【问题标题】:How to change which partial is rendered in OctoberCMS component?如何更改 OctoberCMS 组件中呈现的部分?
【发布时间】:2017-10-18 06:40:41
【问题描述】:

默认情况下,OctoberCMS 插件组件会渲染部分 default.htm。是否可以覆盖将呈现的部分?比如……

插件文件结构

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

例子.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')
   }

}

我知道可以从default.htm 内部渲染other_partial,但在我的情况下,我试图保持default.htm 不变,并将其他部分渲染为默认值。

【问题讨论】:

    标签: php octobercms octobercms-plugins


    【解决方案1】:

    我将在 10 月份执行此操作的方式是在 Twig 中使用一些逻辑在页面模板上处理此问题。在我看来,这可能是最合乎逻辑的地方。

    【讨论】:

    • 能否举例说明如何使用页面模板?
    【解决方案2】:

    你可以使用renderPartial方法

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

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

    【讨论】:

    • 谢谢,这是正确的方向。但是,仍会呈现默认标记,但我可以按照 Chris V 的建议在部分中包含一些逻辑
    【解决方案3】:

    我试图为我的网站解决这个问题,我想我已经找到了答案。在你的组件 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);
    }
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

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

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

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

        当然,您需要在页面中设置一些逻辑来决定变量“其他”是否存在。或者您可以对控制变量的特定值进行逻辑检查

        【讨论】:

        • 谢谢,这样可以。它的缺点是你不能在页面编辑器中“分叉”组件默认标记(你可以,但它只会给你这个逻辑)。无论如何,它有效!
        • 您能否更详细地解释一下您的意思?
        • 10 月,您可以在页面编辑器中customize the default markup,通过单击将加载默认标记的小叉符号。在这种情况下,标记再次只包含 if-else-logic 而不是您要自定义的实际部分代码。您仍然可以手动复制它,所以它可以工作,但我最初的问题是寻找实际更改它 - 但我认为在 10 月份不可能,部分逻辑实际上是要走的路。
        • 实际上,您可以在部分本身中包含逻辑(如果我没记错的话,组件部分除外)。您也可以在部分内部使用 twig
        【解决方案6】:

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

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

        {% component 'mycomponent' %}
        

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

        我的组件的 onRun() 函数中可能有一些代码要 pu,但没有找到正确的。

        使用 $content = $this->renderPartial('grid.htm');仍然渲染 default.htm 部分...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-09-01
          • 1970-01-01
          • 2017-07-08
          • 2021-04-11
          • 2019-04-12
          • 2023-03-21
          • 2019-11-28
          相关资源
          最近更新 更多