我们刚从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()
。如果您只需要重定向表单,则只需添加执行重定向的表单提交处理程序就足够了。