2016-11-22 6 views
3

In meinem TYPO3 gibt es mehrere Speicher mit verschiedenen Sportaktivitäten. Der eine gehört zu Ort A, der andere zu Ort B mit anderem Inhalt. Jetzt möchte ich die folgenden URLs generieren.TYPO3: Erzeuge in realURL mehrere URLs mit den gleichen postVarSets in verschiedenen Levels

Die erste ist für allgemeine, die andere ist spezifisch.

/sport/golf 
/place-a/sport/golf 
/place-b/sport/golf 

Sport wird /sport-detail/controller/action/sport/ dekodiert

ich die Standard-LookupTable verwendet, aber die URLs kann nicht aufgelöst werden.

'lookUpTable' => array(
    'table' => 'tx_myext_domain_model_sport', 
    'id_field' => 'uid', 
    'alias_field' => "url", 
    'addWhereClause' => ' AND deleted = 0 AND hidden = 0', 
    'useUniqueCache' => 1, 
    'languageGetVar' => 'L', 
    'languageField' => 'sys_language_uid', 
    'transOrigPointerField' => 'l10n_parent', 
    'useUniqueCache_conf' => array(
     'strtolower' => 1, 
     'spaceCharacter' => '-', 
    ), 
) 

Was ist erforderlich, um gültige URLs zu erstellen, ohne Golf-1 usw. für alle Ebenen?

+0

Bitte geben Sie Ihre realurlConfiguration.php-Datei und clairify über ** Ort-a ** und ** Ort-b ** sind zwei verschiedene Seiten oder nicht –

Antwort

0

Ich bin nicht genau sicher, was Sie tun möchten. Sind "place-a" und "place-b" getrennte Seiten oder sind diese zusätzlichen Parameter für Ihre ext?
Könnten Sie auch die vollständige RealURL-Konfiguration bereitstellen?

Je nach Ziel Leistung, die Sie könnten auch mit der UniqueCache nur vermeiden ...

0

Schließlich habe ich ein Userfunction, die meine Bedürfnisse erfüllt. In dieser Funktion erweitere ich die angegebene Lookup-Funktion von realURL und hole mir die Werte selbst ab. Das Modell wurde in der Zwischenzeit in Aktivität umbenannt. Ich speichere nun die Detail-PID für die Show-Aktion und die Speicher-PID im Sportmodell, damit ich den gesamten URL-Pfad nach dem Ortsnamen suchen und die Speicher-PID suchen kann. Mit dem Speicher-Pid des Platzes kann ich die richtige Aktivität finden. Und mit einer korrekten Suche in der Datenbank kann ich eine gültige ID zurückgeben. Aus SEO-Gründen habe ich dem Modell eine neue Feld-URL hinzugefügt, die die Zeichenfolge im URL-Pfad enthält. In der Methode id2alias gebe ich den URL-Wert der Aktivität mit der angegebenen ID zurück.

Ich bemerkte ein Verhalten, dass realURL nicht den richtigen Eintrag in der Cachingtabelle findet, sobald alle Parameter gehashed sind, also musste ich die Aktivität GETvar von cHash Generation ausschließen.

$GLOBALS['TYPO3_CONF_VARS']['FE']['cHashExcludedParameters'] = tx_myext_activity[activity] 

Denn dies ist mein Arbeits Setup :-)

RealURL config:

'GETvar' => 'tx_myext_activity[activity]', 
'type' => 'user', 
'languageGetVar' => 'L', 
'languageField' => 'sys_language_uid', 
'useUniqueCache' => 0, 
'userFunc' => 'EXT:MyUserFunc.php:&MyUserFunc->main' 

Die Userfunction übernimmt jetzt die URL Generation.

<?php 

class MyUserFunc 
{ 
    protected $sys_language_uid; 
    protected $params; 
    protected $localizedStrings; 

    public function main($params, $ref) 
    { 
     if ($params) { 
      $this->params = $params; 
      $dirParts = $this->params['pObj']->dirParts; 

      //language 
      $this->sys_language_uid = 0; 

      //is realUrl in encode or decode 
      if ($this->params['decodeAlias']) { 
       return $this->alias2id($this->params['value']); 
      } else { 
       return $this->id2alias($this->params['value']); 
      } 
     } 
    } 

    /* 
    * Generate URL param 
    */ 
    protected function id2alias($value) 
    { 
     $sysLanguageToBuild = $this->params['pathParts'][0]; 

     //if not default, use l10n_parent with sysuid 
     if ($sysLanguageToBuild > 0) { 
      $additionalWhere = ' AND l10n_parent = ' . (int)$value; 
      $additionalWhere .= ' AND sys_language_uid = ' . (int)$sysLanguageToBuild; 
     } else { 
      $additionalWhere = ' AND uid = ' . (int)$value; 
     } 

     $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
      'url', 
      'tx_myext_domain_model_activity', 
      'deleted = 0 AND hidden = 0' . $additionalWhere 
     ); 

     $activityRow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res); 

     if (is_array($activityRow)) { 
      return $activityRow['url']; 
     } 

     return 'undefined'; 
    } 

    /** 
    * Decode string to uid 
    * respect activities with different pid 
    * 
    * @param $value 
    * @return int 
    */ 
    protected function alias2id($value) 
    { 
     $dirParts = $this->params['pObj']->dirParts; //get array of complete path 
     $place = htmlspecialchars($this->params['pObj']->dirParts[2]); //get place 

     //transform place string 
     $place = strtolower($place); 
     $place = preg_replace("/[^A-Za-z0-9\s-._\/]/", "", $place); 
     $place = trim(preg_replace("/[\s-]+/", " ", $place)); 

     //Query Place 
     $placeRes = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
      'uid, activity_storage_page', 
      'tx_myext_domain_model_place', 
      'deleted = 0 AND hidden = 0 AND sys_language_uid = '. $this->sys_language_uid . 
      ' AND LOWER(name) = "' . $place . '"' 
     ); 

     $placeRow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($placeRes); 

     //Query Activity 
     if (is_array($placeRow)) { 
      $additionalWhere .= " AND tx_myext_domain_model_activity.pid = '" . (int)$placeRow['activity_storage_page'] . "'"; 
     } 

     $additionalWhere = " AND tx_myext_domain_model_activity.sys_language_uid = " . $this->sys_language_uid; 
     $additionalWhere .= " AND tx_myext_domain_model_activity.url = '" . $value . "'"; 
     $additionalWhere .= " AND tx_myext_domain_model_activity.pid = '" . $pid . "'"; 


     $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
      'tx_myext_domain_model_activity.uid', 
      'tx_myext_domain_model_activity', 
      'deleted = 0 AND hidden = 0' . $additionalWhere 
     ); 

     while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) { 
      return (int)$row['uid']; 
     } 

     //catch old URLs and return uid 
     $additionalWhere = " AND tx_myext_domain_model_activity.sys_language_uid = " . $this->sys_language_uid; 
     $additionalWhere .= " AND tx_myext_domain_model_activity.name = '" . $value . "'"; 

     $resElse = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
      'tx_myext_domain_model_activity.uid', 
      'tx_myext_domain_model_activity', 
      'deleted = 0 AND hidden = 0' . $additionalWhere 
     ); 
     while ($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($resElse)) { 
      return (int)$row['uid']; 
     } 

     return false; 
    } 
} 
Verwandte Themen