Разница между созданием нового и редактированием узла в форме изменения

24

У меня есть раздел alter для определенного типа контента. В форме изменить, как я могу узнать, создавать ли это новую форму или редактировать форму ?

С помощью dsm ($ form) из alter я могу получить результаты с несколькими различиями между ними. Как лучше отличить их друг от друга?

это хороший способ?

    if(isset($form['nid']['#value']))
     'means in edit form'
    else 
     'means in create new from'
Юсеф
источник

Ответы:

61

Если вы посмотрите на код node_object_prepare () , который вызывается из node_form () (конструктор форм для формы редактирования / создания узла), вы увидите, что он содержит следующий код:

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

В реализации hook_form_BASE_FORM_ID_alter () достаточно использовать код, подобный следующему.

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

Если узел новый, то форма создает узел; если узел не новый, то форма редактирует существующий узел.

В Drupal 8 каждый реализующий класс EntityInterface(который включает в себя Nodeкласс) реализует EntityInterface::isNew()метод. Проверка того, является ли узел новым, становится такой же простой, как и вызов $node->isNew(). Поскольку в Drupal 8 его $form_state['node']больше нет, код становится следующим:

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
лучше использовать !empty($node->is_new)как isset($node->is_new)возврат, TRUEесли он установлен в FALSE.
bloke_zero
@bloke_zero Я беру Drupal, не ожидая, что он будет установлен в FALSE. Действительно, если есть некоторые плохие модули, которые устанавливают его FALSEвместо того, чтобы сбрасывать его, лучше соответствующим образом изменить код.
kiamlaluno
12

Да, вы должны проверить, существует ли идентификатор узла или нет.

Тарек Ассаф
источник
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
источник
1

В Drupal 8 вам понадобится form_idпеременная, и она будет отличаться в каждом случае, и она будет включать _edit_в себя, если мы редактируем узел

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
источник
Или ->isNew()см. Drupal.stackexchange.com/a/223234/15055
leymannx