2014-12-17 1 views
1

Доступ к функциям из представления? Я знаю, что правильный путь должен состоять в том, что контроллеры обрабатывают все вызовы функций, но Если мне нужно вызвать другую функцию и передать переменную, которая поступает из данных db в виде цикла, например.Как побить мои неправильные методы CodeIgniter

вид:

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; 

    } 
} 

Как я должен сделать это правильный путь в контроллере?

Другая вещь - вызовы ajax для javascript. Я поставил много javascript в контроллерах, когда мне нужно получить более одного ответа. Например, если мне нужно получить все сообщения от пользователя через ajax и получить ответ на обновление сообщений div, а также получить количество сообщений и обновить поле count count.

Неверный путь, который я делал: например. ЯШИ:

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 див в то же время? Как я могу получить переменную $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(''); 




    } 
}); 


} 

это не происходит, я должен делать что-то не так.

+2

может создавать ассоциативный массив в php и выводить как json, тогда успех ajax может анализировать возвращаемые свойства объекта, чтобы делать все, что необходимо – charlietfl

+0

@charlietfl Спасибо. Это звучит хорошо, попробуй и опубликуйте результаты. Любая идея для первой проблемы? – sunrisepoet

+0

не совсем уверен, что ваша первая проблема. Передача данных с контроллера на просмотр хорошо документирована в документах CI – charlietfl

ответ

2

Для вашей первой проблемы:
ОК OK, как вы это делаете. Но я не рекомендую его, потому что он не является программистом.
Вы можете решить его по-разному.
Вот одно из решений, которое вы хотите.
процесса контроллер перед отправкой данных в целях таким образом, после получения лиц

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

Теперь отправить этот новый $ лиц к вашему view.Your новый код вида будет как этот

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

    } 
} 

Надеюсь, вы понимаете это. Для вашей второй проблемы вы можете использовать решение @charlietfl.
Реферат:
Вместо того, чтобы вызывать несколько ajax call-call один 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); 

    } 
    }); 

} 

Надеется, что это поможет.

+0

Большое спасибо за ответ , Я не знал, что мне нужно было вызвать 'header()', а в ajax datatye «JSON» попробует его и вернется к вам. Я роджер, мне нужно больше узнать о JSON. ;). – sunrisepoet

Смежные вопросы