Вызывается обработчик отправки пользовательской формы, но узел не сохраняется
Возникает много вопросов по поводу того, что обработчик отправки пользовательской формы не вызывается, но в моем случае обработчик вызывается; однако сущность не сохраняется. В частности, у меня есть пользовательский обработчик отправки для типа контента; когда я нажимаю кнопку для вызова обработчика, в базе данных ничего не сохраняется:
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
в своем обработчике отправки пользовательской формы; во всех других отношениях я хочу, чтобы мой пользовательский обработчик отправки был таким же, как обычный обработчик отправки (т. Е. Я Хочу, чтобы он сохранял узел). Что я делаю не так?
3 answers
Убедитесь, что действие, которое вы пытаетесь выполнить, является правильным. В моем случае, когда мне пришлось добавить обработчик отправки, я также использовал $form['actions']['submit']['#submit'][] = 'my_custom_submit_handler';
, попробуйте добавить дополнительный обработчик отправки, а не перезаписывать существующий. Наконец, попробуйте сохранить свою сущность в обработчике отправки, а не в обратном вызове. Для меня также работал $entity = $form_state->getBuildInfo()['callback_object']->getEntity();
, чтобы получить сущность и изменить ее в моем пользовательском обработчике.
Как указал @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();
}
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']]);
}