Différence entre créer un nouveau nœud et modifier un nœud dans le formulaire

24

J'ai une autre section pour un type de contenu particulier. Dans le formulaire, comment puis-je savoir s'il s'agit de créer un nouveau formulaire ou de modifier un formulaire ?

Avec dsm ($ form) depuis alter, je peux obtenir des résultats avec plusieurs différences entre eux. Quelle est la meilleure façon de les distinguer les uns des autres?

est-ce un bon moyen?

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

Réponses:

61

Si vous regardez le code de node_object_prepare () , qui est appelé depuis node_form () (le générateur de formulaire pour le formulaire de modification / création de nœud), vous verrez qu'il contient le code suivant:

  // 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;
  }

Dans une implémentation de hook_form_BASE_FORM_ID_alter () , il suffit d'utiliser un code similaire au suivant.

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.
  }
}

Si le nœud est nouveau, le formulaire crée un nœud; si le nœud n'est pas nouveau, le formulaire modifie un nœud existant.

Dans Drupal 8, chaque classe implémentant EntityInterface(qui inclut la Nodeclasse) implémente la EntityInterface::isNew()méthode. Vérifier si un nœud est nouveau devient aussi simple que d'appeler $node->isNew(). Comme dans Drupal 8 il n'y en a $form_state['node']plus, le code devient le suivant:

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
la source
Pourquoi les deux conditions sont-elles nécessaires?
digitgopher
Parce qu'il pourrait y avoir un module qui définisse l'ID de nœud pour le nouveau nœud, je suppose.
kiamlaluno
mieux utiliser !empty($node->is_new)comme isset($node->is_new)retours TRUEs'il est défini sur FALSE.
bloke_zero
@bloke_zero Je suppose que Drupal ne s'attend pas à ce qu'il soit défini sur FALSE. En effet, s'il existe des modules défectueux qui le définissent au FALSElieu de le désactiver, il est préférable de modifier le code en conséquence.
kiamlaluno
12

Oui, vous devez vérifier si l'ID de nœud existe ou non.

Tareq Assaf
la source
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
la source
1

Dans Drupal 8, vous aurez besoin de la form_idvariable et elle sera différente dans chaque cas et elle l'inclura _edit_si nous éditons un nœud

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
la source
Ou ->isNew(), voir drupal.stackexchange.com/a/223234/15055
leymannx