web-dev-qa-db-ja.com

バックエンドでJRouteを使用していますか?ほとんどわかった、助けが必要

私は、JRouteをバックエンドで動作させる必要がありました。これにより、管理者がイベントコンポーネントを使用してイベントを作成し、SEFのURLを含むメールを送信できるようになります。調べたところ、アプリインスタンスをサイトに設定し、JRouteを呼び出してアプリを管理者に戻すというヒントを見つけました。ただし、SEFのURLを取得しているときに、イベントの作成後のリダイレクト中に問題が発生します。

これが私がこれを行う方法です、これは基本的に私が見つけた古い投稿からのコピーです:

$live_site = substr(JURI::root(), 0, -1);
    if(JPATH_BASE == JPATH_ADMINISTRATOR) {
        // In the back end we need to set the application to the site app instead in order for JRoute to work
        JFactory::$application = JApplication::getInstance('site');
    }

    // Create the URL
    $url = $live_site . JRoute::_('index.php?option=com_icagenda&view=list&layout=event&id=' . $id . '&Itemid=' . $Itemid);

    // Check if we are in the backend again
    if(JPATH_BASE == JPATH_ADMINISTRATOR) {
         // In backend we need to remove administrator from URL as it is added even though we've set the application to the site app
        $eventLink= str_replace($live_site .'/administrator', $live_site, $url);
        // Set the appilcation back to the administartor app
        JFactory::$application = JApplication::getInstance('administrator');
    }               

上記は機能するようですが、問題はリダイレクト中、イベントが作成されてメールが送信された後です。通常、adminのイベントビューページには次のタイプのURLがあります。

administrator/index.php?option = com_icagenda&layout = edit&id = 23

しかし、JApplication :: getInstanceビジネスが原因で、リダイレクトURLがめちゃくちゃになり、500エラーが発生します。めちゃくちゃになったURLはこの形をしています

管理者/index.php/component/icagenda/?view=event&layout=edit&id=23

おそらく私が貼り付けたソリューションはJoomla 1.5からのものだったと思うので、3で別のことをする必要があるのでしょうか?

何か案は?

ありがとう!

3
Brian

JRouteはバックエンドでは信頼できません。あなたのアプローチは単純なインストールで機能するかもしれませんが、サードパーティのSEFプラグインがある場合、またはサードパーティのコンポーネントに若干の不規則なルーティングがあったとしても、これは無残に失敗します。

だから私は500エラーを取り除く方法には答えません。しかし、代替ソリューションを提案してください。

人気のあるSEF拡張機能であるACEsefは、私が正しく覚えていれば、最も単純で最も効果的なアプローチを使用しました。フロントエンドコンポーネント(または選択したプラグイン)にajax呼び出しを行い、realからJRouteを実行させます。 =フロントエンド。

3
Riccardo Zorn

これが私がどのように機能するようになったかです:

$live_site = substr(JURI::root(), 0, -1);
$app    = JApplication::getInstance('site');
$router = &$app->getRouter();
$url = $router->build($live_site.'/index.php?option=com_icagenda&view=list&layout=event&id=' . $id . '&Itemid=' . $Itemid);
$url= $url->toString();
$eventLink= str_replace($live_site .'/administrator', $live_site, $url);

後でその$ appで何をすべきかはわかりませんが...

3
Brian