Настраиваемые усилители маршрута расширения Typo3

Я создал собственное расширение Typo3 v9.5.26, используя расширение Extension Builder.

Мое расширение находится в typo3conf / ext / xyz_sortitems и сортирует элементы.

Товар имеет атрибуты itemid, name, date и amount.

Мой ext_localconf.php выглядит так:

<?php  
if (!defined('TYPO3_MODE')) {  
    die ('Access denied.');  
}  
  
call_user_func(  
    function() {  
  
        \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin(  
            'XYZ.XyzSortitems',  
            'Sortitems',  
  
            // cacheable actions  
            ['Sortitems' => 'sortbyname,sortbydate,sortbyamount,showsingleitem'],  
  
            // non-cacheable actions  
            ['Sortitems' => 'sortbyname,sortbydate,sortbyamount,showsingleitem']  
        );  
  
    }  
);

Мой контроллер представления находится в typo3conf / ext / xyz_sortitems / classes / Controller / SortitemsController.php и выглядит примерно так:

<?php  
  
namespace XYZ\XyzSortitems\Controller;  
  
class SortitemsController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController {  
  
    protected $sortitemsRepository = null;  
  
    public function injectSortitemsRepository(\XYZ\XyzSortitems\Domain\Repository\SortimtesRepository $sortitemsRepository) {  
        $this->sortitemsRepository = $sortitemsRepository;  
    }  
  
    public function sortbynameAction() {  
        // sorts items by name here...  
    }  
  
    public function sortbydateAction() {  
        // sorts items by date here...  
    }  
  
    public function sortbyamountAction() {  
        // sorts items by amount here...  
    }  
  
    public function showsingleitemAction() {  
        // displays a single item here...  
    }  
  
}

... и мой шаблон представления (например, для sortbydateAction) находится в ext / xyz_sortitems / Resources / Private / Templates / Sortbydate.html и генерирует ссылки на соответствующие элементы, например:

<html xmlns:f="http://typo3.org/ns/fluid/ViewHelpers">  
    <f:layout name="defaultLayout" />  
    <f:section name="sectionname">  
        <f:for each="{items}" as="item">  
  
            <!-- here the link to the single item page is generated -->  
            <f:link.action action="showsingleitem" pageUid="4321" arguments="{itemid: item.itemid}">  
  
        </f:for>  
    </f:section>  
</html>

Мое расширение работает должным образом.

Теперь, когда я смотрю на интерфейс на странице, отображающей отсортированный список элементов (например, отсортированный по дате), механизм шаблонов Fluid генерирует ссылки элементов в этом списке на соответствующие целевые страницы (каждая из которых отображает один элемент). примерно так:

http://example.com/item  
?tx_xzysortitems_sortitems%5Baction%5D=showsingleitem 
&tx_xzysortitems_sortitems%5Bcontroller%5D=Sortitems  
&tx_xzysortitems_sortitems%5Bitemid%5D=12345  
&cHash=38a2dd43d7b0c4997c3b0ff6d4430e55

Вместо этого мне нужны ссылки на соответствующие страницы, показывающие один элемент, выглядящий следующим образом:

