Zum Inhalt springen

SELECT/Options - Daten für Formular aus Datenbank holen

Erstellt am 21. Oktober 2009 · 16 Antworten · letzte Antwort am 3. November 2009

Tags: TCA, Frage

ÁndreMansfeld ·

Hallo Freunde,
möchte gerne ein automatisches Befüllen einer FE- Formular SELCTBOX.
Mit dem Kickstarter habe ich eine Spalte angelegt mit dem Feldnamen und die Optionsfelder entsprechend angegeben.
Wie hole ich denn die Tabellenspaltennamen (also nicht Inhalte sondern generell die Namen und die Optionen die unter einer Tabellenspalte folgen), um grundsätzlich ein Formular zu füllen.

In der SQL Tabelle steht ja zunächst nur der Spaltename(FELD). Die Werte für die OPTIONSFELDER werden ja (wenn ich das richtig verstehe) in der ext_tables.php definiert. Und zwar als ARRAY mit dem Typ SELECT und ITEM als Ausgabe.

Wie greife ich denn auf diese items im Array zu.

Ich nehme an, dass ich zuerst die Spalten in Array holen muß.
Wie lautet denn bitte die richtige SELECT Anweisung dafür?

Danach muß ich wohl für jede Spalte (aus dem Array) die in der ext_tables.php noch ein Array für die Optionsfelder hat ein zweites Array ausgeben lassen.

Wie lautet denn bitte die richtige SELECT Anweisung dafür?

Ich habe nichts zu diesem Thema gefunden, vielleicht hat jemand auch einen Link für diese Thematik.
Also Bezeichnung bzw. Syntax für Zugriff auf SPALTENNAME und die evt. SELECT - ITEMS darin.

Lieben Gruß Andreas

froemken ·

Da gibt es kein SELECT für. Geh mal in Dein Backend und klick links im Menü auf "Konfiguration". Wähl dann oben in der Selectbox $TCA aus und such in der Liste nach deiner Tabelle und klick Dich durch bis zu deiner Selectbox mit den items und klick dann auf ITEMS.

Ergebnis ähnlich dem hier:
$TCA['tt_content']['columns']['CType']['config']['items'] = '';

Mit der Info kannst du jetzt ein foreach realisieren:

$cont_items = $TCA['tt_content']['columns']['CType']['config']['items'];
foreach($cont_items as $key=>$value) {
  $options .= '<option value="'.$key.'">'.$value.'</option>'.chr(10);
}
echo '<select name="trallala" size="1">'.$options.'</select>';

Stefan

ÁndreMansfeld ·

Vielen Dank,
das bringt mich einen großen Schritt weiter.
Ich habe gestern Abend auch schon bemerkt, dass ich die (SUBARRAYS)Tabellen nicht direkt ansprechen kann. Zuerst dachte ich an die ENUM Varianten, aber so ist die DB halt nicht angelegt :-)
Das das TCA meine Quelle ist wurde mir dann schon klar, allerdings die richtige Schreibweise hatte ich noch nicht gefunden :-).

Habs gemacht wie du gesagt hast!
Das echo lieferte mir schon das richtige Ergebnis. Jetzt nur noch auf einen Marker legen, dann sollte es gehen :-)

Bis dann und Danke
Andreas

ÁndreMansfeld ·

Hallo Stefan,
"EINEN SCHRITT WEITER" habe ich gemeint o.O

Ich habe jetzt alles so umgeschrieben:

$field_geschlecht = $TCA['fe_users']['columns']['tx_fesetcard_geschlecht']['config']['items'];
//$daten = array($field_geschlecht['items']);
//foreach($daten as $key=>$value) {
foreach($field_geschlecht as $key=>$value) {
$options .= '<option value="'.$key.'">'.$value.'</option>';
}
$marks['###GESCHLECHT###']= '<select name="###EXT_KEY###[tx_fesetcard_geschlecht]" class="feldergross" size="1">'.$options.'</select>';

