Мы только начинали с Drupal 8 и очень быстро столкнулись с нашей первой проблемой.
Как мне изменить существующую форму в Drupal 8?
Нам нужно изменить метод сохранения для формы узла, чтобы сделать перенаправление на другую страницу. Мы хотим изменить форму узла, чтобы она стала чем-то вроде многошаговой формы. После того, как пользователь создает новый контент, он перенаправляется в новую форму (мы создали), чтобы получить больше информации.
Мы решили нашу проблему реализации hook_entity_type_alter()
.
function mymodule_entity_type_alter(&$entity_info) {
$handlers = $entity_info['node']->get('handlers');
$handlers['form']['default'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$handlers['form']['edit'] = 'Drupal\mymodule\Form\MyExtendedNodeForm';
$entity_info['node']->set('handlers', $handlers);
}
Затем мы создали новый класс формы, который расширяет форму узла и изменяет метод сохранения.
class MyExtendedNodeForm extends NodeForm {
public function save(array $form, FormStateInterface $form_state) {
parent::save($form, $form_state);
$node = $this->entity;
$form_state->setRedirect('entity.regions.add_form', ['nid' => $node->id()]);
}
}
Это отлично работает, но хорошо ли это? Если другой модуль делает то же самое, наш код больше не выполняется.
hook_form_alter()
. Если вам просто нужно перенаправить форму, достаточно добавить обработчик отправки формы, который выполняет перенаправление.save()
самом деле означает «изменить метод». Означает ли это изменение способа сохранения данных или просто перенаправление? В первом случае ответ более сложный.Ответы:
Вчера мне пришлось сделать то же самое, и я все еще ищу более удобный способ сделать это на Drupal 8, но не нашел его. В итоге я сделал это так:
Я все еще очень заинтересован в том, чтобы сделать это по-другому, мой модуль выглядел так чисто без файла .module :).
источник
Я использую Drupal 8.1.1 и пытался перенаправить пользователей после того, как они изменили свою учетную запись, т.е. нажав кнопку Сохранить на странице / user / edit. Я изначально попробовал это:
Хотя это работает для
user_login_form
, это не будет работать дляuser_form
. Дляuser_form
меня было использоватьЯ надеюсь, что это помогает другим, кто сталкивается с той же проблемой!
источник
Ну, я хотел изменить
site_information_settings
форму, чтобы добавить несколько полей.Как и у вас, у меня был выбор между
hook_form_alter
(илиhook_form_FORM_ID_alter
)Хотел сделать несколько ООП, поэтому я начал писать услугу подписчика маршрута, изменяя атрибут
system.site_information_settings
маршрута_form
.Затем в моем новом классе
SiteInformationForm
, после добавления полей и их валидаторов и расширения функции отправки, я чувствовал себя точно так же, как и вы ... Теперь, что, если другой модуль также переписывает маршрут формы, чтобы использовать свой собственный класс?Вернемся к началу, у меня был выбор между двумя вариантами ... кажется, я выбрал неправильный.
hook_form_alter
/,hook_form_FORM_ID_alter
кажется, лучший способ изменить существующую форму.источник
Похоже, что вы хотите сделать, это не на самом деле изменить метод сохранения, но изменить перенаправление при сохранении узла.
В этой ситуации
hook_form_alter
было бы неплохо сделать Drupal 7 вместе с пользовательским обработчиком отправки (в форме или на кнопке, в зависимости от формы и требований).То, что вы описываете в вопросе, также работает, но я бы не стал перезаписывать базовый класс, если только я действительно не хочу что-то менять в классе.
В любом случае метод save используется только как обработчик отправки, поэтому нет смысла перезаписывать его, просто добавив перенаправление.
источник
Я думаю, что лучший способ по-прежнему использовать один из хуков из семейства form_alter, прикрепить обработчик отправки и в этом установить ваш редирект.
Содействовать расширению базовых классов, чтобы сделать это волосатым, на мой взгляд. Тем более что ни одна функция не меняется, только перенаправление.
источник
Вы можете создать новый EventSubscriber, который прослушивает событие KernelEvents :: REQUEST, а затем реагирует, когда вы отправляете форму узла, что-то вроде этого
В любом случае способ hook_form_alter работает нормально.
источник
Что я нашел до сих пор: Реализация перехватчика формы и попытка изменить обработчики проверки / отправки в самой перехватчике формы работает, только если вы измените обработчики $ form ['# validate] / $ form [#submit']. (вызов функции form_state для этого не будет работать в самой форме Alter Hook)
Но когда вы попробуете это внутри обработчика проверки, это будет работать:
Это потому, что форма теперь построена полностью, а не случай в самой форме.
Идея такова: вы можете добавить обработчик проверки как последний, оценить другие обработчики, которые существуют для отправки, и изменить их прямо там.
Если вы также хотите изменить обработчики валидации, убедитесь, что они выполняются раньше других и измените то, что вы хотите в обработчике валидации.
Я все еще ищу лучший способ, мне просто нужно заменить обработчики проверки / отправки для формы регистрации пользователя. Но могут существовать и другие модули, которые нарушают реализацию моих модулей. Так что мой модуль должен быть в состоянии проверить это, и это возможно таким образом. Я действительно задаюсь вопросом, существует ли какая-либо форма сущности после функции сборки, чтобы осуществить это. (то, что запускается, когда форма была заполнена и собирается быть доставленной) (это не слишком сложно для этого простого случая)
Обход перенаправления метода save () невозможен, но сброс сохранения () осуществляется таким образом (+ реализуйте свой собственный). Правда, класс лучше и предлагает более легкий доступ к объектам и т. Д., Но переопределение базового класса действительно приводит к проблемам, когда другие модули хотят использовать их. Это не тот случай, если вы используете этот код.
источник
После проверки этой проблемы я обнаружил, что это должно подойти для вашего случая:
источник