Unterschied zwischen neu erstellen und Knoten in Form ändern bearbeiten

24

Ich habe einen Änderungsabschnitt für einen bestimmten Inhaltstyp. Wie kann ich im Formular ändern herausfinden, ob es sich um das Erstellen eines neuen Formulars oder das Bearbeiten eines Formulars handelt ?

Mit dsm ($ form) in von alter kann ich Ergebnisse mit mehreren Unterschieden zwischen ihnen erhalten. Was ist der beste Weg, diese voneinander zu unterscheiden?

ist das ein guter weg

    if(isset($form['nid']['#value']))
     'means in edit form'
    else 
     'means in create new from'
Yusef
quelle

Antworten:

61

Wenn Sie sich den Code von node_object_prepare () ansehen , der von node_form () (dem Formular- Generator für das Formular zum Bearbeiten / Erstellen von Knoten) aufgerufen wird, sehen Sie, dass er den folgenden Code enthält:

  // If this is a new node, fill in the default values.
  if (!isset($node->nid) || isset($node->is_new)) {
    foreach (array('status', 'promote', 'sticky') as $key) {
      // Multistep node forms might have filled in something already.
      if (!isset($node->$key)) {
        $node->$key = (int) in_array($key, $node_options);
      }
    }
    global $user;
    $node->uid = $user->uid;
    $node->created = REQUEST_TIME;
  }

In einer Implementierung von hook_form_BASE_FORM_ID_alter () ist es ausreichend, Code ähnlich dem folgenden zu verwenden.

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state['node'];

  if (!isset($node->nid) || isset($node->is_new)) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}

Wenn der Knoten neu ist, erstellt das Formular einen Knoten. Wenn der Knoten nicht neu ist, bearbeitet das Formular einen vorhandenen Knoten.

In Drupal 8 implementiert jede Klassenimplementierung EntityInterface(die die NodeKlasse enthält) die EntityInterface::isNew()Methode. Das Prüfen, ob ein Knoten neu ist, ist so einfach wie das Aufrufen $node->isNew(). Da es in Drupal 8 keinen $form_state['node']mehr gibt, sieht der Code folgendermaßen aus:

function mymodule_form_node_form_alter(&$form, &$form_state) {
  $node = $form_state->getFormObject()->getEntity();

  if ($node->isNew()) {
    // This is a new node.
  }
  else {
    // This is not a new node.
  }
}
kiamlaluno
quelle
Warum werden beide Bedingungen benötigt?
Digitgopher
Da es ein Modul geben könnte, das die Knoten-ID für den neuen Knoten festlegt, denke ich.
kiamlaluno
Besser !empty($node->is_new)als isset($node->is_new)Rückgabe verwenden, TRUEwenn es auf gesetzt ist FALSE.
bloke_zero
@bloke_zero Ich nehme an, Drupal erwartet nicht, dass es auf gesetzt wird FALSE. In der Tat FALSEist es besser, den Code entsprechend zu ändern , wenn es einige fehlerhafte Module gibt, die ihn auf setzen, anstatt ihn zu deaktivieren.
Kiamlaluno
12

Ja, Sie müssen prüfen, ob die Node-ID existiert oder nicht.

Tareq Assaf
quelle
4
/**
 * Implementation of hook_form_alter().
 */
function MY_MODULE_form_alter(&$form, $form_state, $form_id) {
  if ($form['#node'] && $form['#node']->type .'_node_form' === $form_id) {
    // Is node form.

    if ($form['#node']->nid) {
      // Is node edit form.
    }
  }
}
Jekis
quelle
1

In Drupal 8 benötigen Sie die form_idVariable und sie ist in jedem Fall anders. Sie enthält die Variable _edit_, wenn Sie einen Knoten bearbeiten

function MODULENAME_form_alter(&$form, &$form_state, $form_id) { 
    if($form_id == '"node_article_edit_form"'){
        //edit form
    }
    if($form_id == 'node_article_form') {
        //create form
    }
}
GiorgosK
quelle
Oder ->isNew()siehe drupal.stackexchange.com/a/223234/15055
leymannx