Настало время немного разъяснить, что представляют из себя помощники видов в Zend Framework. Zend Framework предоставляет компоненту Zend_View, которая позволяет создавать помощники видов. Их использование выглядит примерно так:
<?php echo $this->myHelper('myParam1'); ?>
А сам помощник вида примерно вот так:
<?php
class Zend_View_Helper_MyHelper extends Zend_View_Helper_Abstract
{
public function myHelper($myParam1)
{
$html = '';
// some logic that fills in $html.
return $html;
}
}
Тут необходимо отметить две детали. Первая это то, что любой помощник выводит строку. Вторая, то, что Zend_View_Helper_ это префикс.
В стандартной комплектации проекта на Zend Framework данные помощники видов размещаются в специальном каталоге под названием helpers->views. Так же каталог helpers может находиться в папке layouts. Если вы помещаете помощник видов в один из этих каталогов, то префикс будет следующим Zend_View_Helper_.
Но это не строгое ограничение - мы можем располагать наших помощников в любой папке. Обычно разработчики хранят их в папке library/App/View/Helper/, так что префикс App_View_Helper_ тут уже не сработает. Для того, чтобы всё было пучком следует добавить запись в application.ini:
resources.view.helperPath.App_View_Helper_ = "App/View/Helper/"
Теперь помощники видов располагаются в App/View/Helper/MyHelper.php и выглядят следующим образом:
<?php
class App_View_Helper_MyHelper extends Zend_View_Helper_Abstract
{
public function myHelper($myParam1)
{
$html = '';
// some logic that fills in $html.
return $html;
}
}
После того, как вы наследуете от класса Zend_View_Helper_Abstract для создания собственного хелпера, то вам надо получить доступ к объекту вида. Это необходимо для того, чтобы получать доступ к другим помощникам вида, таким как к примеру escape.
Допустим, мы хотим создать таблицу из массива, который выглядит следующим образом:
$data = array();
$data[] = array('Name', 'Email');
$data[] = array('Alison', 'alison@example.com');
$data[] = array('Bert', 'bert@example.com');
$data[] = array('Charlie', 'charlie@example.com');
Вывод:
<?php echo $this->tabulate($this->data, array('class'=>'tabulated')); ?>
А сам помощник вида будет выглядеть так:
<?php
class App_View_Helper_Tabulate extends Zend_View_Helper_Abstract
{
public function tabulate ($data, $attribs = array())
{
$attribString = '';
foreach ($attribs as $key => $value) {
$attribString .= ' ' . $key .'="' . $value . '"';
}
$header = array_shift($data);
$html = "<table $attribString>\n<tr>\n";
foreach ($header as $cell) {
$escapedCell = $this->view->escape($cell);
$html .= "<th>$escapedCell</th>\n";
}
$html .= "</tr>\n";
foreach ($data as $row) {
$html .= "<tr>\n";
foreach ($row as $cell) {
$escapedCell = $this->view->escape($cell);
$html .= "<td>$escapedCell</td>\n";
}
$html .= "</tr>\n";
}
$html .= '</table>';
return $html;
}
}
Напоследок хочу напомнить, что префиксы можно задавать какие угодно:
resources.view.helperPath.Akrabat_View_Helper_ = "Akrabat/View/Helper/"
resources.view.helperPath.App_View_Helper_ = "App/View/Helper/"
Так же старайтесь давать уникальные имена вашим помощникам иначе они могут быть перезаписаны и не вызываться там, где вы этого ожидаете. Ну и наоборот. Если вас не устраивает встроенные хелперы в Zend Framework, то вы всегда можете заместить их своими собственными.