相同模型,extbase扩展中的不同模板(和操作)

时间:2015-04-02 20:56:09

标签: typo3 fluid extbase typo3-6.2.x

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

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

我的想法:为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' => '',

    )
);

我是否真的必须通过重新命名来调整所有内容"机构"在这里,在Controller和模板目录中?

3 个答案:

答案 0 :(得分:1)

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

plugin.tx_stellen_pi2 {
    settings {
       displaymode = 1
    }
}

您可以设置不同的TemplateRootPath,而不是使用if条件,以便为pi2渲染另一个模板。

答案 1 :(得分:1)

请记住,您可以在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>

在此示例中,添加了一个带有两个选项“neat”和“clean”的选择框。

然后您可以在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>

然后您可以使用它来像这样调用部分

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

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

答案 2 :(得分:0)

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

plugin.tx_stellen {
    settings {
       displaymode = 1
    }
}

然后<f:if condition="{settings.displaymode}==1"></f:if>

这是麻烦的,因为它对整个页面都有效(我根本不需要三个不同的插件)。是不是可以直接在扩展中定义TypoScript“per Plugin”?