Вызывается обработчик отправки пользовательской формы, но узел не сохраняется


Возникает много вопросов по поводу того, что обработчик отправки пользовательской формы не вызывается, но в моем случае обработчик вызывается; однако сущность не сохраняется. В частности, у меня есть пользовательский обработчик отправки для типа контента; когда я нажимаю кнопку для вызова обработчика, в базе данных ничего не сохраняется:

function MYMODULE_form_node_CONTENTTYPE_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  $form['actions']['submit_publish'] = array(
    '#type' => 'submit',
    '#weight' => 999,
    '#button-type' => 'danger',
    '#value' => t('Submit for approval'),
    '#submit' => array('MYMODULE_draft2submit_callback'),
  );
}

function MYMODULE_draft2submit_callback(array &$form, FormStateInterface &$form_state) {
  $form_state->setValue('moderation_state', 'submitted');
}

Поэтому я подумал, что, поскольку узел не сохраняется, возможно, мне придется сделать это вручную. Следуя этой статье, я сделал это:

function MYMODULE_draft2submit_callback(array &$form, FormStateInterface &$form_state) {
  $form_state->setValue('moderation_state', 'submitted');
  $node = $form_state->getFormObject()->getEntity();
  $node->save();
}

Однако в этом случае узел сохраняется, но ни одно из представленных значений (например, тело узла) не сохраняется; все добавленное пользователем игнорируется, как и setValue() в моем обратном вызове.

Я только хочу установить moderation_state в своем обработчике отправки пользовательской формы; во всех других отношениях я хочу, чтобы мой пользовательский обработчик отправки был таким же, как обычный обработчик отправки (т. Е. Я Хочу, чтобы он сохранял узел). Что я делаю не так?

 2
Author: Patrick Kenny, 2017-10-05

3 answers

Убедитесь, что действие, которое вы пытаетесь выполнить, является правильным. В моем случае, когда мне пришлось добавить обработчик отправки, я также использовал $form['actions']['submit']['#submit'][] = 'my_custom_submit_handler';, попробуйте добавить дополнительный обработчик отправки, а не перезаписывать существующий. Наконец, попробуйте сохранить свою сущность в обработчике отправки, а не в обратном вызове. Для меня также работал $entity = $form_state->getBuildInfo()['callback_object']->getEntity();, чтобы получить сущность и изменить ее в моем пользовательском обработчике.

 4
Author: Ismini, 2017-10-05 08:52:45

Как указал @Ismini, сущность должна быть сохранена в обработчике отправки. Способ сделать это, как указано в @4k4, состоит в том, чтобы скопировать обработчики отправки для новой кнопки из исходного обработчика отправки. Исправленный код показан ниже.

function MYMODULE_form_node_CONTENTTYPE_form_alter(&$form, FormStateInterface $form_state, $form_id) {

  $form['actions']['submit_publish'] = array(
    '#type' => 'submit',
    '#weight' => 999,
    '#button-type' => 'danger',
    '#value' => t('Submit for approval'),
    '#submit' => array_merge($form['actions']['submit']['#submit'], array('MYMODULE_draft2submit_callback')),
  );
}

function MYMODULE_draft2submit_callback(array &$form, FormStateInterface &$form_state) {
  // Getting the entity.
  $entity = $form_state->getFormObject()->getEntity();
  // Changing the moderation state.
  $entity->set('moderation_state', 'submitted');
  // Saving the entity.
  $entity->save();
}
 5
Author: Patrick Kenny, 2017-11-01 07:49:36
   function MODULE_form_alter(&$form, 
      \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {
      if($form_id == 'node_contentype_form') {
        array_unshift($form['actions']['submit']['#submit'],
                                         'MODULE_submit_handler');
       }
   }

   function MODULE_submit_handler(array &$form, 
          \Drupal\Core\Form\FormStateInterface $form_state) {
       $form_state->setValue('title', [['value' => 'new title']]);
   }
 0
Author: Efrain Bonilla, 2018-10-18 00:17:36