[erledigt]Settings: textfield in Array speichern
am 04.12.2010 - 14:40 Uhr in
Hi,
ich möchte in den Einstellungen von meinem Modul die textfield-Eingaben als Array speichern. Die Werte werden wie folgt eingegeben: 2,2,2,22,2
Die $form wird mit system_settings_form() generiert.
Die Eingaben werden über blubb_validate() validiert.
Das Problem:
Ich kriege es nicht auf die Reihe an geeigneter Stelle variable_set('bla', explode(',' $textfield) zu setzen. Immer wieder steht die Variable als String in der Tabelle variable und nicht als gewünschter Array.
Wo muss ich mich einhängen? Oder läuft das ganz anders?
- Anmelden oder Registrieren um Kommentare zu schreiben

Hi, die variables Tabelle in
am 04.12.2010 - 18:53 Uhr
Hi,
die variables Tabelle in mysql kennt nur Text. Und ein Feldtyp Array existiert nicht. Also musst du die Daten als Text speichern. Entweder du speicherst direkt deinen 2,2,2 String. Oder du machst ein explode drauf und speicherst das array per serialize. Aber anders wirst du da nichts erreichen.
Das in der MySQL-Tabelle nur
am 05.12.2010 - 11:43 Uhr
Das in der MySQL-Tabelle nur Text steht ist mir klar, aber die variable-Tabelle beinhaltet Strings wie z.B. a:3:{s:12:"participants";s:12:"participants";s:14:"thread_started";i:0;s:5:"count";i:0;}. Diese werden mir variable_get() als Array zurückgeliefert. Und so will ich meine Zeichenkette auch abspeichern. Könnte es natürlich manuell erreichen, aber dachte es gebe noch andere Möglichkeiten.
Das was du dort siehst, sind
am 05.12.2010 - 15:48 Uhr
Das was du dort siehst, sind serialisierte Arrays und als solche musst du diese speichern.
http://php.net/manual/de/function.serialize.php
Achso! Das ist gar keine
am 05.12.2010 - 16:38 Uhr
Achso! Das ist gar keine Drupaleigenheit. Erstmal danke für diese Info.
Aber trotzdem bleibt das Problem. serialize() muss ich ja gar nicht verwenden. Das macht variable_set() ja für mich. Aber wann/wo speichere ich die Eingabe von textfield?
So ist der gewünschte Ablauf:
1. #default_value von textfield: implode(',' variable_get('bla', array(1,1,1)));
2. neuer String wird in textfield eingegeben: "2,2,2"
3. variable_set('bla', explode(',' String));
Wie setzte ich das um? Mir funkt system_settings_form() irgendwie immer dazwischen. Letztendlich steht die Variable doch als serialisierter Sring in der Tabelle.
Hö? Wenn du ein Textfeld in
am 05.12.2010 - 17:13 Uhr
Hö? Wenn du ein Textfeld in einem Formular verwendest, welches über system_settings_form gespeichert wird, dann packt Drupal die Einstellungen automatisch in die Variablen-Tabelle, unter dem Bezeichner des Textfeldes.
Beispiel:
<?php$form['mein_textfeld'] = array(
'#type' => 'textfield',
'#title' => 'Mein Textfeld',
'#description' => 'Gib hier was ein',
'#size' => 10,
'#default_value' => variable_get('mein_textfeld', 'mein_standardwert'),
);
?>
Damit werden die Inhalte des Felds unter "mein_textfeld" gespeichert und können über
<?php variable_get('mein_textfeld', 'mein_standardwert'); ?>abgerufen werden. Wo liegt denn da das Problem?Und wenn du damit insgesamt nicht zufrieden bist, dann mach eben kein
<?php return system_settings_form($form); ?>sondern nur ein<?php return $form; ?>. Dann musst du dir zusätzlich noch eine eigene Submit-Funktion schreiben, in der du das Textfeld auslesen und nach eigenen Wünschen formatieren und mit variable_set() speichern kannst.<?php '#default_value' =>
am 05.12.2010 - 17:46 Uhr
<?php'#default_value' => variable_get('mein_textfeld', 'mein_standardwert'),
?>
Eine eigene Submit-Funktion wäre im Prinzip möglich, aber es muss doch möglich sein, das eine spezielle Feld gesondert zu verarbeiten.
Wenn der Wert aus dem Feld
am 05.12.2010 - 19:45 Uhr
Wenn der Wert aus dem Feld mittels variable_set in die Variablen-Tabelle eingetragen wurde, dürfte doch der Rückweg über variable_get genauso laufen, oder?
Wenn du in dein Textfeld "2,2,22,2" einträgst, dann wird das so in die Variablen-Tabelle gelegt und genauso wieder rausgenommen und kann als default_value verwendet werden. Wo liegt denn da eigentlich das Problem? Wenn du das so in das Feld einträgst, wieso muss das denn dann unbedingt als Array gespeichert werden? Geht doch auch so, oder?
Exterior schrieb Wenn du das
am 05.12.2010 - 20:01 Uhr
Wenn du das so in das Feld einträgst, wieso muss das denn dann unbedingt als Array gespeichert werden? Geht doch auch so, oder?
Weil das unschön ist. Das ist ja eine Moduleinstellung auf die später zugegriffen werden muss. Wenn das nicht als Array gespeichert wird, dann muss ich ja jedes Mal den zurückgelieferten String in ein Array wandeln.
So ist meine momentane "Lösung". Eher ein Workarround:
<?php
function modul_settings() {
//restlichen $forms
$values = array(2,2,2,2,2,2,2,2,2,2,2);
$values = variable_get('blubb', $values);
$values_string = implode(',', $values);
$form['bli']['bla'] = array(
'#type' => 'textfield',
'#default_value' => $values_string,
);
variable_del('bla')
$form['#submit'][] = 'special_submit';
return system_settings_form($form);
}
function special_submit($form, &$form_state) {
variable_set('blubb', explode(',', $form_state['values']['bla']}
?>
Ich kann irgendwie nicht direkt bla speichern und geh den Umweg mit blubb. In bla fuscht mir system_settings_form_submit() immer rein.
Zitat: In bla fuscht mir
am 05.12.2010 - 20:30 Uhr
In bla fuscht mir system_settings_form_submit() immer rein.
Natürlich "pfuscht" dir da system_settings_form_submit() rein, weil die eben so funktioniert und ausgeführt wird.
Weil das unschön ist. Das ist ja eine Moduleinstellung auf die später zugegriffen werden muss. Wenn das nicht als Array gespeichert wird, dann muss ich ja jedes Mal den zurückgelieferten String in ein Array wandeln.
Das würde ich eher in kauf nehmen, als diese sinnlose Doppelspeicherung, die du mit dem Code da oben erzeugst. Damit wird jedesmal der eingegebene String in "bla" und das Array in "blubb" gespeichert, ergo der gleiche Kram zweimal. DAS ist viel unschöner.
Da würde ich doch eher den Weg gehen, den String bei Benutzung in ein Array umzuwandeln, ist nun auch nicht die Welt.
Oder du speicherst es wirklich als Array in der Tabelle, dann solltest du aber - wie bereits weiter oben geschrieben - nict return system_settings_form($form) nehmen, sondern ein ganz normales return $form inkl. Submit-Funktion, damit umgehst du die Doppelspeicherung. Aber das was du da in dem Code machst ist völlig sinnfrei.
Hi, mit der Doppelspeicherung
am 06.12.2010 - 13:54 Uhr
Hi,
mit der Doppelspeicherung hast du sicher recht, deswegen lösche ich die Variable direkt wieder. Also steht letztendlich nur das Array in der Tabelle.
Dachte mir, dass diese "Arbeit" nur bei Änderung der Settings ausgeführt wird, also relativ selten. Die Wandlung von String in Array muss aber häufiger ausgeführt werden.
Ein ganz normales return $form wäre natürlich auch möglich. Dieses würde aber eigentlich wie die drupaleigene Funktion aussehen mit dem einzigen Unterschied, dass der $form_state['values']['blubb'] anders behandelt wird. Alle anderen $form sollen ganz normal behandelt werden. Deswegen wollte ich nur den "blubb" gesondert behandeln. Könnte natürlich die system_settings_form_submit() kopieren und innerhalb der foreach-Schleife "blubb" abfangen und als Array speichern.
Ist das mit dem variable_del('bla') wirklich so sinnfrei oder kann man das machen? Oder doch lieber eine eigene form_submit() auf Basis von system_settings_form_submit()?
Viele Grüße
Hoppla, das variable_del
am 06.12.2010 - 16:33 Uhr
Hoppla, das variable_del hatte ich übersehen, sorry. Dann dürfte es eigentlich funktionieren, denke ich (Allerdings fehlt in dem Code oben hinter variable_del ein Semikolon :-P)
Exterior schrieb Hoppla, das
am 06.12.2010 - 16:52 Uhr
Hoppla, das variable_del hatte ich übersehen, sorry. Dann dürfte es eigentlich funktionieren, denke ich (Allerdings fehlt in dem Code oben hinter variable_del ein Semikolon :-P)
Na dann ist es ja kein Wunder, dass du das übersehen hast. ;) Ich setze den Thread mal auf erledigt.