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' ));
ただし、これは同じ結果になります。
コンポーネントのリダイレクトをどのように制御しますか?
リダイレクトは、コントローラーの保存機能によってオーバーライドされている可能性があります。リストしたメソッドでリダイレクトをオーバーライドできるはずです。正しい場所にリダイレクトする必要があるだけです。
フロントエンドに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メソッドを利用しますが、リダイレクトがリストビューへのデフォルトのリダイレクトを上書きすることを確認します。
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();
}
}
...
コントローラーがメッセージビューを探す前に、リダイレクトが処理されます。
JControllerForm
で$view_list
変数を宣言して、優先するビュー名と同じにしてください(通常はビューフォルダー)
protected $view_list = 'message';
そして、David Fritschが示唆するように同等の関数を明確に宣言しない限り、すべてのフォームイベントはそれにリダイレクトされます。最良のソリューションが最も簡単です!:)