簡體   English   中英

TYPO3:使用不同級別的相同postVarSets在realURL中生成多個URL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM