2015-04-02 116 views
0

我不知道我是否已經將我的擴展設置爲有點古怪。相同模型,extbase擴展中的不同模板(和操作)

我有一個模型,但兩個插件,因爲我想以不同的方式顯示相同的數據。

我想要做什麼:分配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' => '', 

    ) 
); 

難道我真的有被重新命名這裏,在控制器(S)和模板目錄,以適應一切「機構」?

回答

1

要回答您在答案中提出的問題,可以在每個插件基礎上配置您的Extension的TypoScript。只需用下劃線領先於你的TS鍵這樣

plugin.tx_stellen_pi2 { 
    settings { 
     displaymode = 1 
    } 
} 

而不是使用if條件你也可以設置不同的TemplateRootPath所以另一個模板將呈現爲PI2添加pluginname。

+0

啊,謝謝!如果你設置TemplateRootPath,有沒有辦法從第一個模板訪問Partial? – Urs 2015-04-04 17:36:11

+1

如果您不覆蓋partialRootPath,您的模板將使用相同的模板。您還可以定義多個路徑來查找佈局,部分或模板partialRootPaths.10,partialRootPaths.20 etc – Daniel 2015-04-05 09:49:34

+0

aha,它會在一起,再次感謝 – Urs 2015-04-05 15:28:40

0

我現在就是這樣做的。保留一個控制器,只需在插件所在的頁面上設置一些頁面TS即可分叉模板。

plugin.tx_stellen { 
    settings { 
     displaymode = 1 
    } 
} 

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

這是workaroundish,不過,因爲它是適用於整個頁面(和我不會甚至需要三個不同的插件的話)。是不是可以直接在擴展中定義TypoScript「per Plugin」?

+0

定義TypoScript「每個插件」是不可能的,因爲頁面內容也是通過TypoScript呈現的,也就是說,您永遠不能通過TypoScript定位單個內容元素。一些piBase擴展有自己的FlexForm字段,允許覆蓋TypoScript,但我從來沒有見過Extbase擴展實現這一點。但仍然有條件(如你所說)和FlexForm(請參閱我的答案)。 – lorenz 2015-04-05 20:50:39

1

請記住,您可以在FlexForm中設置displayMode。每個FlexForm屬性前綴settings.將在{settings}陣列中可用。只需配置柔性成型在ext_tables.php

$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'); 

的柔性成型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> 

在這個例子中,有兩個選項的選擇框「整潔」和「乾淨」被添加。

然後,您可以在您的流體模板中使用這個(你也可以使用SwitchViewHelper代替如果構建,如果你有兩個以上的模式):

<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> 

請記住,你可以嵌套的諧音,所以它的在部分局部中沒有問題。所以只需爲每個視圖使用一個部分。

如果你想擁有它較少的hackish看,你可以給該顯示模式的講值:

<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構造。

+0

洛倫茲,謝謝你的另一個偉大的教程!如果你寫一本extbase書,我會買它看不見的 – Urs 2015-04-06 12:04:38