![]() |
Начальный практикум в Code Igniter
Автор: Kuzya
Заранее извиняюсь перед модераторами если я перепутал форум для публикации статьи. Я долго выбирал между форумом "Статьи" и "PHP, PERL...." и выбрал последний. Переместите пожалуйста тему если я ошибся файлы приложенные к статье: http://kuzya59.narod.ru/gb_sql.zip http://kuzya59.narod.ru/gb_files.zip http://kuzya59.narod.ru/gallery.zip Официальный сайт: http://codeigniter.com/ Сайт русскоязычной поддержки: http://code-igniter.ru/ Версия на время написания статьи: 1.7 (но документация использовалась для версии 1.6.3) Введение Для хорошего понимания этой статьи Вам желательно ознакомиться с документацией к данному фреймворку. Не обязательно со всей полностью, хотя бы с «Общими темами». Также вам нужно знать архитектуру MVC (Модель-Вид-контроллер) и что именно делает каждая из этих трёх частей. Я бы мог описать базовые этапы работы с CI, но мне кажется, что авторы документации и переводчики её русской версии отлично это сделали. Документация к рассматриваемому фреймворку действительно очень проста и понятна. Плюс ко всему – сам CI спроектирован с максимальным удобством для его будущего изучения, поэтому если у Вас будут возникать какие-либо вопросы по ходу прочтения статьи, то не ленитесь и обращайтесь к документации. Всё, что я здесь буду описывать в ней есть. Также я постарался подробно комментировать весь описываемый код и объяснять каждое действие, относящееся к приложению, дабы у читателя не возникло лишних вопросов. Ниже мы рассмотрим создание простейших приложений с помощью базовых возможностей CI. Приложений этих будет два — гостевая книга и фотогаллерея. В процессе их написания я постарался задействовать как можно больше классов, хэлперов и прочего инструментария CI для того чтобы Вы могли на практике увидеть как они используются и какую пользу могут принести. И ещё кое-что прежде чем приступить непосредственно к программированию. Установите CI на отдельный домен. Писать каждое новое приложение мы будем на «чистом» домене, который не содержит посторонних скриптов. У меня этот хост называется «ci», далее по тексту я буду использовать именно это имя, поэтому будьте внимательны, если Вы назовёте хост по-другому. Фреймворк мы тоже всегда будем использовать «чистый». Для каждого нового приложения мы будет устанавливать CI заново. Нужно это для того чтобы не возникло путаницы между контроллерами, моделями и прочими скриптами разных приложений. В корень хоста положите файл «.htaccess» со следующим текстом: Код:
RewriteEngine on1. Гостевая книга Сейчас мы напишем гостевую книгу, обладающую минимальным функционалом. Она будет показывать отзывы, делить их на страницы и позволять посетителю оставлять сообщения. При написании этих трёх действий мы постараемся задействовать как можно больше инструментов встроенных в CI, чтобы рассмотреть их на практике. Начнём с дизайна. Шаблон гостевой книги Вы можете взять в файле «template.zip» приложенному к статье. Если Вы хотите посмотреть шаблон отдельно от приложения, то поместите его на какой-либо хост, потому что при открытии шаблона браузером локально не отобразятся изображения и не загрузятся стили, поскольку путь к ним начинается с «/». Скопируйте папку «images» и файл стилей в корень хоста с CI. Теперь откройте Вашим редактором файл index.html, содержащий код шаблона. Ниже я буду приводить куски html-кода для того, чтобы не возникло путаницы, и Вы случайно не вынесли в шаблоны ненужный код. Верхнюю часть, до тега «</head>», нужно вынести в файл header.php и сохранить в папке видов «application/views/» (информация по видам: http://code-igniter.ru/user_guide/general/views.html). Вот она: Код:
<HTML>Код:
<table width="100%" border="0" cellspacing="0" cellpadding="0">Код:
<br /><br />С отображениями разобрались, начнём разработку кода приложения. Создадим основной контроллер (информация по контроллерам: http://code-igniter.ru/user_guide/general/controllers.html) «Guestbook». В нём объявим всего один метод - «index». Этот метод используется контроллерами по умолчанию. То есть если при обращении к приложению в URI не указан вызываемый метод то будет вызван именно «index». В конце всей разработки он будет выводить список имеющихся отзывов, но сейчас введём лишь отображение дизайна. По очереди загрузим шаблоны «header», «answers_list»,«answer_form» и «footer». PHP код:
http://kuzya59.narod.ru/ci_1.gif Теперь нам нужно сделать этот контроллер загружаемым по умолчанию для того чтобы не приходилось постоянно его явно указывать в URI. Для этого откройте файл «application/config/routes.php» и пропишите имя контроллера в ячейке «default_controller»: PHP код:
Сейчас нам нужно поработать с базой данных. Создайте отдельную БД для нашей гостевой книги (я назвал её аналогично хосту - «ci»). В этой базе выполните нижеприведённый SQL-код (он создаст таблицу «guestbook»): Код:
CREATE TABLE `guestbook` (Код:
INSERT INTO `guestbook` VALUES (NULL, 'Anna', '1@1.ru', '1230443834', 'This is my first answer!');PHP код:
PHP код:
Для работы с MySQL у нас всё готово. С этой целью в CI можно использовать класс «Database» предназначенный специально для работы с базами данных (информация по нему: http://code-igniter.ru/user_guide/database/index.html). Сейчас мы создадим модель (информация по моделям: http://code-igniter.ru/user_guide/general/models.html) для обращения к БД. Вообще, нам нужны лишь 3 функции — функция, которая бы брала сообщения из базы (для их показа на главной странице), функция получения общего количества отзывов (понадобится при разбиении на страницы), ну и функция добавления записи в таблицу. Пока мы опишем одну функцию — получения всех сообщений из базы. Для этого создадим пустую модель Querys и сохраним её в папке моделей «application/models/»под именем Querys.php. PHP код:
PHP код:
PHP код:
Для проверки работоспособности модели впишите в метод «index» контроллера дамп результатов работы метода «getLastAnswers()»: PHP код:
Массив с отзывами мы должны передать только соответствующему шаблону («answers_list»). Для этого в метод «index» перед обработкой шаблонов добавим объявление массива «answers» с полученными ответами: PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
Код:
<p> </p>Код:
<? foreach($answers as $answer): ?>Да, с виду, конечно, выглядит не очень, но при тщательном рассмотрении Вы увидите что всё легко и понятно, особенно если у Вас редактор с подсветкой кода. Для проверки работоспособности нашего шаблона и метода обратитесь к главной странице. На ней Вы должны увидеть отзыв из базы данных за место того, который был в шаблоне с самого начала. Теперь приступим к написанию метода, добавляющего сообщения от пользователей. Если Вы обращали внимание на код формы отзыва, то наверное заметили что имя этого метода - «make_answer». В нём мы организуем все нужные данные и передадим методу «addAnswer» находящемуся в нашей модели, и его работа будет заключаться во вставке переданной ему информации в таблицу. Для получения внешних данных в CI имеется библиотека input (информация по ней: http://code-igniter.ru/user_guide/libraries/input.html). Для получения значений всех нужных полей мы будем использовать метод «post» этой библиотеки. Методу добавления записи мы будем передавать три параметра — имя автора, его e-mail, текст отзыва. PHP код:
PHP код:
PHP код:
Ну и добавим в конец кода «make_answer» - вызов метода «index», чтобы сразу после добавления информации вывелся весь список отзывов, включая последний. |
PHP код:
Теперь стоит «подшлифуем» предыдущую функцию. Сделаем проверку вводимых данных, семантическую обработку текста отзыва и добавим смайлики. Для проверки правильности вводимых пользователем данных мы будем использовать класс валидации (информация по нему: http://code-igniter.ru/user_guide/libraries/validation.html). Для проверки мы будем использовать следующий правила. Для поля «author» - проверку на пустоту и максимальное ограничение в 50 символов. Для поля «email» - проверку на пустоту, ограничение в 50 символов и проверку на правильность введённого адреса. Текст отзыва проверим только на пустоту. Также в правилах для каждого поля укажем обработку их «trim»-функцией. Задаются правила следующим образом. Создаётся массив полей. В каждой ячейке этого массива указываются правила для конкретного поля. Если правил несколько то они перечисляются через знак «|». Вот как это будет выглядеть у нас: PHP код:
trim — указывает что нужно обработать содержимое поля этой функцией (так же можно использовать такие функции как md5, htmlspecialchars, strtolower и т.д.) required — полу обязательно должно быть заполнено. max_length[50] — максимальная длинна строки в этом поле — 50 символов. valid_email — данные должны представлять из себя правильный e-mail адрес. Полный список правил и функций-обработчиков Вы можете найти в документации к классу «Validation». Вы наверное заметили что мы не проверяем имя автора на наличие только алфавитных или алфавитно-цифровых символов. Сделано это потому что CI не может работать с русскоязычными символами — он их воспринимает как неалфавитные. Установка правил производится методом «set_rules», ему нужно передать массив наших правил в качестве одиночного. Запуск проверки производится вызовом метода «run». Если этот метод вернёт «true», то все данные совпадают с установленными нами правилами. От этого и будем отталкиваться. Мы проведём валидацию данных и по её результатам будем выполнять добавление запроса. Код метода «make_answer» в итоге должен стать таким: PHP код:
Код:
<center>Воспользуемся ещё одной возможностью библиотеки «validation». Если информация из полей не прошла проверку, то при новом отображении формы имеется возможность ввести в её поля то, что вводил до этого пользователь. То есть, если в форме 7 полей, а ошибка лишь в одном, то пользователю не нужно будет заново всё заполнять, а лишь изменить то поле, в котором он допустил ошибку. Это встречается сейчас почти на каждом сайте. В классе валидации для этого используется метод «set_fileds», которому необходимо передать набор полей в виде массива. PHP код:
Код:
<input type='text' name='author' value=''/>Код:
<?if(isset($this->validation->author)):?>Код:
<input type='text' name='email' value=''/>Код:
<?if(isset($this->validation->email)):?>Код:
<textarea name='text' cols='20' rows='5'></textarea>Код:
<?if(isset($this->validation->text)):?>Код:
<input type='text' name='email' value='<?=$this->validation->email?>'/>Теперь займёмся семантической обработкой поступившего от пользователя текста. Под семантической обработкой подразумевается замена специальных символов (или их комбинаций) на их html-эквиваленты. Например перенос строки «\r\n» заменяется на «<br />», двойной перенос на «<p></p>» и так далее. Для подобных задач в CI имеется хэлпер «Typography» (информация по нему: http://code-igniter.ru/user_guide/helpers/typography_helper.html). Его функция «auto_typography» форматирует передаваемый ей текст для привидения его к семантически правильному виду. Добавим вызов этого хэлпера перед получением значений введённых полей, а сразу после определения переменной «text» вызовем нужную нам функцию: PHP код:
PHP код:
PHP код:
Наконец подключим список смайлов к форме ввода комментария для того чтобы пользователь смог кликом мышки добавить нужный ему смайл. Здесь всё проходит в 2 этапа. На первом эапе в заголовок страницы нужно добавить вызов функции «js_insert_smiley». Ей нужно передать 2 параметра — имя формы (у нас это «answer_form») и имя поля (у нас - «text») куда смайлики будут вставляться. Вызовем её в шаблоне «header» прямо перед закрывающим тегом «head»: Код:
<?=js_insert_smiley('answer_form', 'text');?>Код:
<script type="text/javascript">PHP код:
PHP код:
PHP код:
PHP код:
Код:
<tr>http://kuzya59.narod.ru/ci_2.gif При клике на них в текстовое поле сообщения должны добавляться их текстовые эквиваленты. Попробуйте оставить отзыв со смайликом. Теперь приступим к разбиению отзывов на страницы, а именно — по десять штук на страницу. Для того, чтобы наше разбиение можно было увидеть, оставьте на сайте 11 или более сообщений. Для решения этой задачи воспользуемся библиотекой «Pagination» (информация по ней: http://code-igniter.ru/user_guide/libraries/pagination.html). Итак, чтобы сделать то, что нам нужно, требуется загрузить эту библиотеку, определить минимум три параметра — базовый URI, количество объектов на странице, общее количество объектов в базе, ну и под конец вызвать метод «initialize», которому следует все эти данные передать. После этого код страниц будет возвращаться методом «create_links». Его мы передадим вместе с массивом отзывов шаблону «answers_list» и запишем туда код отображения списка страниц (к слову о 11 отзывах - если страниц будет меньше чем 2, то метод «create_links» не вернёт ничего). Обратите внимание на то, что нам нужно будет передать общее количество данных в базе. Для этого мы сейчас добавим соответствующий метод в нашу модель. Он будет просто возвращать количество записей в таблице. PHP код:
PHP код:
Теперь нам нужно инициализировать страницы: PHP код:
PHP код:
PHP код:
Код:
<center><?=$pages_code;?></center>http://ci/guestbook/index/10 http://ci/guestbook/index/20 http://ci/guestbook/index/30 То есть каждая страница указывается в виде номера, с записи которого надо начать вывод. В соответствии с этим, мы модифицируем наши методы «index» в контроллере и метод «getLastAnswers» в модели. Будем передавать им число полученное из ссылки и с помощью «LIMIT» выводить ограниченное количество записей. Для того, чтобы метод «index» принимал данные из ссылки, укажем, что ему должен передаваться один параметр - «start_limit» (Как осуществляется передача данных в функции из ссылок Вы можете прочитать в разделе «URI в Code Igniter»: http://code-igniter.ru/user_guide/general/urls.html). PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
Если у Вас возникли какие-то трудности, то готовый код приложения Вы можете взять в файле «gb_sql.zip» который приложен к статье. |
2. Перевод модели с базы данных на файлы
Отделение модели от контроллера в архитектуре MVC предоставляет разработчикам множество преимуществ. Одно из них — свободное изменение источника данных. То есть если приложение работает с БД, то чтобы перевести его на работу, например, с XML-базой нужно лишь изменить код модели. Главное чтобы её методы возвращали то что раньше, а как они реализованы внутри — приложению не важно. Сейчас мы рассмотрим перевод приложения с одного источника данных на другой на практике, а точнее — на нашей гостевой книге. Мы переведём её с использования MySQL на текстовые файлы. Храниться они у нас будут в папке «data» в корне хоста. Каждая запись будет находятся в отдельном файле. Каждый файл за место имени будет иметь номер записи, то есть это будут файлы без расширения с именами типа 1,2,3 и т.д. Внутри у них будут содержаться те же данные (автор, e-mail, дата публикации и текст), но в виде сериализованного массива. Приступим непосредственно к программированию. При работе с данными нам понадобятся 2 хэлпера - «Directory»(http://code-igniter.ru/user_guide/helpers/directory_helper.html) и «File»(http://code-igniter.ru/user_guide/helpers/file_helper.html). Их подключение мы организуем в конструкторе нашей модели: PHP код:
PHP код:
Перейдём к функции «getAnswersCount». В ней мы просто будем получать количество файлов в директории. Это будет выполнять функция «directory_files_count», которую мы добавим в хелпер «Directory». Создайте файл «MY_Directory_helper.php» в папке «application/helpers/» и поместите в нём следующий текст: PHP код:
PHP код:
PHP код:
|
3. Фотогаллерея.
Следующая часть статьи будет посвящена написанию фотогаллереи. Функционал у неё будет тоже не очень большой, но по количеству рассмотренных инструментов, вместительный. В нашей фотогаллерее будет следующее. Пользовательская часть будет позволять просматривать списки фотоальбомов и их содержимое. Так же нами будет написана имитация рейтинговых оценок альбомов. В админ-части у нас будет авторизация, возможность добавления/удаления фотоальбомов. Возможность их редактирования, включающая в себя добавление в альбом фотографии как по одиночке так и пакетно (архивами). Так же будет возможность архивного бэкапа всех фотографий. В отличие от предыдущего примера мы будем использовать для обработки видов шаблонизатор (Templater parser — http://code-igniter.ru/user_guide/libraries/parser.html). Нужно сказать что его функционал очень скуден (по сравнению с использованием альтернативного синтаксиса PHP в отображениях) и рассмотреть его я решил только потому что это часть инструментария CI. Хотя здесь жаловаться не на что, разработчики в документации чётко написали - «Класс Template Parser не полнофункциональный шаблонизатор. Мы специально оставили его очень простым, чтобы сохранить максимум производительности.». Для обращений же к базе данных мы теперь будем использовать не прямые запросы и метод «query», а паттерн «Active Record» (http://code-igniter.ru/user_guide/database/active_record.html). Он очень прост и удобен в работе, а так же позволяет максимально сэкономить и время разработчика и количество кода. В добавок ко всему интерфейс AR интуитивно понятный и разобраться в чужом коде (работающем с AR) можно даже без документации. Так же, как я писал выше, мы поработаем с ZIP-архивами (создание/распаковка). Пока что в арсенале CI нет функций для извлечения ZIP-архивов, поэтому мы немного дополним его библиотекой PclZip, но всему своё время. Возьмёмся за начальные приготовления. Как я уже писал в начале статьи — для нового приложения мы будем использовать «чистую» копию CI. В корне приложения создайте папку «photos» - в ней будут храниться фотографии из наших альбомов. Шаблон для этого примера у нас останется тот же. Оставьте в корне сайта файл стилей и директорию «images». В папку видов скопируйте прошлые шаблоны «header» и «footer», только удалите вызов функции добавления смайлов в шаблоне «header». Так же оставьте в этой папке файл «.htaccеss» который мы рассматривали в самом начале статьи. В уже созданной в первом примере базе данных выполните следующий код. Код:
CREATE TABLE `albums` (Код:
CREATE TABLE `photos` (Перейдём к созданию администраторской панели. Все её контроллеры будут содержаться в директории «admin», находящейся в папке контроллеров. Никаких трудностей при доступе к ним это не создаст, нужно будет только в URI перед именем контроллера указывать имя этой директории. Подробнее о размещении контроллеров в поддиректориях Вы можете почитать в соответствующем разделе документации (http://code-igniter.ru/user_guide/general/controllers.html), под-раздел «Организация ваших контроллеров в подпапках». Первый контроллер который мы создадим - «Albums». Из названия видно что он будет отвечать за работу с альбомами. Установите его в файле «application/config/routes.php» контроллером по умолчанию как в предыдущем примере. И для пользовательской и для администраторской части главные контроллеры будут называться «Albums». Пусть он пока побудет пустой. Его метод «index» в будущем должен отображать список имеющихся у нас фотоальбомов. Что бы этот список получить нам нужно создать модель. Назовём её «Albums_model» и напишем в ней функцию «getAlbumsArray». Она просто будет выбирать все записи из таблицы «albums» и возвращать результат в виде массива. Для выборки данных в «Active Record» есть метод «get» который получает всё (если не указаны конкретные поля) из указанной таблицы. PHP код:
PHP код:
Код:
<BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0>PHP код:
c PHP код:
PHP код:
Добавим к списку альбомов форму добавления нового, вот её код. Код:
<br /><br />PHP код:
PHP код:
Далее нам нужно заняться функцией добавления фотоальбомов. К ней будет отправлять данные наша форма. Метод который нам нужен называется album_add. В нём у нас будут формироваться данные нового альбома и передаваться в модель, методу который будет эти данные вставлять. На этапе контроллера нам нужно сформировать следующие данные — имя альбома, его транслитерационное имя для ЧПУ и описание. Первое и третье свойства можно свободно получить, а вот для того что бы получить имя альбома в транслите мы напишем отдельную функцию которую сделаем расширением хэлпера «String». В папке «application/helpers» создайте файл «MY_string_helper.php» и впишите в него одну функцию - «translit». Вот её код: PHP код:
Добавлением данных в базу будет заниматься метод «addAlbumQuery» модели. Ему мы передадим все 3 параметра которые формируются в контроллере. Для вставки мы используем метод «insert» которому требуется передать первым параметром имя таблицы, а вторым массив полей вставляемой записи и их значений. PHP код:
PHP код:
PHP код:
PHP код:
http://ci/admin/albums/album_edit/1/ http://ci/admin/albums/album_edit/2/ http://ci/admin/albums/album_edit/3/ Теперь нам осталось лишь создать вид формы редактирования. Код:
<table width="100%" border="0" cellspacing="0" cellpadding="0">Он будет просто производить подсчёт записей в таблице с помощью функции «COUNT» в SQL-запросе. PHP код:
PHP код:
Код:
<tr> |
Для сохранения данных из формы мы создадим метод «album_save» в контроллере и «saveAlbumQuery» в модели. Ничего сложного в них не будет. Первый получит 2 поля от пользователя и передаст второму, который в свою очередь вставит эти данные в БД.
PHP код:
PHP код:
Теперь стоит добавить в шаблон форму загрузки файлов с двумя полями- для единичных фотографий и для архивов с ними. Не закрывая таблицу вставьте туда ещё одну форму. Код:
<form action='/admin/photos/photo_add/{id}/' method='POST' enctype='multipart/form-data'>PHP код:
PHP код:
PHP код:
PHP код:
Непосредственно загрузка осуществляется методом «do_upload» которому нужно передать имя поля для выбора файла. У нас их 2 — «photo» и «archive», но пока мы будем работать лишь с первым. Если загрузка пройдёт успешно то мы запишем информацию о загруженном файле в базу. В конце мы просто перенесём пользователя обратно на редактирование альбома. PHP код:
Теперь нам нужно написать отображение всех, существующих в альбоме, фотографий. Исходными данными для этого будет массив номеров фотографий текущего альбома, полученный из БД. Его формированием будет заниматься метод «getPhotosArray». PHP код:
PHP код:
PHP код:
Код:
<table width='100%' align='center'>Для работы с изображениями в CI имеется библиотека «image_lib» (http://code-igniter.ru/user_guide/libraries/image_lib.html). Список возможностей у неё очень большой, но мы рассмотрим лишь изменение размера изображений. Из шаблона видно что метод, на который ссылается тег «img», называется «photo_view». В нём мы будем изменять размер требуемого изображения и выдавать его в браузер. Для нормальной работы методу будут передаваться 2 параметра — номер фотографии в базе и число 150. Это ширина будущего изображения. Высота же будет генерироваться относительно ширины. Так как методу изменения размера изображения нужно передавать имя файла, а у нас на входе имеется только её номер в базе, то придётся расширить функционал модели «Photos_model». В ней мы создадим функцию получающую данные из базы о фотографии по её номеру. Код её достаточно прост, и в комментариях врятли нуждается. PHP код:
source_image — полный путь к фотографии. maintain_ratio — будет установлен в «true» для того что бы при изменении размеров соблюдались пропорции. width — ширина будущего изображения. height — высота будущего изображения. Если её не указать то в изображении изменится только ширина, невзирая на сохранении пропорций. dynamic_output — будет установлен в «true» для того что бы результат работы выводился в браузер сразу. Иначе изображение будет сохранено на жёстком диске. PHP код:
Время поработать над пакетной закачкой. В базовом наборе CI есть библиотека «Zip Encoding», но она ориентирована лишь на создание архивов, а не на их распаковку. Для того что бы научить CI распаковывать архивы мы подключим к нему библиотеку PclZip. Вы можете скачать её последнюю версию здесь: http://www.phpconcept.net/pclzip/index.en.php . Сохраните скачанный файл «pclzip.lib.php» в папке пользовательских классов «application/libraries», но с именем «Pclzip.php». Затем откройте этот скрипт. В начале файла Вы увидите большое количество констант устанавливаемых для работы данной библиотеки. Что бы соответствовать стандартам перенесём всё объявление констант в файл «application/config/constants.php», тут содержаться константы объявляемые при старте CI. В файле библиотеки должен остаться только код класса (объявление единственной внеклассовой переменной «g_pclzip_version» можно просто удалить). Теперь переименуйте имя класса и конструктора из «PclZip» в «Pclzip». И последним нашим действием замените в конструкторе объявление свойства «zipname» с PHP код:
PHP код:
Перейдём к коду самого метода. Для наших целей мы расширим метод «photo_add» контроллера «Photos». Сразу после части кода отвечающей за загрузку одной фотографии мы заново инициализируем библиотеку «File upload» уже с другими параметрами и попытаемся загрузить отправленный архив. PHP код:
PHP код:
PHP код:
На очереди удаление. Оно будет происходить так же просто как и у фотоальбомов. В контроллере «Photos» создайте метод «photo_del» с двумя параметрами передаваемыми по ссылке — номера фотографии и альбома. Номер альбома нам нужен для того что бы после выполнения удаления перенаправить пользователя обратно на редактирование. PHP код:
PHP код:
Предпоследним действием в отношении админ-панели у нас будет создание бэкапа фотографий. Данная функция будет формировать ZIP-архив со всеми имеющимися фотографиями на сервере, и передавать его на закачку браузеру. Внимание! Никогда не делайте похожих вещей в своих проектах так как они просто не будут работать на большинстве серверов. Дело в том что на многих серверах (а тем более на различных хостингах) объём памяти, выделяемой для PHP, сильно ограничен. Как правило это не больше 25 мегабайт. Соответственно, если объём архива будет превышать это ограничение то будет вылазить ошибка гласящая о недостатке памяти. Ведь архив перед выдачей пользователю (или сохранением на жёсткий диск) формируется именно в памяти. Создание такой функции мы рассматриваем здесь только для того что бы познакомиться с некоторыми свойствами библиотеки «Zip Encoding»(http://code-igniter.ru/user_guide/libraries/zip.html), использование которой может быть Вам полезно при выполнении каких-либо других задач. Итак, начнём. Метод, ответственный за создание резервных копий, будет называться «photos_backup» и находиться в модели «Photos». В начале метода будут загружаться 2 компонента — хэлпер directory (с помощью его функции мы получим список файлов для архивирования) и библиотека «zip». Далее мы получим список файлов и по очереди добавим их в архив. В конце метода мы отдадим содержимое архива браузеру пользователя. Это может Вас удивить, но код этой функции крайне мал. PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
|
В самом начале мы создаём ссылку на супер-объект CI для того что бы пользоваться всеми его возможностями, в том числе библиотеками. Мы ведь не можем пользоваться «$this» т.к. находимся не в объекте, а в обычной функции. Далее сравниваем первый сегмент и начинаем проверку только если содержимое этого сегмента «admin». То есть обычные пользователи под эту проверку никак не попадут. Ну и далее по алгоритму. В конце, при отображении формы авторизации (admin/admin_login_form.php) мы указываем методу «parse» третьим параметром «true» для того что бы он не скидывал код в буффер вывода а возвращал в нашу переменную «code». Код шаблона этой формы.
Код:
<table width="100%" border="0" cellspacing="0" cellpadding="0">Сейчас мы напишем пользовательскую часть нашей галереи. В ней будет не так много функционала как в админ-панели. Мы сделаем следующее: 1.Просмотр списка фотоальбомов 2.Просмотр содержимого альбома 3.Голосование за фотоальбом. Начнём с первого пункта. Для пользовательской части мы будем использовать контроллеры с теми именами что и для администраторской. Создайте пустой контроллер «Albums» (если Вы не забыли, он является контроллером по умолчанию в нашем приложении) и в его конструкторе подключите модель работы с альбомами. Она будет общая для обоих частей сайта. PHP код:
PHP код:
Код:
<BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0>PHP код:
PHP код:
Код:
<BODY BGCOLOR=#FFFFFF LEFTMARGIN=0 TOPMARGIN=0 MARGINWIDTH=0 MARGINHEIGHT=0>PHP код:
PHP код:
PHP код:
PHP код:
|
Перейдём к завершающей стадии этой статьи — интернационализации, или проще говоря — работе с языковыми файлами. Часто у распространяемых приложений или мульти-язычных проектов разработчики используют не разные дизайны (для каждого языка отдельный), а языковые файлы, содержащие в себе текст общего интерфейса сайта. Это позволяет не трогая ни кода ни дизайна приложения удобно и быстро изменять его язык. В CI для этих целей есть библиотека «Language» (http://code-igniter.ru/user_guide/libraries/language.html) и хэлпер с таким же названием (http://code-igniter.ru/user_guide/helpers/language_helper.html). Сейчас мы с помощью них попытаемся перевести часть нашего приложения на использование языковых файлов.
Возьмёмся за локализацию системной части — это всевозможные сообщения и ошибки которые генерируются CI. Например сообщения класса валидации о том что не заполнено какое-то поле, или ошибка библиотеки «Image lib» о том что не верно указан путь к изображению. Языковые файлы этой части находятся в директории «system/language». В свою очередь каждый язык находится в отдельной папке. Создайте в «system/language» папку «russian» и скопируйте туда содержимое папки «english». Теперь откройте файл основной конфигурации («application/config/config.php») и установите значение ячейки «language» в «russian». Для проверки того что мы сделали в директории «russian» откройте файл «db_lang.php», и в ячейку «db_unable_to_connect», содержащую сообщение о невозможности подключения к базе данных, впишите «Не могу соединиться с указанной базой данных.». Теперь откройте файл конфигурации БД и измените имя хоста базы на что угодно. После этого, при обращении к любой странице сайта, Вы должны видеть русскоязычную ошибку о том что к базе невозможно подключиться. Так Вы можете совершить полный русскоязычный (или другой) перевод всего движка. Далее очередь языковой части приложения. Под использование языковых файлов мы переделаем лишь шаблон редактирования альбома. Принцип такой переделки везде одинаков, поэтому достаточно будет только одного примера. Пользовательские языковые файлы хранятся в другой директории - «application/language». Создайте в нём папку «russian», поместите туда пустой файл «albums_lang.php» и впишите в него одну ячейку: PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
PHP код:
Надеюсь что эта статья поможет Вам в освоении столь лёгкого и отличного фреймворка. Code Igniter действительно заслуживает уважения так как является возможно самым наипростейшим инструментом для создания веб-приложений сохраняя, в то же время, огромную мощность и простоту изучения. Удачи Вам в Ваших проектах! |
автор ты? где копирайты?
|
Sharky, выставил. Спасибо что напомнил.
Корвин, а ты почитай, может стоит? |
Мне понравилось :) сам пару недель назад разбирался в этом :) не хватало такой статейки :) но и офф документации хватило :)
|
| Время: 19:48 |