【问题标题】:Same Model, different Templates (and Actions) in extbase extensionextbase 扩展中的相同模型、不同模板(和操作)
【发布时间】:2015-04-02 20:56:09
【问题描述】:

我不知道我是否设置了我的扩展程序有点古怪。

我有一个模型,但有两个插件,因为我想以不同的方式显示相同的数据。

我的想法是:分配 pi1 和 pi2 两个不同的 Fluid 模板,所有显示逻辑都在其中完成。但据我现在了解,没有这样的开关,由于“约定优于配置”,我需要一个单独的 pi2 控制器,对吧?

现在我在 ext_tables.php 中有这个:

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'STUBR.' . $_EXTKEY,
    'Pi1',
    array(
        'Institution' => 'list, show',

    ),
    // non-cacheable actions
    array(
        'Institution' => '',

    )
);

\TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(
    'STUBR.' . $_EXTKEY,
    'Pi2',
    array(
        'Institution' => 'list, show',

    ),
    // non-cacheable actions
    array(
        'Institution' => '',

    )
);

我真的必须通过在此处、控制器和模板目录中重新命名“机构”来调整所有内容吗?

【问题讨论】:

    标签: typo3 fluid extbase typo3-6.2.x


    【解决方案1】:

    要回答您在回答中提出的问题...可以在每个插件基础上配置扩展程序的 TypoScript。只需将带有前导下划线的插件名称添加到您的 TS 密钥中,如下所示

    plugin.tx_stellen_pi2 {
        settings {
           displaymode = 1
        }
    }
    

    除了使用 if 条件,您还可以设置不同的 TemplateRootPath,以便为 pi2 呈现另一个模板。

    【讨论】:

    • 啊,谢谢!如果设置 TemplateRootPath,有没有办法从第一个模板访问 Partials?
    • 如果您不覆盖您的 partialRootPath,您的模板将使用相同的模板。您还可以使用 partialRootPaths.10、partialRootPaths.20 等定义多个路径来查找布局、部分或模板
    【解决方案2】:

    请记住,您可以在 FlexForm 中设置 displayMode。每个以 settings. 为前缀的 FlexForm 属性都将在 {settings} 数组中可用。只需在ext_tables.php 中配置 FlexForm:

    $pluginSignature = str_replace('_','',$_EXTKEY) . '_pi1';
    $GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist'][$pluginSignature] = 'pi_flexform';
    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addPiFlexFormValue($pluginSignature, 'FILE:EXT:' . $_EXTKEY . '/Configuration/FlexForm/flexform_pi1.xml');
    

    然后将 FlexForm XML 添加到配置的路径中:

    <T3DataStructure>
        <meta>
            <langDisable>1</langDisable>
        </meta>
        <sheets>
            <sDEF>
                <ROOT>
                    <TCEforms>
                        <sheetTitle>Configuration</sheetTitle>
                    </TCEforms>
                    <type>array</type>
                    <el>
                        <settings.displayMode>
                            <TCEforms>
                                <exclude>0</exclude>
                                <label>Display mode</label>
                                <config>
                                    <type>select</type>
                                    <items type="array">
                                        <numIndex index="0" type="array">
                                            <numIndex index="0">Neat</numIndex>
                                            <numIndex index="1">1</numIndex>
                                        </numIndex>
                                        <numIndex index="1" type="array">
                                            <numIndex index="0">Clean</numIndex>
                                            <numIndex index="1">2</numIndex>
                                        </numIndex>
                                    </items>
                                    <minitems>0</minitems>
                                    <maxitems>1</maxitems>
                                    <size>1</size>
                                </config>
                            </TCEforms>
                        </settings.displayMode>
                    </el>
                </ROOT>
            </sDEF>
        </sheets>
    </T3DataStructure>
    

    在本例中,添加了一个带有“整洁”和“干净”两个选项的选择框。

    然后您可以在 Fluid 模板中使用它(如果您有两种以上的模式,您也可以使用 SwitchViewHelper 而不是 if 构造):

    <f:if condition="{settings.displayMode} == 1">
        <f:then>
            <f:render partial="Neat/List" arguments="{_all}" />
        </f:then>
        <f:else>
            <f:render partial="Clean/List" arguments="{_all}" />
        </f:else
    </f:if>
    

    请记住,您可以嵌套分部,因此在分部中有分部是没有问题的。因此,只需为每个视图使用部分视图。

    如果你想让它看起来不那么老套,你可以给显示模式一个说话的价值:

    <numIndex index="0" type="array">
        <numIndex index="0">Neat</numIndex>
        <numIndex index="1">Neat</numIndex>
    </numIndex>
    <numIndex index="1" type="array">
        <numIndex index="0">Clean</numIndex>
        <numIndex index="1">Clean</numIndex>
    </numIndex>
    

    那你就可以用 this 像这样调用局部了

    <f:render partial="List/{settings.displayMode}" arguments="{_all}" />
    

    并以这种方式摆脱 if 构造。

    【讨论】:

    • Lorenz,感谢另一个很棒的教程!如果你写一本 extbase 书,我会在看不见的地方买它
    【解决方案3】:

    我现在就是这样做的。保留一个控制器,只需通过在插件所在的页面上设置一些页面 TS 来分叉模板。

    plugin.tx_stellen {
        settings {
           displaymode = 1
        }
    }
    

    然后&lt;f:if condition="{settings.displaymode}==1"&gt;&lt;/f:if&gt;

    不过,这是一种解决方法,因为它对整个页面都有效(而且我什至根本不需要这三个不同的插件)。不能直接在扩展中定义 TypoScript “per Plugin” 吗?

    【讨论】:

    • 定义 TypoScript “每个插件”是不可能的,因为页面内容也是通过 TypoScript 呈现的,也就是说,您永远不能通过 TypoScript 定位单个内容元素。一些 piBase 扩展有自己的 FlexForm 字段,允许覆盖 TypoScript,但我从未见过 Extbase 扩展实现这一点。但是仍然有条件(如您所述)和 FlexForm(请参阅我的回答)。
    猜你喜欢
    • 2012-03-27
    • 2014-05-13
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2012-07-04
    • 2020-04-13
    • 2015-12-20
    相关资源
    最近更新 更多