Allerdings meckert SQL jetzt, dass die foreachschleife nicht valid wäre. Ich kann aber keinen Fehler sehen o.O, außer natürlich, dass foreach ja ein ARRAY benötigt, aber das habe ich schon versucht (// auskommentiert).

Im FE habe ich jetzt mein SELECT Feld, bleibt aber leer.
Mit einem DEBUG auf $daten erhalte ich nichts, wenn ich $daten als array ausgebe ist der Wert = 0.
im Backend unter CONFIG ist die Zeile:

$TCA['fe_users']['columns']['tx_fesetcard_geschlecht']['config']['items'] = '';

Wenn ich das richtig verstanden habe, brauche ich diese Zeile nicht, sondern nur den Pfad daraus. Also:

$TCA['fe_users']['columns']['tx_fesetcard_geschlecht']['config']['items'];

Kannst du mich nochmal richtig fest anschubsen?

#paralyzed#

froemken ·

Dein Script ist schon richtig...ich hab nur einen Denkfehler gehabt, denn du kannst innerhalb deiner Klasse nicht auf $TCA zugreifen. Damit das klappt musst du mit $GLOBALS['TCA'] auf das Array zugreifen:

$field_geschlecht = $GLOBALS['TCA']['fe_users']['columns']['tx_fesetcard_geschlecht']['config']['items'];

Hab's bei mir getestet und es funktioniert.

Kannst ja auch mal ein print_r($field_geschlecht); ausprobieren, dann siehst, wie das Array aufgebaut ist.

Stefan

ÁndreMansfeld ·

Hi nochmal,
also mit $GLOBALS..... erhalte ich nur ein leeres ARRAY.
Mit

$field_geschlecht = $GLOBALS['TCA']['fe_users'];

erhalte ich noch eine vernünftige Ausgabe(also ein gefülltes Array) mit print_r.
Sobald COLUMNS oder die Andern danach dazukommen gibts nur noch leere ARRAYs. Ich habe auch schon mal =array(); ans Ende gepackt. o.O .
Also irgendwas passt da noch nicht ganz. Ich werde noch ein paar Variationen probieren. Vielleicht fällt dir ja nochwas ein. Wenn du sagts, dass du es getestet hast, dann muß es auch gehen 😉 . Ich checke nochmal alle Pfade bei mir genau.

Also das es werden mit
print_r auf $GLOBALS['TCA']['fe_users']

auch nur 3 Unterarrays gezeigt.
[fe_users]
[ctrl]
[interface]
[feInterface]

Danach ist Schluss #angry#
Eigentlich sollten doch dort auch noch
[columns]
[types]
[palettes] folgen.
Hm? Weißt du warum?

Lieben Gruß Andreas

froemken ·

AU man...wie blöd von mir. Wollte erst meinen Code posten und hab's dann doch wieder gelassen.

Über der Zuweisung fehlt noch ein:

t3lib_div::loadTCA('tt_content');

Du musst zuvor die TCA für deine Tabelle laden, sonst ist dein Array leer.

Stefan

ÁndreMansfeld ·

Hallo nochmal,
ich bin leider noch nicht weitergekommen. Mittlerweile schon alle Bücher durch und Google leergelesen o.O .
Irgendwas passt da noch nicht.

Ich habe mittlerweile folgendes herausgefunden, dies aber nur zur Info.

Vor die Abfrage-> t3lib_div::loadTCA('fe_users'); weil ('tt_content') brachte keine Arrays.

Die Abfrage selbst ->

$field_geschlecht = $GLOBALS['TCA']['fe_users']['columns']['tx_fesetcard_geschlecht']['config']['items'];

funktioniert nur bis ['fe_users'] dann werden auch die COLUMNS gelistet (mit print).
Erweitert um die ['Columns'] bringt keine ARRAYs mehr.
Ich habe aber gesehen, dass es in der ext_tables.php der Extension ein exclude Feld gibt. Das steht bei den Feldern, die nicht zu sehen sind auf = 0.
Bei den Sichtbaren stehts auf = 1.
So weit so gut. Hab natürlich meine ext_tables.php dem entsprechend angepasst, aber leider funktioniert das nur bei fe_users. Meine erweiterten Spalten werden nicht gezeigt. In der EXTENSION die die fe_users erweitert, stehen diese TCA Einträge auch unter einem tempColumns Array. Evt. müsste ich dies noch RICHTIG in den Code einbauen. Ich habs noch nicht geschafft.

Ich stelle das jetzt zurück und arbeite mit HTML Forms weiter, damit ich erstmal fertig werde 😢 .
Dann werde ich mich wieder damit auseinandersetzen, denn diese Funktion wäre schon noch sehr praktisch.
Ich lasse den Threat mal offen.

Lieben Gruß Andreas

ÁndreMansfeld ·

Ich habe jetzt genau das Gleiche nochmal bei einer Standardausgabe auf einem Marker 🙁 .

Es geht um die FE_USERS!

$markerArray['###VORNAME###']   = $row['first_name']; 
$markerArray['###NACHNAME###']  = $row['last_name'];
$markerArray['###CRDATE###']    = $row['crdate'];
$markerArray['###TSTAMP###']    = $row['tstamp'];
$markerArray['###LASTLOGIN###'] = $row['lastlogin'];

ergibt im FE dann

Vorname: Muster
Nachname: Mustermann
Mitglied seit: 0
TSTAMP: 0
zuletzt eingeloggt: 123246546 <- z.B.

Also das "lastlogin" gibt er mir aus. (Muß halt noch formatiert werden)
Die Felder CRDATE und TSTAMP werden aber nur mit 0 ausgegeben. #angry#
Sind aber in der DB definitiv vorhanden.

Ich glaube, dass das mit den gleichen Mechanismen, wie hier im Post schon angegeben funktioniert.
Also wahrscheinlich muß ich die mit

$TCA['fe_users']['ctrl']['crdate'] = 'crdate';

holen, aber da erhalte ich nur Fehlermeldungen (unexpected T_STRING ...).

Hat nicht Jemand eine richtige Syntax für mich, wie ich in der Whileschleife den Marker mit dem crdate ausgeben kann?

$markerArray['###CRDATE###'] = ???

Ich denke, wenn das klappt, dann klappts auch mit den anderen Problemen aus diesem Post, denn wenn ich mir die CONFIG so anschaue, stelle ich fest, dass crdate nicht direkt als DB Spalte angesprochen werden kann, sondern sich unterhalb von CTRL befindet.

Das Einzige, was mich wundert, ist, dass ich davon ausgegangen bin, dass man alle Felder die ich in der DB mit phpMyAdmin sehen kann, auch direkt ausgeben könnte. Sie sind ja schön untereinander aufgelistet und haben eigentlich auch die gleichen Eigenschaften.
#paralyzed#

Vielen Dank

Andreas

ÁndreMansfeld ·

Hallo Typo3 Freunde,
ich bin jetzt eigentlich fast fertig, aber die besagten Abfragen benötige ich noch.
Kann mir denn nicht nochmal jemand auf die Spünge helfen, warum man bestimmte Felder aus der DB nicht mit den gewohnten Scripten ansprechen kann.
Betroffen sind ein paar Felder aus der fe_users Tabelle sowie alle Felder aus der erweiterten Tabelle von fe_users.
Wie erwähnt (damit man nicht alles lesen muß) es geht nicht um die Inhalte der Spalten, sondern um den Namen der Spalten.
Ich möchte gerne ein FE Formular mit den voreingestellten Werten in der DB füllen lassen.

z.B. DB FELD -> STADT
Optionfeld ..... München
Optionfeld ........Frankfurt
Optionfeld ........Hamburg

Das FE Formular für STADT soll jetzt automatisch die Städte aus der DB holen.

Hoffe es erbarmt sich noch jemand, denn ich bin mittlerweile am Aufgeben
😢

Lieben Gruß

Andreas

froemken ·

Das Problem liegt an der Performance und die Lösung dazu habe ich hier gefunden:
http://lists.typo3.org/pipermail/typo3-at/2005-June/006068.html
bzw hier:
http://lists.typo3.org/pipermail/typo3-at/2005-June/006069.html
t3lib_div::loadTCA läd nur die ctrl und die Standardfelder, nicht aber auch die nachträglich hinzugefügten. Um auch diese zu erhalten benötigst du den Befehl:

$GLOBALS['TSFE']->includeTCA();

OK...es klappt, aber ich weiß nicht, ob das so der richtige Weg ist, da die TCA schon sehr viel Speicher fressen kann.

Kennt vielleicht noch jemand anderes einen Befehl ähnlich:

includeTCAfromExtension('MyEXT');

Stefan

ÁndreMansfeld ·

ES geht voran :p
mit dem richtigen Suchbegriff habe ich jetzt noch folgendes gefunden.

$GLOBALS['TSFE']->includeTCA();
$tca = t3lib_div::loadTCA('my_ext');

das habe ich auch gleich (hoffentlich richtig) angewendet.

nun wird zumindest das OPTIONFELD gefüllt und es gibt keine Fehlermeldungen mehr.
Einzig, dass im OPTIONFELD jetzt nur ARRAY steht, müßte ich noch hinbekommen.
Und zwar steht das so oft ARRAY wie es EINTRÄGE dazu gibt. Also ich habe z.B. 16 Städte drin und das OPTIONFELD zeigt nun

ARRAY
ARRAY
ARRAY
...u.s.w insg. 16 x

So sieht die CONFIG aus

[tx_fesetcard_grossraum]
[exclude]=0
[label]=LLL:EXT:fe_setcard/locallang_db.xml:fe_users.tx_fesetcard_grossraum
[config]
[type]=select
[items]
[0]
[0]=LLL:EXT:fe_setcard/locallang_db.xml:fe_users.tx_fesetcard_grossraum.I.0
[1]=0

usw bis 16

Folgendes habe ich jetzt gecoded:

$GLOBALS['TSFE']->includeTCA();
$tca = t3lib_div::loadTCA('fe_users');

...

...

$grossraum = $GLOBALS['TCA']['fe_users']['columns']['tx_fesetcard_grossraum ']['config']['items'];
foreach($grossraum as $city=>$citynamen) {
$options .= '<option value="'.$city.'">'.$citynamen.'</option>';
}
$markerArray['###FGROSSRAUM###']= '<select name="'.$city.'">'.$options.'</select>';

Und das liefert mir 16 x ARRAY im PULL-DOWN des FORMULARs o.O .

Allerdings werden die values schon mit 1,2,3,4 u.s.w. im HTML ausgegeben.
Wie kann ich denn hier noch das ARRAY durch den reelen Namen austauschen.
Wenn ich testweise an das

$GLOBALS['TCA']['fe_users']['columns']['tx_fesetcard_grossraum']['config']['items']

noch noch ['0'] oder ['4'] dranhänge, dann erscheinen auch die Werte dazu, aber eben nur einmal, weil ich ja keine Schleife mehr habe, sondern direkt auf einen Eintrag springe.

Also wie bekomme ich noch $citynamen dazu mir nicht ARRAY sondern die Namen anzuzeigen?

Lieben Gruß Andreas

PS: Ich mache ein nettes ausfühliches TODO wenn es klappt :-)
denn ich glaube, dass können viele gebrauchen.

