Как программно перенаправить при сохранении флага?
Я хочу перенаправлять пользователей на представление, когда они отмечают термин таксономии.
Этот вопрос касается того, как использовать правила для перенаправления при сохранении флага. Я хочу сделать это программно.
Я пытался использовать hook_form_alter()для добавления обработчика отправки с перенаправлением. К сожалению, несмотря на то, что пометки имеют форму редактирования, на которую может указывать hook_form_alter()( MYMODULE_form_flagging_FLAGTYPE_edit_form_alter()), у них нет формы «создания».
Итак, как я могу программно добавить перенаправление при пометке?
РЕДАКТИРОВАТЬ
Основываясь на комментарии 4k4, я посмотрел на /flag/srs/Entity/Flagging.php:
* "form" = {
* "add" = "Drupal\flag\Form\FlaggingForm",
* "edit" = "Drupal\flag\Form\FlaggingForm",
* "delete" = "Drupal\flag\Form\UnflagConfirmForm"
Однако, когда я попытался сделать hook_form_alter()с:
function MYMODULE_form_flagging_FLAGGINGTYPE_add_form_alter(&$form, FormStateInterface $form_state, $form_id)function MYMODULE_form_flagging_add_form_alter(&$form, FormStateInterface $form_state, $form_id)
Я не мог заставить себя забрать свой код (я перестроил кеш).
Ответы
Вы можете использовать другой подход к целевым формам сущностей:
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\ContentEntityFormInterface;
/**
* Implements hook_form_alter().
*/
function mymodule_form_alter(array &$form, FormStateInterface $form_state) {
$form_object = $form_state->getFormObject();
if (!($form_object instanceof ContentEntityFormInterface)) { return; } $entity = $form_object->getEntity(); if (!(entity instanceof FooEntityInterface)) { return; } if (!$entity->isNew()) {
return;
}
if ($entity->bundle() !== 'bar') {
return;
}
// alter form
}
Это можно сделать в hook_entity_presave().
function MYMODULE_flagging_presave(FlaggingInterface $flagging) { switch ($flagging->getFlagId()) {
case 'FLAGTYPE':
$redirect_url = Url::fromRoute('view.VIEW_MACHINE_NAME.VIEW_DISPLAY_ID')->toString(); $response = new RedirectResponse($redirect_url); $response->send();
break;
}
}