Статьи
Портфолио
Друзья
Контакты

Последние статьи

06.07.2010 Memcache и Zend: у Вас "падает" Memcache? 4 коммент.

06.07.2010 Collabtive - web-based project management software 2 коммент.

03.06.2010 Ускоряем ZF-проекты: автолоад и сборка в один файл 2 коммент.

Все

Категории

PHP 2 стат.

Zend Framework 25 стат.

Javascript 3 стат.

Другое 12 стат.

Книги 1 стат.

Украина 1 стат.

Все

RSS

Статьи

Комментарии

Портфолио

Облако тегов

программирование  Программы  портфолио  php  zend framework  Zend_Db  Smarty  Zend_Form  паттерны  javascript  niceforms  jQuery  Zend_Mail  веб  Google  Zend_Rest  Zend_View_Helper  zend casts  Zend_View  Zend_Layout  speedUp  интернет  Загрузчик фотографий  Flash  ВКонтакте  zend  localization  zend_translate  gettext  антон шевчук  подарки  Я читаю  Книги  sphinx  релизы 

Все

Реклама



Статистика



Rambler's Top100

Главная > Статьи > Zend Framework > Zend Framework. Пишем помощник вида
20.12.08 Zend Framework. Пишем помощник вида

Здравствуйте, сегодня я хочу рассказать Вам о написании помощников вида. Мне нужно было реализовать один очень важный элемент навигации – т.н. "Хлебные крошки" вертикального типа (самый простой вариант). Для написания подобного функционала, я решил воспользоваться помощниками вида, чтобы не морочится с выводом и интеграцией в мою CMS-систему. Заодно я подумал, что было бы неплохо рассказать об этом читателям…

 

 

Проблема


 

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

 

 

Решение


 

Решение подобного вопроса довольно тривиальное. Самым лучшим способом, на моё мнение, является написание соответствующего помощника вида, потому, что это самый грамотный вариант (ИМХО). Итак, приступим!

 

В первую очередь, выясним, что же такое помощник вида в Zend Framework, как их использовать и как дописывать свои помощники.
Помощник вида – это «плагин» Zend_View, который доступен прямо из скриптов вида, реализующий конкретный функционал.

 

Наиболее полезными помощниками вида я считаю помощников headTitle, headLink, headScript, headMeta. Я их использую наиболее часто. Обо всех этих помощниках можно прочитать в мануале, а у нас же своя задача…

 

По умолчанию, Zend_View ищет помощники в папке Zend/View/Helper/, а также в папке views/helpers/. А что делать, если нам нужно хранить наши помощники не в этих папках и чтобы они были доступны из любого скрипта вида? Правильно! Нужно показать нашу папку Zend_View. Делается это так:


 

Вот сам класс плагина, реализующий "Хлебные крошки":


 

Итак, разберем пошагово, написанное.

  1. В первых строчках мы объявили класс Fooup_View_Helper_BreadCrumbs, унаследовав класс Zend_View_Helper_Placeholder_Container_Standalone (этот класс наследует интерфейс Zend_View_Helper_Interface и имеет базовый функционал необходимый нам);
  2. Далее мы объявляем защищенную переменную $_regKey, которая указывает Placeholder'у название отдельного пространства имен для нашего плагина;
  3. Объявляем функцию breadCrumbs, которая будет основной в нашем помощнике;
  4. И наконец, объявляем функцию toString, которая должна возвращать уже готовую строку для вывода.

Функция breadCrumbs принимает два параметра: первый это элемент (массив с ключами «title» и «url»), а второй, означает тип записи в контейнер (заменить, добавить в конец, добавить в начало). Эта функция выполняется благодаря базовому функционалу помощника под названием "Placeholder". Заметьте, что функция имеет такое же название как и помощник вида. Это и является ключевым моментом - это обязательно!

 

Функция toString, формирует наш вывод, собирая строку с массива элементов, вставляя разделители, префиксы и постфиксы. В итоге функция возвращает строку, которая уже готова для вывода.

 

Наведу Вам небольшой пример использования данного помощника:


 

Обратите внимание на название помощника. Оно формируется на основе части имени класса, но без префикса, который мы указали виду.

 

Как видите, все довольно просто и эффективно. Такой подход очень удобен и грамотен, ведь если бы мы выдумывали какие-то другие системы и решения, то на это ушло бы намного больше времени, да и Zend_View рассчитан на удобное наращивание функционала. А вот результат выполнения подобного кода:

Хлебные крошки

Теги:  zend framework, php, программирование

Другие категории:

■ PHP ■ Zend Framework ■ Javascript ■ Другое ■ Книги ■ Украина
Комментарии к статье
  LighteR

15.05.09 10:45:02

в хэлпере ошибка: метод должен называться "__toString" вместо "toString", т.к. в дальнейшем вы используете его именно как магический метод, не вызывая его явно.

  Snowcore

21.05.09 11:07:26

Я как раз тоже сегодня свой Truncate хелпер написал

  illusive

21.05.09 16:43:15

@LighteR

Обратите, пожалуйста, внимание на унаследованный класс... А потом, пересмотрите свой комментарий Невинность

  Скакунов Александр

