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,
],
];
我创建了一个自定义的 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,
],
];