Сен 11 2008

Расширяем функциональность стандартных хелперов

Раздел: Веб-разработкаМета @ 22:44

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

Рассмотрим на примере хелперов. У нас в студии часто попадаются проекты с большим количеством статических страниц. Их удобнее хранить отдельными представлениями (views), чтобы не было проблем со вставкой и обработкой форм, картинок, элементов динамики и тому подобного. Опять же часто в этих статических страничках бывают произвольно разбросаны по тексту однотипные элементы, например картинки с одинаковым классом css или таблицы с хитрым заголовком.

Верстальщику все время когда встречаются подобные элементы, приходится писать в представлении конструкцию вида:

<?php echo $html->image(’page1/img_sample_2.jpg’, array(’class’=>’special’));?>

Здесь папка «page1» уникальна для каждой странички, т.е. для каждой странички свой набор картинок, некоторые из которых являются специальными — у которых в названии встречается «_sample».

Как упростить работу верстальщика? Расширить функциональность стандартного хелпера HtmlHelper.

Создаем файл «/app/views/helpers/html2.php». Так и будет называться новый хелпер — Html2Helper. Он будет наследоваться от стандартного объекта Helper и использовать возможности HtmlHelper’а.

Для того, чтобы узнать в какой папке искать картинку, в контроллере надо установить переменную $this->params['inpage']. Весь массив $this->params[] доступен из хелперов. Реализуем в нашем хелпере обработку пути и имени картинки в методе image():

<?php
class Html2Helper extends Helper {

var $helpers = array(’Html’); //подключаем для использования HtmlHelper

function image($img, $options = array()) { //первый параметр — имя картинки, второй — необязательные опции
if (isset($this->params['inpage']) && ($this->params['inpage'] <> 0)) { //если установлен путь где искать картинки
if (strpos($img, ‘_sample’) !== false) { //ищем в имени картинки вхождение «_sample»
$options['class'] = ’special’;//если нашли — добавляем класс «special»
}
return $this->Html->image($this->params['inpage'].’/’.$img, $options); //возвращаем оформленный тег img с правильным путем к картинке
} else {
return $this->Html->image($img, $options); // или выводим картинку из пути по-умолчанию
}
}
}
?>

Использовать этот хелпер для верстальщика гораздо проще. Ему достаточно написать в представлении:

<?php echo $html2->image(’img_sample_2.jpg’);?>

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

Теги:

2 Responses to “Расширяем функциональность стандартных хелперов”

  1. skiedr says:

    как то сложно у вас.
    Не забываем что можно определить методы в AppHelper
    и что HtmlHelper extends AppHelper :)

  2. Заменяем стандартные хелперы не трогая ядро CakePHP - Программируем на CakePHP says:

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

Напиши комментарий!