Zum Inhalt springen

Formhandler und static_countries Dropdown

Erstellt am 11. Januar 2012 · 12 Antworten · letzte Antwort am 7. Oktober 2014

Tags: Frage

freefly ·

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 Thread hier im Forum.

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

plugin.Tx_Formhandler.settings.predef.signup {
  debug = 1
  
  markers.dropdown_countries = CONTENT
  markers.dropdown_countries {
   table = static_countries
      select {
        pidInList = 0
        orderBy = cn_short_en
        selectFields = uid,cn_iso_3
      }
 
     renderObj = TEXT
     renderObj {
        #value
        10 = TEXT
        10.wrap = <option value="|"
        10.field = cn_iso_3
 
        #selected
        12 = TEXT
        12.wrap = ###selected_country_|###>
        12.field = cn_iso_3
 
        #label
        13 = TEXT
        13.wrap = |</option>
        13.field = cn_iso_3
      }
  }
# ..... 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 ·

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:

// Sprache für das Länder-Dropdown setzen
selLang = en
[globalVar = GP:L = 1]
  selLang = es
[global]

includeLibs.langDropDown = fileadmin/dropdown.php
temp.info = USER
temp.info {
  userFunc = user_langDropDown->main
  selName = signup[country]
  selClass = select
  selId = country
}

plugin.Tx_Formhandler.settings.predef.signup {
  debug = 0
  markers.dropdown_countries < temp.info
...
ab hier geht der normale Formhandler-Code weiter

Und hier der Inhalt der Datei dropdown.php :

<?
  class user_langDropDown {
    var $cObj;// The backReference to the mother cObj object set at call time

    function main($content,$conf){
      require_once(t3lib_extMgm::extPath('static_info_tables').'pi1/class.tx_staticinfotables_pi1.php');
      $this->staticInfo = t3lib_div::makeInstance('tx_staticinfotables_pi1');
      $this->staticInfo->init();
      $countries = $this->staticInfo->buildStaticInfoSelector('COUNTRIES',$conf["selName"],$conf["selClass"],array(),'',0,$conf["selId"],'','',$conf["selLang"]);
      return $countries;
    }
  }
?>

lg
Chris

LuP ·

Hallo Chris,

freefly schrieb

warum ich an dieser Stelle die Tabelle static_countries nicht abfragen kann und andere Tabellen wie tt_news ohne Probleme funktionieren???

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 ·

Hallo LuP,

LuP schrieb

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

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 ·

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.

  foreach($properties as $property) {
    ...

    if(!$conf[$property]) {
      unset($conf[$property]);
    }
  
    ...
  }

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.

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

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

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

Und jetzt kommt der entscheidende Punkt: in tslib_content::getWhere() wird dieses 'this' mit dem Wert von

  $GLOBALS['TSFE']->contentPid

ersetzt. Angenommen 4 wäre die ID der Seite mit dem Formular, steht somit in der WHERE-Klausel

  static_countries.pid IN (4)

Folglich wird die SQL-Abfrage

  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

  foreach($properties as $property) {
    ...
    
-   if(!$conf[$property]) {
+   if(!isset($conf[$property])) {
      unset($conf[$property]);
    }

    ...
  }

können die Datensätze auch gefunden werden.

VG,
LuP

freefly ·
LuP schrieb

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

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 ·

Hallo Chris,

dies scheint ein Bug 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 ·

Hallo,

ich habe dasselbe Problem wie Chris.

Auf review.typo3.org 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 ·

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 ·

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

netshot ·

Ich habe es nun auch mit Hilfe dieses Threads hinbekommen und wollte das Ergebnis einmal zusammenstellen (Dann kann ich mir das beim nächsten Mal hier rausziehen #giggle#)

Template:

<select id="###formValuesPrefix###[country]" name="###formValuesPrefix###[country]">
  <option value="">###LLL:please_choose###</option>
  ###dropdown_countries###
</select>

Und TypoScript:

plugin.Tx_Formhandler.settings.predef.<meinFormName>.markers {
    dropdown_countries = CONTENT
    dropdown_countries {
      table = static_countries
      select {
        pidInList = 0
        orderBy = cn_short_en
        selectFields = uid,cn_iso_3,cn_short_en
      }
 
     renderObj = COA
     renderObj {
        #value
        10 = TEXT
        10.wrap = <option value="|"
        10.field = cn_iso_3
 
        #selected
        12.noTrimWrap = | ###selected_country_|###>|
        12 = TEXT
        12.field = cn_iso_3
 
        #label
        13 = TEXT
        13.wrap = |</option>
        13.field = cn_short_en
      }
    }
  }
maikusch ·

Hi,

auch wenn der Thread schon etwas älter ist, versuche ich mal mein Glück.
Ich probiere auch das Selectfeld mit den Inhalten aus der static_countries zu befüllen.
Das klappt auch super.
Mein Problem liegt daran dass das die gewählte Option beim fehlerhaften Absenden des Formulares nicht wieder übernommen wird. Als das Formular noch statisch war habe ich dass mit ###selected_Land_DE### gelöst. Mein Problem ist jetzt das ordentlich ins TypoScript zu kriegen. Kann mir da evtl. jemand helfen?

options_dropdown = COA
    options_dropdown {
      10 = TEXT
      10.value = <option value="0">-- Bitte wählen --</option>

      20 = CONTENT
      20 {
        table = static_countries
        select {
          pidInList = 0
          orderBy = uid
          selectFields = uid,cn_iso_3,cn_short_de
          # possible conditions
          # where = ( tx_mytable.type='b0' OR tx_mytablet.type='b1' )
        }
        renderObj = COA
        renderObj {
          #value
          10.wrap = <option value="|"
          10 = TEXT
          10.field = cn_iso_3

          #selected
          12.noTrimWrap = | ###selected_Land_|###>|
          12 = TEXT
          12.field = cn_iso_3

          #label
          13 = TEXT
          13.wrap = |</option>
          13.field = cn_short_de
      }
    }