3 Stimmen

drupal multiple node formulare auf einer seite

Ich habe eine Ansicht, die mehrere Knoten anzeigt. Ich möchte das Knotenformular unter jedem angezeigten Knoten platzieren. Beide node_add y drupal_get_form direkt in template.php funktioniert gut, aber ich erhalte Formulare mit der gleichen Formular-ID von NODETYPE_node_form und die Validierung und Übermittlung funktioniert nicht wie erwartet.

Wenn Sie mehrere Knotenformulare auf einer Seite unterbringen müssten, wie würden Sie generell vorgehen?

Bisherige Fortschritte...

in template.php bei der Vorverarbeitung des Knotens $author_profile und $content werden vorher festgelegt.

$unique = $vars['node']->nid;

$node = new StdClass();
$node->uid = $vars['user']->uid;
$node->name = $vars['user']->name;
$node->type = 'review';
$node->language = '';
$node->title = t('Review of ') . $vars['node']->realname . t(' by ') . $vars['user']->realname . t(' on ') . $content->title;
$node->field_review_to_A[0]['nid'] = $nodeA->nid;
$node->field_review_to_B[0]['nid'] = $vars['node']->nid;
$node->field_review_to_profile[0]['nid'] = $author_profile->nid;

if(!function_exists("node_object_prepare")) {
    include_once(drupal_get_path('module', 'node') . '/node.pages.inc');
}

//$vars['A_review_form'] = drupal_get_form('review_node_form', $node);
$vars['A_review_form'] = mymodule_view($node, $unique);

im Modul mymodule

function mymodule_view($node, $unique) {
    if(!function_exists("node_object_prepare")) {
        include_once(drupal_get_path('module', 'node') . '/node.pages.inc');
    }
    $output = drupal_get_form('review_node_form_' . $unique, $node);
    return $output;
}

function mymodule_forms($form_id, $args) {
    $forms = array();
    if (strpos($form_id, "review_node_form_") === 0) {
        $forms[$form_id] = array('callback' => 'node_form');
    }
    return $forms;
}

function mymodule_form_alter(&$form, $form_state, $form_id) {
    if (isset($form['type']) && isset($form['#node']) && $form_id != $form['type']['#value'] .'_node_form' && $form['type']['#value'] == 'review') {
        $type = content_types($form['#node']->type);
        if (!empty($type['fields'])) {
            module_load_include('inc', 'content', 'includes/content.node_form');
            $form = array_merge($form, content_form($form, $form_state));
        }
        $form['#pre_render'][] = 'content_alter_extra_weights';
        $form['#content_extra_fields'] = $type['extra'];

        //$form['#id'] = $form_id;
        //$form['#validate'][0] = $form_id . '_validate';

        $form['title']['#type'] = 'value';
        $form['field_review_to_A']['#type'] = 'value';
        $form['field_review_to_B']['#type'] = 'value';
        $form['field_review_to_profile']['#type'] = 'value';
    }
}

Fragen

Meine Meinung zur Zusammenfassung unklarer Fragen...

  1. Ist dies gute allgemeine Ansatz für die Anzeige von mehreren Knoten Formen auf derselben Seite?
  2. Ist es OK, den Code von content Module inhalt_form_alter Funktion in Funktion mymodule_form_alter ? Wird es die Dinge nicht bremsen, wenn content Modul aktualisiert wird?
  3. Soll ich die $form['#id'] ? Ohne sie haben alle Formulare die gleiche HTML-Formular-ID von node_form , damit ist die ID eindeutig, wie review_node_form_254 . Die Sache ist die, dass es keinen Unterschied macht, wie das Formular eingereicht wird. Einstellung $form['#validate'][0] scheint die Dinge nicht zu beeinflussen. Vielleicht sollte ich einstellen $form[button]['#submit'][0] zu etwas anderem? Jetzt seine node_form_submit .
  4. Warum funktioniert die Validierung nicht, auch wenn die Formular-ID eindeutig ist und die Funktion form validate verwendet wird? Wenn ich das letzte Formular ohne Pflichtfeld abschicke, werden alle vorherigen Formulare mit roten Feldern angezeigt. Sollte ich meine eigene Validierungsfunktion erstellen? Irgendwelche Tipps, wo ich anfangen soll?

2voto

Henrik Opel Punkte 19268

Sie müssen Folgendes umsetzen hook_forms() um verschiedene IDs der gleichen Builder-Funktion zuzuordnen.

En NODETYPE_node_form ids, die Sie erwähnen, sind bereits ein Beispiel für diesen Mechanismus, da sie alle auf dieselbe Builder-Funktion abgebildet sind ( node_form() ) innerhalb der Knotenmodule node_forms() Umsetzung.

Links zu weiteren Beispielen finden Sie in der Erklärung zu den "Parametern" auf der Seite drupal_get_form() Funktion.

1voto

Gareth Punkte 11

Das war für mich außerordentlich nützlich.

Die Dokumentation zu allen Drupal-APIs ist so lückenhaft, dass ich mir die Haare raufen musste. Der entscheidende Punkt für mich, der meines Erachtens nirgendwo sonst im Netz zu finden ist:

CCK fügt seine Felder über hook_form_alter() zu Ihrem Formular hinzu. Aber es tut dies auf der Grundlage der form_id. Wenn also die ID des Formulars anders ist (weil Sie mehrere auf derselben Seite haben wollen), müssen Sie einen Teil des CCK-Codes replizieren, um die Felder trotzdem zu Ihrem Formular hinzuzufügen.

Das ist es, was dieses Buch auf brillante Weise tut.

0voto

mac Punkte 40526

Ich bin der Sache nicht wirklich auf den Grund gegangen, aber ich habe den Eindruck, dass Sie so ziemlich alles, was Sie wissen wollten, selbst herausgefunden haben.

Nach dem, was ich nur durch die Inspektion des Codes verstanden habe, haben Sie Recht mit der Annahme, dass content_form_alter() ist der Show-Stopper.

Vielleicht ist dies ein naiver Vorschlag, aber wie wäre es, wenn Sie Ihre eigene Implementierung von hook_form_alter() ausgehend von der content_form_alter() Code zu ändern, sondern die Bedingungen zu ändern, die die Änderung bewirken? Ich denke dabei an etwas in dieser Richtung:

function modulename_form_alter(&$form, $form_state, $form_id) {
  if (isset($form['type']) && isset($form['#node']) && 
  stripos($form_id, $form['type']['#value'] .'_node_form')) {
    ...
  }
}

Ich habe pas Testen Sie den obigen Code, aber ich hoffe, er ist selbsterklärend: Sie lösen die Änderungen für einen bestimmten benutzerdefinierten Inhaltstyp aus, wenn MYCCKTYPE_node_form eine Teilzeichenkette der aktuellen form_id ist (z. B. MYCCKTYPE_node_form_234).

Ich hoffe, das hilft wenigstens ein bisschen... Viel Glück! :)

EDIT: ZWEI WEITERE DINGE

  1. Es kam mir gerade in den Sinn, dass, da Ihre benutzerdefinierte Implementierung von hook_form_alter() neben der CCK-Implementierung existieren wird, Sie eine Prüfung hinzufügen möchten, um zu verhindern, dass das Formular zweimal geändert wird, etwa so:

    && $form_id != $form['type']['#value'] .'_node_form'

  2. Sie können auch versuchen, dies zu implementieren, indem Sie CCK nicht verwenden, sondern Ihren benutzerdefinierten Typ programmatisch implementieren (dies könnte sogar von Vorteil sein, wenn Sie planen, Ihr Modul auf verschiedenen Websites zu verwenden).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X