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

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

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

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

  if (isset ($ form ['nid'] ['# value']))
     'означает в форме редактирования'
    еще
     'означает создание нового из'
 
26 голосов | спросил zhilevan 16 J0000006Europe/Moscow 2012, 09:05:08

4 ответа


60

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

  //Если это новый узел, заполните значения по умолчанию.
  if (! isset ($ node-> nid) || isset ($ node-> is_new)) {
    foreach (array ('status', 'promotion', 'sticky') как $ key) {
      //Формы многоступенчатого узла могли уже что-то заполнить.
      if (! isset ($ node-> $ key)) {
        $ node-> $ key = (int) in_array ($ key, $ node_options);
      }
    }
    глобальный $ user;
    $ node-> uid = $ user-> uid;
    $ node-> created = REQUEST_TIME;
  }
 

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

  function mymodule_form_node_form_alter (& amp; $ form, & amp; $ form_state) {
  $ node = $ form_state ['node'];

  if (! isset ($ node-> nid) || isset ($ node-> is_new)) {
    //Это новый узел.
  }
  else {
    //Это не новый узел.
  }
}
 

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

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

  function mymodule_form_node_form_alter (& amp; $ form, & amp; $ form_state) {
  $ node = $ form_state-> getFormObject () -> getEntity ();

  if ($ node-> isNew ()) {
    //Это новый узел.
  }
  else {
    //Это не новый узел.
  }
}
 
ответил kiamlaluno 16 J0000006Europe/Moscow 2012, 17:35:16
14

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

ответил Tareq Assaf 16 J0000006Europe/Moscow 2012, 16:23:21
5
  /**
 * Реализация hook_form_alter ().
 * /
функция MY_MODULE_form_alter (& form $ form, $ form_state, $ form_id) {
  if ($ form ['# node'] & amp; & amp; $ form ['# node'] -> type .'_ node_form '=== $ form_id) {
    //Является формой узла.

    if ($ form ['# node'] -> nid) {
      //Форма редактирования узла.
    }
  }
}
 
ответил Jekis 15 PM00000030000000331 2013, 15:32:03
0

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

  функция MODULENAME_form_alter (& amp; $ form, & amp; $ form_state, $ form_id) {
    if ($ form_id == '"node_article_edit_form"') {
        //редактировать форму
    }
    if ($ form_id == 'node_article_form') {
        //создать форму
    }
}
 
ответил GiorgosK 18 MarpmSun, 18 Mar 2018 17:15:28 +03002018-03-18T17:15:28+03:0005 2018, 17:15:28

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132