[英]TYPO3: Generate in realURL multiple URLs with the same postVarSets in different levels
在我的TYPO3中,有多個存儲器具有不同的運動活動。 一個屬於地方A,另一個屬於不同內容的B。 現在我想生成以下URL。
第一個是一般的,另一個是具體的。
/sport/golf
/place-a/sport/golf
/place-b/sport/golf
運動被解碼為/sport-detail/controller/action/sport/
我使用了默認的lookUpTable,但是URL無法解析。
'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,沒有所有級別的golf-1等..
我不確定你想做什么。 “place-a”和“place-b”是單獨的頁面還是這些附加參數適合您的分機?
另外,你能提供完整的RealURL配置嗎?
根據目標性能,您也可以避免使用UniqueCache ...
最后,我寫了一個滿足我需求的UserFunction。 在這個函數中,我從realURL擴展給定的lookuptable函數,並自己獲取值。 在此期間,該模型已重新命名為活動。 我現在保存運動模型中show動作和存儲pid的細節pid,這樣我就可以搜索整個URL路徑來查找地名並查找存儲pid。 有了這個地方的存儲pid,我可以找到合適的活動。 通過在數據庫中正確查找,我可以返回有效的ID。 出於搜索引擎優化的原因,我在模型中添加了一個新的字段URL,其中包含URL路徑中的字符串。 在id2alias方法中,我返回具有給定ID的活動的url值。
我注意到一個行為,一旦所有參數都被散列,realURL在緩存表中找不到正確的條目,所以我不得不從cHash生成中排除活動GETvar。
$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'
UserFunction現在處理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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.