Я несколько запутался в правильном способе выполнить следующее. Является ли это классом функция или объект? (Не уверен) Итак, здесь (пожалуйста, будьте добры). Я изучаю 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
Однако я хочу, чтобы этот код отображался на всех страницах.
Каков правильный способ сделать это?
view/header
который автоматически загружается на каждую страницу и вставляет туда этот code
? class/public function
в helper
файле и загрузить ее там, где это необходимо? class/public function
в файле library
и загрузить ее там, где это необходимо? 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