Тип отображения виджета Orchard CMS

У меня есть виджет, который использует запрос для отображения деталей. Можно ли указать тип отображения виджета (запрос использует сводку, и все отображается так, как я хочу), потому что заголовок виджета имеет тип отображения сведений, и я хочу, чтобы он использовал сводку, чтобы я мог переопределить форму когда я помещаю его в разные разделы (в основном текст заголовка), но когда я в зоне контента, я бы хотел, чтобы это были подробности. Я использую тему начальной загрузки. Так что, в основном, если я вставлю свой виджет в любое место, кроме контента, я хочу, чтобы он использовал сводку

Надеюсь, это имеет смысл.

Спасибо


person Jonnymaboy    schedule 06.02.2013    source источник
comment
Не уверен, что точно понимаю, что вы пытаетесь сделать, но похоже, что вы ищете альтернативные виджеты, а не меняете тип отображения.   -  person Bertrand Le Roy    schedule 06.02.2013
comment
Я надеялся сделать это с помощью альтернативного типа отображения, но виджет каждый раз отображается как детали типа отображения, поэтому мне особо нечего делать. Если при создании виджета вы можете указать его вид или что-то подобное. Возможно, я ошибаюсь, но не могу найти альтернативу.   -  person Jonnymaboy    schedule 07.02.2013
comment
@BertrandLeRoy, я перепробовал множество перезаписей фигур, но у них есть только: display(model.content) нет доступа к заголовку или любым другим частям. Мне не хватает трюка, так как я не могу найти, как изменить простую вещь, например, как изменить отображаемый заголовок виджета, т.е. сделать его h3 вместо h2 и т. д.   -  person Jonnymaboy    schedule 07.02.2013
comment
Не альтернативный тип отображения, чередуется. Вам не нужен другой тип дисплея. См. docs.orchardproject.net/Documentation/Alternates. В частности, для виджетов убедитесь, что вы включили виджет чередует функцию. Функция отслеживания формы может помочь вам понять, какую альтернативу использовать (но не включайте ее в рабочей версии).   -  person Bertrand Le Roy    schedule 07.02.2013


Ответы (1)


Ах, мы снова встретимся.

Виджеты создаются и внедряются в макет в классе с именем Orchard.Widgets.Filters.WidgetFilter. Кажется, нет никакого способа изменить тип отображения, используемый для виджета (по умолчанию WidgetFilter использует значение по умолчанию «Подробно»).

Чтобы обойти это, вы можете использовать собственную реализацию WidgetFilter. Скопируйте существующий код в свой собственный класс и добавьте в него атрибут [OrchardSuppressDependency("Orchard.Widgets.Filters.WidgetFilter")]. Это гарантирует, что существующий WidgetFilter не используется, а ваш.

Если вы прочитаете метод OnResultExecuting, то увидите, что в самом конце есть вызов BuildDisplay. Вторым аргументом этого метода может быть тип отображения. Вы можете проверить widgetPart.Record.Zone, чтобы увидеть, где был размещен виджет, и соответственно передать разные значения для параметра displayType.

Я не уверен, что это самый элегантный способ, но я бы начал именно с него. Возможно, у кого-то есть более аккуратное решение.

person mdm    schedule 06.02.2013
comment
Я не следую этому решению (вероятно, моя вина). Во-первых, я надеюсь, что вам не придется делать что-то столь тяжелое, как замена части структуры виджетов. Кроме того, похоже, что ваше решение сохраняет DisplayType, и я думаю, что @Jon хочет получить это значение динамически на основе информации о времени выполнения. Я неправильно это понял? - person Phillip Scott Givens; 06.02.2013
comment
@Philip Вы правы, я, должно быть, немного увлекся своим примером - отредактировал, чтобы более прямо ответить на вопрос Джона. Я бы не сказал, что замена части фреймворка виджетов — это тяжелая работа, все это спроектировано таким образом, чтобы его можно было переопределить. - person mdm; 06.02.2013
comment
@Philip Вы сделали меня параноиком из-за того, что я пропустил что-то болезненно очевидное сейчас;) Насколько я вижу, как только вы попадаете в BuildDisplay IContentManager, тип отображения становится неизменным, потому что он передается в BuildDisplayContext. Таким образом, вы можете получить доступ к типу отображения в разработчиках IContentHandler и IContentTemplateFilter, но не изменить его. Я все еще изучаю Orchard, так что докажите мне, что я не прав! - person mdm; 06.02.2013
comment
mdm еще раз спасибо за помощь, вы, кажется, гуру садоводства. Я углублюсь в код из вашего ответа, чтобы посмотреть, что я могу сделать. @Philip Я, хотя, возможно, при создании виджета можно каким-то образом указать ему использовать определенный тип отображения, например: сводку или подробности. Затем я могу создать переопределение формы для соответствующего. Но из вышесказанного это кажется несложным, если это возможно. Может быть, есть лучшее решение, любые другие идеи. Спасибо - person Jonnymaboy; 06.02.2013
comment
Прошло некоторое время с тех пор, как я глубоко копался в Orchard, поэтому я не предлагаю ответа. Однако я надеюсь, что вы сможете получить доступ к этой информации в драйвере или решить ее, создав более настраиваемый файл cshtml. Я почти уверен, что последнее возможно. Поэкспериментируйте с Инструментами дизайнера из вашей среды разработки, и вы должен быть в состоянии переопределить почти все, что вам нужно в шаблоне cshtml (razor). Ищите видео на нем. С этим вы можете найти свой ответ. И не забудьте разместить решение здесь. - person Phillip Scott Givens; 06.02.2013
comment
@PhillipScottGivens Я также рассмотрю инструменты дизайнера. Я буду держать пост в актуальном состоянии с любым решением или дальнейшими вопросами, которые будут более вероятными. Спасибо - person Jonnymaboy; 06.02.2013
comment
Я сделал это, используя несколько переопределений фигур, например, asidefirst/second и снова для других мест, где я помещал виджет. Кажется излишним, как если бы у меня был доступ к типу отображения, я мог бы использовать только переопределение сводного макета. Может быть, я делаю или смотрю на это неправильно, но у меня это работает. у меня есть другие проблемы, но я буду публиковать новые вопросы по мере их возникновения. Спасибо всем - person Jonnymaboy; 07.02.2013