我有一个Drupal 8站点,我需要向另一台服务器(内容)发出http请求,并将其作为页脚附加到页面中。由于SEO问题,在DOM加载后我无法做到这一点。
我熟悉WordPress,因此很容易使用WP。但是,我对如何使用.twig,Drupal 8这样做感到困惑。任何建议都会很棒。谢谢。
答案 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}的技术(根据你的问题,这可能不适合你,但似乎值得指出)。