1

私のアプリケーションでは、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();
}

これですべてが機能し、ブラウザで開発者ツール(ネットワーク)を使用して応答の戻り値を確認できますが、これを使用してビューを「更新」する方法がわかりません。

4

2 に答える 2

0

あなたは2つのことをすることができます:

  • 呼び出しているアクションのレイアウトをajax経由で有効にできます。レイアウトを無効にしているので、ajaxアクションのview phtmlファイルに何かが含まれていても、表示されません。レイアウトを有効にし、代わりにtext / html dataTypeを使用しjsonて、返されたHTMLをどこかに表示することができます。
  • または、successajax呼び出しが発生した場合は、JavaScriptコードを記述してDOMを更新します。
于 2012-10-29T20:02:04.647 に答える
0

@Salmanからの提案に感謝します。彼らは私を正しい方向に導き、問題を解決することができました。複数のパラメーターを取得パラメーターとして渡すことにより、ajax .load()呼び出しで複数のパラメーターを渡すことができました。次に、ajaxActionの結果をajax.ajax.phtmlビューでフォーマットし、選択ボックスがあるindex.phtmlにある#resultsdiv内に連続して表示することができます。

controller / index.phtml

<div id="results" style="display:block;">Select all three values</div>

IndexControllerinitおよびajaxAction

public function init() {
    $ajaxContext = $this->_helper->getHelper('AjaxContext');
    $ajaxContext->addActionContext('ajax', 'html')->initContext('html');
}

public function ajaxAction() {

    $select1    = $this->_request->getQuery('select1');
    $select2    = $this->_request->getQuery('select2');
    $select3    = $this->_request->getQuery('select3');

    $form   = new Application_Form();

    // Database operations and logic

    $this->view->form       = $form;
    $this->view->array      = $somearray;
    } 
}

index.phtmlのjqueryスクリプト

$(document).ready(function(){

    $('.selector').change(function() {
        var select1 = $('#select1').val();
        var select2 = $('#select2').val();
        var select3 = $('#select3').val();
        if ( select1 && select2 && select3) {
            $('#results').show();               
            $('#results').load('/controller/ajax?select1=' + select1 + '&select2=' + select2 + '&select3=' + select3);
        }
    });

});

controller / ajax.ajax.phtml

<?php if ( $this->array ) : ?>
    <?php echo( $this->form ); ?>
<?php else: ?>
    Nothing found for selected values
<?php endif ?>
于 2012-10-30T14:23:40.687 に答える