将JS添加到Drupal 8主题(代替drupal_add_js)


8

在Drupal 7中,我可以drupal_add_js在主题的template.php文件中使用以下theme_preprocess_html(&$vars)功能:

   drupal_add_js(drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
        array(
          'group' => JS_THEME,
          'preprocess' => TRUE,
          'weight' => '999',
        ));

  $vars['scripts'] = drupal_get_js();

在Drupal 8中,我尝试attached在主题的.theme文件中使用进行如下转换:

  $vars['#attached']['js'] = array(
    array(
      'data' => drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
      'options' => array(
        'group' => JS_THEME,
        'preprocess' => TRUE,
        'every_page' => TRUE,
      ),
    ),
  );

...但是那不起作用,并且看门狗/控制台或其他方面没有错误。

按照D8 API页面drupal_add_js

不推荐使用-从Drupal 8.0开始。在渲染数组中使用#attached键。

但是,没有更多的信息。似乎也drupal_add_css将使用此方法。我知道对于Drupal 8来说还处于初期,但是我希望对此有所了解。


1
只是一个猜测-也许您应该尝试图书馆方法?并且请避免使用“没有工作”的声明。当您不得不猜测这是什么意思时,您不讨厌它吗?警告?错误吗?什么都没有,文件不包括在内?
Mołot

@Mołot-没有警告或错误,我也检查了看门狗。我还查看了Chrome中的控制台,发现没有错误,因此我只能报告“它没有用”。完整的错误报告已打开,将这个主题移植到Drupal 8时,我当然也有相当一部分。无论如何,我认为图书馆方法似乎是行之有效的方法,而不是下面给出的答案。我将挑选一些Drupal 8模块,看看是否可以解决。
丹尼·英格兰

您可能会报告“它无法正常工作,没有任何错误……”-那么我们会知道没有任何问题,您实际上是在询问之前完成了工作。这就是我与你想要:)太多人在这里甚至没有检查问...
Mołot

1
好的,谢谢,并更新了更好的问题摘要。:)
Danny Englander 2013年

Answers:


7

看来您可以这样使用hook_preprocess_page附上:

function MYTHEME_preprocess_page(&$vars, $hook) {
  $path = drupal_get_path('theme', 'MYTHEME');
     // Render the main scripts file.
  $local_js = array(
    '#attached' => array(
      'js' => array(
        $path . '/js/scripts.js' => array(
          'group' => JS_THEME,
          'weight' => 9999),
      ),
    ),
  );
  \Drupal::service('renderer')->renderRoot($local_js);
}

这很好用(theme.inc使用此方法),请注意权重周围额外的嵌套数组。


更新了代码以反映完整的工作版本,重量以及所有功能。
丹尼·英格兰

正是我需要的,非常感谢!!!
Yassin Tahtah,2015年

4

文档中的重点是这一点

在渲染数组中使用#attached键。

强调我的。

$variables在主题/预处理功能阵列是不是渲染阵列,它只是一个列保持变量。要使用#attached它,在预处理功能中需要类似以下内容:

$vars['foo'] = array(
  '#markup' => '<p>Bar</p>',
  '#attached' => array(
    'data' => drupal_get_path('theme', 'mytheme') . '/js/scripts.js',
    'options' => array(
      'group' => JS_THEME,
      'preprocess' => TRUE,
      'every_page' => TRUE,
    ),
  ),
);

而这在模板文件中:

{ foo }

换句话说,与Drupal 7差不多(至少在这个时候)。

hook_preprocess_html()顺便说一句,可能不是该代码的正确位置;不要忘记js / css文件实际上是在该模板中呈现的,因此添加任何内容为时已晚hook_preprocess_page()hook_preprocess_node()否则等效项可能会为您提供更可靠的结果。

有关预处理变量的更多信息,请参见Twig最佳实践-预处理功能和模板页面。


1
这是正确的:传递给预处理/过程函数的变量绝不是渲染数组。
kiamlaluno

出于所有应有的尊重,我只是想在Drupal 8中寻找一个替代方案,以将js文件添加到主题中,而不是在其中呈现变量。即使我愿意,也可以像{{ foo }}在Twig世界中那样进行操作,主题模板中没有更多的php / print渲染,即node.html.twig/page.html.twig
Danny Englander

1
是的,大脑冻结在那里,我不好。答案是一样的。您只能#attached在渲染数组的上下文中使用;该文档是正确的。您或者需要使用上面的方法,连同它一起来预处理和预渲染变量,或者使用主题的.info.yml文件来包含JS。到目前为止,我是唯一可以选择的这些选项,无需走图书馆的路线
克莱夫(Clive)

1
我认为这种方法将类似于以下内容:drupalcode.org/project/drupal.git/blob/refs/heads/8.x :/ core / ...-请参阅第564行hook_library_info,该行使用和上面暗示了Mołot。我将不得不尝试一下。谢谢。
丹尼·英格兰


2

在此示例中,您使用的是真实的渲染数组,而不是在函数本身中渲染的数组。

这样,其他模块,主题等可以对其进行更改。

/**
 * Implements hook_page_alter().
 */
function db_jacket_page_alter(&$page) {
  $page['#attached']['js'][] = drupal_get_path('theme', 'db_jacket') . '/js/jquery.image-depth.js';
}

0

尽管OP是关于Drupal 8的,但这可以在Drupal 7中以类似的方式完成,而不必drupal_add_js()开始习惯于不drupal_add_js()熟悉:

/**
 * Implements hook_preprocess_page().
 */
function YOURMODULE_preprocess_page(&$variables) {
  $module_path = drupal_get_path('module', 'YOURMODULE');
  $variables['page']['content']['#attached']['js'][$module_path . '/js/YOURMODULE.js'] = array();
}

可以在空数组中定义选项,请参阅https://api.drupal.org/api/drupal/includes%21common.inc/function/drupal_add_js/7

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.