如何更改OctoberCMS组件中呈现的部分?

时间:2017-05-18 12:34:46

标签: php octobercms octobercms-plugins

默认情况下,OctoberCMS插件组件呈现部分default.htm。是否可以覆盖将呈现哪个部分?例如......

插件文件结构

├── components
│   ├── example
│   │   ├── default.htm
│   │   ├── other_partial.htm
│   ├── Example.php
├── ...
├── Plugin.php

使用example.php

class Example extends ComponentBase  {

   public function onRun() {
       // change the rendered partial, such that other_partial.htm
       // will be rendered instead of default.htm
       $this->setRenderedPartial('other_partial')
   }

}

我知道可以从other_partial内部呈现default.htm,但在我的情况下,我试图保持default.htm不变,而将其他部分视为默认值。< / p>

6 个答案:

答案 0 :(得分:2)

我在十月份这样做的方法是在页面模板上使用Twig中的一些逻辑来处理这个问题。在我看来,这可能是最合乎逻辑的地方。

答案 1 :(得分:2)

您可以使用renderPartial方法

public function onRun()
{
    $content = $this->renderPartial('default.htm');
}

doc:http://octobercms.com/docs/plugin/components#render-partial-method

答案 2 :(得分:2)

我正在尝试为我的网站解决此问题,我想我已经找到了答案。在组件PHP文件上,您可以尝试以下功能:

public function onRender(){
    $partialType= $this->property('partialType');
    switch ($partialType) {
        case 'one':
            $partial = '@partial-1.htm';
            break;
        
        case 'two':
            $partial = '@partial-2.htm';
            break;

        case 'three':
            $partial = '@partial-3.htm';
            break;
              
        case 'four':
            $partial = '@partial-4.htm';
            break;
              
        default:
            $partial = '@default.htm';
            break;
    }

   return $this->renderPartial($partial);
}

答案 3 :(得分:1)

您应告诉组件在呈现布局和页面后运行的onRender()上呈现Partial:

public function onRender()
{
    return $this->renderPartial('@other_partial');
}

使用@强制组件查找部分组件而不是主题组件!

答案 4 :(得分:0)

您页面模板上的逻辑可能类似于下面的代码,以决定应显示哪个部分。

类似的东西(你需要检查语法,因为我最近没有使用过它:

{% if other %} #if variable 'other' exists in the page
    {% partial "other" %}
{% else %}
    {% partial "default" %}
{% endif %}

当然,您需要在页面中设置一些逻辑,以决定变量&#39;其他&#39;应该存在与否。或者您可以对控制变量的特定值进行逻辑检查

答案 5 :(得分:0)

我还在寻找一种不需要树枝的解决方案。我在我的组件中添加了一个设置,列出了模板文件夹下的所有文件。

现在我可以选择所需的模板文件,我想要的是,当我简单地调用组件时:

{% component 'mycomponent' %}

它使用组件设置中定义的正确部分来渲染组件。

在我的组件的onRun()函数中可能存在一些代码,但是找不到正确的代码。

使用$ content = $ this-&gt; renderPartial(&#39; grid.htm&#39;);仍然渲染default.htm partial ...