RealURL: удалить контроллер и действие из URL
у меня есть расширение со списком и показать действие. В настоящее время это расширение может отображаться на нескольких страницах:
/page-1/
/page-2/subpage/
настройки realurl
вот так:
$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['realurl']=array (
'encodeSpURL_postProc' => array('user_encodeSpURL_postProc'),
'decodeSpURL_preProc' => array('user_decodeSpURL_preProc'),
'_DEFAULT' => array (
…
'postVarSets' => array(
'_DEFAULT' => array(
'controller' => array(
array(
'GETvar' => 'tx_extension_plugin[controller]',
'noMatch' => 'bypass',
),
),
'extension' => array(
array(
'GETvar' => 'tx_extension_plugin[action]',
),
array(
'GETvar' => 'tx_extension_plugin[controller]',
),
array(
'GETvar' => 'tx_extension_plugin[value]',
'lookUpTable' => array(
'table' => 'table',
'id_field' => 'uid',
'alias_field' => 'name',
'addWhereClause' => ' AND NOT deleted AND NOT hidden',
…
);
function user_decodeSpURL_preProc(&$params, &$ref) {
$params['URL'] = str_replace('page-1/', 'page-1/extension/', $params['URL']);
}
function user_encodeSpURL_postProc(&$params, &$ref) {
$params['URL'] = str_replace('page-1/extension/', 'page-1/', $params['URL']);
}
теперь я получаю URL-адреса, такие как:
/page-1/ /* shows list */
/page-1/Action/show/name-of-single-element /* single view */
чего я на самом деле хочу, так это:
/page-1/name-of-single-element /* single view */
как мне избавиться от действия и контроллер?
если я удалить:
array('GETvar' => 'tx_extension_plugin[action]'),
array('GETvar' => 'tx_extension_plugin[controller]'),
он добавляет параметры к URL-адресу.
2 ответов
вы не можете избежать добавления всех материалов при использовании f:link.action
VH, вместо этого вам нужно использовать f:link.page
и пройти только необходимые параметры, образец:
<f:link.page additionalParams="{article : article.uid}" class="more" title="{article.name}">show article</f:link.page>
он будет генерировать url, как
/current/page/?article=123
или
/current/page/we-added-realurl-support-for-article
далее в вашем первом действии плагина (возможно list
) вам просто нужно переслать запрос на show
действие, если данный параметр не существует:
public function listAction() {
if (intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('article'))>0) $this->forward('show');
// Rest of code for list action...
}
и, вероятно, изменить подпись show
public function showAction() {
$article = $this->articleRepository->findByUid(intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('article')));
if ($article == null) {
$this->redirectToUri($this->uriBuilder->reset()->setTargetPageUid($GLOBALS['TSFE']->id)->build());
}
// Rest of code for show action...
}
если URIbuilder
используется, вы также можете использовать конфигурацию:
features.skipDefaultArguments = 1
например:
# if enabled, default controller and/or action is skipped when creating URIs through the URI Builder
plugin.tx_extension.features.skipDefaultArguments = 1
Я использую эту конфигурацию в сочетании с realurl обход
'postVarSets' => array(
'_DEFAULT' => array(
'extbaseParameters' => array(
array(
'GETvar' => 'tx_extension_plugin[action]',
'noMatch' => 'bypass',
),
),
),
),