我正在开发一个OctoberCMS插件,它有一个组件,根据提供给组件的模型中的数据呈现不同的部分。我遇到的问题是,如果它属于组件或主题部分文件夹,我似乎只能渲染部分。我希望能够从其他插件注册新的模型类型,并将它们的视图放在同一个插件文件夹中,例如:
我基本上希望主要组件的onRender
能够决定渲染哪个部分,例如:
public function onRender()
{
// Some code here to determine which partial to render
return $this->renderPartial($pathToPartial);
}
答案 0 :(得分:0)
好的,我们可以使用2个引擎1. default PHP
而另一个是2. twig
首先,我们需要将helper
中ViewMaker trait
添加到组件
class CompoOne extends ComponentBase
{
use \System\Traits\ViewMaker; // <- we need to add partial/view related method makeView
现在我们将添加两个方法
render method
和custom Render method
由于我不想覆盖默认行为,我会在extension
添加custom render
。
public function customRender() {
// this will be our logic
$partialPath = $this->vars['parialPath'] ?? 'default';
return $this->makeView($partialPath);
}
public function onRender()
{
// this will decide which partial we need to render
$this->vars['parialPath'] = '$/hardiksatasiya/demotest/main';
// $ <- start from plugin dir
// $this->vars['parialPath'] = '~/main';
// ~ <- start from root dir
// data you want to pass to your partial
$this->vars['model'] = 'your model';
}
这将让组件呈现其默认部分
default.htm
。现在它的代码
<h1>Component Parital</h1>
<div class="dynamic-partial">
{{__SELF__.customRender()|raw }}
<div>
我们的自定义部分
一样$/hardiksatasiya/demotest/main
,就像my_project_root_path/plugins + /hardiksatasiya/demotest/main
main
main.htm automatically
main.htm
代码
<div class="my-partial">
Its ok to have partial <?= $model ?>.
</div>
此组件的最终输出
<h1>Component Parital</h1>
<div class="dynamic-partial">
<div class="my-partial">
Its ok to have partial your model.
</div>
</div>
执行流程
首先onRender
将在此处调用,我们设置vars
,其中包含partial path
[您可以将其从组件配置或其他内容中添加]
它会调用default.htm
这将调用我们的自定义customRender
方法
现在我们finally
调用我们的dynamic partial
,其中包含我们在$this->vars[]
内自动定义的所有变量。 [在演示中我添加了$ this-&gt; vars [&#39; model&#39;]像这样]
只需按照说明使用PHP引擎步骤
我们不需要在组件中添加帮助
ViewMaker trait
(因此跳过该步骤)我们将
custom Render method
更改为使用twig引擎
public function customRender() {
// twig engine
$partialPath = $partialPath = $this->vars['parialPath'] ?? 'default';
$partialPath = $partialPath . '.htm';
if (\File::isPathSymbol($partialPath)) {
$partialPath = \File::symbolizePath($partialPath);
}
$template = $this->controller->getTwig()->loadTemplate($partialPath);
$partialContent = $template->render($this->vars);
return $partialContent;
}
我们的自定义部分文件代码将是
<div class="my-partial">
Its ok to have partial {{ model }}
</div>
输出将与上述相同
我们可以在此处使用
twig
代码,all the variables
分配给$this->vars
的代码将available inside the partial
如果您有任何疑问,请发表评论