среда, 14 апреля 2010 г.

Мои наработки -- заготовка проекта для фреймверка CodeIgniter

Предлагая Вашему вниманию набор своих наработок по CI в виде набора файлов которыми я начинаю проект на CI в последнее время.

Весь набор лежит в Git-репозитарии

Это не полный набор приложения, набор состоит только из измененных и новых файлов.


В наборе есть код не моего авторства, при этом сохранена информация об авторе и указаны изменения (если есть) которые произведенены в файле мной.
Весь пакет распространяется «как есть», без каких либо гарантий и обязательств и совершенно бесплатно.
Главное условие — при использовании Вы должны оставить в исходном коде информацию об авторстве этого кода, лишь расширив упоминанием себя в случае каких-то изменений внесенных вами.

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

Общее описание расширений
Классы
Роутинг — возможность описывать правила формирования ссылки. Детально описана здесь. Новшества —

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

Пример: Необходимо обработать массу старых урлов вида domain/name_name2, переопределив клиента на новый domain/ru/name-name2

      $route[] = array(
                    'main'  => '([^ru][^ua]){2}/*(.+)',
                    'name'  => 'old_route',
                    'url'   => '',
                    'route' => '/ru/$0',
                    'replace' => array(
                                    array(
                                          'key' => '_',
                                          'value' => '-'
                                         )
                                      ),
                    'redirect' => 301
                );
 
произведет редирект любых урлов без описанных языковых алиасов на адрес с русским алиасом заменив все символы подчеркивания на тире. Групп замены может быть сколь угодно много.
Данное расширение функционала сомнительно, т.к. это можно сделать еще на стадии обработки запроса mod_rewrite’ом, потому я не выкладываю это обновление в Вики.

Autoloader — очень простой класс автозагрузки, просматривающий папку библиотек и обрабатывающий пиаровскую конвенцию именования классов (AClass_BClass_Cclass == AClass/BClass/Cclass.php)

Кеширование Предлагается на выбор Zend_Cache (link) и Memcache моя реализация повторяющая интерфейс Zend_Cache. Т.е. если грузить библиотеку кеша с установкой имени, то можно везде использовать $this->cache и в продакшене переключать типы кеша.

Registry — простой класс накопления и возврата объектов/переменных. Метод возвращающий значение ключа принимает так же третий параметр — значение по умолчанию, которое будет возвращено, если ключ не будет найден.

Pagination — класс пагинации заменяющий полностью базовую библиотеку. Изменения коснулись механизма генерирования ссылок — возможно использовать правила роутинга для формирования урла (описано выше) или другой режим — формирование ссылки как ассоциативных пар (т.е. нет фиксированного номера сегмента номера страницы). Более подробно я опишу этот класс чуть позже или здесь или в Вики в русском сообществе), если он заинтересует Сообщество.

MY_URI — Изминения коснулись
  • парсинг запросов. Случай, когда на сервере работает nginx и php работает в режиме FastCGI стандартной библиотекой обрабатывается не корректно, если приложение работает и с сегментной адресацией и GET-запросами. В конфиге uri_protocol нужно определить тогда как REQUEST_URI.
  • изменено поведение функции uri_to_assoc/ruri_to_assoc — второй параметр $default теперь может принимать не просто набор названий параметров, но и ассоциативный массив — имя параметра=>значение по умолчанию (если нет в урле).
MY_Upload* — do_upload теперь принимает 2 новых параметра — 1й(т.е. 2й) это имя которое нужно задать файлу после загрузки на сервер, 2й(т.е. 3й) — ассоциативный массив описания как обработать изображение (изминение размера или вырезка облости), естественно, если загружается изображение и его нужно изменить. При использовании массива обработки, можно задать шаблон именования файлов которые появятся в результате (значений модификации может быть несколько).
MY_Log — добавляет новый тип логированных сообщений — LOG, встраиваясь в ряд под номером 2. Таким образом позволяет в продакшене логировать события встроенными средствами — например размер загруженного обновления данных запускаемого по крону.
MY_Image_lib — поддержка ресайза только по изветсной одной величине (расчет второй величины с соблюдением соотношения сторон).
View — самая большая библиотека из набора. Разрабатывается для моего велосипеда, о котором я пытаюсь писать в своем блоге (линк в подвале) — CMS, но легко портировалась на простые приложения.
Основные моменты:
  • layout или темы оформления без заботы о их выборе в конкретных вызовах
  • за счет расширения Loader’а подменен вызов $this->load->view , что дает возможность быстро подключить к готовому приложению.
  • Полностью автоматическое формирование заголовочной части html-документа.
  • возможность подключить файлы стилей, JavaScript из любого места приложения при помощи набора простых вызовов (есть одноименный хелпер).
  • Библиотека ориентирована на использование jQuery, но легко переделывается на любой другой JavaScript-framework. Поддерживается добавление в 2 события — html-структура загружена и весь документ загружен.
  • Умеет сливать css-файлы в один, производя таким образом кеширование и позволяя ускорить загрузку страницы. При этом есть возможность по маске регулярного вырожения запретить прикреплять отдельные файлы, например, файлы стилей jQueryUI.
  • Файл настроект темы позволяет задать любые параметры, определить всегда подключаемый файлы. Напрмиер: — главную таблицу стилей (есть параметр определяющий где размещать этот файл, в конце или в начале списка стилей), — задать адрес использованного по умолчанию JS-скрипта, — часть title документа и указать где он будет расположен, — определить favicon сайта...
Это не полный перечень возможностей. Перечислю список функций в хелпере из названия которых будет все понятно о назначении: v_setParam(для head-части), v_addToParam, v_addStyle, v_addScript, v_addRawScript, v_addHtml, v_addjQ_OnReady, v_addjQ_WinLoad, v_set_jQ_main, v_getRcFolder, v_show.
Об этой библиотеке я напишу более развернутую статью.

MY_Controller — по сути, просто делает финальным _remap, запускает базовые классы, указывает layout и ищет _reremap или сам вызываемый метод. Если вызываемый метод возвращает массив — отдает ответ клиенту ввиде JSON-объекта с соответствующими заголовками. Наверно, самый слабый и безполезный класс из всего набора, но мне с ним проще жить :) .

Так же, в набор включена библитека SAX для парсинга XML. В ней никаких изминений не производилось.

В набор включен так же плагин для использования флеша на сайте на основе JS-библиотеки Swfobject. Плагин работает с использованием библиотеки View т.к. пришел все из тойже CMS.

Есть и хелпер с сервисными функциями, своеобразный швейцарский нож.

Если данный пакет окажется кому-то полезным — буду несказанно рад. Значит не зря...

Приветствуются слова благодарности, вопросы, тухлые помидоры и исправления.

3 комментария:

Александр комментирует...

Хотя бы чуток было задокументировано. А так возникают сложности, что и как правильно использовать. Скопировал вашу заготовку на чистый дистриб ci. Он выдал ошибку (про хелпер ) и нет коннекта к базе. Хотя базовый контроллер welcome_message не требует подключения к бд. Спасибо за наработки. Буду копать все равно

Unknown комментирует...

1) база грузится в автозагрузке.
2) http://code-igniter.ru/forum/viewtopic.php?f=4&t=1714 -- здесь чуть больше описания и можно более удобно задавать вопросы.

Это писалось для себя... и как мне кажется, мой код вполне прозрачен для понимания.

Александр комментирует...

Да. Спасибо разобрался.