Übrigens die Performance ist im Moment nicht spürbar, also die Seite ist immer noch sehr schnell mit den Ausgaben.

froemken ·

Ich hab hier schon einen bugreport gesetzt, weil ich nicht verstehe, warum loadTCA auch noch ausgeführt werden soll, wenn schon includeTCA ausgeführt wurde. Ich finde das schlicht falsch und denke ein einfaches includetca sollte völlig ausreichen.

Mein Script schaut nun so aus:

$GLOBALS['TSFE']->includeTCA();
$felder = $GLOBALS['TCA']['fe_users']['columns']['tx_sftest_test']['config']['items'];
foreach($felder as $key=>$value) {
	if(t3lib_div::testInt($key)) {
		echo $key.' '.$GLOBALS['LANG']->sL($felder[$key][0]).'<br />';
		//echo $key.' '.$felder[$key][0].'<br />';
	}
}

Das mit den echos musst du wissen. Wenn einfach nur text drin steht, dann nimmst das untere, wenn da sowas wie LLL:EXT:blabla drinsteht, dann nimm das Obere.

Stefan

ÁndreMansfeld ·

VIELEN DANK! ES FUNKTIONIERT!

Und hier der Code um Formularfelder mit Werten aus den OPTIONS - FELDERN der Datenbank im FE anzuzeigen.

