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 - 20: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 - 11: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 - 12: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 (1559)
am 28.06.2010 - 12: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 - 13: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 (1559)
am 28.06.2010 - 13: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

  • 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 22 Stunden 41 Minuten
  • Migrieren von D7 auf D8/ D10/ D11
    vor 1 Tag 14 Stunden
  • melde mich mal wieder, da ich
    vor 7 Wochen 5 Tagen
  • Hey danke
    vor 7 Wochen 6 Tagen
  • Update: jetzt gibt's ein
    vor 8 Wochen 7 Stunden
  • Hallo, im Prinzip habe ich
    vor 8 Wochen 4 Tagen
  • Da scheint die Terminologie
    vor 8 Wochen 4 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 16 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