0

CakePHP 1.3 で jQuery AJAX を使用する場合、AJAX 応答には、モデルのデータセットを含む配列だけでなく、完全なレイアウトが含まれます。このページ全体がレンダリングされないようにするにはどうすればよいですか? $this->autoRender = false; を使用しようとしました。$this->layout = 'ajax' としましたが、これでも問題は解決しませんでした。実際には、返されたデータに応答がありませんでした。

私のコントローラーのアクションは次のとおりです。

    public function search() {
    if (empty($this->data)) {
    } else {
        // $this->autoRender = false;
        // $this->layout = 'ajax';
        $request = $this->data;
        $this->set('data', $this->Event->search($request['Event']['search']), 'host');
    }  
}

そして私の見解は次のとおりです。

      <!-- app/views/events/search.ctp -->

<h1>Corporate Events</h1> 

<form method="post" action="search">
    <input type="text" name="search" id="search_box" class='search_box'/>
    <input type="submit" value="Search" class="search_button" /><br />
</form>

<p><?php echo $html->link("Add Event", "/events/add"); ?> 

<table> 
    <tr> 
        <th style='width:100px'>Id</th> 
        <th style='width:100px'>Title</th> 
        <th style='width:100px'>Host</th> 
        <th style='width:100px'>Description</th> 
        <th style='width:100px'>Action</th> 
    </tr> 

<div id= "results"></div>

<?php foreach ($data as $event): ?> 
    <tr> 
        <td><?php echo $event['id']; ?></td> 
        <td> 
            <?php echo $html->link($event['event_title'],'/events/view/'.$event['id']);?> 
        </td> 
        <td><?php echo $event['host']; ?></td> 
        <td><?php echo $event['description']; ?></td> 
        <td> 
            <?php echo $html->link( 
                'Delete',  
                "/events/delete/{$event['id']}",  
                null,  
                'Are you sure?' 
            )?> 
            <?php echo $html->link('Edit', '/events/edit/'.$event['id']);?> 
        </td> 
    </tr> 
<?php endforeach; ?> 

</table> 

<script type="text/javascript">

$(function() {

    $(".search_button").click(function() {
        var searchString    = $("#search_box").val();
        var data = {'data[Event][search]':searchString};

        if(searchString) {

            $.ajax({
                type: "POST",
                url: "/events/search",
                data: data,
                beforeSend: function(html) { // this happens before actual call
                    $("#results").html('');
                    $("#searchresults").show();
                    $(".word").html(searchString);
                },
                success: function(html){ // this happens after we get results
                    $("#results").show();
                    $("#results").append(html);
                }
            });    
        }
        return false;
    });
});
</script>

ありがとう!

4

2 に答える 2

2

私はあなたの質問をよく理解していませんが、これはレイアウトが完全にエコーされることなくビューに表示するのに役立ちます.

これをビュー内のJavaScriptに置き、

<script type="text/javascript">

$(function() {

    $(".search_button").click(function() {
        var searchString    = $("#search_box").val();

        if(searchString) {

            $.ajax({
                url: "/events/search/" + searchString,
                beforeSend: function() { // this happens before actual call
                    $("#results").html('');
                    $("#searchresults").show();
                    $(".word").html(searchString);
                },
                success: function(data){ // this happens after we get results
                    $("#results").show();
                    $("#results").append(data);
                }
            });    
        }
        return false;
    });
});
</script>

次に、コントローラーに以下のコードを使用します。

public function search($data=null) {
    $this->autoRender = false;
    //your code here;
    return $data;
}
于 2012-11-02T01:46:08.243 に答える
0

別の関数に結果を実行させてレンダリングさせることをお勧めします。update_results という関数を作成します。次の例では、リクエスト ハンドラーと jquery が用意されていることを前提としています。

簡単な例:

//コントローラ

function search()
{

    //search filters
    $locations = $this->Event->Location->find('list',array('order'=>'Location.name'));


    //set vars for view
    $this->set(compact( 'locations'));

}//search

function update_results()
{       

    //location filter
    if(!empty($this->data['Event']['location_id']))
        $conditions['Event.location_id']=$this->data['Event']['location_id'];


    $results=$this->Event->find('all',array('conditions'=>$conditions,'limit'=>15));
    //debug($conditions);

    $this->set('results',$results);


}//update result

//ビュー

//search.ctp

<?php echo $form->create('Event',array('action'=>'search')); 


            echo $this->Form->input('Event.location_id', array('label'=>'Location','empty'=>TRUE));


            echo $js->submit('Find Trainings', array('update' => '#trainingresults','url'=> array('controller'=>'events', 'action'=>'update_results')));


            echo $form->end(); ?>

    <?php 
        echo $html->div('trainingresults',null,array('id'=>'trainingresults'));
        echo '</div>';
    ?>

//update_results.ctp

<?php
    $timestamp=date('r');
    echo "<h4>Search Results ($timestamp)</h4><br/>";
    if(empty($results))
    {
        echo "<p class='well'><strong>No Trainings found. Try different search criteria.</strong></p>";
    }
    else
    {

            foreach($results as $display)
            {
                //Event Info
                    $location=$display['Location']['name'];

                     echo $location;


            }//for

    }//else

?>
于 2012-11-01T18:44:38.917 に答える