La diferencia entre crear nuevo y editar nodo en forma alter

24

Tengo una sección alter para un tipo de contenido en particular. En el formulario, ¿cómo puedo averiguar si se trata de crear un nuevo formulario o editarlo ?

Con dsm ($ form) desde alter puedo obtener resultados con varias diferencias entre ellos. ¿Cuál es la mejor manera de distinguirlos unos de otros?

¿Es esta una buena manera?

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

Respuestas:

61

Si observa el código de node_object_prepare () , que se llama desde node_form () (el generador de formularios para el nodo editar / crear formulario), verá que contiene el siguiente código:

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

En una implementación de hook_form_BASE_FORM_ID_alter () , es suficiente usar un código similar al siguiente.

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 el nodo es nuevo, entonces el formulario está creando un nodo; Si el nodo no es nuevo, el formulario está editando un nodo existente.

En Drupal 8, cada implementación de clase EntityInterface(que incluye la Nodeclase) implementa el EntityInterface::isNew()método. Comprobar si un nodo es nuevo se vuelve tan fácil como llamar $node->isNew(). Como en Drupal 8 ya no existe $form_state['node'], el código se convierte en el siguiente:

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
fuente
¿Por qué se necesitan ambas condiciones?
digitgopher
Supongo que podría haber un módulo que establezca la ID del nodo para el nuevo nodo.
kiamlaluno
mejor usarlo !empty($node->is_new)como isset($node->is_new)devoluciones TRUEsi está configurado en FALSE.
bloke_zero 05 de
@bloke_zero Supongo que Drupal no espera que esté configurado FALSE. De hecho, si hay algunos módulos defectuosos que lo configuran en FALSElugar de desarmarlo, es mejor cambiar el código según corresponda.
kiamlaluno
12

Sí, debe verificar si la ID del nodo existe o no.

Tareq Assaf
fuente
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
fuente
1

En Drupal 8 , necesitará la form_idvariable, que será diferente en cada caso e incluirá la variable _edit_si estamos editando 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
    }
}
GiorgosK
fuente
O ->isNew()visite drupal.stackexchange.com/a/223234/15055
leymannx