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'

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

¿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


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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.