$form, hook_form(), form_alter() Problem
Eingetragen von quiptime (4972)
am 28.11.2007 - 15:23 Uhr in
am 28.11.2007 - 15:23 Uhr in
Ich haenge grad fest.
Wenn ich dieses Array
<?php
$form['foo'] = array(
'#type' => 'select',
'#id' => 'bar',
'#title' => 'Hallo',
'#name' => 'Hallo',
'#options' => array(
'1,5' => t('A'),
'2,5' => t('B'),
'2,5' => t('C'))
);
?>
mit
<?php
theme_select($form['foo']);
?>
starte wird zwar das Array korrekt angezeigt aber ich erhalte einen Fehler
Warning: implode() [function.implode]: Bad arguments. in /www/htdocs/w008030f/dbox/includes/form.inc on line 621
Was mache ich falsch?
----------------------
quiptime
- Anmelden oder Registrieren um Kommentare zu schreiben
zumindest ist da jemand mit
am 28.11.2007 - 17:53 Uhr
zumindest ist da jemand mit nem ähnlichen problem
http://drupal.org/node/176349
vielleicht liegt der fehler ja vorher oder nachher im code?
» forward-media.de Drupal Entwicklung | Drupal Tutorials
drupal_get_form
am 28.11.2007 - 23:15 Uhr
So funktioniert es.
<?php
function foobar() {
$form['foo'] = array(
'#type' => 'select',
'#id' => 'bar',
'#title' => 'Hallo',
'#name' => 'Hallo',
'#options' => array(
'1,5' => t('A'),
'2,5' => t('B'),
'3,5' => t('C'))
);
return $form;
}
?>
<?php
print drupal_get_form('foobar');
?>
Man muss einfach nur lesen. ;-)
http://api.drupal.org/api/file/developer/topics/forms_api.html/5
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Ich kaempfe gerade mit der
am 29.11.2007 - 14:16 Uhr
Ich kaempfe gerade mit der Form API.
Neues Problem. Es geht dabei darum ein erstelltes Array nachtraeglich zu aendern. Beispielsweise um an den Anfang zu erweitern in dem ein neuer Eintrag hinzugefuegt wird.
Zunaechst dachte ich mit array_unshift komme ich einfach zum Ergebnis. Denkste. Wenn ich das Array unmittelbar vor seiner Ausgabe durch
drupal_get_form('foobar');
anspreche um mit array_unshift eine Erweiterung des Array vorzunehmen komme ich an das Array nicht ran. Es ist nicht da.Ein print_r($form), print_r($form['foobar']) oder print_r($form->foobar) zeigt nichts an - die Variable $form ist an der Stelle nicht verfuegbar. Und das obwohl ich das Array mit
drupal_get_form('foobar');
an dieser Stelle ausgeben kann.Wie komme ich an $form ran? Vermutlich irgend eine Drupalfunktion. Hat Jemand eine Idee oder Tipp?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
hook_form_alter()
am 29.11.2007 - 17:06 Uhr
hook_form_alter() (http://api.drupal.org/api/function/hook_form_alter/5)
» forward-media.de Drupal Entwicklung | Drupal Tutorials
Mein Array<?phpfunction
am 29.11.2007 - 17:35 Uhr
Mein Array
<?php
function foobar() {
$form['foo'] = array(
'#type' => 'select',
'#id' => 'bar',
'#title' => 'Hallo',
'#name' => 'Hallo',
'#options' => array(
'1,5' => t('A'),
'2,5' => t('B'),
'3,5' => t('C'))
);
return $form;
}
?>
Erweitern will ich das Array im Array:
'#options' => array(
'1,5' => t('A'),
'2,5' => t('B'),
'3,5' => t('C'))
Mit hook_form_alter()
function hook_form_alter($form_id, &$form) {
if (isset($form['type']) && $form['type']['#value'] .'_node_settings' == $form_id) {
$form['workflow']['upload_'. $form['type']['#value']] = array(
'#type' => 'radios',
'#title' => t('Attachments'),
'#default_value' => variable_get('upload_'. $form['type']['#value'], 1),
'#options' => array(t('Disabled'), t('Enabled')),
);
}
}
sehe ich momentan noch nicht wie ich damit an das Array im Array rankomme.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Das müsste eigentlich so
am 29.11.2007 - 17:43 Uhr
Das müsste eigentlich so gehen (Ich muss aber zugeben, dass ich es selber noch nicht gebraucht hab. Prinzip stimmt aber.):
<?php
function hook_form_alter($form_id, &$form) {
// Wird für jede form aufgerufen deshalb über $form_id auswählen
if ($form_id == 'id_deiner_form') {
// entweder so
$form['foo'] = array(
'#type' => 'select',
'#id' => 'bar',
'#title' => 'Hallo',
'#name' => 'Hallo',
'#options' => array(
'1,5' => t('A'),
'2,5' => t('B'),
'3,5' => t('C'))
);
// oder so
$options = array(
'1,5' => t('A'),
'2,5' => t('B'),
'3,5' => t('C')
);
$form['foo'] = array(
'#type' => 'select',
'#id' => 'bar',
'#title' => 'Hallo',
'#name' => 'Hallo',
'#options' => $options
);
}
}
?>
Wenn du das $options array nicht in das form array (siehe "oder so") direkt reinschreibst, reichts wahrscheinlich wenn du einfach nur das array $options übergibst (ohne $form['foo']).
» forward-media.de Drupal Entwicklung | Drupal Tutorials
Danke Dir. Werde das
am 29.11.2007 - 18:51 Uhr
Danke Dir. Werde das probieren.
Aber der eigentliche Witz an der Sache ist Folgender:
Mein Array
<?php
$options = array(
'1,5' => t('A'),
'2,5' => t('B'),
'3,5' => t('C')
);
?>
hat knapp 200 Eintraege und befindet sich in einer Theme-Funktion - damit Anwender es anpassen koennen. Meine Aenderung dieses Arrays um einen Eintrag am Anfang erfolgt nicht einmalig sondern aktionsbezogen und soll immer unabhaengig vom aktuellen Inhalt des Array erfolgen. Unabhaengig vom aktuellen Inhalt deswegen weil ein Anwender ja durch die Theme-Funktionaltaet das Array geaendert haben kann.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
noch immer keine Aenderungsmoeglichkeit
am 30.11.2007 - 10:52 Uhr
Ich habe noch immer keine Moeglichkeit gefunden, folgendes Select-Feld zu aendern.
Das Formelement wird in einem Nodetype erzeugenden Modul und in diesem nicht innerhalb von
function mymodul_hook_form()
erstellt, das dieses Select-Feld nicht im Editformular sondern nur bei der Anzeige von Nodes verwendet wird. Da es nicht infunction mymodul_hook_form()
erstellt wird verwende ich die<?php
function extra_select() {
$form['extra_select'] = array(
'#type' => 'select',
'#id' => 'bar',
'#title' => 'Hallo',
'#name' => 'Hallo',
'#options' => array(
'1,5' => t('A'),
'2,5' => t('B'),
'3,5' => t('C'))
);
return $form;
}
?>
Um dieses Select-Feld auszugeben verwende ich es innerhalb der
function mymodul_view()
in dieser Art:<div id="extra_select">'.drupal_get_form('world_country_to_latlng').'</div>
Das Funktioniert und ich kann das Selectfeld verwenden.
Nun das Problem.
Die Aenderung des Arrays
#options
soll ereignisgesteuert erfolgen. Also muss ich innerhalb derfunction extra_select()
diese Ereignisparameter wie auch die Aenderungswerte zur Verfuegung haben um die Aenderung von#options
steuern zu koennen. Aber genau das ist nicht moeglich. Ich bekomme keine Parameter oder Werte wie beispielsweise$node->check
oderarray('3,5' => t('D'))<c/ode> an diese Funktion uebergeben bzw. sie stehen sie mir in der Funktion nicht zur Verfuegung.
Die <code>function extra_select()
An einen Parameter wie
$node->check
bzw.array('3,5' => t('D'))<c/ode> komme ich damit nicht heran. Die stehen mir zwar in <code>function mymodul_view()
zur Verfuegung aber nicht in derfunction extra_select()
.Auch
hook_form_alter
kann ich nicht anwenden da diefunction extra_select()
ja keine Hook Funktion ist.Es muss doch eine Moeglichkeit geben das Array
$form['extra_select']
, nach dem es erstellt ist, zu aendern.Entweder mache ich bei der oben geschilderten Vorgehensweise etwas falsch oder es gibt noch eine andere Moeglichkeit das Array
$form['extra_select']
zu erstellen/verwenden.Eine Loesung waere moeglicherweise, das Array
$form['extra_select']
doch innerhalb vonfunction mymodul_hook_form()
zu erzeugen. Aber bei dieser Variante wird es in der Editform der Nodes angezeigt - was nicht sein darf.Wie erreiche ich, das Array
$form['extra_select']
infunction mymodul_hook_form()
zu erzeugen und es nicht im Node-Editformular anzuzeigen?Sieht Jemand meinen Denkfehler bzw. hat eine Idee?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Hi quiptime, ganz
am 30.11.2007 - 11:02 Uhr
Hi quiptime,
ganz grundsätzlich verstehe ich nicht warum hook_form_alter() nicht funktionieren sollte.
Wenn du ein Formelement hast und es per drupal_get_form('world_country_to_latlng') aufrufst, dann wird bevor die Form ausgegeben wird, durch drupal_get_form() automatisch hook_form_alter() aufgerufen.
deinmodul_form_alter('world_country_to_latlng') sollte doch funktionieren. Oder habe ich jetzt wieder nicht verstanden was du machen willst.
» forward-media.de Drupal Entwicklung | Drupal Tutorials
Formelement nicht innerhalb von mymodule_hooh_form() definiert
am 30.11.2007 - 11:54 Uhr
Hi quiptime,
ganz grundsätzlich verstehe ich nicht warum hook_form_alter() nicht funktionieren sollte.
Wenn du ein Formelement hast und es per drupal_get_form('world_country_to_latlng') aufrufst, dann wird bevor die Form ausgegeben wird, durch drupal_get_form() automatisch hook_form_alter() aufgerufen.
Ich habe bisher mein Formelement nicht innerhalb von mymodule_hooh_form() definiert weil es dadurch auf der Bearbeitenseite der Nodes erscheint. Das soll es aber nicht. Das Formelement wird ausschliesslich bei der Anzeige der Nodes verwendet.
Aus diesem Grund definiere ich mein Formelement ausserhalb von mymodule_hooh_form(). Und das ist wohl der Grund warum hook_form_alter() fuer dieses Formelement nicht funktioniert. Ich denke das ist mein Problem und die Frage ist wie kann ich diese Situation aendern?
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
Zitat:deinmodul_form_alter(
am 30.11.2007 - 12:04 Uhr
deinmodul_form_alter('world_country_to_latlng') sollte doch funktionieren.
Was meinst Du mit deinmodul_form_alter('world_country_to_latlng')? Was soll das sein bzw. wie wende ich das Deiner Meinung nach an?
Als function deinmodul_form_alter('world_country_to_latlng') kann ja nicht sein.
Edit
<div id="extra_select">'.drupal_get_form('world_country_to_latlng').'</div>
Dieser Code bezogen auf mein Beispielarray muss natuerlich lauten
<div id="extra_select">'.drupal_get_form('extra_select').'</div>
Aber das aendert am beschriebenen Problem nichts. War nur ein Copy/Paste Fehler.
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.
quiptime wrote: Als
am 30.11.2007 - 15:55 Uhr
Als function deinmodul_form_alter('world_country_to_latlng') kann ja nicht sein.
Vielleicht irre ich mich auch total. Dann ignoriers einfach ;-)
z.B. auch so in der template.php
http://de.pastebin.ca/613113
» forward-media.de Drupal Entwicklung | Drupal Tutorials
Ich habe eine Loesung
am 01.12.2007 - 17:26 Uhr
Ich habe eine Loesung gefunden. Hier geht es zum Weg in Richtung Loesung:
Form API: hook_form() http://www.drupalcenter.de/node/6828
-------------
quiptime
Nur tote Fische schwimmen mit dem Strom.
Da geht noch was.