Zend framework как сделать пункт меню активным

Обновлено: 07.07.2024

Помощники действий (action helpers) дают разработчикам возможность добавлять функционал во время выполнения или по требованию в любые контроллеры действий, которые наследуют от Zend_Controller_Action. Помощники действий помогают снизить необходимость в наследовании от абстрактного контроллера действий при добавлении общего функционала в контроллер действий.

Есть несколько вариантов использования помощников действий. Помощники действий используют брокерскую систему (brokerage system), подобную той, которая используется в Zend_View_Helper и Zend_Controller_Plugin. Помощники действий (как и Zend_View_Helper ) могут быть загружены и вызваны по требованию, либо инстанцироваться во время запроса (начальной загрузки) или создания контроллера действий (init()). Для того, чтобы лучше разобраться с этим, см. ниже раздел по использованию.

7.8.2. Инициализация помощника

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

Брокер помощников хранится как член $_helper класса Zend_Controller_Action ; используйте брокер для получения или вызова помощников. Методы для этого включают в себя:

Явное использование метода getHelper() . Просто передайте ему имя, и будет возвращен объект помощника:

Используйте функционал "волшебного" метода __get() брокера помощников - извлекайте помощника так же, как если бы он был свойством этого брокера:

И наконец, большинство помощников действий реализует метод direct() , который будет вызывать особый, используемый по умолчанию метод в помощнике. Например, в случае FlashMessenger будет вызван метод addMessage() :

Все примеры выше функционально эквивалентны.

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

7.8.3. Брокер помощников

Zend_Controller_Action_HelperBroker управляет регистрацией объектов помощников и путей к помощникам, а также извлечением помощников по требованию.

Для того, чтобы зарегистрировать помощника через брокер, используйте addHelper :

Само собой, инстанцирование и передача помощников брокеру отнимают некоторое время и ресурсы, поэтому существуют два метода для некоторой автоматизации: addPrefix() и addPath() .

addPrefix() принимает префикс класса и использует его для определения пути, по которому определен класс помощника. Подразумевается, что префикс следует соглашениям по именованию классов Zend Framework-а.

addPath() принимает директорию в качестве первого аргумента и префикс класса в качестве второго (по умолчанию это 'Zend_Controller_Action_Helper'). Это позволяет поставить в соответствие определенным директориям собственные префиксы классов.

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

Для определения того, есть ли помощник в брокере, используйте hasHelper($name) , где $name - короткое имя помощника (без префикса):

Оба метода принимают единственный аргумент, $name , который является коротким именем помощника (без префикса).

7.8.4. Встроенные помощники действий

7.8.4.1. ActionStack

Помощник ActionStack позволяет помещать в стек запросы к плагину ActionStack фронт-контроллера, помогая эффективно создавать очереди действий, выполняемых в течение запроса. Этот помощник позволяет добавлять действия посредством установки новых объектов запросов или наборов действие/контроллер/модуль.

При вызове помощника ActionStack неявным образом регистрируется плагин ActionStack . Это значит, что нет необходимости явным образом регистрировать плагин ActionStack для того, чтобы использовать его функционал.

Пример 7.2. Добавление задачи с использованием имен действия, контроллера и модуля

Зачастую наиболее простым способом будет указание действия, контроллера и модуля (и необязательных параметров запроса), почти так же, как если бы вы вызывали Zend_Controller_Action::_forward() :

Пример 7.3. Добавление задачи с использованием объекта запроса

Иногда имеет смысл использовать объект запроса, что более соответствует духу ООП. Объект запроса тоже можно передавать помощнику ActionStack .

7.8.4.2. AutoComplete

Поскольку не все JavaScript-библиотеки реализуют автодополнение одинаково, то помощник AutoComplete предоставляет в абстрактном классе некоторый базовый функционал, необходимый для большинства библиотек, и конкретные реализации для отдельных библиотек. Возвращаемые данные в основном - JSON-массивы строк, JSON-массивы массивов (в которых каждый массив-член является ассоциативным массивом метаданных, используемых при создании списка), либо HTML.

Базовое использование одинаково для всех реализаций:

По умолчанию этот помощник делает следующее:

Отключает макеты и ViewRenderer.

Устанавливает необходимые заголовки ответа.

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

Доступные методы помощника включают в себя:

disableLayouts() может использоваться для отключения макетов и ViewRenderer. Обычно он вызывается в prepareAutoCompletion() .

encodeJson($data, $keepLayouts = false) будет кодировать данные в формат JSON, при этом можно опционально включать или отключать макеты. Обычно этот метод вызывается в prepareAutoCompletion() .

prepareAutoCompletion($data, $keepLayouts = false) используется для подготовки ответа в формате, необходимом для конкретной реализации, при этом можно опционально включать или отключать макеты. Возвращаемое значение может варьироваться в зависимости от используемой реализации.

sendAutoCompletion($data, $keepLayouts = false) используется для отправки данных в формате, необходимом для конкретной реализации. Он вызывает prepareAutoCompletion() и затем отправляет ответ.

direct($data, $sendNow = true, $keepLayouts = false) используется, когда помощник вызывается как метод брокера помощников. Флаг $sendNow используется для определения того, какой метод вызывать - sendAutoCompletion() или prepareAutoCompletion() . По умолчанию ответ отправляется сразу.

В настоящее время AutoComplete поддерживает AJAX-библиотеки Dojo и Scriptaculous.

7.8.4.2.1. Автодополнение c Dojo

В Dojo нет собственно виджета для автодополнения, но он имеет два виджета, которые могут производить автодополнение: ComboBox и FilteringSelect. В обоих случаях они требуют использования хранилища данных, который реализует QueryReadStore, читайте документацию по dojo.data для получения более подробной информации по этой теме.

В Zend Framework вы можете передавать простой индексный массив для помощника AutoCompleteDojo, и он будет возвращен в формате, пригодном для использования с хранилищем в Dojo:

Пример 7.4. Автодополнение с Dojo и Zend MVC

Автодополнение с Dojo через Zend MVC требует реализации нескольких вещей: генерация объекта формы для того ComboBox, для которого нужно реализовать автодополнение, действие контроллера для обслуживания автодополнения, создание своего QueryReadStore для связи с этим действием и генерация javascript-кода для инициализации автодополнения.

Для начала рассмотрим, что нужно сделать по части javascript. Dojo представляет собой полный фреймворк для создания объектно-ориентированного кода на языке JavaScript, почти так же, как Zend Framework на языке PHP. Он позволяет создавать псевдопространства имен, используя для этого иерархию директорий. Создадим директорию 'custom' на том же уровне, что и директория Dojo. В этой директории создадим файл TestNameReadStore.js со следующим содержимым:

Этот класс просто наследует от класса QueryReadStore фреймворка Dojo, который сам по себе является абстрактным. Мы просто определяем метод, по которому производится запрос, и присваиваем его элементу 'test'.

Далее создадим элемент формы, для которого хотим реализовать автодополнение:

Здесь мы просто создаем форму с методами 'test' и 'go'. Метод 'test' добавляет несколько специальных, специфических для Dojo атрибутов: dojoType, store, autoComplete и hasDownArrow. Через 'dojoType' мы указываем, что создается ComboBox, он связан с хранилищем данных (ключ 'store') 'testStore'. Устанавливая 'autoComplete' в false, мы говорим Dojo, чтобы он не выбирал автоматически первое соответствие, а вместо этого показывал список соответсвий. Наконец, 'hasDownArrow' создает стрелку наподобие той, что присутствует в выпадающем списке, чтобы можно было выводить и убирать список соответствий.

Добавим метод для отображения формы и действие для обработки автодополнения:

В методе autocompleteAction() мы делаем несколько вещей. Сначала мы проверяем, был ли произведен POST-запрос и имеет ли параметр 'format' значение 'ajax', это помогает отсечь большинство ложных запросов. Далее мы получаем параметр 'test' и сравниваем его с нашими данными (здесь я намеренно опустил реализацию метода getData() , источники данных могут быть любыми). В конце выполнения передаем найденные соответствия помощнику AutoCompletion.

Теперь на очереди написание скрипта вида для страницы с формой. В нем нужно установить хранилище данных, вывести форму и подключить все необходимые библиотеки Dojo, включая наше хранилище данных. Ниже приведен скрипт вида с комментариями:

Обратите внимание на вызовы помощников видов, таких, как headStyle м headScript, - это метки заполнения, которые могут затем рендериться в HTML-заголовке скрипта макета.

