2

ユーザー登録コンポーネントを指すメニューがいくつかあります。ユーザーが登録する場所に応じて、カスタム プラグインを使用してリダイレクトします。

public function onUserAfterSave($user, $isnew, $success, $msg)
{

    //get the active menu item id so we can compare what plan we are on
    $menu   = $app->getMenu();
    $active   = $menu->getActive();
    $activeId = $active->id;

    //compare active page (i.e. what menu item are we on) with the parameter set in the plugin
    //if it matches redirect accordingly - fallback is to always redirect to free plan
    if ($activeId == $this->params->get('free-reg-menu'))
    {
        //redirect required to go to main page
        JFactory::getApplication()->redirect(JRoute::_('page1'));
    }
    else if ($activeId == $this->params->get('bv-reg-menu')) 
    {
        //redirect to step 2 of main plan payment processing
        JFactory::getApplication()->redirect(JRoute::_('page2'));
    }
    else if ($activeId == $this->params->get('prem-reg-menu'))
    {
        //redirect to step 2 of value plan payment processing
        JFactory::getApplication()->redirect(JRoute::_('page3'));
    }
    else
    {
        //other stuff
    }

}

このプラグインで割り当てられたメニューに応じて、ユーザーを特定のページにリダイレクトします。これはすべて非常にうまく機能します。

私の問題は、登録が失敗した場合(つまり、ユーザー名の重複、一致するパスワードの誤りなど)、サーバー側の検証によりページが更新されることです。この更新により、ページは元のリンクから離れます。最初に作成した登録メニュー ページにリダイレクトされるようです。

例: 登録ページで間違った資格情報を入力すると、ページがまったく別のページに更新されます。何か案は?AJAX 登録の拡張機能がこれに対処する可能性があると思いますが、今のところは避けたいと思います。

4

2 に答える 2

1

次のことができます。

  • 代わりにonAfterRoute内でチェックを実行します
  • 結果をユーザーセッションに保持する
  • 結果が成功した場合、onUserAfterSaveからのリダイレクトを行います

それを行うためのより簡単な方法や、それがもたらす複雑さは考えられません。


システムプラグイン

<?php
public function onAfterRoute()
{
    $app = JFactory::getApplication();

    if ($app->isSite() == false)
        return;

    //get the active menu item id so we can compare what plan we are on
    $menu   = $app->getMenu();
    $active   = $menu->getActive();
    $activeId = $active->id;

    $finalRedirect = null;

    //compare active page (i.e. what menu item are we on) with the parameter set in the plugin
    //if it matches redirect accordingly - fallback is to always redirect to free plan
    if ($activeId == $this->params->get('free-reg-menu'))
    {
        //redirect required to go to main page
        $finalRedirect = JRoute::_('page1');
    }
    else if ($activeId == $this->params->get('bv-reg-menu')) 
    {
        //redirect to step 2 of main plan payment processing
        $finalRedirect = JRoute::_('page2');
    }
    else if ($activeId == $this->params->get('prem-reg-menu'))
    {
        //redirect to step 2 of value plan payment processing
        $finalRedirect = JRoute::_('page3');
    }
    else
    {
        //other stuff
    }

    if($finalRedirect)
    {
        // Store selection in session
        JFactory::getSession()->set('my.redirection', $finalRedirect);
    }
}

ユーザープラグイン

<?php
public function onUserAfterSave($user, $isnew, $success, $msg)
{
    $session = JFactory::getSession();

    if ($finalRedirect = $session->get('my.redirection')
        && $success == true
        && $isnew == true)
    {
        // Clear the session entry
        $session->set('my.redirection', null);

        JFactory::getApplication()->redirect($finalRedirect);
    }
}
于 2013-10-16T20:27:52.977 に答える
0

クレジットは間違いなくそれに固執した@WooDzuに行きます。キーは間違いなくセッション変数でした。しかし、私がしたことは、1 つの単純なことを行うコンポーネントを作成することでした。引き出したクエリ文字列を使用して、URL に基づいてセッション変数を作成します。したがって、私のコンポーネントには次の方法でアクセスできます。

www.mysite.com/index.php?option=com_mycomp&task=registration&plan=<value>

私のコンポーネントには、次のような単純なコントローラーがあります。

function registration()
{
    $jinput = JFactory::getApplication()->input;
    $plan = $jinput->get('plan', null, 'STRING');

    $session = JFactory::getSession();
    $session->set('plan', $plan);

    if ($plan == "page1")
    {
        JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_users&view=registration&plan=page1'));
    }
    else if ($plan == "page2")
    {
        JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_users&view=registration&plan=page2'));

    }
    else 
    {
        JFactory::getApplication()->redirect(JRoute::_('index.php?option=com_users&view=registration&plan=page3'));
    }

}

これにより、セッション変数が設定された com_users 登録コンポーネントにリダイレクトされます。次に、プラグインを配置しましOnUserAfterSaveたが、メニューIDやエイリアスではなく、セッション変数に基づいてリダイレクトします。

これが最善のアプローチかどうかはわかりませんが、かなりきれいに見えます。

于 2013-10-22T20:08:11.733 に答える