in select nicht uid fortschreiben [Gelöst]

  • gupf gupf
    T3PO
    0 x
    13 Beiträge
    0 Hilfreiche Beiträge
    25. 06. 2007, 14:18

    Hallo,

    ich schreibe gerade meine erste Extension (FE-Plugin). Ich habe die tt_contents um ein Feld country erweitert und habe jetzt im Backend eine Selector-Box, die mir wie gewünscht die Länder aus der static_countries sortiert anzeigt.

    Wie erreiche ich es, dass statt der uid aus der static_countries das Feld cn_short_en fortgeschrieben wird?


  • gupf gupf
    T3PO
    0 x
    13 Beiträge
    0 Hilfreiche Beiträge
    25. 06. 2007, 18:07

    Hallo,

    vielleicht sollte ich mein Problem mal etwas anders schildern:

    In der fe_users wird für den Benutzer das Land als cn_iso_3 abgespeichert. In meinem Frontend hole ich mir über die Funktion buildStaticInfoSelector aus der tx_staticinfotables_pi1 die Liste der Länder, bekomme cn_iso_3 mitgeliefert und speichere das auch ab. Vorbesetzung ist immer cn_iso_3 aus fe_users, kann aber geändert werden.
    Da ich im Backend für das Plugin eine Eingrenzung auf das Land habe, sollte ich hier zweckmäßigerweise auch cn_iso_3 abspeichern.
    Ich habe aber trotz langer Suche und Lesen der Core-Dokumentation keine Möglichkeit gefunden, in der Select-Box im Backend anzugeben, dass statt uid das Feld cn_iso_3 verwendet wird.
    Kann mir da jemand weiterhelfen?

  • steffenk steffenk
    Obi-Wan Kenobi
    0 x
    4666 Beiträge
    0 Hilfreiche Beiträge
    25. 06. 2007, 18:12

    dann zeig mal Dein TCA von dem Feld ;)

  • gupf gupf
    T3PO
    0 x
    13 Beiträge
    0 Hilfreiche Beiträge
    25. 06. 2007, 18:28

    Hier ist der TCA für das Feld

    [TS]"country" => Array (
    "exclude" => 0,
    "label" => "LLL:EXT:user_stories/locallang_db.xml:user_stories_stories.country",
    "config" => Array (
    "type" => "select",
    "foreign_table" => "static_countries",
    "foreign_table_where" => " ORDER BY static_countries.cn_short_en",
    "size" => 1,
    "minitems" => 0,
    "maxitems" => 1,
    )
    ),[/TS]

  • steffenk steffenk
    Obi-Wan Kenobi
    0 x
    4666 Beiträge
    0 Hilfreiche Beiträge
    26. 06. 2007, 00:08

    FE ist was anderes - country aus fe_users ist ein input, in das die static_info im FE den isocode einträgt.

    Bei Feldern vom Typ database-relation wird immer die uid abgespeichert, angezeigt wird im BE das, was in der ctrl-Section als label angegeben ist.

  • gupf gupf
    T3PO
    0 x
    13 Beiträge
    0 Hilfreiche Beiträge
    26. 06. 2007, 12:08

    Heute Nacht fiel mir ein, was ich überlesen hatte, wohl in der Hoffnung, es ginge einfacher. Hier jetzt die Lösung für die Bearbeitung der Tabelle im Backend:

    [TS]"country" => Array (
    "exclude" => 0,
    "label" => "LLL:EXT:user_stories/locallang_db.xml:user_stories.country",
    "config" => Array (
    "type" => "select",
    "items" => Array (
    Array("",0),
    ),
    'itemsProcFunc' => 'user_stories_select->select',
    'itemsProcFunc_config' => array(
    'table' => 'static_countries',
    'sortField' => 'cn_short_en',
    'indexField' => 'cn_iso_3',
    ),
    "allowNonIdValues" => 1,
    "size" => 1,
    "minitems" => 0,
    "maxitems" => 1,
    )
    ),
    [/TS]

    entsprechend für das neue Feld im tt_content:
    [TS]"user_stories_storycountry" => Array (
    "exclude" => 0,
    "label" => "LLL:EXT:user_stories/locallang_db.xml:tt_content.user_stories_storycountry",
    "config" => Array (
    "type" => "select",
    "items" => Array (
    Array('',0),
    ),
    'itemsProcFunc' => 'user_stories_select->select',
    'itemsProcFunc_config' => array(
    'table' => 'static_countries',
    'sortField' => 'cn_short_en',
    'indexField' => 'cn_iso_3',
    ),
    "allowNonIdValues" => 1,
    "size" => 1,
    "minitems" => 0,
    "maxitems" => 1,
    )
    ),[/TS]

    Die angegebene Klasse/Funktion 'user_stories_select->select' erstellt --> funktioniert.

    Da der Kickstarter ja kein Form für die Eingabe erstellt und man das sowieso selbst machen muss, habe ich dort für die Selektion des Landes auf die Funktion buildStaticInfoSelector aus der tx_staticinfotables_pi1 zurückgegriffen. Diese liefert den entsprechenden code 'cn_short_en' oder einen anderen, falls gewünscht.
    Das war dann der Punkt, an dem mir erst auffiel, dass der Kickstarter das Feld 'country' auf int(11) umgesetzt hat, statt char(3) verwendet hat, wie ich angegeben hatte.

    Jetzt ergibt sich aber ein anderer Punkt:
    Sowohl der Database Analyzer als auch der Extension Manager behaupten, dass
    die Felder country in meiner tabelle und im tt_content eines Updates bedürften.
    Das ist aber gar nicht wahr. Sie haben bereits das Format, auf das sie upgedatet werden sollen.
    Unter 'Compare with $TCA' im Database Analyzer ist unter 'Suggested value from $TCA:' "int(11) NOT NULL default '0'" zu finden.
    Ich vermute mal, das steht dort, weil das ein Feld vom Typ database-relation ist und man könnte das als Schönheitsfehler übersehen. Es stört mich aber einfach.
    Kann man da was dagegen tun?

  • steffenk steffenk
    Obi-Wan Kenobi
    0 x
    4666 Beiträge
    0 Hilfreiche Beiträge
    26. 06. 2007, 12:22

    soweit ich weiss wird char erst ab 4 zeichen unterstützt, setz das in der sql mal auf char(4).

    Der Extmanager schaut sich die Definition in der ext_tables.sql an und vergleicht das mit dem Feld.

    Der Vollständigkeit halber und für andere User mit ähnlichem Problem wäre es schön, wenn Du auch die userfunction posten könntest.

  • gupf gupf
    T3PO
    0 x
    13 Beiträge
    0 Hilfreiche Beiträge
    26. 06. 2007, 12:36

    Aber klar doch. Hier ist sie (Kommentare habe ich rausgenommen):

    1. <?php
    2.  
    3. require_once (PATH_t3lib.'class.t3lib_page.php');
    4.  
    5. class user_stories_select {
    6.  
    7. function select($params) {
    8. global $TCA, $TYPO3_DB, $LANG;
    9.  
    10. $items = $params['items'];
    11. $config = $params['config'];
    12. $table = $config['itemsProcFunc_config']['table'];
    13. $sortField = $config['itemsProcFunc_config']['sortField'];
    14. $indexField = $config['itemsProcFunc_config']['indexField'];
    15.  
    16. $query = 'SELECT uid, '.$sortField.', '.$indexField.' FROM '.$table.' ORDER BY '.$sortField.t3lib_pageSelect::enableFields($table);
    17. $res = mysql(TYPO3_db,$query);
    18. while($row=$TYPO3_DB->sql_fetch_assoc($res)) {
    19. $params['items'][$row['uid']]=array($row[$sortField],$row[$indexField],'');
    20. }
    21. }
    22. }
    23.  
    24. if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_stories/class.user_stories_select.php']) {
    25. include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_stories/class.user_stories_select.php']);
    26. }
    27. ?>

    Sprachunterstützung ist halt nicht dabei, brauche ich hierfür aber nicht. Wenn man das noch einbaut und noch ein paar Parameter mitgibt, wo die Übersetzung zu finden ist, ist die Funktion universell einsetzbar (future release).

    @steffenk: char(3) habe ich mir in der fe_users abgeschaut. Ich kann mir ehrlich gesagt auch nicht vorstellen, dass das die Ursache sein soll.

  • 0 x
    76 Beiträge
    0 Hilfreiche Beiträge
    20. 11. 2008, 10:27

    Hi gupf,

    muss ich die Klasse noch irgendwo einbinden?

    Ich habe sie mal ins tca.php via require_once eingebunden aber bekomme im BE die Meldung

    |Function/Class 'country_code_select->select' was not prepended with 'user_'|"

    Ich stehe da gerade irgendwie auf dem Schlauch!

  • gupf gupf
    T3PO
    0 x
    13 Beiträge
    0 Hilfreiche Beiträge
    20. 11. 2008, 12:23

    Hallo TheRisingSun,

    das ist jetzt 17 Monate her!
    Ich habe mal kurz durchgeschaut; da ist sonst weiter nichts. Scheint ausreichend zu sein, das im tca.php unter itemsProcFunc definiert zu haben.