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'

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

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


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.