03.07.09 14:16:06

Спасибо, давно хотел разобраться, как в Zend работают helpers.

  illusive

04.07.09 09:48:11

Рад, что Вам помогло разобраться Улыбается

  Andrey

15.01.10 09:30:22

Подскажите, как в скрипте макета указать ссылку на страницу. У меня к примеру есть макет

 

Ссылка  в макете <li><a href="&"quot;about/us">О НАС</a></li> по идее должна вызывать контролер about и действие us. Но когда я нажимаю на эту ссылку страница показывается (стили загружаются), но браузер у меня виснит, не отображаються рисунки... В чем может быть проблема и как правильно нужно писать ссылки в макетах скрипта. Я знаю нужно, наверное использовать помощник вида Url-helper, но как его применить не знаю. Может покажите на примере... Спасибо

 

  illusive

15.01.10 11:48:55

Все ссылки должны быть абсолютными, т.е.

/styles/styles.css

Это путь от папки public_html, если сказать по простому.

Ссылки на конкретные страници желательно выводить с помощью помошника вида url, например,

  Andrey

16.01.10 16:04:45

Подскажите, пожалуйста. Написал в хелпере следущее:


в роутере:

при этом ссылка сгенерировалась вот так:

страница отобразилась но ни рисунки ни другие элементы страницы не загрузились!!! Оно ищщет вроде бы действие martel которое было указано в массиве, хотя это есть значение переменной username.
Почему рисунки не отображаются? Может нужно где-то указать в настройках или в чем проблема? Спасибо за помощь!!! Плачет

  illusive

16.01.10 16:10:34

Во первых, контроллер и действие передавать в первый параметр помощника, в вашем случае не обязательно.

 

Во вторых, если нет картинок и стилей, то первым делом посмотрите на пути к ним в исходном коде страници. Убедитесь, что используете абсолютные пути к файлам, а не относительные...

  Andrey

16.01.10 16:43:19

к стати, когда на ссылку в просмотре кода странице нажимаю выдает вот такое сообщение:

 

Проверил пути к рисункам, и когда на ссылку рисунка (к примеру

 

в просмотре кода странице нажимаю выдает вот такое сообщение:

 

что интиресно если пишу вот так:

и в роутере:

формируется вот такая ссылка которая работает и рисунки загружаются:

а когда напишу в хелпере:

и в роутере

страница открывается а рисунки не грузятся, и пиуть к рисункам остается тот же что и был при нормальной загрузке странице, когда я в хелпер и роутер не добавил username->material. Оно как бы ищет действие material которого нет... Парадокс какой то....

 

 

  Andrey

16.01.10 17:07:13

Спасибо за подсказку, заработал демон.... абсолютные пути нужно указывать....Клёвый

  Serg

25.01.10 16:20:10

Здравствуйте!

Подскажите, я не могу разобраться с помощником вида. Создал помощник вида с именем

FooBar.php и разместил его по такому пути: applications/views/My/Helper/FooBar.php

Затем в контролере зарегестрировал этот помощник вида, написав:

$view->addHelperPath('My/Helper/', 'My_Helper');

Но при этом мневыдает ошибку:

Fatal error: Call to a member function addHelperPath() on a non-object in Z:\home\aqua\www\applications\controllers\ErrorController.php on line 12

Где сдесь проблема? Где нужно размещать помощники вида??? Спасибо!!!

 

 

 

 

 

  illusive

25.01.10 16:31:38

У вас переменная $view не является экземпляром класса Zend_View...
  Serg

25.01.10 16:53:12

Когда я размещаю файл в папке Zend/View/Helper/FooBar.php где находяться все помощники без указания метода addHelperPath() все работает, а когда мне надо скажем поместить помощник вида в папку applications/views/My/Helper/FooBar.php я использую этот метод

 

$view = new Zend_View;

$view->addHelperPath('My/Helper/', 'My_Helper');

и мне выдает ошибку:

Fatal error: Uncaught exception 'Zend_Loader_PluginLoader_Exception' with message 'Plugin by name 'FooBar' was not found in the registry; used paths: My_Helper_: My/Helper/ Zend_View_Helper_: Zend/View/Helper/' in

Наверное где-то не првильно путь указал!!!

 

Как првильно нужно указать путь??? Спасибо!!!


 

 

  VIPrules

24.02.10 11:03:41

Чуть не в тему о "крошках", но о навигации.
Автор (или кто-нить) ткните носом в такую вещь.

Надо реализовать выделение активной страницы в горизонтальном верхнем меню (например, другим стилем). Для этого есть специальный инструмент, или надо писать что-то свое? Если свое, то интересует алгоритм. Можно и реализацию.

Набор пунктов меню  - статический (например, Главная, Личный кабинет, О нас). Классы стилей описаны.
В блоге ничего похожего не нашел.

Спасибо.

Оставить свой комментарий

 
Статьи | Портфолио | Друзья | Контакты
Идея и мозги: Васильев Андрей © 2008-2010 Web-Blog Кисточка и фантазия: Зелинский Богдан