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


24

У мене є розділ змін для певного типу вмісту. Як змінити форму, як я можу дізнатися, чи це створити нову форму чи редагувати форму ?

Маючи 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;
  }

У реалізації куки_форма_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.
  }
}

Для чого потрібні обидві умови?
digitgopher

Тому що міг бути модуль, який встановив ідентифікатор вузла для нового вузла, я думаю.
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
    }
}

Або ->isNew()дивіться drupal.stackexchange.com/a/223234/15055
leymannx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.