Лучший способ сделать произвольное количество разнородных предметов? - PullRequest
2 голосов
/ 16 августа 2011

У меня есть страница оформления заказа на моем сайте, на которой перечислены товары, которые покупатель покупает ... и под основным списком находится раздел "Подробная накладная", где они могут видеть конкретную информацию о каждом. До сих пор у меня было только два разных типа предметов, которые можно было купить, поэтому подробный список был довольно прост в обращении. Теперь я добавляю четыре дополнительных и совершенно разных предмета, которые можно приобрести ... поэтому вопрос: каков хороший способ обработки такого рода рендеринга с использованием подслоев Sitecore? (В настоящее время я просто использую Repeater и скрываю / показываю соответствующие поля)

Хорошей новостью является то, что для каждой позиции в заказе есть связанный экземпляр элемента Sitecore. Если бы API Sitecore лучше подходил для объектно-ориентированной методологии, я мог бы создать метод Render () для каждого из моих рассматриваемых типов объектов. Но, конечно, каждый из них является объектом Sitecore.Data.Items.Item. Подкласс Это кажется излишним только для этой задачи ...

Что-то, что я рассмотрел, это Sublayout / пользовательский элемент управления для каждого отдельного типа элемента ... и затем динамически добавьте их в Placeholder на странице счета. Это кажется разумным ... Мысли? Недостатком является уродливый код, который должен сопоставить пользовательский элемент управления с элементом ... возможно, на основе TemplateID?

В любом случае, просто ищу здесь несколько предложений.

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Создание классов для представления данных Sitecore не является необоснованной идеей.Это идеальный сценарий для этого.Всякий раз, когда я строю проект, у меня всегда есть классы, сгенерированные с помощью Custom Item Generator на случай, если мне понадобится доступ к полям для конкретного шаблона.Я также делаю все как подслуги, чтобы я мог видеть вашу дилемму.

Все ли / большинство полей уникальны для каждого продукта?У вас нет универсального шаблона продукта, который использует каждый экземпляр продукта?

Вот варианты, которые я могу придумать сам (от худшего до лучшего ИМО):

  1. Создатькласс для представления каждого уникального шаблона. Генератор пользовательских предметов может работать, но может сбить вас с толку с первого раза.Вы всегда можете создать свои собственные классы, где вы передаете элемент Sitecore в конструктор и создаете свойства для доступа к полям.Затем используйте обычные элементы управления .NET и свяжите данные с внешним интерфейсом, основываясь на том, какой шаблон использует ваш элемент, и используйте класс строгого типа для шаблона.Скорее всего, это будет грязный код многих if-else.

  2. Создайте уникальный подслой для каждого уникального шаблона в Sitecore.В своем повторителе, который перебирает элементы, основываясь на том, какой шаблон элемента, добавьте правый подслой к заполнителю, используя new Sublayout() и установите DataSource в качестве элемента Sitecore (здесь код для доступа к источнику данных ).Таким образом, вы абстрагируете реализацию для каждого уникального шаблона.

  3. Создайте классы для каждого шаблона, как упомянуто в # 1, но абстрагируйте их через интерфейс.В вашем репитере ItemDataBound реализуйте данные через интерфейс.Это сильно зависит от того, как поля сравниваются и сравниваются от шаблона к шаблону.Если вы можете заставить себя сократить уникальные поля до членов интерфейса, то каждый класс, представляющий шаблон, может просто реализовать ваш интерфейс.Это позволяет в будущем добавлять более уникальные шаблоны, если вы продолжите реализовывать интерфейс.

1 голос
/ 16 августа 2011

Мне кажется, это хорошее место для использования шаблона Sitecore «Инверсия управления представлением» (названного Aware Web).

http://www.awareweb.com/AwareBlog/Presentation%20Inversion%20of%20Control%20part%202.aspx

Хотя пост в блоге обсуждает это больше в контексте размещенных пользователем элементов, он работает и здесь.Если у вас есть шаблон для каждого типа продукта, вы можете определить детали презентации для каждого (возможно, на отдельном устройстве), которые определяют элемент управления, который может отображать этот элемент в корзине.Затем вы можете прочитать RenderingReference с элемента и поместить их на страницу.Это создает гибкую, расширяемую систему, которая позволяет обрабатывать разные выходные данные для разных типов продуктов.

Это близко к описанному вами решению (подуровень для каждого типа продукта), но позволяет подуровню быть даннымиуправляется вместо условной логики для каждого шаблона.(Обратите внимание, что вам также необходимо назначить фиктивную "основную раскладку" в деталях презентации.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...