Zum Inhalt springen

Inhalt der Selectbox aus DB+Relationen zwischen Selectboxen

Erstellt am 16. September 2004 · 13 Antworten · letzte Antwort am 22. Oktober 2004

Tags: TCA, Frage

Tofu ·

Habe seit Tagen das selbe Problem und komm einfach nicht weiter!

Und zwar versuche ich eine Extension zu erstellen in dem ich zwei selectboxen habe die voneinander abhängig sind. z.b. Feld "id" und "Titel".

Mein jetztiger Stand ist das ich die Selectboxen mit Werten aus der Datenbank füllen kann. und zwar mit der Konfiguration in der TCA.PHP

"titel" => Array (
"exclude" => 1,
"label" => "LLL:EXT:test_select_box/locallang_db.php:tx_testselectbox_list.titel",
"config" => Array (
"type" => "select",
"items" => Array (
Array ("LLL:EXT:test_select_box/locallang_db.php:tx_testselectbox_list.titel.I.0", "0"),
),
"itemsProcFunc" => "tx_testselectbox_tx_testselectbox_list_titel->main",
)
),
mit der funktion tx_testselectbox_tx_testselectbox_list_titel->main wird der Inhalt der selectbox aus der datenbank geholt.
So, jetzt möchte ich das wenn ich den "titel" auswähle, dass sich die Seite automatisch erneuert(refresh) und sich der Inhalt der selectbox mit der "id" anpasst.
Ich bekomme weder den refresh noch die beziehung zwischen den beiden selectboxen hin.

Kann mir da jemand vielleicht einen Tipp geben.
Würde mir sehr weiterhelfen, da ich noch viele andere features hinzufügen muss, und mir langsam keine Zeit mehr dazu bleibt.

Danke!!!
Tofu

ottfisch ·

..hast Du inzwischen ne Lösung gefunden?

Ich hab da auch 2 SelectBoxen, die beide Inhalte aus Datenbanken bekommen und voneinander abhängig sein sollen.

Die erste bekommt die Kategorien und die zweite die Seminare. Dummerweise werden in der 2. alle Seminare angezeigt und ich krieg einfach nicht raus, wie ich der SelectBox beibringen kann, daß sie die Seminare nehmen soll, welche zu der Kategorie gehören, die in der ersten ausgewählt ist.

Die Select-Boxen kriegen ihre Inhalte direkt über foreign-table, also nicht über ne eigene Funktion.

Kannst Du Deine Funktion mal posten? Das würde mir vielleicht schon insofern weiterhelfen, daß ich die Inhalte filtern kann, wenn nach Auswahl der Kategorie bereits einmal gespeichert wurde...

Gruß,

Jörg

tmallee ·

Ihr schreibt doch eine Extension, oder? Dann ist es doch kein Problem, die Selectbox mit einem Javascript Event zu versehen und nach jedem Event die beiden Boxen neu aufzubauen? Logischerweise ändert sich das SELECT Statement bei jedem Klick auf die Box. TS kann das meines Wissens nach nicht. Dort kannst Du zwar zwei Selectboxen einer DB Relation darstellen, die werden aber nicht upgedatet, wenn Du eine Box veränderst.

In die Ext. baust Du eine nette kleine Funktion, die Dir Selctboxen abhängig von den übergebenen Parametern generiert und als $content zurückliefert.

Gruss

Thomas

ottfisch ·

Hm, hört sich nach ner guten Idee an. Kannst Du dafür nen kleines Beispiel geben? Ich hab grad keine Idee, wie ich an die erste Box ne Javascript-Funktion kopple.
Die Beziehung zwischen den beiden Boxen hab ich gestern hingekriegt. Ist aber auch nen Akt. Hab der zweiten Box ne Funktion für die Items verpasst und folgenden Code benutzt:

