2016-11-22 5 views
3

В моем TYPO3 есть несколько хранилищ с различными видами спорта. Один принадлежит к месту A, а другой - к B с различным контентом. Теперь я хотел бы создать следующиеURL.TYPO3: сгенерируйте в realURL несколько URL-адресов с одинаковыми postVarSets на разных уровнях

Первый для общего, другой конкретный.

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

спорта декодируются /sport-detail/controller/action/sport/

я использовал по умолчанию LookupTable, но адреса не может быть решены.

'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' => '-', 
    ), 
) 

Что необходимо для создания действительных URL-адресов, без гольфа-1 и т. Д. Для всех уровней?

+0

Просьба предоставить файл realurlConfiguration.php и clairify о ** place-a ** и ** place-b ** - это две разные страницы или нет –

ответ

0

Я не совсем уверен, что вы хотите сделать. Являются ли «места-a» и «place-b» отдельными страницами или являются ли эти дополнительные параметры для вашего ext?
Кроме того, вы могли бы предоставить полную конфигурацию RealURL?

В зависимости от целевой производительности вы также можете просто избежать использования UniqueCache ...

0

Наконец я написал пользовательскую функцию, которая удовлетворяет мои потребности. В этой функции я расширяю данную функцию поиска из realURL и вывожу сами значения. В то же время модель была переименована в действие. Теперь я сохраняю детали pid для действия show и pid для хранения в спортивной модели, поэтому я могу найти весь URL-адрес, чтобы найти имя места и найти pid хранилища. С хранилищем pid этого места я могу найти нужную деятельность. И с правильным поиском в базе данных я могу вернуть действительный идентификатор. По причинам SEO я добавил новый URL-адрес поля в модель, содержащую строку в URL-адресе. В методе id2alias я возвращаю значение url активности с данным ID.

Я заметил одно поведение, что realURL не находит правильную запись в таблице кэширования после того, как все параметры хэшируются, поэтому мне пришлось исключить действие GETvar из поколения cHash.

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

В конце концов это моя рабочая установка :-)

RealUrl конфигурации:

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

Пользовательская функция обрабатывает теперь поколение URL.

<?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; 
    } 
}