Как стать автором
Обновить

Комментарии 57

А что делать если нужно больше менюшек? :)
нужно делать больше менюшек :)
Дело в том что хэлпер Navigation может хранить только один экземпляр меню
вы внимательно читали?
на протяжении всей статьи мы работали с контейнером который хранился в вью. у себя я таким образом вывожу две менюшки.
и только в конце статьи я показал пример с прямой передачей контейнера в хелпер из бутстрапа.
Не, я не совсем о том. Трудно объяснить :((
Ну по любому я уже свой велосипед написал.

а как подключить несколько лейаутов? или отключить например для front-end части, админки, ajax запросов
сам компонент имхо удобен исключительно для создания простых меню без определенной обратной связи. При более серьезном подходе с моделями дерева, сохранением/удалением элементов Zend_Navigation остается только для того что бы обеспечить совместимость с помошниками вида для рендера
ну дерево я через него выводил. тут у него все ок. + есть поиск елементов и их можно удалять/добавлять.
так в чём проблема :)?
проблема в том что сами ноды навигации не удовлетворяют критериям модели и сохраняемых данных. Т.е. что бы сохранить изменения и прочее придется долго мучится либо над наследованием классов Zend_Navigation_Page_ либо создавать отдельные модели и после этого линковать импорт/экспорт на Zend_Navigation. Также есть определенная доля проблем если использовать не одно, а 2-3 разных меню на одной странице (типа head/footer и user меню)
abstract class Zend_Navigation_Container implements _RecursiveIterator_
интересно, почему zend_navigation упорно обзывает корневую страницу как /, а не через /controller/action? где то у него есть настройка такая?
все претензии к Zend_Route :)
а чем вас такое положение вещей не устраивает? если очень нужно, тогда можете свой роутер написать — наследовать его от Zend_Controller_Router_Route и переопределить метод assemble (он возвращает урл).
// Assembles user submitted parameters forming a URL path defined by this route
Нуу инициализировать acl в бутстрапе так явно наверное не следует, иначе бутстрап разрастется неприлично. Лучше плагином.
А вообще за статья зачет, приятно что люди пишут о zf
спасибо :)
рад, что понравилась ^_~
согласен, что не следует. это просто для примера. статья ведь про zend_navigation :).

я список ролей, прав и ресурсов в конфиг выношу. имхо выносить в плагин их не очень верно.
Пардон за ламерский вопос не по теме…
Не смог пройти…

_('Пользователи')

Как Вам удается геттекстом кириллицу вытягивать? Что юзаете?
Я может тоже что-то путаю, но если мне память не изменяет геттекст это система поддержки мультиязычности для сайтов, есть соотв. библиотека в зенде, и она хранит и работает с данными в бинарном виде. Вроде не должно быть проблем с кирилицей. Геттекст автоматически определяет лейблы и по настройкам словаря вытягивает перевод.
В зенде есть либа Zend_Translate он работает с готовыми mo файлами.

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

Поэтому, меня значительно более заинтересовал способ сканирования кириллицы.

:)))
хм, кажется к геттекстовому редактору идет и сканилка, она кирилицу не ест?
poeditor юзает сканер геттекста, который идет сместе с либой…
По моему я этот ставил (под винду) gnuwin32.sourceforge.net/packages/gettext.htm

И ключи на кириллице не распознает… :(((
Вероятно, афтор владеет каким-то ноу-хау :))))
Вру… отсюда качал исходники для работы с геттекстом
sourceforge.net/projects/gettext/
Вот что-то мне сильно подсказівает что броблема в кодировке. Мне мирещится что если подобрать и установить усё в правильной кодировке — должно заработать
И шото очень даже возможно, ибо

2.3.1 Locale Names

A locale name usually has the form ‘ll_CC’. Here ‘ll’ is an ISO 639 two-letter language code, and ‘CC’ is an ISO 3166 two-letter country code. For example, for German in Germany, ll is de, and CC is DE. You find a list of the language codes in appendix Language Codes and a list of the country codes in appendix Country Codes.

You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, ‘de_AT’ is used for Austria, and ‘pt_BR’ for Brazil. The country code serves to distinguish the dialects.
Иными словами, в случае использования Utf-8 задача не решаема?..
Zend_Translate
poedit использую. он xgettext помомему для сканирования использует. проблем не было ни под виндой, ни под линуксом. все файлы в кодировке UTF-8
Вот в том то и дело что при сканировании кириллицы poeditor-ом (xgettext) у меня ошибки вылетают.
Мне вот и интересно чем он ее сканирует…
ну я вам ответил чем я её сканирую (я автор статьи).
А можете пример командной строки привести?
из настроек poedit для php
xgettext --language=PHP --force-po -o %o %C %K %F
Причину нашел. Спасибо за наводку.
xgettext.exe --force-po --language=PHP -o %o --from-code=utf-8 %K %F
// Структура простого меню (можно вынести в XML)


