web-dev-qa-db-ja.com

コンポーネントのリダイレクトの制御(JControllerFormを使用)

Joomla 3.3(Contact Payと呼ばれる)で簡単な連絡先コンポーネントを作成しています。

関連するモデルとコントローラーを使用して、バックエンドに「メッセージ」ビューと「メッセージ」ビューを作成しました。 'message'はJFormフォームで、 'messages'はリストビューです。すべてが正常に機能します。

ただし、フロントエンドには、サイトの訪問者がメッセージを送信するためのメッセージビューしかありません。フロントエンドで同じバックエンドモデルを使用して、

$controller->addModelPath( JPATH_ADMINISTRATOR.DS.'components'.DS.'com_contactpay'.DS.'models' );

コンポーネントエントリファイル内。

私は単にバックエンドからフォームXMLファイル(message.xml)をコピーし、いくつかのフィールドを削除して、それをフロントエンドに使用しました。次のレイアウトファイルでフォームを出力します。

<form action="<?php echo JRoute::_( 'index.php?option=com_contactpay&task=message.save'); ?>"
      method="post" id="contactpay-message-form" class="form-validate form-horizontal" enctype="multipart/form-data">

    <fieldset>

        <?php foreach( $this->form->getFieldset('message_fields') as $field ) : ?>
            <div class="control-group">
                <div class="control-label">
                    <?php echo $field->label; ?>
                </div>
                <div class="controls">
                    <?php echo $field->input; ?>
                </div>
            </div>
        <?php endforeach; ?>

    </fieldset>

    <div class="form-actions">
        <button type="submit" class="btn btn-primary validate"><?php echo JText::_('JSUBMIT');?></button>
        <a class="btn" href="<?php echo JRoute::_('');?>" title="<?php echo JText::_('JCANCEL');?>"><?php echo JText::_('JCANCEL');?></a>
        <input type="hidden" name="option" value="com_contactpay" />
        <input type="hidden" name="task" value="message.save" />
        <?php echo JHtml::_('form.token');?>
    </div>
</form>

使用がフロントエンドのフォームに記入すると、本来の形でデータベースに保存されます。

問題

問題は、フォームが送信された後、フロントエンドに存在しない「メッセージ」ビューにリダイレクトされるため、次のエラーが発生することです。

500 View not found [name, type, prefix]: messages, html, contactpayView 

コンストラクターで次のコードを使用して、JControllerFormを拡張するメッセージコントローラーでリダイレクトを制御してみました。

$this->setRedirect( JRoute::_( 'index.php?option=com_contactpay&view=message' ));

ただし、これは同じ結果になります。

コンポーネントのリダイレクトをどのように制御しますか?

3
Ron

リダイレクトは、コントローラーの保存機能によってオーバーライドされている可能性があります。リストしたメソッドでリダイレクトをオーバーライドできるはずです。正しい場所にリダイレクトする必要があるだけです。

フロントエンドにmessageコントローラーがあるはずです。このコントローラー内に保存機能がない場合は、次のように追加します。

public function save($key = null, $urlVar = null)
{
    $return = parent::save($key, $urlVar);
    $this->setRedirect( JRoute::_( 'index.php?option=com_contactpay&view=message' ));
    return $return;
}

これは、モデルをロードしてフォームを保存するJControllerFormの既存のsaveメソッドを利用しますが、リダイレクトがリストビューへのデフォルトのリダイレクトを上書きすることを確認します。

3
David Fritsch

Components/com_contactpay/controller.phpというファイルが必要です。これはコンポーネントの主要なコントローラーです。ファイル内のクラスは、ContactPayControllerと呼ばれます。

次の構成関数を追加します。これは次のようになります。

class ContactPayController extends JControllerLegacy {

    public function __construct(){
        if (JFactory::getApplication()->input->get('view') == "messages"){
            JFactory::getApplication()->redirect('index.php?option=com_contactpay&view=message');
        } else {
            parent::__construct();
        }
    }
    ...

コントローラーがメッセージビューを探す前に、リダイレクトが処理されます。

2
John Pitchers

JControllerForm$view_list変数を宣言して、優先するビュー名と同じにしてください(通常はビューフォルダー)

protected $view_list = 'message';

そして、David Fritschが示唆するように同等の関数を明確に宣言しない限り、すべてのフォームイベントはそれにリダイレクトされます。最良のソリューションが最も簡単です!:)

0