Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Modul-Entwicklung ›

$form, hook_form(), form_alter() Problem

Eingetragen von quiptime (4972)
am 28.11.2007 - 15:23 Uhr in
  • Modul-Entwicklung
  • Drupal 5.x

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

‹ Probleme mit form_validate und form_set_value Warum funktioniert das nicht? ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

zumindest ist da jemand mit

Eingetragen von derjochenmeyer@... (591)
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?

  • Anmelden oder Registrieren um Kommentare zu schreiben

drupal_get_form

Eingetragen von quiptime (4972)
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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich kaempfe gerade mit der

Eingetragen von quiptime (4972)
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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

hook_form_alter()

Eingetragen von derjochenmeyer@... (591)
am 29.11.2007 - 17:06 Uhr

hook_form_alter() (http://api.drupal.org/api/function/hook_form_alter/5)

  • Anmelden oder Registrieren um Kommentare zu schreiben

Mein Array<?phpfunction

Eingetragen von quiptime (4972)
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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Das müsste eigentlich so

Eingetragen von derjochenmeyer@... (591)
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']).

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke Dir. Werde das

Eingetragen von quiptime (4972)
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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

noch immer keine Aenderungsmoeglichkeit

Eingetragen von quiptime (4972)
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 in function 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 der function 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 oder

array('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()
ist derart "geschuetzt" das ich einzig globale Drupalfunktionen verwenden kann um irgendwelche Parameter oder Variablenwerte innerhalb dieser Funktion aufzurufen/abzufragen.
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 der function extra_select().

Auch hook_form_alter kann ich nicht anwenden da die function 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 von function 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'] in function 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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hi quiptime, ganz

Eingetragen von derjochenmeyer@... (591)
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.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Formelement nicht innerhalb von mymodule_hooh_form() definiert

Eingetragen von quiptime (4972)
am 30.11.2007 - 11:54 Uhr
derjochenmeyer@drupal.org schrieb

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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Zitat:deinmodul_form_alter(

Eingetragen von quiptime (4972)
am 30.11.2007 - 12:04 Uhr
Zitat:

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

Zitat:

<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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

quiptime wrote: Als

Eingetragen von derjochenmeyer@... (591)
am 30.11.2007 - 15:55 Uhr
quiptime schrieb

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

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich habe eine Loesung

Eingetragen von quiptime (4972)
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.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
Weiter

Neue Kommentare

  • Inzwischen sind wir bei
    vor 1 Tag 16 Stunden
  • Migrieren von D7 auf D8/ D10/ D11
    vor 2 Tagen 8 Stunden
  • melde mich mal wieder, da ich
    vor 7 Wochen 6 Tagen
  • Hey danke
    vor 8 Wochen 7 Stunden
  • Update: jetzt gibt's ein
    vor 8 Wochen 1 Tag
  • Hallo, im Prinzip habe ich
    vor 8 Wochen 5 Tagen
  • Da scheint die Terminologie
    vor 8 Wochen 5 Tagen
  • Kannst doch auch alles direkt
    vor 9 Wochen 2 Tagen
  • In der entsprechenden View
    vor 9 Wochen 2 Tagen
  • Dazu müsstest Du vermutlich
    vor 9 Wochen 2 Tagen

Statistik

Beiträge im Forum: 250235
Registrierte User: 20462

Neue User:

  • marouane.blel
  • capilclinic
  • Quabzibboter

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 13 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association