Zum Inhalt springen

in select nicht uid fortschreiben

Erstellt am 25. Juni 2007 · 10 Antworten · letzte Antwort am 20. November 2008

Tags: TCA, Frage

gupf ·

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 ·

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?

gupf ·

Hier ist der TCA für das Feld

		"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,
			)
		),
steffenk ·

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 ·

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:

"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,
	)
),

entsprechend für das neue Feld im tt_content:

"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,
	)
),

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 ·

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 ·

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

<?php

require_once (PATH_t3lib.'class.t3lib_page.php');

class user_stories_select {

	function select($params)	{
		global $TCA, $TYPO3_DB, $LANG;

		$items = $params['items'];
		$config = $params['config'];
		$table = $config['itemsProcFunc_config']['table'];
		$sortField = $config['itemsProcFunc_config']['sortField'];
		$indexField = $config['itemsProcFunc_config']['indexField'];

		$query = 'SELECT uid, '.$sortField.', '.$indexField.' FROM '.$table.' ORDER BY '.$sortField.t3lib_pageSelect::enableFields($table);
		$res = mysql(TYPO3_db,$query);
		while($row=$TYPO3_DB->sql_fetch_assoc($res)) {
			$params['items'][$row['uid']]=array($row[$sortField],$row[$indexField],'');
		}
	}
}

if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_stories/class.user_stories_select.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_stories/class.user_stories_select.php']);
}
?>

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.

TheRisingSun ·

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 ·

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.

TheRisingSun ·

Ich erhalte folgende Meldung in der Backend-Eingabemaske, wenn ich weiter nichts einbinde:

|<strong>ERROR:</strong> No class named: tx_MyEXTENSION_country_select|

Die Auswahlbox ist leer.

Woher soll TYPO3, denn auch wissen in welcher Datei sich die Klasse befindet?

Wenn ich via require_once bzw. include_once die Klasse einbinde, kann ich das Backend nicht mehr erreichen. :-(

Danke für das Feedback!