Packianathan
I'm new here

Arbeiten mit zwei Tabellen

Ich habe zwei Tabellen. In der einen sind die US-Bundesstaaten hinterlegt und in der anderen die dazugehörigen Adressen (1 zu N Beziehung).

Ich habe auch eine Abfrage eingebaut. In den Vorschau funktioniert die EInschränkung der Daten weil ich auch eine Regel anwende .

Formular Syntax:

<CMS_INPUT_COMBOBOX name="st_name" sortOrder="ascending" useLanguages="no">

        <CMS_INCLUDE_OPTIONS type="database">

          <LABELS>

            <LABEL lang="*">#item.name</LABEL>

          </LABELS>

          <TABLE>helukabel_cms_schema.us_state</TABLE>

        </CMS_INCLUDE_OPTIONS>

        <LANGINFOS>

          <LANGINFO lang="*" label="State"/>

        </LANGINFOS>

      </CMS_INPUT_COMBOBOX>

      <CMS_INPUT_COMBOBOX name="st_address" sortOrder="ascending" useLanguages="no">

        <CMS_INCLUDE_OPTIONS type="database">

          <LABELS>

            <LABEL lang="*">#item.fs_id</LABEL>

          </LABELS>

          <QUERY name="helukabel_cms_schema.us_state2location">

            <PARAM name="id">1</PARAM>

          </QUERY>

          <TABLE>helukabel_cms_schema.location_us_state</TABLE>

        </CMS_INCLUDE_OPTIONS>

        <LANGINFOS>

          <LANGINFO lang="*" label="State"/>

        </LANGINFOS>

      </CMS_INPUT_COMBOBOX>

Regel:

<ON_EVENT>

        <WITH>

            <PROPERTY source="st_name" name="VALUE" />

        </WITH>

        <DO>

            <PROPERTY source="st_address" name="query.id" />

        </DO>

    </ON_EVENT>

In der HTML Ausgabe kriege ich es nicht hin. In Abhängigkeit des Auswahls der ersten Tabelleninfos die dazugehörige Daten aus der zweiten Tabelle auszugeben.

Die Varainte für jede Option von der Tabelle1  eine eigene Abfrage mit dem entsprechenden Parameter zu hinterlegen, würde ich gerne vermeiden.

Ist mein Anliegen möglich ?

0 Kudos
11 Replies
Peter_Jodeleit
Crownpeak employee

Wenn zwischen den beiden Tabellen eine Fremdschlüsselbeziehung liegt, dann einfach der Beziehung über das Objektmodell folgen.

Peter
0 Kudos

Was meinen Sie hier genau ? Ein Beispiel hierzu wäre nicht schlecht.

0 Kudos

Im mitgelieferten Demo-Projekt ("Mithras Energy") gibt es einige Beispiele dazu. Z.B. bei den Produkten.

Peter
0 Kudos

leider ist bei uns Mithras Projekt nicht installiert. Da wir schon zwei Projekte haben ist das einspielen weiterhin nicht möglich. Gibt es eine Möglichkeit auf die Daten zuzugreifen ?

0 Kudos

Du kannst dir einen lokalen Server aufsetzen, zum Ausprobieren sollte das reichen.

Noch mal zu dem "Problem". Ich postuliere mal, die Tabellen heißen "address" und "state" und die Fremdschlüsselbeziehung in Adresse heißt ebenfalls "state". Wenn du dann ein Objekt x aus der Tabelle "state" hast, bekommst du mit x.getValue("state") ein Objekt aus der Tabelle "state" (oder "null", wenn die Fremdschlüsselbeziehung nicht gesetzt ist.

Peter
0 Kudos

Anbei Übersicht der beiden Datenbank Tabellen.

Ich habe auch vergessen mein HTML Code mitzuteilen.

<CMS_FUNCTION name="contentSelect" resultname="cs_us_state">

    <CMS_PARAM name="schema" value="helukabel_cms_schema" />

    <QUERY entityType="us_state">

        <ORDER>

            <ORDERCRITERIA attribute="name" ascending="1" />

        </ORDER>

    </QUERY>

</CMS_FUNCTION>

   <select name="us-select" id="us-select" >

      <option value="choose">$CMS_VALUE(#global.gca("languagedependantcontent").getData().get("pt_contact_please_choose").getEditor().get(#global.language))$ ...</option>

        $CMS_FOR(state,cs_us_state)$

        <option value="$CMS_VALUE(state.fs_id)$">$CMS_VALUE(state.name)$</option>

      $CMS_END_FOR$

    </select>

Datenbank.jpg

Wie erhalte ich die Daten von der zweiten Tabelle ? Muss ich ein CMS_FUNCTION für die zweite Tabelle machen ? Aus deinem Hinweis Text werdeich nicht schlau !

0 Kudos

Ich werde aus deiner Frage nicht schlau Smiley Wink

Was ist für dich die "zweite Tabelle"?

Wenn das Element aus der Tabelle "location_us_state" stammt, kommst du über das Attribut "us_state" an das Element aus der Tabelle "us_state":

     $CMS_VALUE(location.us_state.name)$

Umgekehrt hast du eine Liste, über welche du iterieren kannst:

   $CMS_FOR(location, state.location_us_stateList)$

        Location: $CMS_VALUE(location.web)$

   $CMS_END_FOR$

Peter
0 Kudos

Ich will die Adress Daten aus der Tabelle location_us_state ausgeben, in Abhängigkeit was in der Tabelle us_State (Eingrichtet als Combobox) ausgewählt wurde.

Ich habe versucht dein Code zu benutzen. Aber es werden keine Daten im HTML ausgegeben.

Hier nochmal mein HTML Code

<CMS_HEADER>

<CMS_FUNCTION name="contentSelect" resultname="cs_us_state">

    <CMS_PARAM name="schema" value="helukabel_cms_schema" />

    <QUERY entityType="us_state">

        <ORDER>

            <ORDERCRITERIA attribute="name" ascending="1" />

        </ORDER>

    </QUERY>

</CMS_FUNCTION>

</CMS_HEADER>

<div id="worldmap" class="world"$CMS_VALUE(editorId())$>

    <select name="us-select" id="us-select" >

      <option value="choose">$CMS_VALUE(#global.gca("languagedependantcontent").getData().get("pt_contact_please_choose").getEditor().get(#global.language))$ ...</option>

        $CMS_FOR(state,cs_us_state)$

        <option value="$CMS_VALUE(state.fs_id)$">$CMS_VALUE(state.name)$</option>

      $CMS_END_FOR$

    </select>

  $CMS_VALUE(state.location_us_stateList)$

  $CMS_FOR(location, state.location_us_stateList)$

        Location: $CMS_VALUE(location.address)$

  $CMS_END_FOR$

   

$--                   

    $CMS_FOR(location_us_state,cs_location_us_state)$

        $CMS_IF(location_us_state.us_state.fs_id == sv_activeStateId)$

            <div class="country-contact">

                <div class="address">

                    $CMS_VALUE(location_us_state.address)$

                </div>

                $CMS_IF(location_us_state.phone.isEmpty && location_us_state.fax.isEmpty)$

                $CMS_ELSE$

                    <div class="phone">

                        $CMS_IF(!location_us_state.phone.isEmpty)$

                            <p>Tel $CMS_VALUE(location_us_state.phone)$</p>

                        $CMS_END_IF$

                        $CMS_IF(!location_us_state.fax.isEmpty)$

                            <p>Fax $CMS_VALUE(location_us_state.fax)$</p>

                        $CMS_END_IF$

                    </div>

                $CMS_END_IF$

                $CMS_IF(location_us_state.email.isEmpty && location_us_state.web.isEmpty)$

                $CMS_ELSE$

                    <div class="online">

                            $CMS_IF(!location_us_state.email.isEmpty)$

                                <p>E-Mail: <a href="mailto:$CMS_VALUE(location_us_state.email)$" class="wm-mailto">$CMS_VALUE(location_us_state.email)$</a></p>

                            $CMS_END_IF$

                            $CMS_IF(!location_us_state.web.isEmpty)$

                                <p>Internet: <a href="$CMS_IF(!location_us_state.web.contains("://"))$http://$CMS_END_IF$$CMS_VALUE(location_us_state.web)$" target="_blank" class="wm-web">$CMS_VALUE(location_us_state.web)$</a></p>

                            $CMS_END_IF$

                    </div>

            </div>

        $CMS_END_IF$

    $CMS_END_FOR$

    --$

</div>

Was mache ich hier falsch ?

Die Anzeige sollte dynamisch sein. Wenn in Combobox ein andere US Staat ausgewählt wurde, sollte auch die dazugehörige Adresse in der HTML Ausgabe erfolgen.

0 Kudos

Du hast jetzt eine Datenbankabfrage über alle "location_us_state" Einträge gebaut. Wenn da in der Schleife nichts ausgegeben wird, wird die Schleife wohl nicht durchlaufen. Gibt es denn Einträge in der Tabelle?

Peter
0 Kudos