Здравствуйте!
Данная статья рассчитана для тех, кто хочет научиться писать собственные хелперы и плагины для замечательного Zend Framework. Постараюсь описать все кратко и ясно. Итак, начнем.
Разработчики Zend Framework дали нам прекрасную возможность расширять и дополнять его. Для этих целей существуют хелперы и плагины. Различие в том, что плагин всегда срабатывает автоматически по какому-либо событию, а хелперы мы вызываем вручную. Хелперы же в свою очередь делятся на две категории: action helpers и view helpers. Action helpers пишуться для работы в контроллерах, а view helpers — для скриптов вида. Теперь перейдем непосредственно к написанию кода.
1. Action helpers
Для написания собственного action хелпера нам понадобиться всего лишь унаследоваться от абстрактного класса Zend_Controller_Action_Helper_Abstract и переопределить его метод direct. Для примера рассмотрим хелпер переключения сайта на работу по протоколу HTTPS:
<?php
Тепер появляется вопрос — как же его использовать? А использовать его очень просто: мы заносим его в брокер хелперов
и при необходимости вызываем в контроллере
2. View helpers
Здесь немного другая ситуация. Для начала придумываем хелперу имя, например — truncate (для обрезания строки до заданной длинны), затем унаследуемся от класса Zend_View_Helper_Abstract и называем класс Puzzle_View_Helper_Truncate. Обратите внимание на то, что имя класса должно заканчиваться нашим придуманным именем хелпера.
Потом прописываем путь, где будут лежать view хелперы. Я делаю это через ресурсы.
Пример использования:
Для наглядности приведу еще один пример — перевод размера файла в «человеческий» вид:
3. Плагины
В контроллере есть такое понятие, как «событие». Их всего 6 штук: routeStartup, routeShutdown, dispatchLoopStartup, preDispatch, postDispatch, dispatchLoopShutdown. Подробнее про них можно прочитату в оффициальном мануале zend framework. Скажу только что нам вполне хватит одного из них — preDispatch.
Например нам надо чтобы каждый модуль нашей системы автоматом «подсасывал» свой лэйоут. Для этого мы напишем свой плагин, который унаследуем от класса Zend_Controller_Plugin_Abstract и напишем наш функционал в какое-либо событие.
Остается только подключить плагин
Ну и на последок приведу пример плагина, который будет автоматом удалять ненужные ковычки из суперглобальных массивов.
Спасибо за внимание — всем хорошего кода!
Данная статья рассчитана для тех, кто хочет научиться писать собственные хелперы и плагины для замечательного Zend Framework. Постараюсь описать все кратко и ясно. Итак, начнем.
Разработчики Zend Framework дали нам прекрасную возможность расширять и дополнять его. Для этих целей существуют хелперы и плагины. Различие в том, что плагин всегда срабатывает автоматически по какому-либо событию, а хелперы мы вызываем вручную. Хелперы же в свою очередь делятся на две категории: action helpers и view helpers. Action helpers пишуться для работы в контроллерах, а view helpers — для скриптов вида. Теперь перейдем непосредственно к написанию кода.
1. Action helpers
Для написания собственного action хелпера нам понадобиться всего лишь унаследоваться от абстрактного класса Zend_Controller_Action_Helper_Abstract и переопределить его метод direct. Для примера рассмотрим хелпер переключения сайта на работу по протоколу HTTPS:
<?php
class Puzzle_Helper_SslSwitch extends Zend_Controller_Action_Helper_Abstract
{
public function direct ()
{
if (!isset($_SERVER['HTTPS']) || !$_SERVER['HTTPS']) {
$request = $this->getRequest();
$url = 'https://' . $_SERVER['HTTP_HOST'] . $request->getRequestUri();
$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$redirector->gotoUrl($url);
}
}
}
Тепер появляется вопрос — как же его использовать? А использовать его очень просто: мы заносим его в брокер хелперов
Zend_Controller_Action_HelperBroker::addHelper(
new Puzzle_Controller_Action_Helper_Config()
);
и при необходимости вызываем в контроллере
$this->_helpers->sslSwitch();
2. View helpers
Здесь немного другая ситуация. Для начала придумываем хелперу имя, например — truncate (для обрезания строки до заданной длинны), затем унаследуемся от класса Zend_View_Helper_Abstract и называем класс Puzzle_View_Helper_Truncate. Обратите внимание на то, что имя класса должно заканчиваться нашим придуманным именем хелпера.
class Puzzle_View_Helper_Truncate extends Zend_View_Helper_Abstract
{
public function truncate ($string, $length = 50, $postfix = '...')
{
$truncated = trim($string);
if (null === $string) {
return $truncated;
}
$fullLength = mb_strlen($truncated, 'utf-8');
if ($fullLength > $length) {
$truncated = trim(mb_substr($truncated, 0, $length, 'utf-8')) . $postfix;
}
return $truncated;
}
}
Потом прописываем путь, где будут лежать view хелперы. Я делаю это через ресурсы.
resources.view.helperPath.Puzzle_View_Helper_ = APPLICATION_PATH "/../library/puzzle/view/helper"
Пример использования:
$this->truncate('my string', 5);
Для наглядности приведу еще один пример — перевод размера файла в «человеческий» вид:
class Puzzle_View_Helper_Humanize
{
public function humanize ($bytes)
{
$orig = $bytes;
$ext = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
$unitCount = 0;
for(; $bytes > 1024; $unitCount++) $bytes /= 1024;
$human1 = sprintf("%s %s", round($bytes, 2), $ext[$unitCount]);
$human2 = sprintf("%s %s", $orig, $ext[0]);
return $human1 == $human2 ? $human1 : sprintf("%s (%s)", $human1, $human2);
}
}
3. Плагины
В контроллере есть такое понятие, как «событие». Их всего 6 штук: routeStartup, routeShutdown, dispatchLoopStartup, preDispatch, postDispatch, dispatchLoopShutdown. Подробнее про них можно прочитату в оффициальном мануале zend framework. Скажу только что нам вполне хватит одного из них — preDispatch.
Например нам надо чтобы каждый модуль нашей системы автоматом «подсасывал» свой лэйоут. Для этого мы напишем свой плагин, который унаследуем от класса Zend_Controller_Plugin_Abstract и напишем наш функционал в какое-либо событие.
class Puzzle_Controller_Plugin_Layout extends Zend_Controller_Plugin_Abstract
{
public function preDispatch (Zend_Controller_Request_Abstract $request)
{
$layout = Zend_Layout::getMvcInstance();
$layout->setLayout('backend' == $request->getModuleName() ? 'backend' : 'frontend');
}
}
Остается только подключить плагин
resources.frontController.plugins.layout = "Puzzle_Controller_Plugin_Layout"
Ну и на последок приведу пример плагина, который будет автоматом удалять ненужные ковычки из суперглобальных массивов.
class Puzzle_Controller_Plugin_Quotes extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup (Zend_Controller_Request_Abstract $request)
{
$params = $request->getParams();
array_walk_recursive($params, array($this, '_stripSlashes'));
$request->setParams($params);
}
private function _stripSlashes (&$value)
{
$value = stripslashes($value);
}
}
Спасибо за внимание — всем хорошего кода!