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

Formular ohne hook_form_alter modifizieren [gelöst]

Eingetragen von drubb (580)
am 27.06.2010 - 21:16 Uhr in
  • Modul-Entwicklung
  • Drupal 6.x

Blödes Problem, bei dem ich nicht weiter komme: in einem Modul habe ich ein kleines Formular definiert, sowie einen passenden Submit-Handler dazu. Etwa so:

function mymodule_form(&$form_state) {
  $form = array();
  $form['text'] = array(
    '#title' => t('Help text'),
    '#type' => 'textarea',
  );
  $form['submit'] = array(
    '#value' => t('Save'),
    '#type' => 'submit',
    '#weight' => 99,
  );
  return $form;
}

function mymodule_form_submit(&$form, &$form_state) {
  // Mach was mit dem Formular...
}

Jetzt möchte ich dieses Formular in einem Template (xyz.tpl.php) verwenden. Die Standardmethode dafür ist folgende:

<?php print drupal_get_form('mymodule_form'); ?>

Das funktioniert auch, das Formular wird angezeigt, ich kann etwas eingeben, das Formular abschicken, und der Submit-Handler wird aufgerufen und macht den Rest. Aber jetzt zum eigentlichen Problem: ich möchte das Formular vor der Ausgabe verändern, z.B. vorbelegen. drupal_get_form liefert aber das fertige HTML. Normalerweise würde man hook_form_alter verwenden, um Änderungen vorzunehmen. Diese Methode kann ich hier nicht benutzen, da die benötigten Variablen nur in dem betroffenen Template zur Verfügung stehen. Also habe ich im Template anstelle von drupal_get_form folgenden Ansatz versucht:

<?php
  $form_state
= array();
 
$form = drupal_retrieve_form('mymodule_form',$form_state);
 
drupal_prepare_form ('mymodule_form',$form,$form_state);
 
$form['text']['#value']  = 'Irgendein Text';
 
drupal_process_form ('mymodule_form',$form,$form_state);
  print
drupal_render_form ('mymodule_form',$form);
?>

Das Formular wird auch angezeigt, mit dem geänderten Feldinhalt. Aber der Submit-Handler wird nicht mehr aufgerufen, obwohl er im Formular enthalten ist. Ich kann das Formular also nicht weiter verarbeiten.
Die Funktionen drupal_retrieve_form, drupal_prepare_form und drupal_process_form sind leider nicht sonderlich gut dokumentiert, bzw. einfach selten verwendet. Ich weiss nicht ob das der richtige Weg ist. Auf jeden Fall funktioniert es so nicht.

Gibt es vielleicht einen besseren Weg? Oder mache ich was falsch?

Danke und Gruß,
Boris

‹ Modul zum Downloaden von Bildern Tabs im Modul hinzufügen ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Anderer Ansatz

Eingetragen von tiger (415)
am 28.06.2010 - 12:37 Uhr

Ich wähle jeweils einen anderen Ansatz. Default Werte kann man direkt im Formular setzten, mit der Funktion variable_get sogar dynamische. Das Aussehen passe ich jeweils so an, dass ich mit prefix und suffix beliebige

hiinzufüge und die dann über css anspreche und theme.

http://api.drupal.org/api/drupal/developer--topics--forms_api_reference....

  • Anmelden oder Registrieren um Kommentare zu schreiben

Jaaah...

Eingetragen von drubb (580)
am 28.06.2010 - 13:01 Uhr

Danke, das ist gar nicht so dumm. Also im Template eine Variable setzen, die im Formular angezogen wird, und dann das Formular wie im ersten Ansatz behandeln:

function mymodule_form(&$form_state) {
  $form = array();
  $form['text'] = array(
    '#title' => t('Help text'),
    '#value' => variable_get ('myvar','');
    '#type' => 'textarea',
  );
  $form['submit'] = array(
    '#value' => t('Save'),
    '#type' => 'submit',
    '#weight' => 99,
  );
  return $form;
}

Und im Template:

