具有自定义动作的Drupal 8 Form

时间:2019-10-29 11:44:22

标签: php drupal drupal-8

我在Drupal中创建了一个ModalDialog,其中包含如下两种形式,

public function signUpForm() {

    $response = new AjaxResponse();
    // Get the modal form using the form builder.
    $modal_form[] = $this->formBuilder->getForm('Drupal\signup_form\Form\SignupForm');
     $modal_form[] = $this->formBuilder->getForm('Drupal\signup_form\Form\SigninForm');

    // Add an AJAX command to open a modal dialog with the form as the content.
    $response->addCommand(new OpenModalDialogCommand('', $modal_form, ['width' => '800','dialogClass' => 'signup-modal']));

    return $response;
  }

呈现了表格,但是问题是,两个表格都提交给相同的功能。我无法更改表格的操作。 是否有任何可用选项将表单操作更改为自定义网址?

1 个答案:

答案 0 :(得分:0)

您需要更改这些格式,以便可以添加自己的提交处理程序(并删除不需要的处理程序),最终从那里您将能够设置适当的重定向或AjaxResponse

例如,对于每种形式,请通过自定义模块实现hook_form_alter

function MODULE_signup_form_alter(&$form, FormStateInterface $form_state, $form_id) {
  $form['actions']['submit']['#attributes']['class'][] = 'use-ajax-submit';
  $form['actions']['submit']['#submit'][] = 'MODULE_signup_form_ajax_submit';
}

然后添加适当的提交处理程序,例如。 :

function MODULE_signup_form_ajax_submit(array $form, FormStateInterface &$form_state) {
  $response = new AjaxResponse();
  $form-class = '.signup-form'; # using your own selector 
  $selector = '#drupal-modal' . ' ' . $form-class;
  $message = '<div>submitted</div>';
  $response->addCommand(new ReplaceCommand($selector, $message));
  $form_state->setResponse($response);  
}

我假设您想更新模式内容,以便仍然可以提交第二个表单,因此在这里我将'use-ajax-submit'类(参见Drupal.behaviors.AJAX)添加到适当的$ form操作属性中,因此提交响应也可以在模式中呈现。还使用ReplaceCommand用一条简单的消息替换提交的表单内容。

如果相反,第一个提交的表单应该触发重定向,则不要使用setResponse()(实际上会取消重定向),如果基本操作网址不是您想要的URL,请不要使用setRedirect()