Formhandler und static_countries Dropdown

  • freefly freefly
    Padawan
    0 x
    43 Beiträge
    1 Hilfreiche Beiträge
    11. 01. 2012, 09:01

    Hi,

    ich schaffe es einfach nicht in der Erweiterung Formhandler ein Dropdown in einem eigenen Marker aus der Tabelle static_countries zu erstellen.

    Vorgegangen bin ich genau nach den Beispielen auf typo3-formhandler.com und dem [url="http://www.typo3.net/index.php?id=forum&tx_mmforum_pi1[action]=list_post&tx_mmforum_pi1[tid]=101075&tx_mmforum_pi1[fid]=9"]Thread hier im Forum[/url].

    Bei mir bleibt das Dropdown einfach leer - wenn ich jedoch als Tabelle z.B.: die tt_news oder die tt_content nehme, so wird der Marker ohne Probleme mit diesen Werten gefüllt (auch wenn dann natürlich nichts vernünftiges für ein Länderdropdown drinnen steht :-)

    Gibt es noch irgendwo etwas, das ich umschalten/einschalten muss, dass ich per Typoscript auf die static_countries zugreifen darf?

    Hier nochmal der TS-Code

    1. plugin.Tx_Formhandler.settings.predef.signup {
    2. debug = 1
    3.  
    4. markers.dropdown_countries = CONTENT
    5. markers.dropdown_countries {
    6. table = static_countries
    7. pidInList = 0
    8. orderBy = cn_short_en
    9. selectFields = uid,cn_iso_3
    10. }
    11.  
    12. renderObj = TEXT
    13. renderObj {
    14. #value
    15. 10 = TEXT
    16. 10.wrap = <option value="|"
    17. 10.field = cn_iso_3
    18.  
    19. #selected
    20. 12 = TEXT
    21. 12.wrap = !!|>
    22. 12.field = cn_iso_3
    23.  
    24. #label
    25. 13 = TEXT
    26. 13.wrap = |</option>
    27. 13.field = cn_iso_3
    28. }
    29. }
    30. # ..... und der Rest mit Validators, Finishers etc. - das funktioniert aber alles

    Es macht auch keinen Unterschied ob ich renderObj als TEXT oder COA definiere - bleibt immer leer

    Und wie gesagt - der Marker wird richtig ersetzt wenn ich eine andere Tabelle oder einen statischen Text nehmen - es liegt also definitiv in der Abfrage von static_countries wo ich irgendeinen Fehler habe, den ich einfach nicht finde....

    Typo3 ist die Version 4.6.1, Formhandler in Version 1.0.0.

    Danke schon mal für alle hilfreichen Antworten

    Chris


  • freefly freefly
    Padawan
    0 x
    43 Beiträge
    1 Hilfreiche Beiträge
    13. 01. 2012, 11:06

    So - nachdem das Projekt irgendwann fertig werden muss habe ich mir mit einer userFunc geholfen in welcher ich das Dropdown erstellen lasse.

    Aber ich wäre immer noch dankbar, wenn irgendwer eine Idee hat, warum ich an dieser Stelle die Tabelle static_countries nicht abfragen kann und andere Tabellen wie tt_news ohne Probleme funktionieren???

    Falls jemand nochmal vor diesem Problem steht - hier meine suboptimale Lösung:

    1. // Sprache für das Länder-Dropdown setzen
    2. selLang = en
    3. [globalVar = GP:L = 1]
    4. selLang = es
    5. [global]
    6.  
    7. includeLibs.langDropDown = fileadmin/dropdown.php
    8. temp.info = USER
    9. temp.info {
    10. userFunc = user_langDropDown->main
    11. selName = signup[country]
    12. selClass = select
    13. selId = country
    14. }
    15.  
    16. plugin.Tx_Formhandler.settings.predef.signup {
    17. debug = 0
    18. markers.dropdown_countries < temp.info
    19. ...
    20. ab hier geht der normale Formhandler-Code weiter

    Und hier der Inhalt der Datei dropdown.php :

    1. <?
    2. class user_langDropDown {
    3. var $cObj;// The backReference to the mother cObj object set at call time
    4.  
    5. function main($content,$conf){
    6. require_once(t3lib_extMgm::extPath('static_info_tables').'pi1/class.tx_staticinfotables_pi1.php');
    7. $this->staticInfo = t3lib_div::makeInstance('tx_staticinfotables_pi1');
    8. $this->staticInfo->init();
    9. $countries = $this->staticInfo->buildStaticInfoSelector('COUNTRIES',$conf["selName"],$conf["selClass"],array(),'',0,$conf["selId"],'','',$conf["selLang"]);
    10. return $countries;
    11. }
    12. }
    13. ?>

    lg
    Chris

  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    16. 01. 2012, 10:39

    Hallo Chris,

    [quote="freefly"]
    warum ich an dieser Stelle die Tabelle static_countries nicht abfragen kann und andere Tabellen wie tt_news ohne Probleme funktionieren???
    [/quote]
    bei anderen Tabellen wie tt_news hast Du für select.pidInList einen Wert verschieden von 0 stehen, nehme ich mal an.

    VG,
    LuP

  • freefly freefly
    Padawan
    0 x
    43 Beiträge
    1 Hilfreiche Beiträge
    16. 01. 2012, 10:54

    Hallo LuP,

    [quote="LuP"]

    bei anderen Tabellen wie tt_news hast Du für select.pidInList einen Wert verschieden von 0 stehen, nehme ich mal an.

    [/quote]

    ja - für die tt_news den Sysfolder mit den News-Einträgen (in meinem Fall 10)

    Und für die static_countries die PID 0 - weil da ja auf dem Root-Folder mit der PID 0 untergebracht sind. (nehme ich zumindest an :-)

    lg
    Chris

  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    16. 01. 2012, 11:21

    Meiner Einschätzung nach ist der leere Rückgabewert bei den static_* Tabellen auf die SELECT-Abfrage in tslib_content zurückzuführen.

    In tslib_content::getQuery() wird der logische Operator NOT (!) verwendet, um die select-Eigenschaften ausm TS auf ihre Existenz zu überprüfen.

    1. foreach($properties as $property) {
    2. ...
    3.  
    4. if(!$conf[$property]) {
    5. unset($conf[$property]);
    6. }
    7.  
    8. ...
    9. }

    Da es hier zwischen 0 und leer nicht unterschieden wird, trifft die Bedingung für select.pidInList=0 auch zu.
    Somit wird das Element $conf['pidInList'] gelöscht.

    Im nächsten Schritt wird $conf['pidInList'] mit '' verglichen.

    1. if(!strcmp($conf['pidInList'], '')) {
    2. $conf['pidInList'] = 'this';
    3. }

    Die Bedingung ist hier erfüllt und es gilt für den nächsten Verlauf

    1. $conf['pidInList'] = 'this';

    Und jetzt kommt der entscheidende Punkt: in tslib_content::getWhere() wird dieses 'this' mit dem Wert von
    1. $GLOBALS['TSFE']->contentPid

    ersetzt. Angenommen 4 wäre die ID der Seite mit dem Formular, steht somit in der WHERE-Klausel
    1. static_countries.pid IN (4)

    Folglich wird die SQL-Abfrage
    1. SELECT cn_iso_3, cn_short_en FROM static_countries WHERE static_countries.pid IN (4) AND static_countries.deleted=0

    ausgeführt, die logischerweise NULL-Resultat liefert, weil die gesuchten static-Daten unter pid=0 stehen.

    Aus meiner Sicht wäre man mit !isset() in der foreach-Schleife besser dran. Dies schließt den Wert 0 aus.
    Damit würde die Eigenschaft nur dann gelöscht, wenn sie wirklich nicht gesetzt ist.
    Die Änderung würde alle Tabellen der Erweiterung static_info_tables einschließen.

    Mit select.pidInList=0 und

    1. foreach($properties as $property) {
    2. ...
    3.  
    4. - if(!$conf[$property]) {
    5. + if(!isset($conf[$property])) {
    6. unset($conf[$property]);
    7. }
    8.  
    9. ...
    10. }

    können die Datensätze auch gefunden werden.

    VG,
    LuP

  • freefly freefly
    Padawan
    0 x
    43 Beiträge
    1 Hilfreiche Beiträge
    16. 01. 2012, 11:43

    [quote="LuP"]
    Meiner Einschätzung nach ist der leere Rückgabewert bei den static_* Tabellen auf die SELECT-Abfrage in tslib_content zurückzuführen.
    [/quote]

    Danke für den Hinweis - so weit hatte ich noch gar nicht gedacht - ich habe den Fehler immer bei mir gesucht, weil ich den Code aus einer anderen Stelle im Netz hatte und derjenige behauptet hat, dass er so sein Länder-Dropdown im Formhandler gefüllt hat...

    Das muss ich jetzt mal auf der Testseite ein bisschen herumspielen.

    Vielen Dank für die super ausführliche Analyse!

    bg
    Chris

  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    17. 01. 2012, 21:14

    Hallo Chris,

    dies scheint ein [url="http://forge.typo3.org/issues/31209"]Bug[/url] zu sein. Die Core-Entwickler sind bereits um eine Lösung bemüht. An dieser Stelle vielen Dank an das TYPO3-Core-Team.

    VG,
    LuP

  • jochla jochla
    Jedi-Ritter
    0 x
    128 Beiträge
    0 Hilfreiche Beiträge
    21. 02. 2012, 14:15

    Hallo,

    ich habe dasselbe Problem wie Chris.

    Auf [url=http://review.typo3.org/#patch,sidebyside,7826,3,typo3/sysext/cms/tslib/class.tslib_content.php]review.typo3.org[/url] gibt es die geänderte Datei. Ich habe meine Installation geprüft und festgestellt, dass in meiner Version 4.6.4 die Datei aber bereits gepatched ist.

    Und trotzdem bekomme ich die Länderliste nicht ausgelesen.

    Gibt es inzwischen neue Erkenntnisse bzgl. dieses Problems?

    Gruß, Johannes.

  • LuP LuP
    Jedi-Meister
    0 x
    496 Beiträge
    1 Hilfreiche Beiträge
    21. 02. 2012, 17:39

    Hallo,

    ja, der Bug ist in 4.6.4 bereits gefixt.

    Mit select.pidInList = 0 klappt es nun, die Daten aus static_countries zu holen.

    VG,
    LuP

  • freefly freefly
    Padawan
    0 x
    43 Beiträge
    1 Hilfreiche Beiträge
    21. 02. 2012, 19:08

    Hallo,

    habe jetzt mal den 4.6.4 Sourcecode installiert (vorher 4.6.3), alle Caches geleert und meine Userfunc (auf einer Testseite) rausgehauen und wieder durch den "Formhandler eigenen Code" ersetzt.

    Aber leider funktioniert das noch immer nicht (obwohl pidInList=0 gesetzt ist)

    Wie gesagt - es ist ja nicht mehr so wichtig, da es mit der Userfunc ja problemlos klappt.

    Danke fürs auf dem Laufenden halten!

    vg
    Chris