尝试在Drupal 8(测试版2)中添加html头标记


9

使用Drupal 8.0β2,drupal_add_html_head() 已被弃用,赞成的#attached。因此,旧方法是:

function MYTHEME_page_build(&$page) {
    $viewport = array(
          '#type' => 'html_tag',
          '#tag' => 'meta',
          '#attributes' => array(
            'name' => 'viewport',
            'content' => 'width=device-width, initial-scale=1.0, maximum-scale=2.0, minimum-scale=0.55, user-scalable=yes',
          ),
        );
        drupal_add_html_head($viewport, 'viewport');
}

根据您现在使用的更改通知#attached。因此,上面的代码本质上是相同的,最后一部分变为:

$build['#attached']['html_head'][] = [$viewport, 'viewport'];

但是,这不起作用,并且看门狗中没有错误消息。我也尝试将其放在页面alter中以及$build$variables和进行交换,$output但仍然无法正常工作。另外,我尝试将整个过程作为数组:

  $build['#attached']['html_head'][] = array(
    '#type' => 'html_tag',
    '#tag' => 'meta',
    '#attributes' => array(
      'name' => 'viewport',
      'content' => 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no',
    ),
  );

...但是那也不起作用。我不确定自己在做什么错,似乎应该可以正常工作。

更新资料

这是工作代码,使用的代码hook_page_attachments_alter不在D8 Beta 2中,因为它只是致力于开发的。

function MYTHEME_page_attachments_alter(array &$page) {
    $viewport = array(
      '#type' => 'html_tag',
      '#tag' => 'meta',
      '#attributes' => array(
        'name' => 'viewport',
        'content' => 'width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no',
      ),
    );
    $page['#attached']['html_head'][] = [$viewport, 'viewport'];
  }

现在唯一的问题是核心的视口标签不会被覆盖,因此我只能使用自定义标签和核心标签。不确定如何处理该标签,还是我的标签应该覆盖核心标签?

在此处输入图片说明

Answers:


7

您在预处理中没有$ build,所以不能那样工作。$ build必须是在某个地方渲染的渲染数组。我也看不到以前如何工作,因为在函数运行之前已经在template_preprocess_html()中进行了转换。

添加hook_page_attachments(_alter)()并弃用刚刚提交的hook_page_build / alter(),作为主题,您可以实现hook_page_attachments_alter(),在已提交的补丁中查找示例,例如common_test_page_attachments_alter()

因此,类似的东西$page['#attached']['html_head'][] = [$viewport, 'viewport'];应该在那里工作。


好,谢谢您的帮助,但我仍然迷路。我很好奇您是否可以使用它。我已经尝试过hook_page_build和alter,但仍然没有喜悦。我什至没有从运气中拿到一些例子。看起来应该没有那么难。
丹尼·英格兰

1
然后用当前的代码示例更新您的问题。我所指的示例肯定可以正常工作,因为它用于测试。因此,您必须做一些不同的事情。我建议使用的钩子是hook_page_attachments_alter(),而不是page_build()。当实现一个钩子并且什么东西不起作用时,首先要验证的事情始终是是否通过添加出口来调用您的代码。例如。
Berdir 2014年

我添加了使用您建议的工作代码hook_page_attachments_alter。有一个副作用,我现在有两个视口标签,一个来自核心,另一个是从主题添加的,所以我不确定该如何处理。
丹尼·英格兰

1
这就是第二个参数的含义,html_head元素正在使用它来保持唯一性。从核心看,该元素已添加到DefaultHtmlFragementRenderer :: setDefaultMetatags()中。那里的新API没有指定密钥的方法,这似乎是一个非常严重的问题。我建议您为此打开一个问题。也许drupal.org/node/2350943是相关的。
贝尔迪尔

我打开了一个核心问题:drupal.org/node/2359987
Danny Englander 2014年
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.