2014-10-01 17 views
7

Ho un'estensione con un elenco e mostra l'azione. Attualmente questa estensione può comparire su più pagine:RealURL: Rimuovi controller e azione dall'URL

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

Ho configurato realurl così:

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

Ora ho URL del tipo:

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

Quello che realmente voglio è questo:

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

Come sbarazzarmi dell'azione e del controller?

Se rimuovo:

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

aggiunge il parametri all'URL.

+0

Si richiede un altro approccio, è proprio interno? puoi cambiare il suo codice? mostrami come costruisci i tuoi link/url – biesior

+0

@biesior Sì, è la mia estensione e sì, posso cambiare tutto. I collegamenti sono costruiti in questo modo: ' mostra articolo ' – lampshade

risposta

5

Non si può evitare di aggiungere tutte le cose quando si utilizza f:link.action VH, invece è necessario utilizzare f:link.page e superare params solo necessari, di esempio:

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

genererà url come

/current/page/?article=123 

o

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

prossimo nella vostra prima azione di plug-in (Probabilmente list) è sufficiente inoltrare richiesta al show azione se esiste dato param:

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

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

e probabilmente cambiare firma del 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... 
} 
+1

+1 - funziona come un incantesimo. Molte grazie. Ho modificato il codice un po 'per renderlo più versatile. Ho cambiato la firma in: 'public function showAction (\ namespace $ article = null)' e ha avvolto la parte appena aggiunta in questo: 'if (! $ Article) {...}'. – lampshade

+0

Sto usando una proprietà @transient nella mia estensione (vedi http://stackoverflow.com/questions/27274477/parse-an-existing-json-string-in-fluid-template) - può essere che fallisca con il metodo sopra?Quando ho funzionato, tutti i dati "transitori" non venivano più visualizzati – Urs

+0

Sembra che extbase fosse meno severo nei confronti del tipo di proprietà (che avevo impostato erroneamente) quando utilizzavo il link "azione" rispetto a ora con la procedura alternativa. Non aveva nulla a che fare con "transient" – Urs

3

Se il URIbuilder viene utilizzato è anche possibile utilizzare la configurazione:

features.skipDefaultArguments = 1 

per esempio;

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

Io uso questa configurazione in combinazione con il realurl bypass

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