Как стать автором
Обновить

Tips & tricks CakePHP

Время на прочтение 4 мин
Количество просмотров 2.5K
Для тех, кто уже успел познакомиться с фреймворком.


Гибкое управление связями


По умолчанию, при поиске всех представителей модели, 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 делаем так:
<?php $paginator->options(array('update' => 'comment-content', 'indicator' =>
'notification')); ?>
Навигация:
<?php echo $paginator->prev('<< Назад', (isset($paginator_params)
? $paginator_params: null), null, array('class' => 'disabled')); ?>
 
<?php echo $paginator->next('Вперед >>', (isset($paginator_params)?
$paginator_params: null), null, array('class' => 'disabled')); ?>
Страницы:
<?php echo $paginator->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, потому возможно открытие блога, который писал бы о всем, что связано с разработкой на этом фреймворке.
Теги:
Хабы:
+8
Комментарии 22
Комментарии Комментарии 22

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн