1.2.5 MySQL - система управления базами данных
MySQL - сервер баз данных. MySQL характеризуется большой скоростью, устойчивостью и легкостью в использовании, является идеальным решением для малых и средних приложений.
Преимущества MySQL, по сравнению с другими системами управления базами данных в том, что она бесплатна, при этом имеет хорошо развитый функционал, а так же сильно распространена на современных серверах.
1.3 CMS
Системма управлемния содержиммым (контемнтом) (англ. Content management system, CMS) -- информационная система или компьютерная программа, используемая для обеспечения и организации совместного процесса создания, редактирования и управления контентом (то есть содержимым): Главной целью такой системы является возможность собирать в единое целое и объединять на основе ролей и задач все разнотипные источники знаний и информации, доступные как внутри организации, так и за ее пределами, а также возможность обеспечения взаимодействия сотрудников, рабочих групп и проектов с созданными ими базами знаний, информацией и данными так, чтобы их легко можно было найти, извлечь и повторно использовать привычным для пользователя образом.
В системе управления содержимым могут быть определены самые различные данные: документы, фильмы, фотографии, номера телефонов, научные данные и так далее. Такая система часто используется для хранения, управления, пересмотра и публикации документации. Контроль версий является одним из основных её преимуществ, когда содержимое изменяется группой лиц.
Существует множество готовых систем управления содержимым сайта, в том числе и бесплатных. Их можно разделить на три типа по способу работы:
Генерация страниц по запросу. Системы такого типа работают на основе связки «Модуль редактирования > База данных > Модуль представления». Модуль представления генерирует страницу с содержанием при запросе на него, на основе информации из базы данных. Информация в базе данных изменяется с помощью модуля редактирования. Страницы заново создаются сервером при каждом запросе, что в свою очередь создаёт дополнительную нагрузку на системные ресурсы. Нагрузка может быть многократно снижена при использовании средств кэширования, которые имеются в современных веб-серверах.
Генерация страниц при редактировании. Системы этого типа суть программы для редактирования страниц, которые при внесении изменений в содержание сайта создают набор статических страниц. При таком способе в жертву приносится интерактивность между посетителем и содержимым сайта.
Смешанный тип. Как понятно из названия, сочетает в себе преимущества первых двух. Может быть реализован путём кэширования -- модуль представления генерирует страницу один раз, в дальнейшем она в несколько раз быстрее подгружается из кэша. Кэш может обновляться как автоматически, по истечении некоторого срока времени или при внесении изменений в определённые разделы сайта, так и вручную по команде администратора. Другой подход -- сохранение определённых информационных блоков на этапе редактирования сайта и сборка страницы из этих блоков при запросе соответствующей страницы пользователем.
1.3.1 CMS, взгляд со стороны
Теперь следует рассмотреть, как системы управления представляются различным пользователям. Кто такие пользователи? Фактически к пользователям систем управления можно причислить всех тех, кто хоть как-то с ними взаимодействует. К примеру, пользователями обычно становятся следующие лица:
· Будущие и настоящие посетители разрабатываемого /разработанного веб-проекта (гости, зарегистрированные и незарегистрированные пользователи), в корпоративных проектах в эту группу войдут и сотрудники предприятия;
· Контент-менеджеры, модераторы, редакторы, администраторы (владельцы);
· Программисты и интеграторы (пользователи CMS «как продукта»).
Посетители - это самая многочисленная и самая значительная группа пользователей. Без них любой проект перестал бы развиваться (а возможно и вообще существовать), поэтому за их внимание и ведется столь жесткая борьба. Посетитель, он никогда не вникает в технические подробности - ему абсолютно безразлично, на базе какой системы управления функционирует разрабатываемый проект, ему важен результат: информация и способ ее получения. Систему управления посетитель не видит в таком виде, в каком ее видит доверенные участники вашего проекта (например, модераторы), вся система ль него - это страницы с материалами, навигационные элементы, формы обратной связи, подсказки и т.д, но не более того. Пользователь - это типичный потребитель, и чем проще и быстрее интересная информация «извлекается» из вашего проекта, тем меньше он задумывается о других, альтернативных проектах. Поэтому недостаточно создать удобный и хорошо настроенный проект, необходимо также позаботиться и о его содержании - оно должно быть интересным и актуальным.
Контент-менеджеры, модераторы, редакторы, администраторы - это доверенные лица, которым делегирован набор дополнительных прав. Пользователям такого уровня система управления предоставляется в расширенном виде - к интерфейсу системы добавляются дополнительные элементы управления или целые административные разделы. В таких разделах администратор может легко и быстро добавлять, например, новых пользователей, а модератор может вносить правки в остальные посетителями сообщения и делать другие разрешенные администратором действия.
1.3.2 CMS Drupal
Drupal -- мощная система управления контентом, созданная группой энтузиастов со всего мира. С ее помощью можно создать сайт практически любой сложности -- от небольшого личного блога до огромного портала. Благодаря мощному API, большому количеству подключаемых модулей и тем оформления, Drupal может удовлетворить любые ваши потребности.
Проект начат в 2000 году, программистом Драйесом Байтаертом.
Название Drupal является английским произношением голландского слова "druppel" ("капля"). Так что название этой CMS, в отличие от CMS Joomla, не несёт никакого смысла.
Установка Drupal
Drupal устанавливается за четыре шага:
1. Рспаковывается архив.
2. Папки и файлы Drupal загружаються на локальный сервер “Denwer”, по адресу home/jetaimes/www.
3. Создаем базу данных mySQL на сайте: http://localhost/Tools/phpMyAdmin/index.php.
4. Прописав в браузере jetaimes/ начинаем установку:
На следующей странице Drupal попросит создать файл settings.php в папке /sites/default. Этот файл нужно создать из файла default.settings.php. Нужно именно создать новый файл, а не переименовать существующий. После этого в этой папке должно быть два файла: default.settings.php и settings.php. Нажимаем ссылку обновите страницу в последней строке.
На следующей странице вводим информацию о базе данных (название, пользователя и пароль) и нажимем кнопку Сохранить. Секция Расширенные настройки не понадобится.
Откроется и вскоре исчезнет страница Установка Drupal, во время которой Drupal внесёт изменения в файл settings.php.
Следующая страница будет находится на экране дольше. Т.к. будет выполняться перевод интерфеса на русский язык. На общих хостингах с небольшими ресурсами именно эта операция проходит не полностью, т.к. установленного ограничения на время выполнения скрипта не хватает на импорт переводов.
После того, как переводы будут импортированы, нужно заполнить общую информацию о сайте (название, почтовый адрес, часовой пояс, поддержка чистых ссылок, оповещения) и информацию об аккаунте администратора.
На следующей странице будет проведена установка языка.
На последней странице установки Drupal сообщит о её завершении и предложит войти в аккаунт. Нажмите ссылку войти в свой аккаунт.
Мы окажемся в аккаунте администратора. На странице будет находиться сообщение, которое выводится на первую страницу сайта в том случае, когда нет не одного документа выведенного на первую страницу. Теперь сделайте то, что обычно не делают: прочитайте эту страницу.
После установки удалять файл install.php нет необходимости, т.к. в install.php есть Verify existing settings.php и установка запуститься только в том случае, если файл settings.php содержит записи совпадающие с default.settings.php. Но если вас все-таки смущает наличие этого фала, вы конечно же можете удалить как install.php, так и все файлы с расширением txt: CHANGELOG.txt, COPYRIGHT.txt, INSTALL.txt, INSTALL.mysql.txt, INSTALL.pgsql.txt, LICENSE.txt, MAINTAINERS.txt, UPGRADE.txt.
Ход выполнения приложения
Рисунок 1 показывает, в какой последовательности происходит выполнение приложения:
Рисунок 1 - Ход выполнения приложения
Файл index.php выступает в роли фронт-контроллера, он инициализирует подключение остальных частей кода CodeIgniter.
Роутер анализирует HTTP запрос, чтобы определить, что надо сделать с этим адресом.
Если существует кеш этой страницы, то он напрямую выдается в браузер, минуя логику приложения.
Безопасность. Перед загрузкой контроллера приложения HTTP запрос и любая информация, отправленная пользователем, фильтруется на предмет безопасности.
Контроллер загружает модель, ядро библиотек, плагины, хелперы и прочие ресурсы, необходимые для выполнения этого запроса.
Далее подключается отображение, и данные отдаются в браузер пользователя. Если включено кеширование, то отображение записывается на диск, чтобы в следующий раз быть считанным с него.
URL в CodeIgniter
По умолчанию адреса в CodeIgniter являются дружественными для поисковых систем и понятны для человека. CodeIgniter использует подход, основанный на сегментах адреса:
www.your-site.com/news/article/my_article
URL состоит из сегментов, соответствуют архитектуре MVC и, как правило, строятся таким образом:
www.your-site.com/class/function/ID
В первом сегменте описывается контроллер class, к которому происходит обращение.
Во втором сегменте происходит ссылка на функцию function или метод, который необходимо вызвать.
В третьем и последующих сегментах описываются переменные, которые будут переданы в эту функцию.
Класс URI и URL хелпер содержат функции, которые упрощают работу с информацией в URI. Кроме того все адреса можно переопределять при помощи Роутинга, что помогает сделать приложение более гибким.
По умолчанию, index.php будет подключаться URL:
www.your-site.com/index.php/news/article/my_article
Чтобы удалить этот файл из запроса, необходимо сделать несколько записей в файле .htaccess. Вот пример файла, в котором будут перенаправлены все запросы, кроме указанных:
RewriteEngine on
RewriteCond $1 !^(index.php|images|robots.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]
В приведенном выше примере, любой запрос HTTP, помимо запросов к index.php, изображениям и robots.txt, трактуется как запрос к файлу index.php.
В файле config/config.php можно указать суффикс, который будет добавляться ко всем адресам, созданным CodeIgniter. Например, если URL такой:
www.your-site.com/index.php/products/view/shoes ,
то можно добавить произвольный суффикс, например .html, сделав все страницы похожими на:
www.your-site.com/index.php/products/view/shoes.html
Подключение строки запроса.
В некоторых случаях нужно использовать строки запроса в URL:
index.php?c=products&m=view&id=345
CodeIgniter опционально поддерживает эту возможность, которая может быть подключена в файле application/config.php. В конфигурационном файле есть следующие строки:
$config[enable_query_strings] = FALSE;
$config[controller_trigger] = c;
$config[function_trigger] = m;
Если изменить «enable_query_strings» в положение TRUE, то эта возможность активируется. Контроллеры и функции в них будут доступны при помощи определенных «триггерных» слов:
index.php?c=controller&m=method
Контроллеры
Контроллеры -- это сердце приложения. В контроллере определяется, как необходимо реагировать на тот или иной запрос.
Контроллер это простой файл с классом, названным так чтобы ассоциироваться с URI, по которому он будет вызван.
Рассмотрим URI:
www.your-site.com/index.php/blog/
В приведенном примере CodeIgniter попытается найти контроллер с именем blog.php и загрузить его.
Когда имя контроллера будет найдено в первом сегменте URL -- он будет загружен.
Для примера создадим простой контроллер, чтобы посмотреть его в действии. Используя текстовый редактор, создаем файл blog.php и вставляем в него следующий код:
<?php
class Blog extends Controller {
function index()
{
echo Hello World!;
}
}
?>
Затем сохраняем этот файл в директории application/controllers/.
Теперь заходим на сайт, используя примерно такой адрес:
www.your-site.com/index.php/blog/
В итоге на сайте должны увидеть Hello World!.
Отмечу особенность, что имена классов должны начинаться с прописных букв.
Правильный вариант:
<?php
class Blog extends Controller {
}
?>
Неправильный вариант:
<?php
class blog extends Controller {
}
?>
Во время работы необходимо убедится в том, что созданный контроллер наследует главный контроллер, чтобы внутри первого был доступен весь функционал второго.
Функции.
В приведенном выше примере функция называется index(). Функция с названием «index» всегда будет загружаться по умолчанию, если второй сегмент в URL не определен. Еще один способ просмотреть сообщение «Hello World» -- обратиться по этому адресу:
www.your-site.com/index.php/blog/index/
Второй сегмент адреса определяет, какая функция контроллера должна быть вызвана.
Для проверки добавим функцию в ранее созданный контроллер:
<?php
class Blog extends Controller {
function index()
{
echo Hello World!;
}
function comments()
{
echo Взгляни сюда!;
}
}
?>
Чтобы посмотреть на работу функции comment, загружаем следующий адрес:
www.your-site.com/index.php/blog/comments/ ,
где можно увидеть новое сообщение «Взгляни сюда!».
Передача сегментов URL функциям.
Если URI содержит более двух сегментов -- они будут переданы функции в качестве параметров.
Например, можно вызвать такой адрес:
www.your-site.com/index.php/products/shoes/sandals/123
Функция получит 3 и 4 сегменты в URL («sandals» and «123»):
<?php
class Products extends Controller {
function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
?>
Следует отметить, если вы используете URI Роутинг, то сегменты адреса, направленные в функцию, будут сегментами route-адреса.
Объявление контроллера по умолчанию.
Можно сказать CodeIgniter, какой контроллер необходимо загружать, если URI не объявлен. Это возникает при запрашивании корня сайта. Чтобы установить контроллер, выполняемый по умолчанию, в файл application/config/routes.php следует установить эту переменную:
$route[default_controller] = Blog;
Где Blog -- это имя контроллера, который нужно использовать. При загрузке основного index.php, появится приветственное сообщение «Hello world».
Переадресация вызова функции.
Как было отмечено выше, второй сегмент URI определяет, какая функция должна быть вызвана в этом классе. CodeIgniter позволяет переопределить это поведение при помощи функции _remap():
function _remap()
{
// Здесь любой код...
}
Если контроллер содержит функцию _remap(), то она всегда будет определять, какую функцию загружать независимо от того, что написано в URL запросе. Она перекрывает нормальное поведение контроллера, создавая свой локальный роутинг.
В _remap() передается название вызываемой функции, обычно это второй сегмент в URI:
function _remap($method)
{
if ($method == some_method)
{
$this->$method();
}
else
{
$this->default_method();
}
}
Результат обработки.
CodeIgniter имеет класс вывода, который принимает готовое отображение и отдает его браузеру пользователя. В некоторых случаях может понадобиться пост-обработка сформированного отображения, и выдача ее браузеру самостоятельно. CodeIgniter позволяет добавить в контроллер функцию _output(), которая будет принимать готовые к выдаче данные.
Если контроллер содержит функцию называющуюся _output(), то в нее всегда будут передаваться отрендеренные отображения, вместо того чтобы отдавать их напрямую в браузер. Первый параметр этой функции будет содержать окончательный вывод.
Например:
function _output($output)
{
echo $output;
}
Функция _output() будет получать данные в их окончательном состоянии. Бенчмарк и загрузка будут посчитаны, файл будет записан в кеш, все заголовки будут отправлены (при использовании Output Class), и только после этого будет выполнена функция _output(). Если на странице выводится информация о времени выполнения и нагрузке скриптом, то эта информация не будет точной, т.к. в ней учитывается только время исполнения до вызова _output().
Защищенные функции.
В некоторых случаях может понадобиться скрыть ту или иную функцию от публичного доступа. Чтобы сделать функцию приватной -- нужно добавить символ подчеркивания перед ее названием, и она не будет отображаться при запросе через URL. Например, если функция называется так:
function _utility()
{
// какой-то код
}
Попытки получить к ней доступ, набрав ее имя в запросе, окажутся неудачными:
www.your-site.com/index.php/blog/_utility/
Организация контроллеров в подпапках.
При разработке большого проекта может оказаться вполне удобным деление контроллеров по подпапкам. CodeIgniter позволяет это сделать.
Просто нужно создать внутри папки application/controllers каталог и разместить класс контроллера внутри него.
При использовании этой возможности в первом сегменте URL необходимо указать папку с этим контроллером. Например, контроллер расположен здесь:
application/controllers/products/shoes.php
URI для вызова этого контроллера будет выглядеть так:
www.your-site.com/index.php/products/shoes/123
Каждая из вложенных папок может содержать контроллер по умолчанию, который будет вызван, если URL не содержит название контроллера. Нужно просто назвать его именем по умолчанию, которое указано в файле application/config/routes.php.
Так же вы можете переадресовать контроллеры, используя URI Роутинг.
Конструкторы классов.
Если есть необходимость в каком-либо из контроллеров использовать конструктор, то необходимо разместить в нем следующую строчку:
parent::Controller();
Причина этого в том, что собственный конструктор будет перекрывать конструктор главного контроллера, поэтому необходимо вызвать его вручную.
Можно отметить, что в PHP 4 конструктор -- это просто функция, название которой совпадает с названием класса:
<?php
class Blog extends Controller {
function Blog()
{
parent::Controller();
}
}
?>
В PHP 5 конструктор использует следующий синтаксис:
<?php
class Blog extends Controller {
function __construct()
{
parent::Controller();
}
}
?>
Конструктор нужен, если надо установить некоторые переменные в значения по умолчанию до того, как будет вызвана функция класса. Конструктор не может возвращать значение, но он может проделывать некоторую работу, по инициализации класса.
Отображения
Отображение -- это простая веб-страница или ее фрагмент, например шапка, подвал, боковая панель или т.п. Одни отображения могут быть очень гибко встроены в другие отображения.
Отображения никогда не вызываются напрямую. Они должны быть загружены из контроллеров. В модели MVC контроллер управляет всем происходящим, именно в нем должно быть определено какое отображение загружать.
Для ранее описанного контроллера создадим отображение.
Создание отображения.
Используя текстовый редактор, создадим файл с названием blogview.php и вставим в него следующие строки:
<html>
<head>
<title>Мой блог</title>
</head>
<body>
<h1>Добро пожаловать в мой блог!</h1>
</body>
</html>
Затем сохраним этот файл в директории application/views/.
Загрузка отображения.
Чтобы загрузить необходимое отображение, используем эту функцию:
$this->load->view(name);
Где name это имя файла с отображением. Следует отметить, что расширение .php не надо указывать.
Теперь откроем контроллер, ранее названный blog.php и заменим в нем функцию echo на функцию загрузки отображения:
<?php
class Blog extends Controller {
function index()
{
$this->load->view(blogview);
}
}
?>
Если зайти на сайт, используя URL определенный ранее, то можно увидеть новое отображение. URL должен быть таким:
www.your-site.com/index.php/blog/
Загрузка нескольких отображений.
CodeIgniter правильно обработает несколько вызовов $this->load->view из одного контроллера. Если произойдет более одного вызова, то будут загружены все отображения. Например, можно хранить отдельно отображение шапки, отображение меню, контента и подвала. Это может выглядеть примерно так:
<?php
class Page extends Controller {
function index()
{
$data[page_title] = Your title;
$this->load->view(header);
$this->load->view(menu);
$this->load->view(content, $data);
$this->load->view(footer);
}
}
?>
В приведенном выше примере используется «динамическое добавление данных».
Хранение отображений в подпапках.
Отображения могут быть сохранены в подпапках, таким образом можно структурировать данные. При таком подходе необходимо будет включать имя папки в путь загрузки отображения. Например:
$this->load->view(имя_папки/имя_файла);
Добавление динамических данных в отображение.
Данные передаются в отображение из контроллера при помощи массива или объекта вторым параметром функции загрузки отображения. Вот пример с использованием массива:
$data = array(
title => My Title,
heading => My Heading,
message => My Message
);
$this->load->view(blogview, $data);
А сейчас пример с использованием объекта:
$data = new Someclass();
$this->load->view(blogview, $data);
При использовании объекта его переменные будут превращены в массив.
Посмотрим на примере, как работает отображение. Откроем ранее рассмотренный контроллер и добавим следующий код:
<?php
class Blog extends Controller {
function index()
{
$data[title] = "My Real Title";
$data[heading] = "My Real Heading";
$this->load->view(blogview, $data);
}
}
?>
Теперь откроем файл с отображением и сменим находящийся там текст на переменные, названия которых соответствуют ключам массива:
<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
<h1><?php echo $heading;?></h1>
</body>
</html>
Затем загрузим страницу по ранее определенному URL и увидим, что все переменные заменены текстом.
Создание циклов.
Данные массива, который передается в отображение, не ограничиваются простыми переменными. Можно передавать многомерные массивы с множеством строк. Например, если выбирать данные из базы данных, то они, как правило, будут представлены многомерным массивом.
Например. Добавим эти строки в контроллер:
<?php
class Blog extends Controller {
function index()
{
$data[todo_list] = array(Clean House, Call Mom, Run Errands);
$data[title] = "My Real Title";
$data[heading] = "My Real Heading";
$this->load->view(blogview, $data);
}
}
?>
Теперь откроем файл с отображением и создадим цикл:
<html>
<head>
<title><?php echo $title;?></title>
</head>
<body>
<h1><?php echo $heading;?></h1>
<h3>My Todo List</h3>
<ul>
<?php foreach($todo_list as $item):?>
<li><?php echo $item;?></li>
<?php endforeach;?>
</ul>
</body>
</html>
В приведенном выше примере используется альтернативный синтаксис PHP.
Модели
Модели используются опционально, если применять более традиционный подход к MVC.
Модели -- это PHP классы, создаваемые для работы с информацией из базы данных. Например, предположим, что используем CodeIgniter для ведения блога. В этом случае необходим класс модели с функциями для вставки, обновления и удаления записей, а так же поиска по блогу. Вот пример класса модели, который выполняет некоторые из этих действий:
class Blogmodel extends Model {
var $title = ;
var $content = ;
var $date = ;
function Blogmodel()
{
// Call the Model constructor
parent::Model();
}
function get_last_ten_entries()
{
$query = $this->db->get(entries, 10);
return $query->result();
}
function insert_entry()
{
$this->title = $_POST[title];
$this->content = $_POST[content];
$this->date = time();
$this->db->insert(entries, $this);
}
function update_entry()
{
$this->title = $_POST[title];
$this->content = $_POST[content];
$this->date = time();
$this->db->update(entries, $this, array(id => $_POST[id]));
}
}
Функции, в приведенном выше примере, используют функции работы с базой данных Active Record.
Устройство модели.
Классы моделей хранятся в папке application/models/. Они могут располагаться в подпапках, если необходима такая организация.
Вот основной прототип класса модели:
class Model_name extends Model {
function Model_name()
{
parent::Model();
}
}
Где Model_name это имя класса. Имена классов должны начинаться с заглавной буквы, в то время как остальные буквы должны быть в нижнем регистре. Следует убедиться, что класс расширяет базовый класс модели.
Имя файла должно соответствовать имени модели, но быть целиком в нижнем регистре. Например, вот класс:
class User_model extends Model {
function User_model()
{
parent::Model();
}
Имя файла должно быть таким:
application/models/user_model.php
Загрузка модели.
Модели обычно загружаются и вызываются из контроллера. Для загрузки моделей необходимо использовать следующую функцию:
$this->load->model(Model_name);
Если модель находится в под-папке, то надо указать относительный путь до нее. Например, если модель располагается по адресу application/models/blog/queries.php, то для ее загрузки используем:
$this->load->model(blog/queries);
После загрузки можно получить доступ к модели, используя объект с именем, аналогичным названию модели:
$this->load->model(Model_name);
$this->Model_name->function();
Если нужно обратиться к модели используя не ее, а другое имя, то надо передать временное название в функцию загрузки вторым параметром:
$this->load->model(Model_name, fubar);
$this->fubar->function();
Вот пример контроллера, который загружает модель, а потом отображение:
class Blog_controller extends Controller {
function blog()
{
$this->load->model(Blog);
$data[query] = $this->Blog->get_last_ten_entries();
$this->load->view(blog, $data);
}
}
Авто-загрузка моделей.
Если некоторая модель нужна на глобальном уровне, то можно сообщить CodeIgniter, что эту модель необходимо загружать при инициализации системы. Это можно сделать, открыв файл application/config/autoload.php и добавив модель в массив автозагрузки.
Соединение с базой данных.
При загрузке модели автоматического подключения к базе не происходит. Доступны следующие варианты подключения к базе данных:
- Можно соединиться, используя стандартные методы базы данных, описанные здесь или из классов контроллера или модели.
- Можно передать в функцию загрузки модели третий параметр TRUE (boolean), который сообщит модели о том, что надо сразу подключиться. При этом будут использованы настройки соединения по умолчанию, которые определены в файле с настройками базы данных:
$this->load->model(Model_name, , TRUE);
- Через третий параметр так же можно передать настройки подключения, заданные вручную:
$config[hostname] = "localhost";
$config[username] = "myusername";
$config[password] = "mypassword";
$config[database] = "mydatabase";
$config[dbdriver] = "mysql";
$config[dbprefix] = "";
$config[pconnect] = FALSE;
$config[db_debug] = TRUE;
$this->load->model(Model_name, , $config);
Создание библиотек
Когда мы используем термин «библиотеки», то, как правило, ссылаемся на классы, которые лежат в папке libraries. Однако я хочу рассказать о том, как создавать собственные классы в каталоге application/libraries, чтобы сохранить разделение между локальными ресурсами и глобальными ресурсами фреймворка.
CodeIgniter позволяет расширять родные классы фреймворка, если просто необходимо добавить какую-то функциональность. Или можно полностью заменить родную библиотеку, просто разместив новую с идентичным названием в папке application/libraries.
Класс Database не может быть расширен или заменен, а так же для PHP 4 нельзя заменять класс Loader. Все прочие классы можно свободно расширять/заменять.
Хранение.
Созданные библиотеки классов должны быть расположены в директории application/libraries, CodeIgniter будет искать их там во время инициализации.
Правила именования:
- Имена файлов с большой буквы. Например: Myclass.php
- Имя класса с большой буквы. Например: class Myclass
- Имя файла и имя класса должны совпадать.
Файл класса.
Классы должны следовать этому прототипу:
<?php if (!defined(BASEPATH)) exit(Нет доступа к скрипту);
class Someclass {
function some_function()
{
}
}
?>
Использование созданных пользователем классов.
Из любой функции контроллера можно инициализировать библиотеку следующей стандартной функцией:
$this->load->library(someclass);
Где someclass - это имя файла без расширения «.php». Можно указать имя файла в любом регистре.
После загрузки класса, следует обращаться к нему, используя нижний регистр:
$this->someclass->some_function(); // Имя объекта всегда в нижнем регистре
Передача параметров при инициализации класса.
В функцию загрузки класса можно передать второй параметр, он будет передан в класс:
$params = array(type => large, color => red);
$this->load->library(Someclass, $params);
Если используется эта возможность, то необходимо настроить в конструкторе класса ожидание переменных:
<?php if (!defined(BASEPATH)) exit(Нет доступа к скрипту);
class Someclass {
function Someclass($params)
{
// Какие-то операции с $params
}
}
?>
Можно также передавать параметры, хранящиеся в конфигурационном файле. Необходимо создать файл с именем, аналогичным имени файла с классом и сохранить в папке application/config/. Если параметры передаются динамически, то конфигурационный файл будет недоступен.
Использование ресурсов CodeIgniter в библиотеке
Для доступа к родным ресурсам CodeIgniter в библиотеке используется функция get_instance(). Эта функция вернет супер-объект CodeIgniter.
При помощи этого можно обращаться к любой родной функции при помощи конструкции $this:
$this->load->helper(url);
$this->load->library(session);
$this->config->item(base_url);
и т.п.
$this, однако, работает только в контроллере, модели или отображении. Если нужно использовать родные классы CI внутри собственных, то можно сделать это следующим образом:
- Во первых присвоить указатель на родной объект переменной:
$CI =& get_instance();
- После того как присвоили объект переменной -- нужно использовать эту переменную вместо $this:
$CI =& get_instance();
$CI->load->helper(url);
$CI->load->library(session);
$CI->config->item(base_url);
и т.п.
Функция get_instance() передается по ссылке:
$CI =& get_instance();
Что важно, т.к. указатель позволяет использовать оригинальный объект CodeIgniter, а не создавать его копию.
Кроме того, при работе с PHP 4 лучше избегать вызова get_instance() внутри конструктора класса. PHP 4 имеет проблемы с созданием ссылок на супер-объект CI в контроллере, т.к. объекты не существуют до тех пор, пока класс полностью не обработан.
Замена родных библиотек версиями. Достаточно назвать собственный класс таким же именем, как и родной, и CI загрузит его, вместо родного. Например, чтобы заменить родной класс Email, можно создать файл application/libraries/Email.php и создать класс внутри него:
class CI_Email {
}
Отммечу, что большинство родных классов имеют префикс CI_.
Для загрузки библиотеки используем родную функцию загрузки:
$this->load->library(email);
На данный момент класс Database не может быть заменен.
Расширение родных библиотек. Если надо расширить функциональность библиотеки, возможно добавить одну-две функции, то стоит не переопределять всю библиотеку, а просто расширить ее функциональность. Расширение класса практически идентично его замене за парой исключений: - Объявление класса должно расширять родительский класс.- Новое имя класса должно начинаться с префикса MY_ (это можно настроить).Например, чтобы расширить родной класс Email, нужно создать файл application/libraries/MY_Email.php и объявить внутри класс:
class MY_Email extends CI_Email {
}
Если в классе необходимо использовать конструктор, то нужно вызвать в нем родительский конструктор:
class MY_Email extends CI_Email {
function My_Email()
{
parent::CI_Email();
}
}
Загрузка подкласса.
Для загрузки собственного подкласса, как правило, используется стандартный синтаксис. Не надо указывать здесь префикс. Так, например, для класса Email, который расширяет стандартный одноименный класс, небходимо использовать:
$this->load->library(email);
После загрузки класса, пользователь будет использовать переменные класса, как при обычном его расширении. В случае с описанным примером все вызовы будут иметь следующий синтаксис:
$this->email->some_function();
Установка собственного префикса.
Для установки собственного подклассового префикса откроем файл application/config/config.php и напишем там следующее:
$config[subclass_prefix] = MY_;
Стандартным для CodeIgniter является префикс CI_. В данном случае нельзя использовать его.
Создание классов ядра
При каждом запуске CodeIgniter запускается несколько его базовых классов, которые инициализируются автоматически при загрузке системы. Это части ядра фреймворка. Хотя можно заменить любой из системных классов или просто расширить их.
У большинства пользователей никогда не возникнет необходимость менять классы ядра, но сама возможность сделать это делает CodeIgniter очень гибким фреймворком.
Перечень системных классов.
Вот перечень основных системных файлов, которые вызываются при инициализации CodeIgniter:
Benchmark
Config
Controller
Exceptions
Hooks
Input
Language
Loader
Log
Output
Router
URI
Замена классов ядра.
Для использования созданных скриптов вместо скриптов по умолчанию нужно разместить их в папке application/libraries:
application/libraries/some-class.php
Если такой папки нет, то нужно ее создать.
Любое имя файла, идентичное одному из перечисленных выше, будет использоваться вместо настоящего файла из поставки CodeIgnier.
Созданный класс должен использовать CI в качестве префикса. Например, если файл назван Input.php, то класс должен объявляться так:
class CI_Input {
}
Расширение классов ядра.
Расширение класса практически идентично его замене за парой исключений:
- Объявление класса должно расширять родительский класс.
- Новое имя класса должно начинаться с префикса MY_ .
Например, чтобы расширить родной класс Input, вы должны создать файл application/libraries/MY_Input.php и объявить внутри класс:
class MY_Input extends CI_Input {
}
Если в классе необходим конструктор -- нужно в нем вызвать конструктор родителя:
class MY_Input extends CI_Input {
function My_Input()
{
parent::CI_Input();
}
}
Любая функция в классе, название которой аналогично функции в родительском классе будет использоваться вместо родной (это называется «метод переопределения»). Это позволяет существенно менять ядро CodeIgniterа.
Установка собственного префикса.
Для установки собственного префикса откройте файл application/config/config.php и найдите там:
$config[subclass_prefix] = MY_;
2 Практическая часть
Согласно цели дипломной проект был создан сайт, содержащий информацию о ресторанах, кафе и барах города Челябинска. Данная информация заноситься администратором сайта и храниться в базе данных MySQL.
- 1 ОРГАНИЗАЦИОННО-ТЕХНОЛОГИЧЕСКАЯ ЧАСТЬ
- 1.1 Web-страница
- 1.2 Web-технологии
- 1.2.1 HTML - язык разметки документов
- 1.2.2 CSS - язык описания внешнего вида документа
- 1.2.3 Apache - HTTP-сервер
- 1.2.4 РНР - серверный язык программирования
- 1.2.5 MySQL - система управления базами данных
- 2.1 Структура сайта
- 2.1.1 Административная часть
- · Страницы со списком заведений конкретной категории
- 2.1.3 Страницы со списком заведений конкретной категории
- 2.1.4 Страницы с информацией по конкретному заведению
- 2.2.1 Модель заведений - Firm
- Классификация предприятий общественного питания. Рестораны, кафе, бары, предприятия быстрого обслуживания, комбинаты специализированного питания.
- Глава 1. Общая характеристика Кафе-Бар «Восточный Дворик»
- Общение в кафе, ресторане
- 3. Рестораны и бары
- Каким должно быть освещение ресторанов, кафе, баров
- Как можно улучшить интерьер ресторанов, кафе, баров
- Цветовое решение интерьера ресторанов, кафе, баров
- Музыкальное оформление ресторанов, кафе, баров
- Кафе, бары и рестораны