Как программно перенаправить при сохранении флага?

Nov 07 2020

Я хочу перенаправлять пользователей на представление, когда они отмечают термин таксономии.

Этот вопрос касается того, как использовать правила для перенаправления при сохранении флага. Я хочу сделать это программно.

Я пытался использовать 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)

Я не мог заставить себя забрать свой код (я перестроил кеш).

Ответы

1 4k4 Nov 07 2020 at 23:15

Вы можете использовать другой подход к целевым формам сущностей:

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
}
1 PatrickKenny Nov 07 2020 at 12:24

Это можно сделать в 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;
   }
 }