In der Datenbank ein Feld anlegen mit dem Feldtyp SELECTORBOX:
Achtung mehr als 20 schafft der Kickstarter nicht!

Z.B. STADT
Dann in die Optionsfelder die Städte eintragen:
Frankfurt
München
Hamburg ect.pp

speichern fertisch.

Im ***_pi1.php Code der Extension zur eigentlichen function ....

function main($content, $conf) {
.......
.......
$GLOBALS['TSFE']->includeTCA(); <- Das hier !!!!!!!
.......
}

hinzufügen.

Dann wie üblich SELECT ect. pp

Wenn man nun z.B. in einem FE Formular oder vielleicht auch nur die Variable aus den Options braucht, kann man sie sich so holen.

Ich habe dazu im HTML Template einen Marker gesetzt und habe diesen z.B.

###STADT### genannt.

Nun kann ich die Werte aus den OPTIONFELDERN mit

$stadt = $GLOBALS['TCA']['fe_users']['columns'][' NAME DER EXT _spaltennamen !!! ']['config']['items'];

foreach($stadt as $city=>$cityname) {
	$options .= '<option value="'.$city.'">'.$GLOBALS['LANG']->sL($stadt[$city][0]).'</option>';
} 
$markerArray['###STADT###']= '<select name="'.$city.'">'.$options.'</select>';

1. Der genaue PFAD zu den WERTEN findet man unter ADMIN TOOLS -> CONFIGURATION. Dort einfach solange + öffnen, bis man zu seinem Wert kommt. Dieser ist dann als Pfad für die

$GLOBALS['TCA']['fe_users']['columns']......

einzutragen.

2. Im Pfad nicht vergessen die Spalte an den Ext.Namen zu hängen. Z.B tx_test heißt die EXT dann lautet es so tx_test_stadt!!

Zeile 4 und 6 generieren mir das PULL DOWN im FE (ist eigentlich HTML mit php Werten für Name und Value).
Man kann auch die Formulare im Template definieren und sich die Werte holen.
Lässt sich dann einfacher mit CSS im WYSIWIG definieren

😉

Vielen lieben Dank an froemken der das hier zusammengecodet hat und sich richtig bemüht hat 😃 .

Lieben Gruß Andreas (und viel Spass damit... es macht so vieles einfacher)

froemken ·
ÁndreMansfeld schrieb

Vielen lieben Dank an froemken der das hier zusammengecodet hat und sich richtig bemüht hat 😃 .

Na das hört sich doch gut an. Danke :-)
Viel Erfolg damit.