Для тех, кто уже успел познакомиться с фреймворком.
По умолчанию, при поиске всех представителей модели, Cake ищет и все связанные с ней подмодели. Что бывает часто неудобно, поскольку число запросов резко увеличивается, как и число бесполезной информации. Это, конечно, можно решить стандартными средствами, типа $this->recursive в размере количества необходимых подуровней поиска (до 3 по умолчанию), но и это часто не помогает, т.к. бывает, что некоторые субмодели нужны, но не все. В этом случае поможет удобная функция expects, которая работает непосредственно в модели.
Инструкция
Пользоваться ей очень удобно.
Например:
А можно сразу так:
Казалось бы, тривиальная задача. Попробуем сделать ее в терминах CakePHP.
Понятно, что облако тегов (например, tagcloud) должно существовать, как action контроллера Tags, последний будет выполнять в дальнейшем и другие задачи. С другой стороны, у этого action'a нет стандартного view, т.к. в качестве него выступает layout всей страницы. Т.е. глобальный view.
Здесь нам поможет понятие Элемента. Элемент — это view, который вызывается от страницы к странице, чаще всего в layout. То, что нам нужно. Потому в папке elements создаем шаблон tagcloud.ctp с текстом:
Т.о. мы получили массив тегов и в этом же шаблоне теперь можем как угодно обустраивать облако ;)
Теперь заходим в layouts/default.thtml и в необходимом месте на странице вставляем следующую строку:
Вот и все. Теперь будет отпечатан наш шаблон с облаком тегов ;)
Да, это просто невероятно! В последней версии CakePHP работа с кэшированием стала не простой, а очень простой! На данный момент поддерживаются: APC, File, Memcache, Model и XCache. Самая простая и удобная — это File. Все просто, в папке tmp создается файл с заданным названием. Кроме того, поддерживается создание собственной кэширующей системы.
Итак, активируем Cache. Для это в файле с настройками core.php напишем:
или, например
Помните, что у вас должен быть установлен Memcached! Для экспериментов в Windows можно установить эту версию.
Дальше все еще проще! Вне зависимости от названия кэширующей системы используем в контроллере следующие команды:
Для чтения
Если такого ключа еще нет в кэше, то read возвращает false:
Удаление или полная отчистка:
Валидация также стала проще. Для некоторых типичных случаев теперь не надо пользоваться регулярными выражениями.
Общий вид правил валидации такой:
К примеру, числа и цифры:
Длина поля
Сравнение с числом или словом:
Дата:
rule можно превратить в массив подобных правил, чтобы расширить проверку.
Подробнее о правилах здесь
В 1.2 встроенна поддержка разбивки страниц с помощью Ajax. Рассмотрим пример для action некоторого контроллера:
Все очень просто. Создаем объект paginate с элементом User, который мы хотим разделить на страницы. Затем вызываем функцию paginate. Если мы хотим передать какие-то дополнительные параметры через Ajax запрос, то делаем это в paginator_params.
Во view делаем так:
Собственно, все. Необходимо только создать HTML элемент comment-content, который и будет обновляться за счет новой страницы Pagination.
$form->month('Модель') по-умолчанию выводит месяцы на английском языке. Месяцы берутся из локали, потому чтобы вывести русский вариант надо выполнить что-то вроде этого:
Внимание: в Windows такой вариант выдаст CP1251 кодировку. Потому, если у Вас UTF-8 сайт, то необходимо либо иметь на сервере ru_RU.UTF8 локаль (пользователи Линух, привет!), либо эту $form->month конвертировать с помощью iconv. Либо создать свой $form->select ;)
P.S. В скором времени планируется открытие социальной сети, написанной на основе 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 делаем так:
<?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, потому возможно открытие блога, который писал бы о всем, что связано с разработкой на этом фреймворке.