function mySelect(&$params, &$pObj) {
$temp2 = array_keys($pObj->cachedTSconfig);
$temp3 = $temp2[0];
$temp = $pObj->cachedTSconfig[$temp3]["_THIS_UID"];
$result = mysql(TYPO3_db,"SELECT tx_seminarExtension_kategorie FROM tt_content WHERE uid='".$temp."'");//###UID###.
$dasObjekt=mysql_fetch_object($result);
$dieKategorie=$dasObjekt->tx_seminarExtension_kategorie;
$result = mysql(TYPO3_db,"SELECT COUNT(uid) AS zahl FROM tx_seminarextension_seminare WHERE kategorie='".$dieKategorie."'");
$dasObjekt = mysql_fetch_object($result);
if (($dasObjekt->zahl)==0) {
$params["items"][]=Array(
"Bitte Kategorie wählen",
"",
);
}
else {
$result = mysql(TYPO3_db,"SELECT uid, titel FROM tx_seminarextension_seminare WHERE kategorie='".$dieKategorie."'");
while ($dasObjekt=mysql_fetch_object($result)) {
$params["items"][]=Array(
$dasObjekt->titel,
$dasObjekt->uid,
);
}
}
}

Ich hol mir also aus dem pObj die uid des Content-Objekts das eingefügt wird, hole mir den Inhalt der ersten SelectBox aus der erweiterten tt_content-Tabelle (klappt natürlich nur, wenn nach der Auswahl einmal gespeichert wurde) und füge in die zweite SelectBox die Seminare der ausgewählten Kategorie.

Das dumme ist natürlich noch, daß man nach der Auswahl der Kategorie erstmal speichern muß.

Hast Du vielleicht ne Idee, wie man das noch automatisieren könnte?

Gruß,

Jörg

tmallee ·

JavaScript bekommst Du über das Event onChange in die Selectbox.

onChange="this.form.submit();"

Dieser Code innerhalb des öffnenden Select Tags sorgt für ein Absenden des Formulars mit allen aktuellen Daten nach Änderung der Auswahl. Zur Vorsicht solltest Du neben die Selectbox noch einen Form Submit Button einbauen, da ja nicht jeder mit eingschaltetem JavaScript (was durchaus sinnvoll ist!).

Ein Speichern der Kategorien ist m.E,. nicht nötig, denn jede Aktion Deiner Extension wird ja sicherlich über einen submit wieder alle aktuellen Formulardaten an die Extensionklassen zurückübertragen, also auch die aktuell gewählten Einträge der Select Box. Du musst also nur dafür sorgen, dass die Selectbox beim Neuaufbau auch wieder den aktuellen Wert als "selected" markiert (das macht Dein Code gluabe ich sogar schon). Wenn Du wirklich was zwischenspeichern willst, bediene Dich einfach der guten alten hidden Fields.

Gruss

Thomas

ottfisch ·

Hm, ich bin jetzt ein bißchen verwirrt.

Wir reden schon beide von 2 SelectBoxen im Frontend-Plugin? Also nicht von SelectBoxen, die man sich selbst in seiner von tslib_pibase abgeleiteten Klasse bastelt, sondern von den Deklarationen in der Datei ext_tables.php der Extension (Code siehe Tofus Beitrag).

Gruß,

Jörg

tmallee ·

Das Prinzip ist sowohl im Front- als auch im Backend anwendbar.

0. Übermittle alle Formularwerte bei Änderung der führenden Selectbox an die Ext. bzw. das Plugin
1. Lies im Plugin den (Formular-)Wert der führenden Selectbox aus
2. Baue ein entsprechendes SELECT Statement auf und lies die entsprechenden Werte für die 2. Selectbox aus der DB aus
3. Fülle die unter 2 gelesenen Werte in eine Selectbox
4. Gib den Inhalt der führenden als auch den Inhalt der zweiten Selectbox als content zurück
5. was du sonst noch machen musst....

Ich gehe davon aus, dass ihr eine eigene Ext. bzw. ein eigenes Plugin entwickelt, das neben diesen beiden sich aktualisierenden Selectboxen noch mehr Funktionen abbildet. Deshalb habe ich auch eingangs gefragt, ob ihr eine eigene Extension baut.

Ob das auch mit reiner ext_tables und tca Definition machbar ist, weiss ich nicht. Ich gehe aber davon aus, das nicht (lasse mich aber sehr gerne eines besseren belehren).

Gruss

Thomas

ottfisch ·

Hm, also wie gesagt: Es geht ja um das Frontend-Plugin. Weiß nicht wie das bei Tofu aussieht, aber bei mir hab ich da nur die beiden Select-Boxen drin und die werden ja über die ext_tables.php erstellt.

Da seh ich jetzt irgendwie nicht die Möglichkeiten, die Du vorschlägst.

Ich laß mich aber auch gerne eines besseren belehren 😉

Gruß,

Jörg

tmallee ·

Naja, kann ja nicht immer klappen 😉

Mehr fällt mir zu dem Them jetzt leider auch nicht mehr ein.

Trotzdem viel Erfolg und stellt eure Lösung bei Gelegenheit mal hier vor.

Gruss

Thomas

Tofu ·

komme irgendwie zu keiner lösung. liegt wohl daran
das ich mit einer externen DBtabelle arbeite die die felder uid,pid,delete,hidden nicht besitzt. das macht das ganze irgendwie noch komplizierter.

habe jetzt jedoch ein anderes problem:

und zwar habe ich 2 tabellen : mitarbeiter, abteilung

ich möchte das in der Listen Ansicht also WEB->List
von der tabelle mitarbeiter die spalten name u. vorname und aus der tabelle abteilung die spalte name_der_abteilung angezeigt wird.
nun zum Problem ich benutze eine User Function

"config" => Array (
'type' => 'user',
"userFunc" => "tx_firma_tx_firma_abteilung->main",

für die tabelle abteilung und kann somit keine verknüpfung über foreign_table machen. momentan wird bei mir die uid von name_der_abteilung angezeigt.
wo kann ich diese listen ansicht beeinflussen.
ich weiß das ich wenn ich verknüpfungen mit foreign_table benutze das man dies in der ext_tables.php unter "label" => "das_zu_anzeigende_feld", angeben kann.
aber wie geht es wenn ich user Function verwende?
Kann mir da jemand einen tip geben. würde mir sehr helfen. da mir dazu einfach nichts mehr einfällt!

THX
Tofu

cokker ·

Hi Jungs.
Ich hab zwar nicht all zu viel Ahnung vom Extension schreiben, aber Die Sache der abhängigen Selectboxen hört sich für mich stark nach optionsfelder an.
Das hat dann relativ wenig mit PHP oder Typo zu tun. Schaut dann einfach mal in Selfhtmll.

Gruß
Sven

ottfisch ·

Hi,

@Tofu:

Weiß nicht genau, ob ich Dich richtig verstanden hab. meinst Du, wie man Typo3 sagt, was er in der abhängigen Box anzeigt? Das läuft über das Array $params, das je per Reference an die eigene Funktion übergeben wird. Bei mir sieht das dann so aus, wobei man dem Array neue Arrays hinzufügt. Dabei ist das erste Feld dann das, was er anzeigen soll und das 2. das Entscheidungskriterium zum einfügen (gleub ich jedenfalls). Man kann auch noch nen drittes Feld übergeben, aber ich weiß jetzt nicht mehr genau, wofür das ist.

$result = mysql(TYPO3_db,"SELECT uid, titel FROM tx_seminarextension_seminare WHERE kategorie='".$dieKategorie."'");
while ($dasObjekt=mysql_fetch_object($result)) {
$params["items"][]=Array(
$dasObjekt->titel,
$dasObjekt->uid,
);
}

Gruß,

Jörg

Tofu ·

@ ottfisch
Danke für deine Antwort.

War aber leider nicht das Problem das ich hatte. Mein Problem bezieht sich auf die ansicht bevor ich meinen content editiere.
Click mal auf das menü WEB/list und dann auf deinen sysordner, wo dein contentelemente stehen. Und genau da ist mein problem.
Diese, ich nenne es mal Übersichten-Ansicht, bereitet mir schwierigkeiten.

Habe jedoch ein bißchen in den php dateien rumgestöbert. und ich glaube zur Erkenntnis gekommen zu sein das es nicht möglich ist mit einer user Function diese Übersichten-Ansicht zu beeinflussen. Außer eventuell mit einer MM-Relation die ich aber vermeiden wollte.

Muß mir da eine andere Lösung einfallen lassen.

ottfisch ·

Hm, gute Frage. Ich hab ja keine externe Tabelle und konnte das als Label-field im Kickstarter angeben.
Das jetzt noch so umzumodeln mit ner Typo-Tabelle ist wahrscheinlich ne ganze Ecke Arbeit, was?

Gruß,

Jörg