作者:亚艾元技术部
对于一个管理界面,添加、编辑,删除等链接,指向的表单页面,有时候为了更好的体验,我们想在Modal的形式中打开,也就是弹出框的形式。
对于这样的链接,我们需要为它添加一些额外的属性:
<ul>
<li><a href="/tags/add" class="button button-action button--primary button--small use-ajax" data-dialog-type="modal" data-dialog-options="{"width":700}" target="_blank">添加标签</a></li>
</ul>
红色部分,就是使用modal打开,需要添加的额外信息,只需要添加这样的信息,即可实现ajax。
当然,我们还需要对我们的表单加以改造,下面是我们实际项目中的一个自立,供大家参考:
class TagForm extends FormBase {
/**
* {@inheritdoc}
*/
public function getFormId() {
return 'tag_form';
}
/**
* Is the current request for an Ajax modal/dialog.
*
* @return bool
* TRUE if the current request is for an Ajax modal/dialog.
*/
protected function isDialog() {
$wrapper_format = $this->getRequest()
->get(MainContentViewSubscriber::WRAPPER_FORMAT);
return (in_array($wrapper_format, [
'drupal_ajax',
'drupal_modal',
'drupal_dialog',
'drupal_dialog.off_canvas',
])) ? TRUE : FALSE;
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state) {
$term = NULL;
$term = \Drupal::routeMatch()->getParameter('taxonomy_term');
$form['name'] = [
'#type' => 'textfield',
'#title' => $this->t('标签名称'),
'#maxlength' => 40,
'#weight' => 0,
'#default_value' => $term == NULL ? '' : $term->label(),
'#required' => TRUE,
];
$form['weight'] = [
'#type' => 'textfield',
'#title' => $this->t('Weight'),
'#size' => 6,
'#default_value' => $term == NULL ? 0 : $term->getWeight(),
'#description' => $this->t('标签是按照权重的升序排列的.'),
'#required' => TRUE,
];
if ($this->isDialog()) {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('保存'),
'#prefix' => '<div id="submit-button-container">',
'#suffix' => '</div>',
'#ajax' => array(
'callback' => '::ajaxSubmit',
'event' => 'click',
),
];
}
else {
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('保存'),
'#prefix' => '<div id="submit-button-container">',
'#suffix' => '</div>',
];
}
return $form;
}
public function ajaxSubmit(array &$form, FormStateInterface $form_state) {
$response = new AjaxResponse();
$term_name = $form_state->getValue('name');
$entity = NULL;
$term = \Drupal::routeMatch()->getParameters()->get('taxonomy_term');
$entity = $term;
if ($entity != NULL) {
//$entity->set('vid', 'subject_category');
if ($term_name != NULL) {
$entity->set('name', $term_name);
}
}
else {
$entity = \Drupal::entityTypeManager()
->getStorage('taxonomy_term')
->create([
'vid' => 'tags',
'name' => $term_name,
]);
//设置部门id,根据用户的部门id,这里假定所有的用户都有部门,这是必须的。只在添加的时候,设置。
$uid = \Drupal::currentUser()->id();
$account = User::load($uid);
$tid = $account->field_department->target_id;
$entity->set('field_department', $tid);
}
$weight = $form_state->getValue('weight');
if (!empty($weight)) {
$entity->set('weight', $weight);
}
else {
$entity->set('weight', 0);
}
$status = $entity->save();
if ($form_state->getErrors()) {
}
else {
$response->addCommand(new CloseModalDialogCommand());
$str_redirect_url = Url::fromUri('internal:/department/tags')->toString();
//$str_redirect_url = Url::fromRoute('zhuanti.zhuanti_admin_page', [], [])->toString();
$response->addCommand(new RedirectCommand($str_redirect_url));
}
return $response;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state) {
parent::validateForm($form, $form_state);
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
//普通页面
if (!$this->isDialog()) {
$term_name = $form_state->getValue('name');
//$term = NULL;
$term = \Drupal::routeMatch()->getParameter('taxonomy_term');
if ($term != NULL) {
if ($term_name != NULL) {
$term->set('name', $term_name);
}
}
else {
$term = \Drupal::entityTypeManager()
->getStorage('taxonomy_term')
->create([
'vid' => 'tags',
'name' => $term_name,
]);
//设置部门id,根据用户的部门id,这里假定所有的用户都有部门,这是必须的。只在添加的时候,设置。
$uid = \Drupal::currentUser()->id();
$account = User::load($uid);
$tid = $account->field_department->target_id;
$term->set('field_department', $tid);
}
$weight = $form_state->getValue('weight');
if (!empty($weight)) {
$term->set('weight', $weight);
}
else {
$term->set('weight', 0);
}
$result = $term->save();
//==========================================================
switch ($result) {
case SAVED_NEW:
$this->messenger()
->addStatus($this->t('创建了一个新标签.'));
break;
case SAVED_UPDATED:
$this->messenger()
->addStatus($this->t('更新了新标签.'));
break;
}
//$route_name = "view.$view_id.$display_id";
$route_name = "view.department_tags.page_1";
$form_state->setRedirect($route_name, []);
}
//==========================================================
}
}
主要是增加了isDialog 的判断,检查一下是不是通过弹出框打开的,然后分两种情况分别处理。
Ajax更新完毕以后,想让当前页面刷新,这样可以看到最新的数据:
$response->addCommand(new CloseModalDialogCommand());
$str_redirect_url = Url::fromUri('internal:/department/tags')->toString();
//$str_redirect_url = Url::fromRoute('zhuanti.zhuanti_admin_page', [], [])->toString();
$response->addCommand(new RedirectCommand($str_redirect_url));

