Themen eines Node-Formulars
Hin und wieder kommt es vor, dass man das Formular eines bestimmten Inhaltstypen ein wenig umstrukturieren möchte.
Dies lässt sich mit ein wenig Code-Einsatz relativ einfach bewerkstelligen.
In diesem Tutorial gehe ich von "Garland" als Theme und einem Inhaltstyp namens "article" aus.
Zuerst müssen wir Drupal mitteilen, dass wir die Gestaltung des entsprechenden Formulars selbst in die Hand nehmen wollen. Dazu müssen wir in der template.php unseres Themes eine Instanz der Funktion hook_theme erstellen (bzw. eine vorhandene Instanz erweitern):
<?php
function garland_theme($existing, $type, $theme, $path) {
return array(
'article_node_form' => array(
'arguments' => array('form' => NULL),
'template' => 'article-node-form',
),
);
}
?>
Mit diesem Code sagen wir Drupal jetzt, dass die Darstellung des Formulars von nun an über ein Template namens "article-node-form.tpl.php" erfolgen soll. Das Template bekommt (sinnigerweise) als Argument die Daten des Formularobjektes ($form
) übergeben.
Bevor wir jetzt das Template erstellen, wollen wir vielleicht noch ein paar der verfügbaren Variablen oder auch einige Elemente des Formulars verändern.
Dies geschieht in einer entsprechenden preprocess Funktion:
<?php
function garland_preprocess_article_node_form(&$vars) {
// drupal_set_message('<pre>'. print_r($vars['form'], 1) .'</pre>'); // Die Struktur des Formulars ansehen.
// Aus dem Submit-Button einen Image-Button machen.
$vars['form']['buttons']['submit']['#type'] = 'image_button';
$vars['form']['buttons']['submit']['#src'] = drupal_get_path('theme', 'garland') .'/images/submit.png';
// Länge des Titelfeldes ändern.
$vars['form']['title']['#size'] = 30;
// Beschreibung des Titelfeldes ändern.
$vars['form']['title']['#description'] = 'Der Titel des Artikels.';
// Das Titelfeld als einfache Variable ($field_title) im Template verfügbar machen.
$vars['field_title'] = drupal_render($vars['form']['title']);
// CCK Feld namens 'field_test' (eine einfache Checkbox).
// Titel verändern.
$vars['form']['field_test']['value']['#title'] = t('Happy?');
// Beschreibung verändern.
$vars['form']['field_test']['value']['#description'] = t('Click to select');
// Das Feld als einfache Variable ($field_check) im Template verfügbar machen.
$vars['field_check'] = drupal_render($vars['form']['field_test']);
// Body
// Anzahl der Zeilen im Body-Feld ändern.
$vars['form']['body_field']['body']['#rows'] = 10;
// Body-Feld als einfache Variable ($field_body) im Template verfügbar machen.
$vars['field_body'] = drupal_render($vars['form']['body_field']);
// Fieldsets als einfache Variablen im Template verfügbar machen.
$vars['field_menu'] = drupal_render($vars['form']['menu']);
$vars['field_revision'] = drupal_render($vars['form']['revision_information']);
$vars['field_author'] = drupal_render($vars['form']['author']);
$vars['field_options'] = drupal_render($vars['form']['options']);
$vars['field_comment_settings'] = drupal_render($vars['form']['comment_settings']);
// Schaltflächen.
$vars['buttons'] = drupal_render($vars['form']['buttons']);
}
?>
Jetzt können wir das Template erstellen.
<?php
// Die Namen aller verfügbaren Variablen ausgeben.
// drupal_set_message('<pre>'. var_export(array_keys(get_defined_vars()), 1) .'</pre>');
?>
<?php // Felder ausgeben. ?>
<?php // Ohne die preprocess müsste man "print drupal_render($form['title']);" schreiben. ?>
<?php print $field_title; ?>
<?php print $field_body; ?>
<div class="my-check">
<?php print $field_check; ?>
</div>
<div class="extra-fields">
<?php print $field_author; ?>
<?php print $field_revision; ?>
<?php print $field_menu; ?>
<?php print $field_comment_settings; ?>
</div>
<div class="form-buttons">
<?php print $buttons; ?>
</div>
<?php // Alle anderen Felder und Ausgaben nicht anzeigen (setzt natürlich ein "display: none;" für die CSS-Klasse voraus). ?>
<div class="hidden">
<?php print drupal_render($form); ?>
</div>
Und schon ist das Node-Formular für diesen Inhaltstypen ein wenig umstrukturiert.
Danke Stefan, das ist selbst
am 15.09.2009 - 17:22 Uhr
Danke Stefan, das ist selbst für Nichtprogrammierer gut erklärt :-)
Gerade heute wollte ich es ausprobieren, dann fand ich allerdings das recht neue Modul "Interface", was obige Prozedur vereinfacht und auch sehr stark beschleunigt. Ich habe es probiert und bin sehr zufrieden.
http://www.twitter.com/aschiwi
http://www.twitter.com/aschiwi
Drupal-Initiative e.V.
Interface modul
am 15.09.2009 - 17:42 Uhr
Das ist ja ein Wahnsinn!
vg
--
md - DrupalCenter.de
mdwp*
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services