У меня есть этот файл макета под названием menuAdmin. Я хочу каждый раз, когда данный контроллер и данное действие активны, показывать элемент "li" с определенным классом.

Итак, у меня есть следующее На моем menuAdmin.php :

Я ничего не получу с этим, и если я свалю: var_dump($this->controller); и var_dump($this->action); я получаю NULL NULL

  • Поэтому я считаю, что Зенд не запускает их в этот момент.

Вопрос : Как я могу выполнить такую задачу? Должен ли я следовать по этому пути? Если да, то как мой макет menuAdmin узнает о том, какой контроллер и действие находятся на месте?

Обновление: menuAdmin.php - это файл макета, расположенный внутри папки макетов в структуре Zend. Это большое приложение, и структура на месте уже такая - использование файлов макета в качестве меню, где это только один из них.

Таким образом, $this->controller и $this->action работают только внутри контроллера, OR если я явно передаю его в представление. В данном случае, однако, я хотел бы назвать его на макете. Почему именно там? Потому что, делая это, я могу сделать одно изменение и позволить этому изменению быть воспроизведенным во всех представлениях, которые используют этот макет.

Что касается вышеприведенных разъяснений, могут ли ваши ответы измениться ?

Обновление 2: я не знаю, актуально это или нет, но весь этот макет menuadmin вызывается из основного файла макета "layouts/main.php", и там мы имеем: <?php echo $this->render("menuadmin.php"); ?>

2 ответа

В настоящее время у меня есть Zend setup для поиска сценария макета в файле view/scripts/layout.phtml каждого модуля (т. е.: /application/modules/moduleName/scripts/layout.phtml). Это делается путем установки значения layout[] в nothing (blank) в файле application.ini ( resources.layout[] = ).

В зависимости от того, что такое menuAdmin.php , вы можете получить контроллер и действие различными способами.

Если ваш файл является контроллером, вы можете выполнить одно из следующих действий, все они делают одно и то же

В идеале вы должны использовать Zend_Navigation для этого.

Вместо этого вы должны использовать Zend_Navigation, так как это встроенная функция.

Edit: Чтобы ответить на ваш вопрос о значениях null "controller" и "action"; если вы не установили их в качестве параметров представления из контроллера или чего-то еще на уровне контроллера (помощника, плагина и т. Д.), Конечно, они будут пустыми.

Похожие вопросы:

Я создаю небольшую программу в Qt со строками меню (menuBar) с использованием C++, и я хотел бы знать, как отключить (например, отключить) пункт меню при активации определенной переменной. Возможно.

Вот в чем моя проблема. У меня есть сайт в drupal и некоторая структура меню. Когда адрес URL равен application/android/all android, пункт меню подсвечивается. Однако когда адрес URL равен.

В настоящее время у меня есть Zend setup для поиска сценария макета в файле view/scripts/layout.phtml каждого модуля (т. е.: /application/modules/moduleName/scripts/layout.phtml). Это делается путем.

Я разработал новое пользовательское расширение для раздела администратора magento. Виден пункт главного меню этого расширения в разделе администратора. Когда я нажимаю на этот пункт меню.

Я хочу сделать функциональность пользовательского расширения доступной через пункт меню в главном навигационном меню CKAN. Не знаю, как я могу добавить этот новый пункт меню из моего кода.

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

Я создал пункт главного меню для файла под названием Refresh , сопоставив ему CMD-R. Но по какой-то причине пункт главного меню отключается при запуске приложения. Настройки таковы: Но когда я.

Помощник Menu используется для отображения меню из контейнера навигации. По умолчанию меню будет создаваться с использованием тегов UL и LI. Возможно использование вспомогательных скриптов видов.

Методы помощника Menu

1) UlClass() gets/sets(получить/установить) класс (class) CSS, который будет использоваться при рендеринге.

2) OnlyActiveBranch() gets/sets (получить/установить) флаг, определяющий, должна ли выводиться только активная ветка из контейнера или нет.

3) RenderParents() gets/sets (получить/установить) флаг, определяющий, должны ли выводиться родители, если рендериться только активная ветка в контейнера. Если установить «FALSE», то рендериться будет только самое глубокое активное меню.

