Drupal 8から始めてすぐに、最初の問題にぶつかりました。
Drupal 8の既存のフォームを変更するにはどうすればよいですか?
ノードフォームのsaveメソッドを変更して、他のページにリダイレクトする必要があります。ノードフォームを変更して、マルチステップフォームのようなものにしたいと思います。ユーザーは新しいコンテンツを作成した後、新しいフォーム(作成した)にリダイレクトされ、さらに情報を取得します。
実装の問題を解決しました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);
}
次に、ノードフォームを拡張し、saveメソッドを変更する新しいフォームクラスを作成しました。
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()]);
}
}
これは完全に機能しますが、それは良いですか?別のモジュールが同じことを行うと、コードは実行されなくなります。
save()
メソッドを変更する」が実際に何を意味するのかを明確にする必要があります。データの保存方法を変更するのですか、それとも単にリダイレクトするのですか?前者の場合、答えはより複雑です。
hook_form_alter()
。フォームをリダイレクトする必要がある場合は、リダイレクトを行うフォーム送信ハンドラーを追加するだけで十分です。