Решить задачу. Передача значения переменной в контролере

Каждый топик здесь посвящен конкретной библиотеке или наработкам конкретного проекта

Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 17 ноя 2015, 12:02

Очень нужна ваша помощь.

1. Есть массив с данными зарегистрированного пользователя.
2. Есть AJAX-запрос который добавляет в таблицу некоторые данные.
3. Есть контроллер ajax.php через который работает ajax-запрос.

Поскольку массив с пользовательскими данными создается из сессии, он не доступен в самом в ajax-скрипте (сессия на сервере, скрипт - у клиента), пытаюсь передать данные через контроллер ajax.php. Пока все попытки не увенчались успехом.

ajax-запрос:
Код: Выделить всё
$.ajax({
            type: 'POST',
            url: '/index.php/ajax/add_personal_setting/',               
            dataType
: 'json',
            data: {'setting_id': $setting_id},                   
            success
: function(){alert("Данные добавлены");}
}); 

контроллер ajax.php:
Код: Выделить всё
function add_personal_setting () {
$user_id=???????;
      $array = array('user_id' => $user_id,
                   'setting_id' => $this->input->post('setting_id'),
                           );
            $res = $this->crud->add_personal_setting($array);              
            echo 
(json_encode($res));                                                    
    
}

Сам массив с пользовательскими данными создаётся из сессии в контроллере pages.php :
Код: Выделить всё
$this->load->library('uauth'); //Подключаем библиотеку авторизации        
if ( $this->uauth->is_authorised()){             
            $data
['userdata'] = $this->uauth->userdata(); //Загружаем данные о пользователе в массив                          
        }

Дальше я пытался создать глобальную константу:
Код: Выделить всё
$this->config->set_item('CURR_USER_ID', $data['userdata']['user_id']); 
или так:
Код: Выделить всё
define('CURR_USER_ID', $data['userdata']['user_id']); 

