1

カスタム Joomla(v1.5) コンポーネントがあり、現在コンポーネントのルーターで作業しています。問題は、SEF URL から ID 番号を削除できないことです。私は得る:

http://myaddress.com/componentalias/17-city-alias/130-item-alias

私が取得したいもの:

http://myaddress.com/componentalias/city-alias/item-alias

以下の router.php メソッドを見てください。

function ComponentnameBuildRoute(&$query) {

    $segments = array();

    if(isset($query['city_id'])){               
        $segments[] = $query['city_id'];                    
        unset($query['city_id']);
    }

    if(isset($query['item_id'])){
        $segments[] = $query['item_id'];          
        unset($query['item_id']);
    }


    if(isset($query['task'])){
        switch($query['task']){
            case 'pay':
                $segments[] = JText::_('payment');
                unset($query['task']);
                break;  
        }
    }

    unset($query['view']);

    return $segments;
}
/*
 * Function to convert a SEF URL back to a system URL
 */
function ComponentnameParseRoute($segments) {

    $var = array();

    if(isset($segments[0])){
        $cityData = explode(':',$segments[0]);
        if(isset($cityData[0])){
            $vars['city_id'] = $cityData[0];
        }
    }

    if(isset($segments[1])){
        $itemData = explode(':',$segments[1]);
        if(isset($itemData[0])){
            $vars['item_id'] = $itemData[0];
        }
    }

    if(isset($segments[2])){
        switch($segments[2]){
            case JText::_('payment'):
                $vars['task'] = 'pay';
                break;  
        }
    }


    return $vars;

}

何か案は?あなたの助けをいただければ幸いです。

4

1 に答える 1

3

router.phpあなたのファイルから始めるのに最適な場所は、この記事(少し古いですが、それでも十分です) を読んでから、com_content のrouter.phpファイル ( components/com_content/router.php) を確認することです。記事はあなたが望むものを達成するので、実際のコードを見てそこから得たものに気付くでしょう。

より長い答え:

  1. 項目を直接指すメニュー項目が存在する場合にのみ、コンテンツ要素へのパス内の項目 ID 変数を取り除くことができます。それ以外の場合、項目を見つける方法はありません。

  2. Joomla! の SEF URL 1.5 などは、個々の要素のエイリアスから作成されます

例えば。このメニュー構造がある場合:

Recipes                (The menu)
-- Seafood             (<-- Category blog where category alias is `seafood` )
  -- Grilled Snapper      (<-- Recipe Item where item alias is `grilled-snapper` )
-- 'Other category'    (<-- Another Category blog )

完全な ID の削除

レシピの SEF URL を構築している場合、サイト メニューを取得し、現在のメニュー項目$menu = &JSite::getMenu();のクエリを渡された配列の値と比較して、表示される可能性のあるメニュー項目を探すことでルートを構築できます。 .idid$query

一致する場合は、メニュー パスのエイリアスとレシピ エイリアスを使用してセグメントを作成できます。(そして、ParseRoute($segments)メソッドのプロセスを逆にします)。

したがって、上記の例から、次のような Grilled Snapper レシピへの SEF URL を作成できますrecipes/seafood/grilled-snapper

部分的な ID の削除

ここで、メニューに直接リンクされていないが、「シーフード」カテゴリのブログ ページに表示される別のレシピ (たとえば、「ガーリック エビ」別名「ガーリック エビ」)もあるとします。この状況では、最終的には recipes/seafood/2:garlic-prawns

一致するものがない場合 ( Garlic Prawnsなど)、コンポーネントにカテゴリ ブログや例のレシピ カテゴリ ページなどのリスト ビューがある場合は、部分一致を構築できます。基本的に、この場合、現在のメニューを確認します。コンテンツ アイテムを含むリスト/カテゴリ ビューであるかどうかを判断します。

それがカテゴリ/リスト ビュー フォームへのパスである場合は、最初のセグメントを形成しますが、記事のメニュー項目がないため、URL の最後の要素で項目の ID を使用する必要があります。

コンテンツ アイテムまたはリスト/カテゴリ ビューのメニュー アイテムがない

コンテンツ アイテムが (記事、モジュール、または検索結果などから) 直接リンクされていて、それを指す、またはそれを含む可能性のあるメニュー アイテムがない場合でも、ID が含まれていない URL を作成できますが、直接コンポーネント アクセス URL の形式のパス。

例えば。/component/recipes/recipe/ice-cream-sundaerecipesコンポーネントの名前、recipeはビュー、ice-cream-sundaeは記事のエイリアスです。

于 2012-05-05T06:03:32.957 に答える