1

我在表单 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);

上面的代码将打印“你好,那里! ”当表单将被渲染时。

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

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

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

谢谢

4

2 回答 2

3

在 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”文件中定义多个库。

于 2016-08-11T12:58:55.397 回答
1

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

#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-08-05T05:35:57.193 回答