2015-04-02 5 views
0

Я не знаю, настроил ли я свое расширение немного причудливо.Та же модель, разные шаблоны (и действия) в extbase extension

У меня есть одна модель, но два плагина, так как я хотел бы отображать одни и те же данные по-разному.

Что я буду делать: назначьте 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' => '', 

    ) 
); 

ли я на самом деле придется адаптировать все перезагрузкой именование «Учреждение» здесь, в контроллере (ов), а также в каталогах шаблонов?

ответ

1

Чтобы ответить на вопрос, который вы задали в своем ответе ..., вы можете настроить TypoScript вашего расширения на основе каждого плагина. Просто добавьте pluginname с ведущим подчерком ключа TS как этот

plugin.tx_stellen_pi2 { 
    settings { 
     displaymode = 1 
    } 
} 

Вместо того, чтобы использовать, если условие можно также установить другой TemplateRootPath поэтому другой шаблон будет вынесен для PI2.

+0

А, спасибо! И есть ли способ доступа к Partials из 1-го шаблона, если вы установите TemplateRootPath? – Urs

+1

Если вы не перезапишите свой partialRootPath, ваши шаблоны будут использовать те же шаблоны. Вы также можете определить несколько путей, чтобы искать макеты, частичные или шаблоны с partialRootPaths.10, partialRootPaths.20 и т. Д. – Daniel

+0

aha, он собирается вместе, снова спасибо – Urs

0

Я делаю это так сейчас. Держите один контроллер, просто откройте шаблон, установив несколько страниц на странице, на которой включен плагин.

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

1

Помните, что вы можете установить displayMode в FlexForm. Каждое свойство FlexForm с префиксом settings. будет доступно в массиве {settings}. Просто настройте Flexform в 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 Flexform на пути сконфигурированной:

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

Помните, что вы можете вкладывать парциальных, так что нет проблем с частичным в частичном в частичном. Поэтому просто используйте частичный для каждого вида.

Если вы хотите, чтобы он меньше хак выглядящего, вы могли бы дать в режиме отображения говорящего значения:

<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

Lorenz, спасибо за еще один отличный учебник! Если вы напишете книгу extbase, я куплю ее невидимой – Urs