Я создал собственное расширение 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 легко.