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

Neues Feld mit hook_form_alter. Wo sind die Daten nach 'Preview'?

Eingetragen von sr (6)
am 04.12.2009 - 10:35 Uhr in
  • Modul-Entwicklung
  • Drupal 6.x

Hallo ihr da draußen. Ich bin gerade dabei meine ersten Erfahrungen mit der Modulentwicklung unter drupal zu machen. Mein eigentliches Ziel ist es der forum_node_form ein neues Textfeld für ein Datum hinzuzufügen. Das habe ich dann auch relativ leicht geschaft, nun besteht jedoch das Problem, dass das Eingabefeld nach der Vorschau leer ist. Also den vom Benutzer eingegebenen Wert vergisst.

Wenn ich während der validate-Phase mit form_set_error() einen Fehler setze bleibt der Inhalt erhalten. Nur wenn die Daten die Validierung passieren vergisst er sie. Was mache ich falsch?

Ich hab mal den Code eingedampft und ein minimales Modul erstellt welches das Problem ebenfalls zeigt. (Angepasst von: http://www.drupalcenter.de/node/16058 )

<?php
function meinmodul_form_alter(&$form, $form_state, $form_id) {
 
//if ($form_id == 'forum_node_form') {
   
$form['extra_feld'] = array(
     
'#type' => 'textfield',
     
'#title' => t('Extra'),
     
//'#default_value' => t('Additional info'),
   
);
   
$form['#validate'][] = 'meinmodul_validate_handler';
   
$form['#submit'][] = 'meinmodul_submit_handler';
 
//}
}
function
meinmodul_validate_handler($form, &$form_state) {
 
//if ($form['form_id'] == 'forum_node_form') {
  //print_r($form_state);
   
if (strlen($form_state['values']['extra_feld']) < 3) {
     
form_set_error('extra_feld', t('You have to enter at least 3 characters.'));
    }
// }
}
function
meinmodul_submit($form, &$form_state) {
 
// Werte aus $form_state irgendwo speichern
}
?>

‹ Node Tabelle verändern (durch Modul) oder alternativer Weg!? eigenes upload Formular "http error 0" ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

Sieh Dir doch mal im

Eingetragen von wla (9461)
am 04.12.2009 - 11:06 Uhr

Sieh Dir doch mal im Originalmodul die Form an. Die Forms-API von Drupal hat viele Möglichkeiten, z.B das setzten eines Default-Wertes. Wenn Du nichts in ein Feld hineinschreibst, wird in der Form auch nichts angezeigt.

Beste Grüße
Werner

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ja das mit dem default-Wert

Eingetragen von sr (6)
am 04.12.2009 - 11:18 Uhr

Ja das mit dem default-Wert ist mir klar. Mir geht es darum, dass wenn ich per Hand in das von der forms-api generierte Feld etwas eintrage, die Daten nach einem 'preview/validate' verloren gehen. Also das Feld wieder leer ist.

Alle anderen Felder, also Betreff, Text, usw. behalten nach einer Vorschau die vom Benutzer eingegebenen Werte.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Hast Du denn den Node um

Eingetragen von wla (9461)
am 04.12.2009 - 11:30 Uhr

Hast Du denn den Node um Dein zusätzliches Feld erweitert? Nur ein Feld in der Form eintragen sorgt ja noch nicht dafür, daß es gespeichert wird. Eine Form holt die Daten nur ab. Anschließend wird z.B. beim Node im Node-Modul die Funktion node_save aufgerufen, aber die sichert natürlich nur, was in der Node-Typ Definition vorhanden ist. Wenn Du den Node-Typ in der Typ-Definition um ein Feld erweiterst, wird das von selbst angezeigt und Du brauchst auch nicht mehr zu zaubern.

Beste Grüße
Werner

  • Anmelden oder Registrieren um Kommentare zu schreiben

Die Parameter, die in der

Eingetragen von traxer (1009)
am 04.12.2009 - 11:39 Uhr

Die Parameter, die in der Dokumentation zu hook_form_alter angegeben werden, sind die Parameter, die immer an deine Funktion übergeben werden.

Abhängig von dem konkreten Formular, das geändert werden soll, werden noch weitere Argumente übergeben. Bei Node-Formularen ist das z.B. ein Node-Objekt. Auf zusätzliche Argumente kannst du mit func_get_args zugreifen. In dem Node-Objekt steht dann das Datum, das du vorher eingegeben hast. Diesen Wert musst du in $form['extra_feld']['#default_value'] eintragen.

BTW: Du brauchst keine eigenen Validation- und Submit-Handler implementieren. Du kannst auch einfach warten bis hook_nodeapi bei dir vorbeikommt, das passiert automatisch. Diesen Hook musst du sowieso implementieren, da du bei $op = 'load' dein Datum aus der Datenbank lesen und in den Node eintragen musst. Vielleicht möchtest du auch dein Feld im Node selbst anzeigen; das geht ebenfalls über hook_nodeapi, nämlich bei $op = 'view'.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

@wla: Wie kann ich denn die

Eingetragen von sr (6)
am 04.12.2009 - 13:19 Uhr

@wla: Wie kann ich denn die Typ-Definition von einem fremden Node-Typ ändern? (Ich will ja mit meinem Modul das node-Formular vom forum.module ändern.)

@traxer: Also rekapitulieren wir (ich habs immernoch nicht geschafft).

Ich bekomme nach http://api.drupal.org/api/function/hook_nodeapi/6 für 'validate' drei Argumente.
0. ein Node-Objekt welches ich verändern kann.
1. Die Operation welche auf das Formular angewendet werden soll.
2. Das Formular welches ich NICHT ändern kann. (Nach api wird ja nur das Objekt als Kopie übergeben, kein Pointer.)

Wenn ich jetzt nun im validate in das Node-Objekt schaue (Argument 0) sehe ich mein Feld mit dem Inhalt ($node->extra_feld->'04.12.2009'). Das dazu gehörige HTML ist leer.

<label for="edit-extra-feld">Datum:</label>
<input type="text" maxlength="10" name="extra_feld" id="edit-extra-feld" size="10" value="" class="form-text" />

Wo soll ich jetzt da $form['extra_feld']['#default_value'] ändern. Das ist ja nur im Argument 2, und das kann ich nur lesen, nicht ändern.

ps: Natürlich hat das Feld in Wirklichkeit einen an mein Modul angepassten Namen, ich verwende hier beim Schreiben nur weiter 'extra_feld' weil das oben so in meinem kleinen Beispielmodul war.

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ich gehe mal davon aus, Du

Eingetragen von wla (9461)
am 04.12.2009 - 13:49 Uhr

Ich gehe mal davon aus, Du hast CCK schon installiert. Dann kannst Du unter Inhalt > Inhaltstypen > Forumsbeitrag > Felder Verwalten ein weiteres Feld in den Node einfügen.

Beste Grüße
Werner

  • Anmelden oder Registrieren um Kommentare zu schreiben

sr schrieb Wo soll ich

Eingetragen von traxer (1009)
am 04.12.2009 - 14:06 Uhr
sr schrieb

Wo soll ich jetzt da $form['extra_feld']['#default_value'] ändern.

Während der Validierung überhaupt nicht. Während der Validierung sorgt Drupal selbst dafür, das das Eingabefeld passend belegt ist. Während der Validierung musst du lediglich prüfen, ob das was im Node-Objekt steht deinen Ansprüchen genügt und falls nicht dann rufst du

<?php
form_set_error
('extra_feld', t('The value for the field "extra_feld" is invalid.'));
?>
auf.

$form['extra_feld']['#default_value'] musst du in meinmodul_form_alter setzten, und zwar anhand des vierten Argumentes, das die Funktion übergeben bekommt.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Ach CCK. Genau das (und

Eingetragen von sr (6)
am 04.12.2009 - 14:09 Uhr

Ach CCK. Genau das (und views) versuche ich gerade aus Geschwindigkeitsgründen loszuwerden. Die cck-Datumsfelder in der mysql-Tabelle sind nur als String gespeichert so das kein ordentlicher Index bei Abfragen genutzt werden kann. Und die Zusammenstellung des Kalenders über views ist zu resourcenintensiv.

Mit dem Modul was ich jetzt schreibe (der Teil der Daten lädt ist schon fertig) konnte ich die Ausführungszeiten im Kalender von ca 120ms auf 50ms senken.

  • Anmelden oder Registrieren um Kommentare zu schreiben

@traxer: In form_alter

Eingetragen von sr (6)
am 04.12.2009 - 14:22 Uhr

@traxer:

In form_alter bekomme ich nur drei Argumente. Doch im zweiten war was passendes, danke.

<?php
function kir_kalender_form_alter(&$form, &$form_state, $form_id) {

switch (
$form_id) {
  case
'forum_node_form':
   
$form['extra_feld'] = array(
       
'#title'=> t('Date'),
       
'#type' => 'textfield',
   
'#default_value' => $form_state['node']['extra_feld'],
      );
break;
  }
}
?>

ABER... in http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6 unter creating forms steht:

Zitat:

Don't use the '#value' attribute for any form elements that can be changed by the user. Use the '#default_value' attribute instead. Don't put values from $form_state['values'] (or $_POST) here! FormsAPI will deal with that for you; only put the original value of the field here.

Ist $form_state['node']['extra_feld'] ok? Die Daten sehen ja genauso aus wie die unter $form_state['values']['extra_feld'].

  • Anmelden oder Registrieren um Kommentare zu schreiben

func_get_args

Eingetragen von traxer (1009)
am 04.12.2009 - 14:38 Uhr

<?php
function kir_kalender_form_alter(&$form, &$form_state, $form_id) {
  switch (
$form_id) {
    case
'forum_node_form':
     
$args = func_get_args();
     
$node = $args[3];
     
$form['extra_feld'] = array(
       
'#title'=> t('Date'),
       
'#type' => 'textfield',
       
'#default_value' => isset($node->extra_feld) ? $node->extra_feld : '',
        );
    break;
  }
}
?>

Falls das nicht funktioniert, dann ist $form_state['node']['extra_feld'] wohl auch OK.

Wenn du dir um Performance sorgen machst, dann wirf mal einen Blick auf hook_form_FORM_ID_alter. Dieser Hook hat die gleiche Funktion wie hook_form_alter, wird aber nur für Formulare mit passender $form_id ausgeführt (spart also unnötige Funktionsaufrufe und die switch-Anweisung ein).

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Danke funktioniert jetzt

Eingetragen von sr (6)
am 04.12.2009 - 15:47 Uhr

Danke funktioniert jetzt alles. Um $node zu bekommen fehlt bei dir ein $node = $form['#node'];

Gibt es sowas wie hook_form_FORM_ID_alter auch für hook_nodeapi? Das wird ja auch bei jedem! node-Vorgang ausgeführt und ist ja bei mir eigentlich nur bei einem bestimmten node-type erforderlich.

  • Anmelden oder Registrieren um Kommentare zu schreiben

sr schrieb Um $node zu

Eingetragen von traxer (1009)
am 05.12.2009 - 12:45 Uhr
sr schrieb

Um $node zu bekommen fehlt bei dir ein $node = $form['#node'];

Eigentlich ist $node = $args[3]; dazu gedacht.

sr schrieb

Gibt es sowas wie hook_form_FORM_ID_alter auch für hook_nodeapi?

Nein. In Drupal 7 werden lediglich die einzelnen Operationen auf eigene Hooks verteilt. Eine Unterscheidung nach Inhaltstypen gibt es auch dort nicht.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • 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?
  • Update Manger läst sich nicht Installieren
Weiter

Neue Kommentare

  • melde mich mal wieder, da ich
    vor 1 Woche 6 Tagen
  • Hey danke
    vor 2 Wochen 11 Stunden
  • Update: jetzt gibt's ein
    vor 2 Wochen 1 Tag
  • Hallo, im Prinzip habe ich
    vor 2 Wochen 5 Tagen
  • Da scheint die Terminologie
    vor 2 Wochen 5 Tagen
  • Kannst doch auch alles direkt
    vor 3 Wochen 3 Tagen
  • In der entsprechenden View
    vor 3 Wochen 3 Tagen
  • Dazu müsstest Du vermutlich
    vor 3 Wochen 3 Tagen
  • gelöst
    vor 5 Wochen 6 Tagen
  • Ja natürlich. Dass ist etwas,
    vor 6 Wochen 12 Stunden

Statistik

Beiträge im Forum: 250233
Registrierte User: 20451

Neue User:

  • ByteScrapers
  • Mroppoofpaync
  • 4aficiona2

» 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 35 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