http://example.com/item/{itemid}/{name}  
(e.g. http://example.com/item/12345/ice-cream-on-toast)

Поскольку RealURL отсутствует в Typo2 v9, мне, очевидно, нужен Route Enhancer в typo3conf / ext / xyz_sortitems / config.yaml, считывающий itemid и name из таблицы расширений в базе данных Typo3 и помещающий эти значения в URL-адреса, указывающие на страницы отдельных элементов .

К сожалению, около 90% всех примеров кода я смог найти ссылку на расширение News Георга Рингера на основе пи. Это расширение является совершенно особенным (потому что оно основано на пи и по многим другим причинам), и простое повторение примеров этого расширения не делает тему более понятной для меня. Остальные 10% инструкций, которые я смог найти, включая официальную документацию Typo3 (в настоящее время здесь) предоставляет отличные примеры, но не упоминает, какое значение откуда берется.

В основном меня интересует верхняя часть config.yaml:

  routeEnhancers:  
    {SecondLine}:  
      type: {typedefinition}  
      extension: {extensionname}  
      plugin: {pluginname}  
      namespace: {namespace}  
      limitToPages:  
        - {a_page_id}  
        - {another_page_id}  
      routes:  
      # routes here...

Какие из этих значений мне нужны и где именно их взять?

Инструкции, которые я нашел до сих пор, обычно либо вообще не объясняют эти значения, либо ссылаются на них, беря эти значения из вашего ext_localconf.php. Это мне не очень помогает, так как не объясняет, какое значение в config.yaml соответствует какому значению в ext_localconf.php, и если синтаксис соответствующего значения должен быть в нижнем регистре, первая буква в верхнем регистре, а остальные в нижнем или верблюжьем регистре, если он должен быть в одинарных или двойных кавычках, экранирован, может содержать пробелы, требуются символы подчеркивания или что-то еще, что требует синтаксис, чтобы быть действительным. Такие термины, как имя расширения, могут вводить в заблуждение, так как в моем примере это могут быть sortitems, xyz_sortitems, XYZ.Sortitems, XyzSortitems или Sortitems, просто чтобы назвать некоторые из них.

Я был бы признателен за ответ с примером кода config.yaml, объясняющим эти значения подробно, в общем виде, так что каждый, кто читает этот вопрос и имеет такую ​​же проблему с пониманием руководств, как я, мог применить это ценные знания для их собственного расширения Typo3 легко.


person Tobse    schedule 07.05.2021    source источник
comment
Имейте в виду, что большая часть приведенного выше кода является псевдокодом, чтобы пример был как можно более общим, но с сохранением наиболее подробных имен переменных, чтобы избежать ошибочных ключевых слов, таких как контроллер или расширение.   -  person Tobse    schedule 07.05.2021


Ответы (1)


Основываясь на вашем вопросе, это объяснение значений.

routeEnhancers:  
    {SecondLine}:  
      type: {typedefinition}  
      extension: {extensionname}  
      plugin: {pluginname}  
      namespace: {namespace}  
      limitToPages:  
        - {a_page_id}  
        - {another_page_id}  
      routes:  
      # routes here...

Значение {SecondLine}

Пример: XzySortitemsShow

Уникальное имя для энхансеров, используемое внутри для ссылок. Найдено в основной документ.

Значение {typedefinition}

Пример: Extbase

TYPO3 поставляется со следующими усилителями маршрута из коробки:

  • Simple Enhancer (тип усилителя «Simple»)
  • Plugin Enhancer (тип усилителя «Plugin»)
  • Extbase Plugin Enhancer (тип усилителя «Extbase»)

Другие типы описаны в основные документы.

Значение {extensionname}

Пример: XyzSortitems.

UpperCamelCase имени расширения (имя папки вашего расширения)

Источник: typo3_src-10.4.14 / sysext / extbase / Classes / Utility / ExtensionUtility.php

Функциональные параметры configurePlugin ():

public static function configurePlugin(
    $extensionName, 
    $pluginName, 
    array $controllerActions, 
    array $nonCacheableControllerActions = [], 
    $pluginType = self::PLUGIN_TYPE_PLUGIN)

Комментарий из кода configurePlugin () * @param string $ extensionName Имя расширения (в UpperCamelCase) или ключ расширения (в lower_underscore)

Значение {pluginname}

Пример: Элементы сортировки

Источник: typo3_src-10.4.14 / sysext / extbase / Classes / Utility / ExtensionUtility.php

Функциональные параметры configurePlugin ():

public static function configurePlugin(
    $extensionName, 
    $pluginName, 
    array $controllerActions, 
    array $nonCacheableControllerActions = [], 
    $pluginType = self::PLUGIN_TYPE_PLUGIN)

Комментарий из кода configurePlugin ()

* @param string $pluginName must be a unique id 
      for your plugin in UpperCamelCase 
      (the string length of the extension key 
      added to the length of the plugin name 
      should be less than 32!)

{пространство имен}

Является альтернативой типу extbase.

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

Для Extbase Plugin Enhancer также можно настроить пространство имен напрямую, пропустив свойства расширения и плагина и просто используя свойство namespace, как в обычном Plugin Enhancer.

Offtopic: EXT Георга Рингера: новости не основаны на числах числа пи!

person Heinz Schilling    schedule 09.05.2021
comment
Большое спасибо за эту подробную и понятную информацию! Ключевым моментом для меня было написать напрямую в typo3conf / sites / {sitename} /config.yaml, а не в typo3conf / ext / xyz_sortitems / config.yaml. - person Tobse; 11.05.2021
comment
В качестве альтернативы вы можете импортировать его в typo3conf / sites / {sitename} /config.yaml: imports: - resource: 'EXT: xyz_sortitems / Configuration / Routes / Default.yaml' - person Heinz Schilling; 11.05.2021