Передача данных между 2 функциями контроллера

#php #jquery #ajax #codeigniter

Вопрос:

Проще говоря, я хочу, чтобы status1 перешел в контроллер ajaxleadsreport

введите описание изображения здесь

Немного более сложное объяснение:

У меня есть 2 класса представления, называемых indexreport и ajaxleadsreport. ajaxleadsreport извлекает все данные и отображает их. Теперь у меня есть переменная GET, которая передается в indexreport, и я хочу, чтобы она могла передать ее в ajaxleadsreport для фильтрации текущих данных в соответствии с переданной переменной GET.

Класс Контроллера:

 public function listsreport($slug='')
    {
        $status1 = $this->input->get('status');
        print_r($status1);
        $main['content']=$this->load->view('crm/leads/indexreport',$content,true);
     }
    public function ajaxleadsreport($p='')
    {       
            $output = array( 'html'=>$this->load->view('crm/leads/ajaxleadsreport',$content, true)); 
        echo json_encode($output); 
    }
 

класс представления indexreport:

 <?php
$i=$return=$uriseg;
$post=$this->input->post(); $sess=$this->session->userdata();
$post = $post?$post:$sess;
?>
<div>
...
</div>
$(document).ready(function (){
  getleads();
 });
function getleads(p){ 

    $.ajax({
    type: "post",dataType:"json",async:false,cache:true,
    url: "<?php echo site_url('leads/ajaxleadsreport'); ?>" ( parseInt(p)>0?'/' p:''),
    data: $('#objlistform').serialize(),
    success: function(e){$('#leadswrap').hide().html(e.html).fadeIn('slow');} 
  }); return false;
}
 

класс представления ajaxleadsreport:

 <?php  
$sess=$this->session->userdata(); 
$status1 = $this->input->get('status');
// This is where I'm trying to put my GET value of status for filtering but it gives NULL.
$post = array('fstatus'=> $status,'fpriority'=> $sessn['fpriority']);
$postd = json_encode(array_filter($post));
?>
...
<script>
$(document).ready(function() {
  function sendreq(){
    setpostdatas();cleartable();getleads();
  }
   var slug = '<?php echo $slug?>';
   var postd = '<?php echo $postd; ?>';
    $('#item-list').DataTable({
        "processing": true,
        "stateSave": true,
        "serverSide": true,
        "ordering": false,
        "ajax": {
            url: "<?php echo site_url(); ?>leads/loadLeads",
            data: {slug: slug, postdata: postd},
            type : 'POST',
            "dataSrc": function ( d ) {
                d.myKey = "myValue";
                if(d.recordsTotal == 0 || d.data == null){
                   $("#item-list_info").text("No records found");
                }
                return d.data;
            }
        },
        'columns': [
            {"data": "id", "id": "id"},
            {"data": "lead_status", "lead_status": "lead_status"},
            {"data": "priority", "priority": "priority"},  
        ]
    });
 

Как вы можете видеть в приведенном выше коде, я пытался $status1 = $this->input->get('status'); использовать класс представления ajaxleadsreport, но результат для этого равен НУЛЮ, так как значение GET передается в моем классе представления indexreport. Когда я выполняю print_r($status1) в контроллере indexreport, он выдает правильный вывод, но в контроллере ajaxleadsreport значение равно НУЛЮ.

Так что в принципе теперь мне нужен способ передать это значение GET контроллеру ajaxleadsreport.

Комментарии:

1. Не вызывайте один контроллер от другого. Если вам нужно запустить какой-то общий код в обоих, переместите этот код в службу (или, возможно, в защищенный метод контроллера), который могут вызывать оба. Затем, если этому коду нужны какие-то аргументы, добавьте их в качестве аргументов функции в метод службы и передайте его от контроллера. Таким образом, контроллер получает значение аргумента (GET, POST или что-либо еще, может отличаться в разных контроллерах), просто передает его службе, а затем получает результат.

2. @MagnusEriksson хорошо, предположим, что у вас есть это значение в вашем URL( http://localhost/leads/listsreport?status=9 ). Теперь вы хотите получить доступ к status=9 значению в контроллере ajaxleadsreport. Не могли бы вы рассказать мне кодовым способом, как я могу этого достичь?

Ответ №1:

Вы можете использовать флэш-данные здесь:

Установите свой статус на flashdata, а затем получите его в отчете ajaxleadsreport следующим образом: (данные flashdata существуют только один раз при следующем запросе)

 $this->session->set_flashdata('status', $status1);
 

В отчете ajaxleadsreport:

 $this->session->flashdata('status');
 

Ответ №2:

В классе контроллера объявите переменную:

 protected $status1;
public function listsReport() { 
  $this->status1 =  $this->input->get('status');
  // [...]
}
 

Затем вы можете получить доступ $this->status1 из любой функции, которая будет вызвана после.