web-dev-qa-db-ja.com

データベースを検索しないカスタムコンポーネントからSEF URLを作成する

別のURLからJSONによってデータを取得するカスタムコンポーネントを作成しています。これまでのところそれはうまくいきますが、router.phpファイルでSEF URLを適用しようとするのは難しいです。

例、私のコンポーネントの現在のURLは次のとおりです:index.php?option = com_mycomponent&id = 333

必要なSEF URL(Jrouteによって生成されないため、joomlaが読み取る必要があるだけです)は次のとおりです。website.com/ alias-id

JSONを解析するにはidだけが必要です。エイリアスは無関係です。

問題は... router.phpがまったく機能しないことです。私のルートは$ vars配列から値を返しません。それは常に言う:通知:未定義の変数:30行目の[...] router.phpのvars。

私はすべてを試していますが、ParseRoute関数内に正確な変数を配置しようとしてもです。 ($ vars [] = 30;のように)$ vars出力はまだ未定義です。

私は無数の例を試しましたが、Jumi router.phpを例として使ってみました。これは、JrouteやメニューIDにリンクがなくても、フロントエンドURLのエイリアスを認識できる拡張機能であることを知っているからです。

これが私の現在のrouter.phpです。クエリがまったくないため(そして、それがどこから来ているのかわかりません)、BuildRoute関数で$ query変数を使用することはできませんでした。

function myComponentBuildRoute()
    {
    $url = JURI::getInstance();

    $myid = end(explode('-', $url)); // gets the id from a /alias-id format
    $segments = array();
    $segments[] = $myid;

    return $segments;
}

    function myComponentParseRoute($segments)
    {
       $vars = array();


    $vars['jid'] = $segments[0];

    return $vars;
}

print_r($vars);

だから多分私はrouter.phpのロジックがまったく欠けています。多分それはビューから何かが必要です。 $ vars配列が最終的に渡された後、それをどのように使用できるかさえわかりません。しかし、Joomlaが理解し、404を与えないSEF URLを作成するために何をする必要がありますか?

1
user1967509

1つは、古い方法でルーターを作成しようとしていることです。ルーターは時間とともに変化します。これでルーターはクラスになります。 2つ目は、コンポーネントビューの1つをシステムのフロントページとして設定する必要があることです。これがないと、ほとんどのWebサイトでデフォルトのルーターはcom_contentのルーターになるため、すべての間違ったURL(適切なメニュー項目/親項目がないURL)はcom_contentによって処理され、おそらく404を返します。適切なメニュー項目がないページのSEF URLを処理する必要があります。

コンポーネントルーターの例

以下のリンクで適切な例のルーターを見つけることができますが、Joomlaの次のバージョンの1つでそれを覚えておいてください!ルーターの構築方法は再び変更されます(バグが解消された場合)。

https://github.com/joomla-extensions/weblinks/blob/master/src/components/com_weblinks/router.php

3
Artur Stępień

次のようなURLを作成します。

echo JRoute::_('index.php?option=com_mycomponent&Itemid='.Itemid.'&aliasid=alias-'.$id);

現在のメニュー項目のItemidを含めることで、物事をより明確にし、現在の場所を追跡するのに役立ちます。それは以下で見つけることができます:

$Itemid = JFactory::getApplication()->getMenu()->getActive()->id;

ルーターでこれを試してください。これは、aliasidのurl変数を探し、その値をセグメントとしてルートパーサーに渡す非常に単純なルーターです。次に、ルートパーサーはその要素を変数に書き込みます。その後、アプリケーションの入力メソッドを使用して変数を呼び出すことができます。

function myComponentBuildRoute(&$query)
{
    $app = JFactory::getApplication();
    $segments = array();
    if(isset($query['aliasid'])){
        $segments[] = $query['aliasid'];
        unset($query['aliasid']);
    }
    return $segments;
}


function myComponentParseRoute($segments)
{
    $vars = array();
    switch(count($segments))
    {
        case '1':
            $id = end(explode('-', str_replace(':','-',$segments[0])));
            $vars['id'] = $id;
            break;
    }
    return $vars;
}

次に、ビュー内のIDを取得するには、次のコードを使用します。

$JInput = JFactory::getApplication()->input;
$this->id = $JInput->get('id','','int');
1
Terry Carter

私の最初の目標は、JrouteまたはメニューIDを使用してリンクなしでフロントエンドにエイリアスを作成することでした...

しかし、多くの検索の後、Joomlaはそれを行うことができないようです、またはそれができる場合、ルーターでいくつかの深刻な変更が必要になる可能性があります。 Joomlaルーターをいじる代わりに(実際に試しました)、プラグインにスクリプトを作成して、メニュータイプを作成し、データベースにそのメニュータイプの新しいメニュー項目を保存します。 JSONにリストされているすべてのアイテムの有効なsef url。

ルーターソリューションに関するヒントが必要な場合は、次のリンクを確認してください。 https://docs.joomla.org/Creating_a_System_Plugin_to_augment_JRouter

それはj25用であり、このバージョン以降、ルータ自体はすでに大幅に変更されていると思いますが、Joomlaルータを改造する方法を示唆していることがわかったので、続行する方法についていくつかのアイデアがあるかもしれません。

1
user1967509