如何击败我的CodeIgniter不良做法


How to beat my CodeIgniter bad practices

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

视图:

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('');


    }
});

}

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

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

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

现在将此新$persons发送到您的视图。您的新视图代码将如下所示

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

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

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);
     }
    });
 }

希望对您有所帮助。