Drupal 8,http请求到服务器并附加到站点

时间:2016-06-22 15:32:08

标签: drupal twig drupal-8

我有一个Drupal 8站点,我需要向另一台服务器(内容)发出http请求,并将其作为页脚附加到页面中。由于SEO问题,在DOM加载后我无法做到这一点。

我熟悉WordPress,因此很容易使用WP。但是,我对如何使用.twig,Drupal 8这样做感到困惑。任何建议都会很棒。谢谢。

1 个答案:

答案 0 :(得分:0)

如果您希望内容在发送到浏览器时成为DOM的一部分,这不是您想要在Twig中执行的操作,您应该在此过程中先前加载内容。

您可以create a module that defines custom block将该区块放在主题的正确区域。

块插件类要求您编写一个build()方法,该方法返回块的渲染数组。在build()内,您可以做任何获取内容所需的内容,包括使用Symfony的Guzzle客户端发出HTTP请求:

public function build() {
  $url = 'https://www.example.com/remote/service';
  $client = \Drupal::httpClient();
  $request = $client->createRequest('GET', $url);
  // Do whatever's needed to extract the data you need from the request...
  $build = ['my_remote_block' => [
      '#theme' => 'my_custom_theme_function',
      '#attributes' => [
         //An array of variables to pass to the theme
      ],
      '#cache' => [
        //Some appropriate cache settings
      ],
    ],
  ];

如果您从请求中获取HTML,则可以跳过自定义主题函数并返回包含'#type' => 'markup'的数组,然后返回标记字段。本例的其余部分假设您获取数据并希望自己呈现它。

在模块的.module文件中,您可以定义自定义主题功能(这样您就可以使用自己设计的树枝文件)。

function my_module_theme($existing, $type, $theme, $path) {
  return [
    'my_custom_theme_function' => [
      'variables'=> [ 
        // defaults for variables used in this block.
      ],
    ],
  ];
}

然后最后你可以创建一个twig文件named my-custom-theme-function.html.twig来渲染输出。

这些类型的设置通常很慢(因为浏览器的请求会触发另一个HTTP请求+处理时间),因此您应该考虑尽可能多地缓存块或使用类似{{3}的技术(根据你的问题,这可能不适合你,但似乎值得指出)。