PHP: Tips & tricks CakePHP
Для тех, кто уже успел познакомиться с фреймворком.
Гибкое управление связями
По умолчанию, при поиске всех представителей модели, Cake ищет и все связанные с ней подмодели. Что бывает часто неудобно, поскольку число запросов резко увеличивается, как и число бесполезной информации. Это, конечно, можно решить стандартными средствами, типа $this->recursive в размере количества необходимых подуровней поиска (до 3 по умолчанию), но и это часто не помогает, т.к. бывает, что некоторые субмодели нужны, но не все. В этом случае поможет удобная функция expects, которая работает непосредственно в модели.
Инструкция
Пользоваться ей очень удобно.
Например:
$this->Post->Author->expects();
$this->Post->Category->expects();
$this->Post->PostDetail->expects(array('PostExtendedDetail', 'PostAttachment'));
А можно сразу так:
$this->Post->expects('Author.Author', 'Category.Category',
'PostDetail.PostExtendedDetail', 'PostDetail.PostAttachment');
Облако тегов
Казалось бы, тривиальная задача. Попробуем сделать ее в терминах CakePHP.
Понятно, что облако тегов (например, tagcloud) должно существовать, как action контроллера Tags, последний будет выполнять в дальнейшем и другие задачи. С другой стороны, у этого action'a нет стандартного view, т.к. в качестве него выступает layout всей страницы. Т.е. глобальный view.
Здесь нам поможет понятие Элемента. Элемент - это view, который вызывается от страницы к странице, чаще всего в layout. То, что нам нужно. Потому в папке elements создаем шаблон tagcloud.ctp с текстом:
$tags=$this->requestAction('tags/cloud');
Т.о. мы получили массив тегов и в этом же шаблоне теперь можем как угодно обустраивать облако ;)
Теперь заходим в layouts/default.thtml и в необходимом месте на странице вставляем следующую строку:
echo $this->renderElement('tagcloud');
Вот и все. Теперь будет отпечатан наш шаблон с облаком тегов ;)
Кэш в CakePHP 1.2
Да, это просто невероятно! В последней версии CakePHP работа с кэшированием стала не простой, а очень простой! На данный момент поддерживаются: APC, File, Memcache, Model и XCache. Самая простая и удобная - это File. Все просто, в папке tmp создается файл с заданным названием. Кроме того, поддерживается создание собственной кэширующей системы.
Итак, активируем Cache. Для это в файле с настройками core.php напишем:
$cakeCache = array('File');
или, например
$cakeCache = array('Memcache');
Помните, что у вас должен быть установлен Memcached! Для экспериментов в Windows можно установить эту версию.
Дальше все еще проще! Вне зависимости от названия кэширующей системы используем в контроллере следующие команды:
Cache::write($key, $data, '+1 week');
Для чтения
Cache::read($key);
Если такого ключа еще нет в кэше, то read возвращает false:
$users = Cache::read($key);
if ($users === false) {
$users = $this->User->findAll();
Cache::write($key, $users);
}
Удаление или полная отчистка:
Cache::delete($key);
Cache::clear();
Валидация в CakePHP 1.2
Валидация также стала проще. Для некоторых типичных случаев теперь не надо пользоваться регулярными выражениями.
Общий вид правил валидации такой:
var $validate = array('field' => array('rule' => array('validationmethod', 'param1', 'param2')));
К примеру, числа и цифры:
var $validate = array('username' => array('rule' => array('alphaNumeric')));
Длина поля
var $validate = array('username' => array('rule' => array('between', 3, 10)));
Сравнение с числом или словом:
var $validate = array('age' => array('rule' => array('comparison', 'greater or equal', 18)));
Дата:
var $validate = array('startdate' => array('rule' => array('date', 'ymd')));
rule можно превратить в массив подобных правил, чтобы расширить проверку.
Подробнее о правилах здесь
Ajax Pagination 1.2
В 1.2 встроенна поддержка разбивки страниц с помощью Ajax. Рассмотрим пример для action некоторого контроллера:
$this->paginate['User'] = array('limit' => 10);
$records = $this->paginate('User');
$this->set('records', $records);
$params['url']=$id;
$this->set('paginator_params', $params);
Все очень просто. Создаем объект paginate с элементом User, который мы хотим разделить на страницы. Затем вызываем функцию paginate. Если мы хотим передать какие-то дополнительные параметры через Ajax запрос, то делаем это в paginator_params.
Во view делаем так:
options(array('update' => 'comment-content', 'indicator' =>
'notification')); ?>
Навигация:
prev(' 'disabled')); ?>
next('Вперед >>', (isset($paginator_params) ?
$paginator_params : null), null, array('class' => 'disabled')); ?>
Страницы:
counter(array('separator' => ' из '));
Собственно, все. Необходимо только создать HTML элемент comment-content, который и будет обновляться за счет новой страницы Pagination.
Месяцы в форме по-русски
$form->month('Модель') по-умолчанию выводит месяцы на английском языке. Месяцы берутся из локали, потому чтобы вывести русский вариант надо выполнить что-то вроде этого:
setlocale(LC_TIME, 'rus');
Внимание: в Windows такой вариант выдаст CP1251 кодировку. Потому, если у Вас UTF-8 сайт, то необходимо либо иметь на сервере ru_RU.UTF8 локаль (пользователи Линух, привет!), либо эту $form->month конвертировать с помощью iconv. Либо создать свой $form->select ;)
P.S. В скором времени планируется открытие социальной сети, написанной на основе CakePHP, потому возможно открытие блога, который писал бы о всем, что связано с разработкой на этом фреймворке.
- CakePHP: Tips & tricks CakePHP #2 В связи с выходом пре-беты 1.2 второй выпуск tips&tricks. Продолжаем знакомить Вас с идеями и проблемами версии 1.2, особенностями пре-беты, с которыми мы встретились в процессе разработки социальной сети. Кроме того, мы завели себе блог на Хабре - присоединяйтесь, задавайте вопросы. Думаю, нам есть что обсудить.Новый core.php! Самое главное измение пре-беты – это новый формат файла core.php! Замените обязательно при обновлении этот файл и настройте его по усмотрению. В принципе, все описание
- Я умный: CodeIgniter vs. CakePHP Ниже находится переводстатьиДжонатана Снука (Jonathan Snook) о преимуществах и недостатках двух популярных PHP фреймворков CakePHP и CodeIgniter. Прежде чем публиковать такого рода публикации, я обычно опасаюсь за всякого рода фанатиков, которые неадекватно реагируют на подобные сравнения. Поэтому стараюсь максимально объективно подойти к повествованию. Все выводы в статье сделаны только на основании фактов. Я сопоставляю эти две платформы друг против друга, но безоговорочного победителя здесь
- Web-разработка: Разберемся раз и навсегда: AJAX, «кириллические символы», кодировки, prototype.js, jQuery, JsHttpRequest AJAX, — это технология. Одной из часто используемых техник этой технологии является посылка запросов при помощи объекта класса XMLHttpRequest. Как же посылать и принимать AJAX запросы в нужной нам кодировке, нужно ли использовать однобайтовые кодировки или не обойтись без UTF-8. На все эти вопросы раз и навсегда ответит эта статья. Кстати, перепечатка с моего. И ещё, классов-то, конечно, в JavaScript нет, но для удобства будем пользоваться такой терминологией. В документации на XMLHttpRequest с
- Веб-стандарты: Google Suggest в стиле HTML5 Введение HTML5 — следующая большая переделка HTML (и XHTML), и разрабатывается совместно группами WHATWG и W3C HTML WG (работа еще не завершена, но в этой статье мы будем называть её просто HTML5). Я уже описывала начала HTML-форм и возможные улучшения с помощью HTML5 в моей предыдущей статье, поэтому сейчас рассмотрю некоторые более сложные аспекты полей ввода в HTML5, и завершу примером, демонстрирующим простоту создания автодополняющегося поля ввода — коротким серверным скриптом и нескольким
- PHP: Безопасный метод авторизации на PHP Примечание: мини-статья написана для новичков Давайте посмотрим вокруг: форумы, интернет магазины, гостевые книги и т.д. используют регистрацию и последующую авторизацию пользователей. Можно даже сказать, что это почти необходимая функция каждого сайта (только если это не домашняя страничка Васи Пупкина или не визитная карточка, какой-нибудь небольшой компании). Сегодня я хочу поделиться со всеми новичками информацией, о том, как лучше это все реализовать. 1. Модель (клиент) Регистрация - логин
- PHP: Введение в Zend_Auth В статье приведен обзор возможностей компоненты Zend_Auth, дающий общее представление о реализации пользовательской авторизации в приложениях на базе Zend Framework. В качестве основы приводимых примеров, использованы материалы статьи «Введение в Zend Framework». Примеры протестированы на Zend Framework версий 0.9, 0.9.1 и 0.9.2, и скорее всего будут работать с более поздними версиями, но не с более ранними. Автop: Рoб Алeн, http://akrabat.comОpигинaл:http://akrabat.com/zend-auth-tutorialПepe
- PHP: Введение в Zend Framework (продолжение) Продолжаем рассказ о Zend Framework. В первой части статьи была описана концепция программной архитектуры MVC, рассмотрена структура типового веб-приложения, базирующегося на Zend Framework и выполнена демонстрационная реализация контроллера и вида на его основе. Во второй части будет раскрыта тема модели и приведен пример взаимодействия приложения с базой данных. Для печaти рекомендуется использовaть полную версию стaтьи в формaте PDF: zend-fw-intro.pdfАвтор: Роб Ален, http://akrabat.comОриги
- Mr. Digger: Как пережить digg-эффект с wordpress Поскольку вы добрались до этой страницы, я предполагаю, что ваш сайт расположен на публичном сервере и уже стал жертвой дигг-эффекта (или вы, по крайней мере, знаете, что это такое) – и теперь вам необходимо как-то разрешить эту проблему. Конечно, хорошо размещать свои статьи на Дигге – так ваш голос наверняка будет услышан. Все идет хорошо, пока ваша статья не попадает на главную страницу Дигга. С этого момента вы уже не можете контролировать свой сайт, не можете открыть панель управления или
- Дизайн пользовательских интерфейсов и юзабилити: Интерактивные прототипы. Действующая модель пользовательского интерфейса, часть 3. Особенности процесса Я уже писал про классификацию и два основных пути создания интерактивных прототипов. В большинстве случаев мы делаем как раз цветной прототип. По сути, это обычная верстка HTML-шаблонов страниц на основе визуального дизайна, включающая в себя JavaScript-взаимодействия. Разница в том, что эти шаблоны еще много раз поменяются и дополнятся.Процесс созданияАвтоматические средства создания прототипов на основе схем страниц — те же Axure RP Pro и Intuitect — я стараюсь не использовать. Он
- Я умный: Выбор хостинга: кому можно доверять? Два года назад у меня появилась идея сделать хобби-проект про музыку, выложить записей. В ту пору, да и сейчас, хороших академических ресурсов было совсем не много. Сайт Аркадия Чубрика весьма хорош, только вот беда — он один в своем роде. Решил, выбрал хостинг, наверстал, оцифровал, выложил. Получился ArtOfPiano.ru. Ссылки на меня поставили, проект зажил. Поисковики меня полюбили, пользователи шлют »спасибо«. Казалось бы, сайту ничего не мешает... Признаю честно, сайтом год не занимался