verschachtelte select

Ausgabedaten formatieren und darstellen

verschachtelte select

Beitragvon Molekül am Fr 25. Sep 2009, 10:29

Hallo,

Ich habe drei Tabellen, A, B, C, D mit den Abhängigkeiten
A has many B, B has many C, C has many D
und
D belongs to C, C belongs to B, B belongs to A.

Ich möchte bei Anlegen eines neuen Eintrags in D drei Dropdown-Menüs für A, B, C
Wenn A ausgewählt wird, wird bei B die Auswahl auf alle zugehörigen Elemente für B eingeschränkt,
wenn B ausgewählt wird, wird bei C die Auswahl au falle zugehörigen Elemente für C eingeschränkt.

Als Beispiel:
Zu erst wähle ich aus zwischen Pflanze / Stein / Tier, dann zwischen Baum, Blume, Strauch und dann Ahorn, Eiche, ...

Ich hab keine Ahnung wie ich das ganze angehen muss (bis darauf dass ich wohl AJAX brauche, womit ich bisher keine Erfahrungen gesammelt habe) - gibt es ein Tutorial das dieses Thema aufgreift? Falls nein: Unter welchem Stichwort kann ich weiter suchen, hat dieses Verhalten irgendeinen Namen oder welche Elemente benötige ich?

Vielen Dank!
LG Molekül
Molekül
 
Beiträge: 24
Registriert: Fr 25. Sep 2009, 09:45

Re: verschachtelte select

Beitragvon Dogo am Fr 25. Sep 2009, 11:55

Ich habe drei Tabellen, A, B, C, D

Aha :)

Ein Dropdown befüllen kannst Du?
Schritt für Schritt wäre es wahrscheinlich am besten.
Den Code hier müsstest Du Auf Deine Anwendung ummünzen. Dient als Beispiel für das Befüllen vom Dropdown.

Im Controller:
Code: Alles auswählen
    function add() {
    if (!empty($this->data)) {
        $this->Category->save($this->data);
        $this->redirect(array('action' => 'index'));
        }
    else    {
        $liste[0] = 'Ganz oben';
        $listeneu = array_merge($liste, $this->Category->generatetreelist(null, null, null, '->'));
       
        $this->set('categories', $listeneu);
        }
    }


im View ($categories wird eingesetzt):
Code: Alles auswählen
<!-- File: /app/views/categories/add.ctp -->

<h1>Kategorie anlegen</h1>
<?php
echo $form->create('Category');
echo $form->input('name', array('rows' => '1'));
echo $form->input('description', array('rows' => '3'));
echo $form->input('parent_id', array('options' => $categories, 'label' => 'Wo soll die Kategorie eingehängt werden?'));
echo $form->end('Kategorie Anlegen');
?>


Dein nächster Schritt wäre also: onChange die Abfrage für mein "$this->Category->generatetreelist(null, null, null, '->')" neu auszuführen und einen Filter hinzu zu fügen.
Ich würde aber mal nach "tree behaviour" suchen, da findest Du bestimmt auch Ideen. Denn die "Pflanzen" sind ja Parents von den "Bäume", die wiederum "Children" haben, z.B. "Eiche"

Gruß,

Guido
Benutzeravatar
Dogo
 
Beiträge: 54
Registriert: Do 6. Aug 2009, 00:59
Wohnort: Wuppertal

Re: verschachtelte select

Beitragvon Dogo am Fr 25. Sep 2009, 11:59

Ich habe drei Tabellen, A, B, C, D

Aha :)

Ein Dropdown befüllen kannst Du?
Schritt für Schritt wäre es wahrscheinlich am besten.
Den Code hier müsstest Du Auf Deine Anwendung ummünzen. Dient als Beispiel für das Befüllen vom Dropdown.

Im Controller:
Code: Alles auswählen
    function add() {
    if (!empty($this->data)) {
        $this->Category->save($this->data);
        $this->redirect(array('action' => 'index'));
        }
    else    {
        $liste[0] = 'Ganz oben';
        $listeneu = array_merge($liste, $this->Category->generatetreelist(null, null, null, '->'));
       
        $this->set('categories', $listeneu);
        }
    }


im View ($categories wird eingesetzt):
Code: Alles auswählen
<!-- File: /app/views/categories/add.ctp -->

<h1>Kategorie anlegen</h1>
<?php
echo $form->create('Category');
echo $form->input('name', array('rows' => '1'));
echo $form->input('description', array('rows' => '3'));
echo $form->input('parent_id', array('options' => $categories, 'label' => 'Wo soll die Kategorie eingehängt werden?'));
echo $form->end('Kategorie Anlegen');
?>


Dein nächster Schritt wäre also: onChange die Abfrage für mein "$this->Category->generatetreelist(null, null, null, '->')" neu auszuführen und einen Filter hinzu zu fügen.
Ich würde aber mal nach "tree behaviour" suchen, da findest Du bestimmt auch Ideen. Denn die "Pflanzen" sind ja Parents von den "Bäume", die wiederum "Children" haben, z.B. "Eiche"
Äh.. hier: http://book.cakephp.org/de/view/91/Tree

Gruß,

Guido
Benutzeravatar
Dogo
 
Beiträge: 54
Registriert: Do 6. Aug 2009, 00:59
Wohnort: Wuppertal

Re: verschachtelte select

Beitragvon Molekül am Fr 25. Sep 2009, 21:35

Hallo,

Danke erstmal für die Antwort. Ja, Zählen ist nicht meine Stärke ;-)

dein Lösungsansatz ist nicht ganz das was ich wollte - ich dachte an eine dynamische Lösung, drei Dropdowns nebeneinander wobei das zweite sich erst füllt wenn das erste ausgewählt ist, und das dritte wenn das zweite ...

Vorrübergehend habe ich diese Lösung zusammengemurkst - wahrhaft zusammengemurkst weil ich das als reine mysql-Abfrage sehr viel eleganter mit einem left join gelöst hätte, das mit cakephp nicht auf die Reihe bekomme.

Zumindest kann ich so erstmal weiter arbeiten. Tabelle "C" ist ohne die Zusatzinformationen von Tabelle A und B nämlich nicht verständlich.

Code: Alles auswählen
$Cs= $this->D->C->find('all');
foreach($Cs as $key => $C){
$code = $C['C']['title'];
$Bs = $this->B->find('all',array('conditions' => array('B.id'=>$C['C']['B_id'])));
$B = $B[0]['B']['title'];
$As = $this->A->find('all',array('conditions' => array('A.id'=>$lamps[0]['C']['A_id'])));
$A = $As[0]['A']['shorttitle'];
$Cs[$key] = $A.' > '.$B.' > '.$C;
}
asort($Cs);


Den Tree verstehe ich in der Anwendung nicht. Habe ich dann zusätzlich zu A, B, C, D noch eine Tabelle für den Tree? Ich bin mir nicht so ganz sicher ob der wirklich zu meiner Anwendung passt.
Molekül
 
Beiträge: 24
Registriert: Fr 25. Sep 2009, 09:45

Re: verschachtelte select

Beitragvon Dogo am Sa 26. Sep 2009, 16:07

Der Tree gibt dir die Sortierung (also einen echten "Tree") wieder. So, wie der Verzeichnisbaum bei Windows im Explorer das Tut.
Schau doch noch mal hier drauf: http://book.cakephp.org/view/228/Basic-Usage
Das müsste damit ganz einfach sein. Und die Abfragen müssten kleiner / weniger werden. So viel habe ich damit aber auch noch nicht gemacht, habe nur im Gefühl, das das das richtige sein könnte (Speziell die "Children").

Gruß,

Guido
Benutzeravatar
Dogo
 
Beiträge: 54
Registriert: Do 6. Aug 2009, 00:59
Wohnort: Wuppertal


Zurück zu Views

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron