CodeIgniter не передаёт $this->uri->segment(3) в функцию контроллера (передача переменной PHP->JavaScript->PHP)

CodeIgniter не передаёт $this->uri->segment(3) в функцию контроллера (передача переменной PHP->JavaScript->PHP) Правильно передаём переменную из контроллера (PHP) в вид (Javascript) и затем используем её в ajax вызове функции из того же контроллера (снова в PHP). 

Процесс путешествия переменной такой. Сначала в контроллере ей присваивается значение из строки URL, затем это значение отправляется в отображение (из PHP получается Javascript, впрочем в этом случае это не обязательно, так как в виде могут присутствовать и PHP переменные и Javascript). Дальше нам нужно с помощью опции jQuery $.ajax под названием data передать значение переменной по GET опять в контроллер. Там взять её $this->input->get('sch_teacher_id'); и передать в функцию модели как параметр.

Сначала было непонятно почему такой код работает

$this->sch_teacher_id = $this->ion_auth->user_by_username("vika")->row()->id;

А такой – нет?

$this->sch_teacher_id = $this->ion_auth->user_by_username($this->uri->segment(3))->row()->id;

Url – teamsense:8888/admin_schedule/teacher/vika

route.php содержит

$route['admin_schedule/teacher/(:any)'] = "admin_schedule/index/$1";

Эти коды пишу в контроллере в function __construct(), и пытаюсь использовать их результат в других 3-х функциях этого же контроллера. Оказывается что $this->uri->segment(3) теряется где-то (!!!) и следующая функция user_by_username выдаёт не викины уроки, а мои собственные (залогиненного пользователя, чmb данные сохранены в сессии)

public function user_by_username($username = FALSE)
    {
        $this->trigger_events('user');

        //if no id was passed use the current users id
        $username || $username = $this->session->userdata('username');

        $this->limit(1);
        $this->where($this->tables['users'].'.username', $username);

        $this->users();

        return $this;
    } 

Генерируется страница следующим образом. Контроллер admin_schedule имеет функцию index, которая рендерит представление index.php. И в этом представлении я использую ajax вызов с помощью jQuery, вызывающий выполнение другой функции в контроллере admin_schedule. Вот этот вызов:

...
{
                url: '/admin_schedule/get_schedule_db_recurring_events_on_daysweek/',//"<?echo $data_path?>",
                backgroundColor: 'red',
            }

а вот функция в контроллере — get_schedule_db_recurring_events_on_daysweek()

function get_schedule_db_recurring_events_on_daysweek()
    {   
        ... 
        $sch_teacher_id = $this->uri->segment(3); // <--- this doesn't work, but $sch_teacher_id = 111 works perfectly
        $result=$this->Schedule_model->get_schedule_recurring_events_on_daysweek($start, $end, $sch_teacher_id);
        ...
    }

 

Решение проблемы:

Думаю всё дело в ajax вызове. Так, когда в контроллере код:

function __construct()
 {
        parent::__construct();
        ...

        $this->sch_teacher_row = $this->ion_auth->user_by_username($this->uri->segment(3))->row();
        $this->data['sch_teacher_id'] = $this->sch_teacher_row->id;
        $this->data['subtitle'] = $this->sch_teacher_row->username;          
 } 

То я получаю верное значение ID для Вики (например, '911') в представлении, но не в другую функцию из того же контроллера. Но я могу передать это знасение (sch_teacher_id) теперь из представления обратно в контроллер вызовом опции jQuery $.ajax – data:

eventSources: [
...         
{
                url: '/admin_schedule/get_schedule_db_recurring_events_on_daysweek/',//"<?echo $data_path?>",
                type: 'GET',
                data: {sch_teacher_id: sch_teacher_id},
                backgroundColor: 'red',
            }  
        ],

И дальше (с другой стороны горы – в контроллере) поймать значение с помощью параметра GET и пнуть его в функцию модели:

function get_schedule_db_recurring_events_on_daysweek()
    {   
        ...
        $sch_teacher_id_from_view = $this->input->get('sch_teacher_id');
        $result=$this->Schedule_model->get_schedule_recurring_events_on_daysweek($start, $end, $sch_teacher_id_from_view);
        ...
    }

Вот и весь брейкданс. Дальше функция эта выберет из базы данных то, что требуется!

Процесс поиска решения этой проблемы на stackoverflow.com

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.