4) Partial() gets/sets (получить/установить) дополнительный скрипт вида, который должен быть использован для построения меню. Если скрипт установлен, то будет использоваться метод renderPartial(). Если не установлен то используется метод renderMenu(). В метод нужно передать String (строку) или Array (массив) из двух элементов. Если передана строка - то это имя скрипта. Если массив, то первый элемент должен быть имя дополнительного скрипта вида, второй - имя модуля, где располагается этот скрипт.

5) htmlify() - переопределяет метод от абстрактного класса, чтобы вернуть диапазон элементов, если страница не имеет HREF.

6) renderMenu($container = null, $options = array()) - является методом отображения по-умолчанию. Строит меню используя тег Ul. Если $container не указан, то будет использован при рендеринге контейнер, переданный в помощник. $options используется для переопределения параметров, указанных временно без перезаписи значений в экземпляре помощника. Представляет собой массив, каждый ключ которого соответствует опции помощника.

1) indent; отступ. Строка или целочисленное значение.

2) minDepth; минимальная глубина. Целочисленное значение или NULL (минимальная глубина).

3) maxDepth; максимальная глубина. Целочисленное значение или NULL (максимальная глубина).

4) ulClass; CSS класс (class) для элемента «ul». Строка.

5) onlyActiveBranch; Отображать только активную ветвь. Логическое значение.

6) renderParents; Отображать родителей или нет, если выбрано отображение только активной ветви. Логическое значение.

Если опции не указаны, то будут использованы те, что установлены в помощнике.

Меню формируется из контейнера, указанного в помощнике.

Обратите внимание, как фильтруются страницы на основе ACL.

Вызов renderMenu () напрямую

Меню рендериться без регистрации в помощнике с помощью renderMenu() напрямую и назначением нескольких опций.

Отображение самого глубокого активного меню

Отображение самого глубокого активного подменю в активной ветке с помощью renderSubMenu().

Вызов renderSubMenu($container, $ulClass, $indent) эквивалентен вызову renderMenu($container, $options) со следующими опциями:

Рендеринг (отображение, формирование) меню с максимальной глубино й

Рендеринг(отображение, формирование) меню с минимальной глубиной

Отображение только активной ветви

Отображение только активной ветви с минимальной глубиной

Отображение только активной ветви с максимальной глубиной

Отображение только активной ветви с минимальной глубиной и без родителей

Отображение пользовательского меню используя вспомогательный скрипт вида

Вызвав setPartial() Вы имеете возможность указать вспомогательный скрипт вида (partial view script).

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

Когда-то давным давно я сам задавался этой проблемой, пока не пришел к выводу, что бесполезно искать какие-то сторонние решения и решил создать свой скрипт, который легок для понимания любому мало-мальски подготовленному программисту в JavaScript, легко встраивается в любой шаблон, дизайн, в любую систему управления сайтом, хоть Joomla, хоть WordPress или иные. Итак, представляю Вашему вниманию активный пункт меню CSS и JavaScript.

Для начала подключаем между тегами <head> и </head> JQuery библиотеку, вот код.

Чтобы более наглядно продемонстрировать Вам всю возможность и порядок действий для начала создайте любое меню между тегами <body></body>, например, вот такое.

И вот, мы установили такое меню. Теперь наша задача сделать так, можно сказать, представить в голове, а потом кодом, как нам нужно, чтобы выглядел активный пункт меню при нахождении на соответствующей странице. Для этого мы будем использовать CSS и давайте придумаем класс для нашего активного пункта меню и назовем его active. Учтите, Вы можете назвать его как Вашей душе угодно. Вот примерный код.

Теперь я хотел немного пояснить вышепредставленный код и что он делает. Итак, это JavaScript код и он начинает функцию, которая сначала берет данные из нашего меню, а именно из нашего тега <a> нашего меню. Функция берет из адресной строки адрес, на котором мы сейчас находимся и присваивает его переменной location. Затем берет атрибут ссылки у нашего тега <a> и присваивает это значение переменной link, затем сравнивает эти две переменные, и если они равны, то есть мы находимся в данный момент именно на нужной нам странице, то с помощью функции addClass мы даем нашей ссылки новый класс active, стили оформления которого мы указали в CSS. Все, теперь все будет работать и Вы с легкостью сможете указывать любое меню с постоянной ссылкой.

Читайте также: