как переопределить рендеринг зоны навигации в Orchard CMS?

Я новичок в Orchard, поэтому, вероятно, понятия не имею, что делаю.

Я понял, как переопределить разные фигуры, но поместив файл cshtml в папку «Просмотр» с тем же именем, что и фигура.

Кроме того, я нашел файлы cshtml формы Menu и MenuItem в файлах Core Orchard.

Однако я не вижу фигуры с именем «Навигация» и не совсем понимаю, как работают зоны.

Я искал код и не мог точно понять, как отображается навигация, хотя я нашел часть кода.

Причина, по которой я хочу переопределить рендеринг навигации, заключается в том, что он отображает теги DIV и NAV вокруг UL. Я бы предпочел просто отображать NAV и UL.


person Zack    schedule 29.05.2011    source источник


Ответы (2)


Зоны также являются фигурами, но они объявлены в коде (Core/Shapes/CoreShapes.cs), а не в файлах .cshtml, как большинство фигур. Кроме того, отсутствует фигура под названием «Навигация», так как зоны создаются динамически во время выполнения — их имена предоставляются используемой темой.

Зоны имеют альтернативы по умолчанию в виде Zone__[ZoneName]. Это означает, что вам просто нужно поместить файл Zone-Navigation.cshtml в папку /Views в папке вашей темы. чтобы переопределить визуализацию зоны навигации.

person Piotr Szmyd    schedule 29.05.2011
comment
благодаря. Это сработало, но я не знаю, как отобразить форму меню с навигационными данными или как получить доступ к навигационным данным, чтобы самому создать меню. Вызов @Display(Model.Menu) не работает. - person Zack; 30.05.2011
comment
Menu (отображает элемент nav) и MenuItem (отображает один элемент) являются фигурами, поэтому их можно переопределить, поместив Menu.cshtml и/или файлы MenuItem.cshtml в папке /View вашей темы. Посмотрите, как рендерятся стандартные — вы можете найти их в папке Core/Shapes/Views. Кстати, метод @Display() используется для рендеринга объекта формы (и он должен быть предоставлен). Если вам нужно визуализировать содержимое зоны вручную, приведите модель (которая содержит текущий объект формы зоны) к IEnumerable‹dynamic› и вызовите Display(item) для каждого элемента. - person Piotr Szmyd; 30.05.2011
comment
Для пояснения: каждый объект фигуры (который доступен в файле .cshtml как свойство модели) реализует динамический интерфейс IEnumerable и может содержать другие дочерние фигуры (например, форму меню в зоне навигации). Вот почему вы можете свободно преобразовать его в IEnumerable‹dynamic› и получить доступ к дочерним элементам (если они есть) в цикле foreach. - person Piotr Szmyd; 30.05.2011
comment
Это интересно, а я этого не знал. Все еще не уверен, что полностью понимаю это, но Menu.cshtml и MenuItem.cshtml уже делают то, что я хочу. Я бы хотел переопределить их только в том случае, если бы я не смог добиться желаемого изменения в навигации. Настоящая проблема заключается в том, что теперь, когда навигация отображается, она отображает DIV, который окружает все содержимое, чего я не хочу. Я могу переопределить Навигацию с помощью Zone-Navigation.cshtml, как вы предложили, но теперь я не знаю, как заставить Menu.cshtml правильно отображаться. Я пытался вызвать @Display(Model.Menu), но вообще ничего не отображается. - person Zack; 30.05.2011
comment
Я только что обнаружил, что если я создаю Zone-Navigation.cshtml и внутри этого файла я вызываю @DisplayChildrent(Model), он делает именно то, что я пытался сделать. Я просто не понимаю, почему именно? Я копался в объекте «Модель» и не смог найти никаких данных, поэтому я не знаю, как DisplayChildren знал, что нужно отображать форму меню, или откуда он извлек данные меню для построения формы. Я не могу понять, какая информация содержится в модели - person Zack; 30.05.2011
comment
Еще одна вещь: в качестве эксперимента я попытался привести модель к IEnumerable‹dynamic› и запустил на ней цикл foreach(). После того, как я написал цикл, я не знал, что делать с элементами, которые я собирался перебирать, поэтому я просто вызвал ToString(). Когда я это сделал, там был один элемент, и он назывался ShapeProxy3e96a40aca6c4604a7fc374cf0889153. Я пробовал искать разные свойства, такие как .Text, но не знал, что с ним делать. Я попытался внедрить еще один цикл foreach, думая, что у него может быть дочерний элемент Menu, у которого есть дочерние элементы MenuItem, но это не сработало или я сделал это неправильно. - person Zack; 30.05.2011
comment
Это сработало!@{ IEnumerable<dynamic> m = (IEnumerable<dynamic>)Model; } <ol> @foreach (var i in m) { <li> <ol> @foreach (var j in i) { <li>@j.Text</li> } </ol> </li> } </ol> - person Zack; 30.05.2011
comment
Рад, что у вас получилось! Метод @DisplayChildren объявлен в объекте Orchard.Mvc.ViewEngines.Razor.WebViewPage. Он просто перебирает фигуру и вызывает Display(...) для каждого объекта. Фигуры являются динамическими, и большинство их свойств добавляются во время выполнения, поэтому, к сожалению, в отладчике мало что можно увидеть. Форма меню создается и добавляется в зону навигации в классе Orchard.UI.Navigation.MenuFilter (строки 44-52). Элементы выбираются через метод INavigationManager.BuildMenu(), вызов которого вы также можете увидеть там. - person Piotr Szmyd; 30.05.2011

Если вы используете последнюю версию 1.1.3, вы можете использовать новый инструмент трассировки формы из модуль инструментов дизайнера. Он предоставляет список альтернативных URL-адресов для имени вашего шаблона, чтобы переопределить рендеринг по умолчанию.

person David Glenn    schedule 29.05.2011