они везде доступны, только не в контроллере ajax.php ((

Помогите мне решить эту проблему.
Спасибо.
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26

Re: Решить задачу. Передача значения переменной в контролере

Сообщение dedov1 » 18 ноя 2015, 11:15

Если Вы записали в конфиг:
Код: Выделить всё
$this->config->set_item('CURR_USER_ID', $data['userdata']['user_id']); 


ТО получить её можно практически везде.

В контроллере:
Код: Выделить всё
$this->config->item('CURR_USER_ID'); 


В библиотеках:
Код: Выделить всё
$CI =& get_instance();
$CI->config->item('CURR_USER_ID'); 


http://www.code-igniter.ru/user_guide/l ... onfig.html
dedov1
 
Сообщения: 72
Зарегистрирован: 01 мар 2012, 08:17

Re: Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 18 ноя 2015, 11:44

dedov1 писал(а):Если Вы записали в конфиг:
Код: Выделить всё
$this->config->set_item('CURR_USER_ID', $data['userdata']['user_id']);


ТО получить её можно практически везде.

В контроллере:
Код: Выделить всё
$this->config->item('CURR_USER_ID');



Да, я именно так и пытался сделать,

Сдеал следующую проверку в контроллере ajax.php
Код: Выделить всё
function add_personal_setting () {
        $array = array();               
        $array 
= array('user_id' => $this->config->item('CURR_USER_ID'),
                       'setting_id' => $this->input->post('setting_id'),
                           );
        echo (json_encode($array));                                                   
    


в итоге получаю ответ в виде
Код: Выделить всё
{"user_id":false,"setting_id":"14"}]


проверил в другом контроллере данная константа передаёт значение user_id=1.
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26

Re: Решить задачу. Передача значения переменной в контролере

Сообщение dedov1 » 19 ноя 2015, 14:35

Ну значит Вы изначально записываете в конфиг пустое значение.
Ну ведь легко проверить - отследите что Вы пишете и куда.
Например:
Код: Выделить всё
$this->config->set_item('CURR_USER_ID', 'ВАСЯ'); 

Далее смотрите... Отслеживайте... Что куда не приходит.

... Скорее всего Вам ID_user нужно получать так:
Код: Выделить всё

$userdata 
= $this->uauth->userdata(); // Объект
$id_user  = $userdata->user_id;
dedov1
 
Сообщения: 72
Зарегистрирован: 01 мар 2012, 08:17

Re: Решить задачу. Передача значения переменной в контролере

Сообщение gest » 20 ноя 2015, 01:38

Попробуйте в запросе передать заголовок XmlHttpRequest принудительно
Мне помогло...
"В споре чаще рождается ненависть и только умному открывается истина"
"Я NODE выучил лишь бы за то, что он использует яву"
gest
 
Сообщения: 38
Зарегистрирован: 08 ноя 2012, 23:13

Re: Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 24 ноя 2015, 17:56

dedov1 писал(а):Ну значит Вы изначально записываете в конфиг пустое значение.
Ну ведь легко проверить - отследите что Вы пишете и куда.
Например:
Код: Выделить всё
$this->config->set_item('CURR_USER_ID', 'ВАСЯ'); 

Далее смотрите... Отслеживайте... Что куда не приходит.

... Скорее всего Вам ID_user нужно получать так:
Код: Выделить всё

$userdata 
= $this->uauth->userdata(); // Объект
$id_user  = $userdata->user_id;


Спасибо за подсказку, но я именно так и делал проверку. Везде передаваемая переменная доступна за исключением контроллера ajax.php.

gest писал(а):Попробуйте в запросе передать заголовок XmlHttpRequest принудительно
Мне помогло...


Могли бы вы выложить пример?..
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26

Re: Решить задачу. Передача значения переменной в контролере

Сообщение dedov1 » 25 ноя 2015, 07:18

Покажите от чего наследуется контроллер ajax и его конструктор.
dedov1
 
Сообщения: 72
Зарегистрирован: 01 мар 2012, 08:17

Re: Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 25 ноя 2015, 10:10

dedov1 писал(а):Покажите от чего наследуется контроллер ajax и его конструктор.

Код: Выделить всё
class Ajax extends CI_Controller
{
    
    public function constructor
(){
        parent::__construct();        
    
}

function add_personal_setting () {
      $user_id = $this->config->item('CURR_USER_ID');
      $array = array('user_id' => $user_id,
                   'setting_id' => $this->input->post('setting_id'),
                           );
            $res = $this->crud->add_personal_setting($array);              
            echo 
(json_encode($res));                                                    
    
}
}
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26

Re: Решить задачу. Передача значения переменной в контролере

Сообщение dedov1 » 25 ноя 2015, 11:04

они везде доступны, только не в контроллере ajax.php ((

Ну да, в контроллере Pages

Вы пытаетесь достать переменную в другом контроллере...

Когда Вы обращаетесь к контроллеру Ajax он ни чего не знает о Pages в котором пишется значение в конфиг..

Делайте примерно так:
Создайте один главный контроллер в котором пишите в конфиг весь глобал. И потом от него наследуйте нужные Вам контроллеры... Как кто так.

Вот тут, когда то давным давно я тупил по похожей задаче, и там есть пример который Вам нужен:
[url]
viewtopic.php?f=15&t=4492&p=28694#p28668
[/url]
dedov1
 
Сообщения: 72
Зарегистрирован: 01 мар 2012, 08:17

Re: Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 25 ноя 2015, 18:09

dedov1 писал(а):Делайте примерно так:
Создайте один главный контроллер в котором пишите в конфиг весь глобал. И потом от него наследуйте нужные Вам контроллеры... Как кто так.

Спасибо за помощь. К сожалению ваша подсказка помогла решить мою проблему только частично.
Что я сделал:
Код: Выделить всё
//Application/core/MY_Controller.php
class MY_Controller extends CI_Controller {
     public function __construct(){ 
        parent
::__construct();       
    
}
}
 
//Application/controllers/ajax.php
class Ajax extends MY_Controller
{
    public function constructor(){
        parent::__construct();        
    
}

На выходе получилось следующее. Если задать значение в контроллере MY_Controller статично,
Код: Выделить всё
public function __construct(){ 
        parent
::__construct();
        $this->config->set_item('CURR_USER_ID', '14465');
        }

то всё работает замечательно:
Код: Выделить всё
{"user_id":"14465","setting_id":"1664"}

, но как только я пытаюсь подключить библиотеку авторизации, что бы вытащить динамические данные:
Код: Выделить всё
public function __construct(){ 
        parent
::__construct();
        $this->load->library('uauth'); //Подключаем библиотеку авторизации
        }

система вываливает ошибку:
Код: Выделить всё
<p>Message:  session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send
 session cache limiter 
- headers already sent (output started at www\application\controllers
\ajax.php:1)</p>
<
p>Filename: libraries/Uauth.php</p>
<
p>Line Number: 30</p

В строке 30 Uauth.php находится открытие сессии
Код: Выделить всё
function __construct($params=array()) {
        parent::__construct($params);
        if(session_id()=='') {
            session_name('transl');
стр.30        session_start();
        }
        $this->userdata=isset($_SESSION[self::session_key])? $_SESSION[self::session_key]: false;
    }


Собственно я уперся в эту проблему изначально(
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26

Re: Решить задачу. Передача значения переменной в контролере

Сообщение dedov1 » 26 ноя 2015, 13:20

До старта сессии нельзя в браузер что то отправлять, echo print_r и тд.
Ваша ошибка говорит о том что в браузер уже отправлены заголовки или проще говоря Вы что то уже вывели на экран.
Далее... это что за хрень и зачем она нужна, можно убрать.
Код: Выделить всё
session_name('transl');


К сожалению я не знаю кокой библиотекой пользуетесь и не могу глубже подсказать. Я например пользуюсь старенькой, но проверенной временем библиотекой авторизации Ion_auth.php для CI и она сама сессию стартует где нужно, кстати сейчас её внедрил в проект который на CI3 разраб. - полёт пока нормальный, хоть и переделывал там много под себя... Вот здесь разжёвано всё до дальше некуда - посмотрите, может Вам её легче прикрутить
http://benedmunds.com/ion_auth/
http://dev-mark.blogspot.ru/2010/11/cod ... -auth.html
dedov1
 
Сообщения: 72
Зарегистрирован: 01 мар 2012, 08:17

Re: Решить задачу. Передача значения переменной в контролере

Сообщение gest » 30 ноя 2015, 01:36

Не используйте session_start() и session_name(). У CI свой механизм сессий. В крайнем случае (если "позарез" нужны родные сессии php) - можно использовать эти функции в файле контроллера до объявления класса.
"В споре чаще рождается ненависть и только умному открывается истина"
"Я NODE выучил лишь бы за то, что он использует яву"
gest
 
Сообщения: 38
Зарегистрирован: 08 ноя 2012, 23:13

Re: Решить задачу. Передача значения переменной в контролере

Сообщение gest » 30 ноя 2015, 01:59

И на всякий случай : заголовок xhr запроса можно отправить принудительно например так

Код: Выделить всё
$.ajax({
  ...
  beforeSend: function( xhr ) {
    xhr.setRequestHeader('X-Requested-With', 'XmlHttpRequest');
  },
  ...
})
"В споре чаще рождается ненависть и только умному открывается истина"
"Я NODE выучил лишь бы за то, что он использует яву"
gest
 
Сообщения: 38
Зарегистрирован: 08 ноя 2012, 23:13

Re: Решить задачу. Передача значения переменной в контролере

Сообщение gest » 30 ноя 2015, 02:10

Только что заметил
Вы пишете
$this->userdata=...

Насколько я помню при установке значений нужно использовать

Код: Выделить всё
$this->session->set_userdata(session_key, session_value); 
"В споре чаще рождается ненависть и только умному открывается истина"
"Я NODE выучил лишь бы за то, что он использует яву"
gest
 
Сообщения: 38
Зарегистрирован: 08 ноя 2012, 23:13

Re: Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 01 дек 2015, 12:20

dedov1 писал(а):К сожалению я не знаю кокой библиотекой пользуетесь и не могу глубже подсказать. Я например пользуюсь старенькой, но проверенной временем библиотекой авторизации Ion_auth.php для CI и она сама сессию стартует где нужно, кстати сейчас её внедрил в проект который на CI3 разраб. - полёт пока нормальный, хоть и переделывал там много под себя... Вот здесь разжёвано всё до дальше некуда - посмотрите, может Вам её легче прикрутить
http://benedmunds.com/ion_auth/
http://dev-mark.blogspot.ru/2010/11/cod ... -auth.html


Я использую авторизацию через соц. сети ulogin. http://ulogin.ru/constructor.php?display=2
Библиотеку старался не модифицировать, так что все запуски сессий и прочее родное.
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26

Re: Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 02 дек 2015, 11:26

gest писал(а):И на всякий случай : заголовок xhr запроса можно отправить принудительно например так

Код: Выделить всё
$.ajax({
  ...
  beforeSend: function( xhr ) {
    xhr.setRequestHeader('X-Requested-With', 'XmlHttpRequest');
  },
  ...
}) 

Спасибо, но к сожалению не помогло.
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26

Re: Решить задачу. Передача значения переменной в контролере

Сообщение gest » 03 дек 2015, 20:31

Судя по ошибке строки 30, заголовки уже отправлены, а Вы еще раз пытаетесь их отправить.
На мой взгляд вариантов 2: или "Модифицировать" исходный код библиотеки под синтаксис CI или отказаться от CI, создав "контроллер" не в папке контроллеров.
"В споре чаще рождается ненависть и только умному открывается истина"
"Я NODE выучил лишь бы за то, что он использует яву"
gest
 
Сообщения: 38
Зарегистрирован: 08 ноя 2012, 23:13

Re: Решить задачу. Передача значения переменной в контролере

Сообщение opus44 » 14 дек 2015, 17:46

Вышел и положения следующим образом. В библиотеку авторизации добавил создание cookie
Код: Выделить всё
$cookie = array(
                   'name'   => 'user',                   
                   
'expire' => $this->CI->config->item('sess_expiration'),
                   'value'  => $userdata['id'],
                   'path'   => '/',
                   'prefix' => 'ts_',
               );
                $this->CI->input->set_cookie($cookie); 


и в логаут добавил
Код: Выделить всё
       if ($this->CI->input->cookie('ts_user',  TRUE)) 
           $this
->CI->input->set_cookie('ts_user', '', ''); 
opus44
 
Сообщения: 25
Зарегистрирован: 04 окт 2012, 17:26


Вернуться в Решения, авторский код и библиотеки

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1