【问题标题】:Working with forms in drupal 8在 drupal 8 中使用表单
【发布时间】:2016-08-05 05:12:39
【问题描述】:

我在表单 API 中遇到“#markup”问题。

在 Drupal 7 中,我们可以使用如下所示的“#markup”表单元素:

<?php
$form['test'] = array(
    '#type' => 'markup',
    '#markup' => '<div><script src="http://localhost/drupal7/sites/all/libraries/test.js"></script></div>',
  );
?>
//Here is my custom test.js
(function($) {
    Drupal.behaviors.test = {
        attach: function(context, settings) {
            console.log('testttt');
            document.write('*Hello, there!*');
        }
    };
})(jQuery);

当表单被渲染时,上面的代码将打印“Hello, there!”。

现在在 Drupal 8 中,我使用下面的代码,但它什么也没打印。

<?php
$form['test'] = array(
      '#markup' => '<div><script src="http://localhost/project8/sites/all/libraries/test.js"></script></div>',
    );
?>

那么如何在 Drupal 8 中实现这个功能,这已经在 Drupal 7 中工作了。 在脚本标签下,它可以是本地脚本或外部脚本.. 请帮忙...

谢谢

【问题讨论】:

    标签: drupal drupal-8 form-api


    【解决方案1】:

    在 Drupal 8 中,不建议使用“#markup”来附加 javascript 文件。 您可以在自定义模块或主题中定义库并将库附加到您的表单。该库可以包含多个 js 和(或)css 文件。

    在模块中定义库:

    假设你的模块名称是“my_module”,在你的模块文件夹中创建一个文件“my_module.libraries.yml”,并像这样指定js和css文件

    form-script:
      version: 1.x
      css:
        theme:
          css/form.css: {}
      js:
        js/form.js: {}
        js/form-ajax.js: {}
      dependencies:
        - core/jquery
    

    为了将此库附加到您的表单:

    $form['#attached']['library'][] = 'my_module/form-script';
    

    然后清除缓存。 js 和 css 文件将按照您在 library.yml 文件中提到的顺序加载。 您可以在同一个“my_module.libraries.yml”文件中定义多个库。

    【讨论】:

      【解决方案2】:

      #markup 在 Drupal 8 中仍然有效,但现在它在输出前被过滤了。正如Render API overview中所述:

      #markup:指定数组直接提供 HTML 标记。除非标记非常简单,例如段落标记中的解释,否则通常最好使用#theme 或#type 代替,以便主题可以自定义标记。请注意,该值是通过\Drupal\Component\Utility\Xss::filterAdmin() 传递的,它会去除已知的 XSS 向量,同时允许允许的 HTML 标记列表不是 XSS 向量。 (即,不允许。)请参阅\Drupal\Component\Utility\Xss::$adminTags 以获取允许的标签列表。如果您的标记需要任何不在此白名单中的标签,那么您可以实现主题挂钩和模板文件和/或资产库。或者,您可以使用渲染数组键 #allowed_tags 来更改过滤哪些标签。

      您也可以使用FormattableMarkup:

      '#markup' => new FormattableMarkup('<div><script src="http://localhost/project8/sites/all/libraries/test.js"></script></div>', []),
      

      虽然在这种情况下不建议这样做。

      【讨论】:

        猜你喜欢
        • 2016-07-03
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-16
        • 2017-09-20
        • 1970-01-01
        • 2019-05-24
        相关资源
        最近更新 更多