Установка переменной для хранения электронной почты пользователя без повторения кода в каждой функции

Я использую библиотеку Ion_Auth с Codeigniter 3.0.*. Мне удалось отобразить адрес электронной почты пользователя, с которым я вошел в систему, с помощью этой строки кода в методе __construct() моего Admin_Controller:

$this->user_email = $this->ion_auth->user()->row();

Но мне нужно повторить этот код:

$data['user_email'] = $this->user_email->email;

В каждом методе представления в каждом контроллере. Я отображаю переменную $user_email в моем header.php, которая одинакова для каждой страницы. Как сделать его доступным для всех, не повторяя эту строку кода?


person fermoga    schedule 15.11.2015    source источник
comment
Является ли header.php представлением?   -  person DFriend    schedule 15.11.2015


Ответы (2)


Добавьте свойство класса $data в определение класса Admin_controller. Свойство $data будет доступно для каждого контроллера, расширяющего Admin_controller. Поскольку это свойство класса, доступ к нему осуществляется с помощью синтаксиса $this->data.

class Admin_controller extends CI_Controller
{
    //our new class property 
    protected $data = array(); 

    public function __construct(){
      parent :: __construct();
      // do what is needed to get $ion_auth working
    }
}

В любом классе, расширяющем Admin_controller, установите $data['$user_email'] в конструкторе. Затем он доступен для каждого представления, которому задано значение $this->data.

class Some_controller extends  Admin_controller
{
    public function __construct(){
      parent :: __construct();
      //I am assuming that by this time $this->ion_auth->user() exists
      //so we add a key and value to the class' $data property 
      //Note the use of the "$this->" syntax)
      $this->data['user_email'] = $this->ion_auth->user()->row();
    }

    public function sets_up_a_view(){
       //do stuff until you're ready for the header
       //note that we are sending the class property "$this->data" to the view
       $this-load->view('header', $this->data);
       //load other views as needed using $this-data or other array - your choice
    }

    public function some_other_view(){
        //send class property to view
        $this-load->view('header', $this->data);
        $data['foo'] = 42;
        //send local var to view
        $this-load->view('other_parts', $data);
    }
}

Обратите внимание, что и sets_up_a_view(), и some_other_view() передают свойство класса '$this->data' в header.php. Но в some_other_view() мы настраиваем локальную переменную с именем $data для отправки в представление other_parts.php.

person DFriend    schedule 15.11.2015
comment
Это то, что я сделал. Я вызываю переменную $data в методе __construct() из моего Admin_controller, который расширяется всеми остальными имеющимися у меня контроллерами. Проблема здесь в том, что я должен повторять это $data['user_email'] = $this->user_email->email; в каждом методе вызова моих представлений. Я хотел знать, есть ли способ избежать повторения этого, но я полагаю, что нет? - person fermoga; 15.11.2015
comment
@ mfgabriel92, я пересмотрел ответ, чтобы (надеюсь) сделать мое решение более понятным. - person DFriend; 15.11.2015
comment
Я нашел решение! Проверьте мой собственный ответ. В любом случае спасибо. - person fermoga; 15.11.2015

Решение заключалось в добавлении этих двух строк кода в мой Admin_controller:

$data['user_email'] = $this->ion_auth->user()->row()->email;
$this->load->vars($data);

При этом каждый метод представления в контроллерах, расширяющих Admin_controller, может получить доступ к этой переменной.

person fermoga    schedule 15.11.2015