2014-10-01 5 views
7

Ich habe eine Erweiterung mit einer Liste und Aktion anzeigen. Aktuell können diese Erweiterung auf mehreren Seiten angezeigt:RealURL: Entfernen Sie Controller und Aktion von URL

/page-1/ 
/page-2/subpage/ 

ich realurl so konfiguriert haben:

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

Jetzt bekomme ich URLs wie:

/page-1/ /* shows list */ 
/page-1/Action/show/name-of-single-element /* single view */ 

Was ich will, tatsächlich ist dies:

/page-1/name-of-single-element /* single view */ 

Wie kann ich die Aktion und den Controller loswerden?

Wenn ich entfernen:

array('GETvar' => 'tx_extension_plugin[action]'), 
array('GETvar' => 'tx_extension_plugin[controller]'), 

es die Parameter an die URL anhängt.

+0

Es einen anderen Ansatz erfordert, ist es Ihre Erweiterung? Kannst du den Code ändern? zeig mir wie du deine Links/URLs erstellst – biesior

+0

@biesior Ja, es ist meine eigene Erweiterung und ja, ich kann alles ändern. Die Links sind wie folgt aufgebaut: ' Artikel anzeigen ' – lampshade

Antwort

5

Sie nicht vermeiden können all die Dinge hinzuzufügen, wenn f:link.action VH verwenden, stattdessen müssen Sie f:link.page verwenden und nur dann erforderlich, params, Probe passieren:

<f:link.page additionalParams="{article : article.uid}" class="more" title="{article.name}">show article</f:link.page> 

es url erzeugen wird wie

/current/page/?article=123 

oder

/current/page/we-added-realurl-support-for-article 

nächste in Ihrer ersten Aktion des Plugins (Wahrscheinlich list) Sie müssen nur Anforderung an show Aktion zu übermitteln, wenn gegeben param vorhanden:

public function listAction() { 
    if (intval(\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('article'))>0) $this->forward('show'); 

    // Rest of code for list action... 
} 

und wahrscheinlich Unterschrift von show ändern

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... 
} 
+1

+1 - funktioniert wie ein Zauber. Danke vielmals. Ich habe den Code ein wenig geändert, um ihn vielseitiger zu machen. Ich änderte die Signatur in: 'public function showAction (\ namespace $ article = null)' und wickelte den neu hinzugefügten Teil in folgendes: 'if (! $ Article) {...}'. – lampshade

+0

Ich verwende eine @ transient-Eigenschaft in meiner Erweiterung (siehe http://stackoverflow.com/questions/27274477/parse-an-existing-json-string-in-fluid-template) - kann es sein, dass es mit dem fehlschlägt über Methode?Als ich es funktionierte, wurden alle diese "transienten" Daten nicht mehr ausgegeben. – Urs

+0

Scheint, dass extbase gegenüber der Art der Eigenschaft (die ich falsch eingestellt hatte) weniger streng war, als die "action" -Links als jetzt mit dem alternativen Verfahren. Es hatte nichts mit "transient" zu tun – Urs

3

Wenn die URIbuilder verwendet wird Sie auch die Konfiguration verwenden können:

features.skipDefaultArguments = 1 

zum Beispiel;

# if enabled, default controller and/or action is skipped when creating URIs through the URI Builder 
plugin.tx_extension.features.skipDefaultArguments = 1 

ich diese Konfiguration in Kombination mit dem realurl Bypass verwenden

'postVarSets' => array(
    '_DEFAULT' => array(
    'extbaseParameters' => array(
     array(
     'GETvar' => 'tx_extension_plugin[action]', 
     'noMatch' => 'bypass', 
    ), 
    ), 
), 
), 
Verwandte Themen