Differenza tra creare un nuovo nodo e modificarlo in forma alter


24

Ho una sezione alter per un particolare tipo di contenuto. Nel modulo alterare come posso sapere se si tratta di creare un nuovo modulo o modificare il modulo ?

Con dsm ($ form) in da alter posso ottenere risultati con diverse differenze tra loro. Qual è il modo migliore per distinguere gli uni dagli altri?

è un buon modo?

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

Risposte:


61

Se guardi il codice di node_object_prepare () , che viene chiamato da node_form () (il generatore di moduli per il modulo di modifica / creazione del nodo), vedrai che contiene il seguente codice:

  // 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 un'implementazione di hook_form_BASE_FORM_ID_alter () , è sufficiente utilizzare un codice simile al seguente.

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

Se il nodo è nuovo, il modulo sta creando un nodo; se il nodo non è nuovo, il modulo sta modificando un nodo esistente.

In Drupal 8, ogni implementazione di classe EntityInterface(che include la Nodeclasse) implementa il EntityInterface::isNew()metodo. Controllare se un nodo è nuovo diventa facile come chiamare $node->isNew(). Poiché in Drupal 8 non esiste $form_state['node']più, il codice diventa il seguente:

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

Perché sono necessarie entrambe le condizioni?
digitgopher,

Perché potrebbe esserci un modulo che imposta l'ID nodo per il nuovo nodo, immagino.
kiamlaluno

meglio usare !empty($node->is_new)come isset($node->is_new)ritorni TRUEse è impostato su FALSE.
bloke_zero,

@bloke_zero Prendo Drupal non si aspetta che sia impostato su FALSE. In effetti, se ci sono alcuni moduli danneggiati che lo impostano FALSEinvece di disinserirlo, è meglio cambiare il codice in modo concordato.
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

In Drupal 8 avrai bisogno della form_idvariabile e sarà diversa per ogni caso e includerà _edit_in essa se stiamo modificando un nodo

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.