如何击败我的CodeIgniter不良做法

时间:2014-12-17 15:41:33

标签: javascript php jquery ajax codeigniter

从视图中访问功能? 我知道正确的方法应该是控制器处理所有函数调用,但是 如果我需要调用另一个函数并在视图中传递来自db数据的变量,例如。

视图:

if($persons != ""){

   foreach($persons as $p){
       echo $p->name;
       echo $p->lastname;
       // Now I need to call a function and pass parameters from loop
       $is_banned = $this->model_users->checkIfBanned($p->name);
       echo $is_banned;

   }
}

我应该如何在控制器中以正确的方式执行此操作?

其他的是javascript ajax调用。当我需要收到多个响应时,我一直在控制器中放入大量的javascript。例如,如果我需要通过ajax获取用户的所有帖子并获得更新帖子div的响应,加上获取帖子数量并更新帖子计数div。

我一直在做错的方式: 例如。 JS:

function insertNewPost(){
var the_text = $('#post_text_input').val();
if(the_text != ""){
    $.ajax({
    type:"POST",
    url:base_url+"controller/insertNewPost",
    data: {post_text: the_text},
    cache:false,
    success:function(response){
              $('#post_output').prepend(response);
              $('#post_text_input').val('');

    }
});


}

控制器:

function insertNewPost(){
        if($this->session->userdata('is_logged_in')){
            $this->load->model('model_users');
            $this->load->model('model_posts');
            $email = $this->session->userdata('email');
            $myid = $this->model_users->getUserId($email);
            $post_text= $this->FilterData($this->input->post('post_text'));


            if($this->model_posts->insertNewPost($myid,$post_text)){
                $count = $this->model_posts->countPosts($myid);
                echo  'More recent: '.$post_text;?>

                <script>
                    var count = "<?php echo $count;?>";
                    $('#posts_count').html(count);     

                </script>

                <?php


            } 
       }else{
               redirect("inicio");
            }

}

是否可以同时获得2个响应并同时更新2个div中的内容?我如何获得$count变量并将其传递给相同的ajax响应?

任何光线都会非常好。 提前致谢

正如@charlietfl所建议的那样:

更改了控制器:

function insertNewPost(){
        if($this->session->userdata('is_logged_in')){
            $this->load->model('model_users');
            $this->load->model('model_posts');
            $email = $this->session->userdata('email');
            $myid = $this->model_users->getUserId($email);
            $post_text= $this->FilterData($this->input->post('post_text'));


            if($this->model_posts->insertNewPost($myid,$post_text)){

                $content = 'More recent: '.$post_text;
                $count = $this->model_posts->countPosts($myid);
                $items = array($content,$count);
                echo json_encode($items);


            } 
       }else{
               redirect("inicio");
            }

}

并更改了js功能:

function insertNewPost(){
var the_text = $('#post_text_input').val();
var post_count = '#posts_count';
if(the_text != ""){
    $.ajax({
    type:"POST",
    url:base_url+"controller/insertNewPost",
    data: {post_text: the_text},
    cache:false,
    success:function(response){
                var content = json_encode(response);   
                 $('#post_output').prepend(content[0]);
                $(post_count).html(content[1]);
                $('#post_text_input').val('');




    }
});


}

它没有发生,我一定是做错了。

1 个答案:

答案 0 :(得分:2)

第一个问题:
它的行为方式还行。但我不推荐它,因为它不是程序员友好的。
你可以通过很多方式解决它 这是您想要的一种解决方案 在获得人员之后以这种方式发送数据之前处理您的控制器

for($i=0;$i<sizeof($persons);$i++)
{
   $persons[$i]->is_banned=$this->model_users->checkIfBanned($persons[$i]->name);
}

现在将这个新的$ person发送到您的视图。您的新视图代码将是这样的

if($persons != "")
{
   foreach($persons as $p)
   {
       echo $p->name;
       echo $p->lastname;
       echo $p->is_banned;

  }
}

希望你明白这一点。 对于您的第二个问题,您可以使用@charlietfl解决方案 以下是摘要:
而不是调用多个ajax调用 - 调用一个ajax并将所有结果返回为array.Like

function insertNewPost()
{
   //do your stuff;
   $data['content']="something";//it may be anything array,string
   //do your stuff;
   $data['count']="something";
   //do your stuff;
   $data['moreresult']="something";
   header('Content-type: application/json');
   echo json_encode($data);
   exit();
}

现在在你的js

function insertNewPost()
{
  var the_text = $('#post_text_input').val();
 if(the_text != "")
 {
   $.ajax({
     type:"POST",
     url:base_url+"controller/insertNewPost",
     data: {post_text: the_text},
     dataType: "JSON",
     success:function(response){
          //here you will get datas as response.content,response.count,response.moreresult
         //Now use them as you want as example
          $('#post_output').prepend(response.content);
          $('#post_text_input').val(response.count);
          $('#anotherid').val(response.moreresult);

     }
    });

 }

希望它会对你有所帮助。