使用CodeIgniter / MVC通过AJAX加载文件

时间:2013-06-29 14:00:24

标签: codeigniter jquery

我目前正在重写我的整个site,以便它与CI兼容。我对CI和MVC模式一般都很新。我遵循了这个tutorial,并为MVC模式的视图部分制作了一个相当不错的模板。问题是,我的很多网站都使用jQuery / AJAX来使它更具动态性。例如,在我网站上的所有页面上,我有一个输入字段,使用jQuery在keyup上加载PHP文件。

<script type="text/javascript">
    $("#search_bar").keyup(function(){
        var search = $("#search_bar").val();
        var url = "search_bar.php";
        var data = "q="+ search;

        $('#livesearch').load(url, data);
        $("#livesearch").slideDown("fast");
    });
</script>

<input type='text' maxlength='30' id='search_bar' autocomplete='off' placeholder='Browse Teams' />
<div id='livesearch' style='display:none;'></div>

加载结果所需的所有后端工作都发生在通过jQuery(search_bar.php)加载的PHP文件中。那么,“search_bar”应该是自己的View,它由自己的Controller触发,然后由名为“search_bar”的模型建模?同样,我对MVC模式非常陌生,并且不太确定如何将AJAX与像CI这样的面向对象框架正确集成。

由于

3 个答案:

答案 0 :(得分:0)

您应该从视图转到控制器:

<script type='text/javascript' language='javascript'>
    $('#search_bar').keyup(function(){
        $.ajax({
                url: 'search_bar.php',
                type:'GET',
                data: {q: search,
                success: function(result){
                        //Insert code here
                    } // End of success function of ajax form
                }); // End of ajax call
    });
    </script>

然后在您的控制器中,根据需要加载模型:

public function weigeren() {
        $user = $this->CI->authex->getUserInfo();
        $data['title'] = "Test";
        $this->load->model('search_model');
        $query = $this->input->get('q');
        if (isset($user)) {

          echo $this->search_model->search($query);


        }
    }

答案 1 :(得分:0)

直接调用ajax请求中的视图不是一个好的做法,调用加载视图的控制器或直接在控制器的函数中执行操作

<script type='text/javascript'>
    $('#search_bar').keyup(function(){
        $.ajax({
                url: 'yourcontrollername/search_bar_yourfunction',
                type:'POST',
                data: {q: search,
                success: function(result){
                 $("#livesearch").html(result);
                 $("#livesearch").slideDown("fast");
                    } 
                }); 
    });
    </script>

您的控制器代码

 class yourcontrollername extends My_Controller {
public function search_bar_yourfunction() {
      //do your stuff and store in the $data[] array

$this->load->view("search_bar",$data); //search_bar.php
die();
        }
    }
    }

答案 2 :(得分:0)

我找到了一种在CodeIgniter 3中加载ajax(jquery)的方法。例如,

文件夹结构:

  1. 控制器/ upload.php的
  2. 视图/管理/ ajax_view / ajax_images.php
  3. 控制器/上传:

    public function process()
    {
        $data['my_picture'] = array(
            'pic_id' => '1', 
            'pic_path' => 'http://example.com/images', 
            );
    
        $this->load->view('admin/ajax_view/ajax_images', $data);
    }
    

    查看/管理/ ajax_view / ajax_images:

    <?php foreach($my_picture as $key => $row): ?>
    <td><?php echo $my_picture['pic_path']; ?></td>
    <?php endforeach; ?>
    

    查看/管理/ form_upload:

    <tbody>
      <tr class="trbody">
        <th scope="row">1</th>
        <!-- <td></td> --> <!--comments this because appends element jquery-->
      </tr>
     </tbody>
    
    <script type="text/javascript">
     $(document).ready(function(){
      $('#my_button').click(function(e){
       e.preventDefault;
        $.ajax({
          url: 'upload/process',
          dataType: 'text',
          type: 'post',
          success: function(data){
          $('.trbody')
          .append(
            '<td>'+ data + '</td>'
            );
          },
          error: function(errorThrown){
            console.log(errorThrown);
          }
        });
      });
    });
    </script>
    

    通过这种方式,我分离了整页的ajax视图并加载了ajax视图 事件触发器。