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

Я несколько запутался в правильном способе выполнить следующее. Является ли это классом функция или объект? (Не уверен) Итак, здесь (пожалуйста, будьте добры). Я изучаю codeigniter / php одновременно.

$is_live = $this->session->userdata('email'); $is_live = ucwords($is_live); if (!$is_live == null) echo 'Hello, '.$is_live. ' <b>(Not you? '.'<a href="' .base_url(). 'main/logout">Log Out</a>) </b>'; 

Я написал этот код, который проверяет, установлен ли сеанс, и если true, эхо детали. У меня есть этот код на моем view/main Однако я хочу, чтобы этот код отображался на всех страницах.

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

  1. Я создаю view/header который автоматически загружается на каждую страницу и вставляет туда этот code ?
  2. Создать class/public function в helper файле и загрузить ее там, где это необходимо?
  3. Создать функцию class/public function в файле library и загрузить ее там, где это необходимо?
  4. Создать public function в контроллере?

-EXTRA- Мое предположение – вариант 1 но мне любопытно, что, если я хочу отображать эту информацию в другом месте на определенной странице? Я не хочу копировать / вставлять блок кода, потому что это неряшливо.

Как мне настроить его так, чтобы я мог просто назвать его там, где он мне нужен? например $this->load->helper('check_for_sess');

 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class isLive { public function is_live() { $is_live = $this->session->userdata('email'); $is_live = ucwords($is_live); if (!$is_live == null) echo 'Hello, '.$is_live. ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>'; } } 

В view я попробовал это:

 <?php $isLive = new isLive; $isLive->is_live(); ?> 

Это, однако, не работает и вызывает функцию userdata () для ошибки, отличной от объекта "

Может кто-то объяснит, как правильно найти желаемое решение и правильный синтаксис. Заранее спасибо!

-UPDATE– Пытался создать библиотеку, все еще получая ошибку.

 #Created a library class CheckSess { function IsLive() { $is_live = $this->session->userdata('email'); $is_live = ucwords($is_live); if (!$is_live == null) { $check_msg = 'Hello, '.$is_live. ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>'; } return $check_msg; } } #In the View <?php echo $this->CheckSess->IsLive(); ?> #in the controller $this->load->library('CheckSess'); 

–ОБНОВИТЬ–

 class CheckSess { function IsLive() { $CI =& get_instance(); $is_live = $CI->session->userdata('email'); $is_live = ucwords($is_live); if (!$is_live == null) { return 'Hello, '.$is_live. ' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>'; } } } 

Установите этот элемент ^ в папку libraries

view показывает <?php echo $this->CheckSess->IsLive(); ?> <?php echo $this->CheckSess->IsLive(); ?>

и controller показывает $this->load->library('CheckSess');

пожалуйста, порекомендуйте. Еще раз спасибо!

ОШИБКА—

(!) SCREAM: подавление ошибок игнорируется для (!) Неустранимая ошибка: вызов функции-члена IsLive () для не-объекта в C: \ wampserver \ www \ test-app \ application \ views \ homepage.php в строке 56 Стек вызовов

Расположение функции памяти времени

1 0.0005 151432 {main} () .. \ index.php: 0 2 0.0014 187792 require_once ('C: \ wampserver \ www \ test-app \ system \ core \ CodeIgniter.php') .. \ index.php: 202 3 0.0277 1537000 call_user_func_array () .. \ CodeIgniter.php: 359 4 0.0277 1537048 Main-> index () .. \ CodeIgniter.php: 359 5 0.0283 1540200 CI_Loader-> view () .. \ main.php: 8 6 0.0283 1540640 CI_Loader -> _ ci_load () .. \ Loader.php: 419 7 0.0287 1566584 include ('C: \ wampserver \ www \ test-app \ application \ views \ homepage.php') .. \ Loader.php: 833

Лучшие способы написания такого многократного использования в CodeIgniter – это модели и библиотеки.

Поскольку библиотеки лучше, потому что используемый вами код и логика на самом деле не являются моделями в MVC, но с CodeIgniter и особенно для новичков довольно хорошо писать это в моделях, если вы не планируете распространять или распространять этот код в так или иначе.

Я бы предложил больше узнать о том, что происходит в CodeIgniter, вы можете найти много информации здесь, на SO или на официальных форумах CI, но в качестве краткой справки я напишу список того, что происходит.

Просмотры

Статический, немой вывод данных, форматирование, итерация (для отображения таблиц, списков и т. Д.).

Единственные вещи, которые вы хотите использовать здесь, – это некоторые из основных функций PHP, помощники CodeIgniter, foreach , в while циклы и условные обозначения ( if , case )

Контроллеры

Формирование и проверка данных форм, улавливание данных с моделей, отправка данных в представления, перенаправления.

модели

Запрос, чтение, запись и обновление данных из баз данных, удаленных источников (API), файлов.

Помощники

Часто используемые функции, которые, как ожидается, будут использоваться в представлениях – форматирование HTML, синтаксический анализ и отображение деревьев в виде списков <ul><li></li></ul> , сокращенные функции для других функций, таких как:

 function mydate() { return date("dmY"); } 

Материал, который не использует ни одну из библиотек / моделей CodeIgniter (технически он может использоваться, но в большинстве случаев его следует избегать).

Библиотеки

Пользовательские классы и объекты, обработка данных, интерфейсы API, комплекс вышеупомянутых



Если вы хотите отобразить некоторый файл вида с данными, я бы поместил его в библиотеку. Вы можете привести его в модель. В моих проектах, когда я использую некоторые части, у меня есть библиотека / модель (разница в нашем случае минимальна), давайте назовем ее pmodel .

 class Pmodel extends CI_Model() { function ShowHeader() { $data = array( 'user' => $this->usermodel->GetCurrentUser() } $this->load->view('header', $data); } function ShowMyPart() { $is_live = $this->session->userdata('email'); $is_live = ucwords($is_live); if (!$is_live == null) echo 'Hello, '.$is_live. ' <b>(Not you? '.'<a href="' .base_url(). 'main/logout">Log Out</a>) </b>'; } } 

Теперь в любом месте файлов вида вы можете вызвать $this->pmodel->ShowMyPart() если вы его загрузили раньше (модели этого типа должны быть автоматически загружены).

Есть одно небольшое изменение, которое я бы сделал, поскольку это считается хорошей практикой – никогда не echo ничего из любого места, кроме файлов вида, вместо этого return значения.

Измените ключевое слово echo для return и в вашем файле просмотра просто напишите echo $this->pmodel->ShowMyPart() .

Зачем вам это делать? Поскольку, если вы хотите вызвать какой-либо метод, который перекликается с чем-то из контроллера прямо между загрузкой заголовка и нижнего колонтитула (например, CodeIgniter будет повторять это перед заголовком, так как CodeIgniter не сразу выводит ваши загруженные представления, он сохраняет их для вывода хранения и отправляет финализированный выход прямо перед разрушением. Более подробную информацию можно найти здесь .

Но вы можете сделать еще лучше – используйте файл представления для вывода любых данных, которые вы хотите, просто создайте помощника и загрузите его из своей модели / библиотеки, как это делается в ваших контроллерах.

Надеюсь, это поможет!


РЕДАКТИРОВАТЬ

Для вашего отредактированного вопроса причина, по которой вы получаете ошибки в своей библиотеке, заключается в том, что ваша библиотека не знает, что экземпляр CodeIgniter существует даже тогда, когда вы не расширяете свою библиотеку от него, как это происходит с вашими моделями и контроллерами. Вы не используете $this для обозначения классов CodeIgniter в своих библиотеках, а $this – это ссылка на вашу библиотеку, которая является отдельным классом. Чтобы использовать классы CodeIgniter, вы должны получить экземпляр CodeIgniter:

 $CI =& get_instance(); 

И тогда вы можете использовать $CI вместо $this чтобы вызвать классы CodeIgniter, изменив строку:

 $is_live = $this->session->userdata('email'); 

в

 $is_live = $CI->session->userdata('email'); 

Вы можете создать базовый помощник html и загрузить его в конфигурационном файле.

Тогда вы можете сделать функцию для этого …

 function displayLoginStatus($em) { $html = ''; if($em) { $html = 'Hello, '.ucwords($em).' <b>(Not you? '.'<a href="' .base_url().'main/logout">Log Out</a>) </b>'; } return $html; } 

то вы называете его нормальной функцией:

 <?php echo displayLoginStatus($this->session->userdata('email')); ?> 

но в идеале вы помещаете что-то подобное в шаблон или заголовочный файл, который обертывает ваши стандартные просмотры страниц. Нет необходимости делать какие-либо функции из этого, так как обычно у вас нет входа / выхода из системы в нескольких местах на странице. Его можно просто сжать:

 <?php if($this->session->userdata('email')): ?> Hello, <?php echo ucwords($this->session->userdata('email')); ?> <b>(Not you? <a href="<?php echo base_url(); ?>main/logout">Log Out</a>) </b> <?php endif; ?> 

Я предпочитаю создать шаблон сайта и обернуть его просмотром. Делает общие элементы намного проще в обращении. Некоторые люди делают это так: http://codeigniter.com/forums/viewthread/88335/

Есть много способов справиться с этим, но общая идея состоит в том, чтобы разделить ваши наиболее распространенные элементы на один шаблон. Я не знаю краткий способ проинструктировать вас о том, как это сделать, поэтому я только обновляю этот пост, если вы почувствуете необходимость в гораздо большем объяснении шаблонов.

вспомогательные документы: http://codeigniter.com/user_guide/general/helpers.html