Drupal 8自定义模块,带有ajax和模板覆盖

时间:2017-11-24 23:30:33

标签: ajax templates module drupal-8

我正在创建一个具有自定义管理2-col页面的模块,该页面使用ajax填充div,在表单提交之前根据下拉选择显示内容。

一切正常,我可以看到容器由ajax更新。

但是当我尝试使用自定义模板进行2-col布局时,我将以下内容插入到容器中:

  

发生了无法恢复的错误。上传的文件可能超过了   此服务器支持的最大文件大小(50 MB)。

没有监视程序消息或日志详细信息,因此这可能表示apache配置问题(https://www.drupal.org/forum/support/post-installation/2013-02-27/an-unrecoverable-error-occurred-the-uploaded-file-likely),但mod_security似乎未启用,并且表单不包含任何文件,并且它没有任何接近50MB!所以我不知道这是从哪里来的。这是我的笔记本电脑上的开发环境,我之前没有遇到过这种情况,所以我认为apache配置不是问题。

令我感到震惊的是,带有自定义模板的ajax表单API中可能存在核心错误,因为没有自定义模板它可以正常工作......除非我不正确地实现自定义模板。

一种可能的解决方法是使用CSS强制容器进入RHS,但理想情况下应该在模板中,以便管理主题可以使用它。

我已将代码放在pastebin中:https://pastebin.com/F1zkd5rg

或下面列出:

my_module.links.menu.yml

my_module.main:
  route_name: my_module.main
  title: My Module
  parent: system.admin
  weight: -6
my_module.form_page:
  route_name: my_module.form_page
  title: My Module Form
  parent: my_module.main
  weight: -6

my_module.routing.yml

my_module.main:
  path: '/admin/my_module'
  defaults:
    _controller: 'Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
    _title: 'My Module'
  requirements:
    _permission: 'administrator'
my_module.form_page:
  path: '/admin/my_module/form'
  defaults:
    _form: 'Drupal\my_module\Form\MyModuleForm'
    _title: 'My Module Form'
  requirements:
    _permission: 'administrator'

my_module.module

<?php
/**
 * Implements hook_theme_registry_alter
*/
function my_module_theme($existing, $type, $theme, $path) {
  return [
    'my_module_form' => [
      'render element' => 'form',
    ],
  ];
}

模板/我的模块-form.html.twig

<form {{ attributes }}>
  <div class="layout-column layout-column--half">
    {{ form.user_view }}
    {{ form.submit }}
  </div>
  <div class="layout-column layout-column--half">
    {{ form.user_list_wrapper }}
  </div>
</form>

的src /窗体/ MyModuleForm.php

<?php
/**
 * @file
 * Contains \Drupal\my_module\Form\MyModuleForm.
 */
namespace Drupal\my_module\Form;

use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\views\Views;

/**
 * Configure custom_rest settings for this site.
 */
class MyModuleForm extends FormBase {

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'my_module_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    ...

    $form['#theme'] = 'my_module_form';

    $form['user_view'] = [
      '#type' => 'select',
      '#title' => $this->t('Select element'),
      '#options' => $userViews,
      '#ajax' => [
        'callback' => '::findUsers',
        'event' => 'change',
        'wrapper' => 'edit-user-list',
        'progress' => array(
          'type' => 'throbber',
          'message' => t('Searching Users...'),
        ),
      ],
    ];
    $form['user_list_wrapper'] = [
      '#type' => 'container',
      '#attributes' => array(
        'class' => array(
          'user-list-wrapper',
        ),
      ),
    ];
    $form['user_list_wrapper']['user_list'] = [
      '#type' => 'item',
      '#attributes' => [
        'id' => ['user_list'],
      ],
      '#markup' => '<ul><li><a href="#">None</a></li></ul>'
    ];
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => t('Submit'),
    ];

    return $form;
  }

  /**
 * Ajax callback to list users.
 */
  public function findUsers(array &$form, FormStateInterface $form_state) {
    // Create the user list HTML
    $selected = $form_state->getValue('user_view');
    ...
    $user_list = '';
    ...
    if (strlen($user_list) == 0) {
      $user_list = 'None';
    } else {
      $user_list = "<ul>$user_list</ul>";
    }

    // Generate the AJAX response
    $ajax_response = new AjaxResponse();
    $ajax_response->addCommand(new HtmlCommand('#edit-user-list', $user_list));
    return $ajax_response;
  }

  public function submitForm(array &$form, FormStateInterface $form_state) {
    drupal_set_message('Nothing Submitted. Just an Example.');
  }
}

提前致谢

0 个答案:

没有答案