досада что нет(или я её не могу найти просто) прослойки между Zend_Db_Table_Abstract и Zend_Navigation_Container
чтобы деревья напрямую из ДБ выбирать
можно самому написать. на проекте я для меню категорий так делал. просто формируете массив с деревом и передаете его в контейнер.
<?php echo $this->navigation()->menu(); ?>
<?php echo $this->navigation()->breadcrumbs(); ?>


он в ul и li обрамляет элементы, можно ли применить декораторы?
нет. поменять можно только наследовав хелпер и переопределив соотвествующие методы.

а зачем вам это нужно?
чтобы исключить проблемы с верстальщиком
если у верстальщика проблема со стилями для списка, тогда лучше исключить такого верстальщика…
Пишите <?php $this->navigation(ваш контейнер)->menu()->setPartial(myshablon.phtml); ?>

А в файле myshablon.phtml делайте вашу разметку и через foreach выводите элементы меню, типа:

foreach ($this->container as $page){
echo $this->menu()->htmlfy($page);
}

ну и уже обрамляете элементы как вам нужно.

отличное решение. на знал такого. спасибо ;)
спасибо, это лучшее решение
Блин, google монстр, нашел ваш топик :)
Спасибо, а то я уже хотел отказываться от Zend_Navigation
Для большинства приложений строится один объект навигации и один ACL список. Поэтому можно менюшку положить в Zend_Registry::set('Zend_Navigation', $AppNavigation) — хелперы сами найдут и не надо в лейоут пихать и указывать при вызове хелпера.

Используя скажем в бутстрапе
Zend_View_Helper_Navigation_HelperAbstract::setDefaultAcl($acl);
Zend_View_Helper_Navigation_HelperAbstract::setDefaultRole($RoleName);

можно задать и acl сразу.
а я и просмотрел такую возможность. спасибо. сейчас добавлю в статью ;)
Спасибо за статью. По ней и пытаюсь изучать ZF.

У меня совсем, наверно, ламерский вопрос…
Вот есть, контроллеры и экшены. Например, у меня вся менюшка — это список из того же контроллера и того же экшена, но я хочу еще передавать айдишник. Я еще пока что не очень разобралась в Роутерах… догадываюсь, что нужно их использовать. Но это получается нужно на каждый пункт меню задавать новый Роутер или можно как-то попроще, по-другому? Как вообще делают в таких случаях?

Приведу пример:
— автобусы (c: category, a: index, id: buses)
— грузовики (c: category, a: index, id: cars)
— тягачи (c: category, a: index, id: tractors)
и т.д.
просто как переменную передаешь. в дефолтном роутере переменные идут после экшена
controller/action/parametr/value/parametr/value
Спасибо. Оказывается, все правильно передавала, но забирала неправильно.
Вы придали мне уверенности хоть в одном действии, тогда уже нашлась и ошибка в другом :)
Спасибо. Оказывается, все правильно передавала, но забирала неправильно.
Вы придали мне уверенности хоть в одном действии, тогда уже нашлась и ошибка в другом :)
No Pasaran!
Кстати…
Если для рендера используется хелпер ViewRenderer, то ему необходимо передать экземпляр вида, который создается бутстраппером.

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{
protected function _initView(){
// Initialize view
$view = new Zend_View();

// Do something

// Add it to the ViewRenderer
$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
'ViewRenderer'
);
$viewRenderer->setView($view);

// Return it, so that it can be stored by the bootstrap
return $view;
}
}
не совсем вас понял.
Ну вот вы вью бутстрапите: $this->bootstrapView();
А потом в нем контейнер сохраняете: $view->menu = $container;
так?
А если в контроллерах используется инфлексия скриптов вида то хелпер, который рендерит эти скрипты сам создает себе вью и в нем не будет вашего $view->menu.
Хорошая статья. Попробую реализовать. Спасибо за наглядный пример.
Попробовал я компонент. Такой вот вопрос остался мне неясен. Пусть будет на примере блога. Что бы отображать хлебные крошки правильно:
категории -> запись ID -> статистика по записи, нужно сделать следущее — либо добавить в контейнер все записи блога и их подстраницы (что соответсвенно представляет здоровое полотно) либо динамически подгружать нужные странцы в контейнер в зависимости от открытой на данный момент страницы.
Вопрос в том, как правильнее нужно использовать компонент в этом случае.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории