私のアプリケーションでは、3つの選択ボックスで構成されるコントローラー/インデックスのフォームがあります。3つのボックスすべてで値が選択されている場合、それらの選択された値に基づいて、同じビューに追加のhtmlおよび追加のフォームオプションを表示する必要があります。明らかな解決策は、データベース操作を処理し、ビューを作成し、そのビューをcontroller/index.phtmlにロードする別のアクションをajax呼び出しするようです。
以下を使用して、index.phtmlに別のアクションのビューをロードすることができました。
$('#select').change(function() {
event.preventDefault();
var id = $(this).attr('id');
$('#results').show();
$('#results').load('/controller/index/' + $(this).attr('value'));
return false;
});
ただし、3つの選択ボックスすべての変数を渡す必要があり、そのために代わりに次を使用しました。
$('#select1').change(function() {
var select1 = $('#select1').val();
var select2 = $('#select2').val();
var select3 = $('#select3').val();
$.ajax({
type: 'POST',
dataType: 'json',
url: '/controller/index/',
data: { select1: select1, select2: select2, select3: select3},
success: function(result){
var return1 = result.return1;
var return2 = result.return2;
}
});
});
最後のメソッドは、ヘッダーに渡された変数が表示され、応答にビューが含まれている限り機能しますが、ajaxビューのコンテンツのみがインデックスビュー内に配置されるように修正することはできません。(もちろん、AjaxContentスイッチングを使用しないことにより、ajaxビューがロードされますが、完全なレイアウトも含まれます。)ajaxアクションまたはajaxビューでエコーしたものは、インデックスビューに表示されません。どんなポインタでも大歓迎です
編集
ajaxアクションは次のようになります
$this->view->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
$select1 = $this->_request->getParam('select1');
$select2 = $this->_request->getParam('select2');
$select3 = $this->_request->getParam('select3');
// DO THE OTHER STUFF AND LOGIC HERE
$results = array(
'return1' => 'value1',
'return2' => 'value2'
);
$this->_response->setBody(json_encode($results));
およびコントローラーの初期化
public function init() {
$ajaxContext = $this->_helper->getHelper('AjaxContext');
$ajaxContext->addActionContext('ajax', 'json')->initContext();
}
これですべてが機能し、ブラウザで開発者ツール(ネットワーク)を使用して応答の戻り値を確認できますが、これを使用してビューを「更新」する方法がわかりません。