Diferença entre criar novo e editar nó no formulário alter

24

Eu tenho uma seção de alteração para um tipo de conteúdo específico. No formulário alter, como posso descobrir se é criar um novo formulário ou editar um formulário ?

Com dsm ($ form) no alter, posso obter resultados com várias diferenças entre eles. Qual é a melhor maneira de distinguir um do outro?

este é um bom caminho?

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

Respostas:

61

Se você observar o código de node_object_prepare () , chamado de node_form () (o construtor de formulários para o nó editar / criar formulário), verá que ele contém o seguinte 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;
  }

Em uma implementação de hook_form_BASE_FORM_ID_alter () , basta usar código semelhante ao seguinte.

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 o nó for novo, o formulário estará criando um nó; se o nó não for novo, o formulário estará editando um nó existente.

No Drupal 8, toda classe de implementação EntityInterface(que inclui a Nodeclasse) implementa o EntityInterface::isNew()método. Verificar se um nó é novo torna-se tão fácil quanto chamar $node->isNew(). Como no Drupal 8 não existe $form_state['node']mais, o código se torna o seguinte:

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
fonte
Por que as duas condições são necessárias?
digitgopher
Como pode haver um módulo que defina o ID do nó para o novo nó, eu acho.
Kiamlaluno
melhor usar !empty($node->is_new)como isset($node->is_new)retornos TRUEse estiver definido como FALSE.
Bloquei
@bloke_zero Tomo Drupal não está esperando que seja definido como FALSE. De fato, se existem alguns módulos defeituosos que o definem em FALSEvez de desmarcá-lo, é melhor alterar o código de maneira adequada.
Kiamlaluno
12

Sim, você deve verificar se o ID do nó existe ou não.

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

No Drupal 8, você precisará da form_idvariável e ela será diferente em cada caso e incluirá a _edit_mesma se estivermos editando um nó

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
fonte
Ou ->isNew()consulte drupal.stackexchange.com/a/223234/15055
leymannx em