2

私はこれがどのように機能するかを理解するためにしばらく静かに過ごしてきました.

router.php の助けを借りて Joomla で URL をカスタマイズする方法を理解しています - 少なくとも私はそう思いました。このようなものを作成するのは簡単です

domain.com/country/id

例:

domain.com/germany/12

ただし、id が都市を表していることはわかりません。したがって、この例では、ID 12 の都市がベルリンであると仮定します。

したがって、私のカスタム コンポーネント (名前: 国) では、次のように表示されることを望みます。

for view=countries (第 1 レベル)

domain.com/country

すなわち:

domain.com/germany

view=city (第 2 レベル) の場合

domain.com/country/city-id

すなわち:

domain.com/country/berlin-12

(または単に: domain.com/country/berlin - ただし、カスタム コンポーネントが機能するには ID が必要だと思います - ID を読み取って何をすべきかを知るページ上の関連モジュール)

私はこれまでに何を持っていますか:

function CountriesBuildRoute(&$query)
{
    $segments = array();
    //if(isset($query['view'])) {
    //    $segments[] = $query['view'];
    //    unset( $query['view'] );
    //}
    if (isset($query['task'])) {
        $segments[] = implode('/',explode('.',$query['task']));
        unset($query['task']);
    }
    if (isset($query['id'])) {
        $segments[] = $query['id'];
        unset($query['id']);
    }
        if (isset($query['name'])) {
        $segments[] = $query['name'];
        unset($query['name']);
    }

    unset( $query['view'] );    

    return $segments;
}


function CountriesParseRoute( $segments )
{
       $vars = array();
       $app =& JFactory::getApplication();
       $menu =& $app->getMenu();
       $item =& $menu->getActive();
       // Count segments
       $count = count( $segments );
       //Handle View and Identifier
       switch( $item->query['view'] )
       {
               case 'countries':
                       if($count == 1) {
                               $vars['view'] = 'city';
                       }

                       break;
               case 'city':
                       $id   = explode( ':', $segments[$count-2] );
                       $name   = explode( ':', $segments[$count-1] );
                       $vars['id']   = $id[0].'-'.$name;
                       break;
       }
       return $vars;
}

ビューの国から都市ページを呼び出す方法は次のとおりです。

<a href="<?php echo JRoute::_('index.php?option=com_countries&view=city&id=' . (int)$item->id) .'&name='. $item->city_name; ?>">

誰かが助けることができれば素晴らしいだろう! 乾杯

4

1 に答える 1

0

URL から ID を取得したい場合は、すべての国のメニュー項目を追加するか、データベース内の項目 ID を検索するルーターを作成する必要があります (大きな Web サイトでは悪い考えです)。これには、ホームページをコンポーネント ビューの 1 つに設定する必要もあります。その最も簡単な方法。

ルーターを構築するときは、2 つの関数が必要です。1 つ目は SEF url を返しCountriesBuildRoute、2 つ目は SEF url を query に変換しますCountriesParseRoute。このレベルで SEF を記述することは、実際に考えているよりも難しいことです。ルーター全体を書くことはしませんが、正しい方向を示すだけです。

Joomla 1.5 では、必要な機能を簡単に作成できました。時間があれば、(com_weblinks) のような Joomla 1.5 コンポーネントから rooter を見てください。 CountriesBuildRouteURL を構築する配列を返します。たとえば、次$queryのような配列を返す場合: array('country','berlin')url は次のようになりますdomain.com/country/berlin。しかし、そのプロセスを逆にすること (で行うことCountriesParseRoute) は難しくなります。最初のセグメントが国かどうかを確認する必要があります (2 番目のセグメントの場合は都市にする必要があります)。

したがって、関数CountriesBuildRouteで渡されたビューを確認し、URLまたは選択したビューが必要なように配列を直接構築$segmentsします。その配列の 1 つの要素が URL の 1 つのセグメントになることに注意してください。

最初の配列要素が国であるかどうかの関数CountriesParseRouteチェック(データベースチェック、キャッシュされた国のリスト、それを行う方法はたくさんあります)では、配列の2番目の要素(存在する場合)で同じことを行う必要があります。

私は常に、必要に応じて最初に BuildRoute を作成しました。次に、解析ルートをできる限り正確かつ効果的にするために何時間も費やします。優れたルーターを作成したい場合は、数時間または数日を費やすことができます.

于 2013-08-10T23:30:38.153 に答える