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


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


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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.