Drupal 8 自定义模块添加 php 类

Drupal 8 custom module add php classes

我创建了一个自定义的 Drupal 8 模块,它与自定义块和块表单一起工作以收集一些信息。

这一切都很好。

我还有一个 twig 模板,我想使用我购买的 php 提要 class 呈现 Twitter 提要。我只是不知道它是如何将它集成到模块中的。

这是 class 的设置:http://austinbrunkhorst.com/demos/twitter-class/#setup

它包含两个文件:

ultimate.twitter.feed.php

tmhOAuth.php

当前是require_once 'tmhOAuth.php';ultimate.twitter.feed.php

的头部

根据说明,我应该创建一个 php 文件,其中包含:

$options = array(
    'screen_name' => 'FeedTestUser',
    'consumer_key'  => '...',
    'consumer_secret' => '...',
    'user_token' => '...',
    'user_secret' => '...',
);

$twitter = new Twitter($options);

$twitter->PrintFeed();

我猜这也是一个障碍,因为 twig 文件不是 php

非常感谢任何帮助。

C

创建自定义块并将 PrintFeed() 的结果添加到渲染数组。就像任何通常的自定义块一样。在渲染数组中,您可以指定一个应该使用的模板(如果需要)。如果你想输出没有任何模板的纯 html,你可以使用 '#markup' 键。

小例子:

您的块渲染数组:

return array(
    '#theme' => 'name_of_your_theme',
    '#some_twig_variable' => $twitter->PrintFeed();
);

您的 your_module.module 文件(在您的模块文件夹的根目录中):

function your_module_theme() {
  return array(
    'name_of_your_theme' => array(
      'variables' => array(
        'some_twig_variable' => some-default-value,
      ),
    ),
  );
}

你的你的名字theme.html.twig模板(应该在your_module/templates下):

{{ some_twig_variable }}

就使用 class 而言:我认为使用 require_once 没有问题(在您的 Block php 文件中)。当然它总是 better/nicer 如果你可以通过 make 文件或作曲家要求 library/package 然后使用自动加载器,但如果那不可能就把它放在例如在 /libraries/twitter 左右的 drupal root 中,然后需要它。如果你这样做,你显然必须将该库检查到你的 git 存储库中。

你在 TwitterBlock.php 文件中使用过 ultimate.twitter.feed.php

如果没有,则尝试在 class 块 beginns:

之前添加此行
require_once 'path/to/twitter_class/ultimate.twitter.feed.php';

我会在您的模块中将 class 设置为服务。然后,您的块将实施该服务并进行处理。如果可以避免,您真的不想使用 require_once() ,而是使用 Drupal 结构(部分原因是如果您稍后重新组织,Drupal 将帮助在新位置找到文件)。

将 class 放在模块的 src 目录中,并在文件的开头添加一个名称space(假设那里还没有)。然后在你的块的 class 文件中,你应该能够添加一个引用该名称 space 的 use 语句(更好的方法是使用依赖注入,但相关的细节会妨碍你在这里).

在您的块 class 的 build() 方法中,您然后按照您的问题中的描述实例化 class,而不是仅仅让模块打印 HTML,您可能想要捕获 HTML 并将其作为标记放入您的块中。如果 class 允许您在不使用缓冲区的情况下执行此操作,您应该(但我没有在文档中看到任何支持该功能的内容),然后尝试为结构化数据设置主题。如果没有,您可以使用 PHP's output buffering 来捕获其打印尝试:

 ob_start();
 $twitter->PrintFeed();
 $content= ob_get_contents();
 ob_end_clean();

然后将生成的标记放入渲染数组中:

return [ 
  'my_twitter_block' => [
    '#markup' => $content,
  ],
];