<?php variable_set ('myvar','Irgendwas steht hier'); ?>
<?php print drupal_get_form('mymodule_form'); ?>

Wenn das aber kein statischer Defaultwert ist, überschreiben sich die User den Inhalt gegenseitig, oder man muss lustige Arrays in der Variablentabelle speichern und diese ziemlich aufblähen. Aber ich denke mal drüber nach.

Ne andere Möglichkeit wäre, auf hook_form zu verzichten und das Formular komplett im Template aufzubauen. Hab ich so aber noch nicht gemacht, muss mich erst einlesen.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hab mal grad nen bissl

Eingetragen von Sense (1560)
am 28.06.2010 - 13:18 Uhr

Hab mal grad nen bissl rumprobiert, teste mal folgendes:

<?php

function mymodule_form(&$form_state, $values) {
 
$form = array();
 
 
$form['text'] = array(
   
'#title' => t('Help text'),
   
'#type' => 'textarea',
   
'#default_value' => $values['text'],
  );

 
$form['submit'] = array(
   
'#value' => t('Save'),
   
'#type' => 'submit',
   
'#weight' => 99,
  );

  return
$form;
}
?>

und im Template

<?php

$values
= array(
 
'text' => 'test',
);
 
echo
drupal_get_form('mymodule_form', $values);
?>

  • Anmelden oder Registrieren um Kommentare zu schreiben

Super!

Eingetragen von drubb (580)
am 28.06.2010 - 14:16 Uhr

Das klappt einwandfrei, vielen Dank! Manche Sachen in der API Dokumentation kann man drei Mal lesen, und bemerkt sie immer noch nicht:

Zitat:

5 – 7 drupal_get_form($form_id)

... Any additional arguments are passed on to the functions called by drupal_get_form(), including the unique form constructor function. For example, the node_edit form requires that a node object be passed in here when it is called.

Auf die Idee, hier einfach mal nen zweiten Parameter zu verwenden, wäre ich so schnell nicht gekommen!

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hehe, ja genau das hab ich

Eingetragen von Sense (1560)
am 28.06.2010 - 14:23 Uhr

Hehe, ja genau das hab ich auch gelesen und einfach nen 2. Parameter eingebunden. Die meiste Zeit ging beim Anlegen des Moduls drauf ... ;)

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Neuinstallation: vermutlich ein rewrite-Problem
  • Drupal CMS installieren
  • [erledigt]MP3 in Drupal 10 einbinden
  • (gelöst)Drupal 11 installieren
  • Titel ausblenden
  • Ich brauche dringen Hilfe zu Updates oder ggf. wwie geht Composer?
  • Dynamische Ansicht von Seiteninhalt (als Tabelle?)
  • Vergabe von Berechtigungen für bestimmte Rollen; mir fehlt der Haken bzw. das „Veröffentlicht“
  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • Rolle erstellen nicht zu finden
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
Weiter

Neue Kommentare

  • Was für einen Server benutzt
    vor 1 Woche 1 Tag
  • Wenn die Subdomain auf
    vor 1 Woche 3 Tagen
  • ordnerstruktur
    vor 1 Woche 4 Tagen
  • Die Subdomain muß auf den
    vor 1 Woche 6 Tagen
  • Verwende doch das Tag dafür,
    vor 5 Wochen 1 Tag
  • Guckst du hier: step by step
    vor 5 Wochen 1 Tag
  • Guckst du hier: step by step
    vor 5 Wochen 1 Tag
  • Ich habe ja keine Angst vor
    vor 6 Wochen 3 Tagen
  • Ist grundsätzlichmachbar – aber nichts für „einfach mal schnell“
    vor 6 Wochen 5 Tagen
  • Vielen Dank erst einmal, aber
    vor 7 Wochen 9 Stunden

Statistik

Beiträge im Forum: 250289
Registrierte User: 20517

Neue User:

  • Wolf Dab
  • Scottteday
  • MichaelPeeno

» Alle User anzeigen

User nach Punkten sortiert:
wla9466
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 28 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