Jump to content


Photo
- - - - -

Коварный вопрос


Best Answer Станислав , 08 August 2013 - 14:52

Кстати, на так называемом демонстрационном сайте итемы тоже почему--то разнесены по разным приложениям...

 

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

 

И вы правильно заметили по поводу "Как узнать возможности стороннего компонента (в данном случае JBZoo), как не применив его на практике?". В данном случае вами совершенно неумышленно была допущена ошибка на стадии проектирования, которая привела к проблемам при использовании конкретного продукта. Без ложной скромности скажу, что я знаю внутренности ZOO и JBZoo довольно неплохо, но работаю с ZOO еще с бета версии и более года с JBZoo, потому есть опыт и знание нюансов построения сложных приложений на JBZoo. Советуют вам правильно - переносите все в одно приложение и при необходимости дополнительно разделяйте типы категориями. С такой логикой построения каталога проблем не возникало. Если есть тип айтема - производитель и тип айтема - товар, то, например, привязать к производителю список производимых им товаров будет несложно (я так понял у вас задача примерно такого плана стоит). Если же разнести по разным экземплярам приложений (как в демо), то это уже вызывает дополнительные проблемы, с которыми вы и столкнулись.

Go to the full post


  • This topic is locked This topic is locked
22 replies to this topic

#11 mindguru

mindguru
  • Topic Starter
  • JBZoo User (rus)
  • User rate: -0.2
  • posts: 173
  • topics: 57

Posted 08 August 2013 - 14:00

Кстати, на так называемом демонстрационном сайте итемы тоже почему--то разнесены по разным приложениям...



Вы объем такого кода себе представляете?

 

 

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



Причем здесь поддержка, если вы совершили ошибку на стадии проектирования?

 

Отвечаю. Как узнать возможности стороннего компонента (в данном случае JBZoo), как не применив его на практике?


Edited by mindguru, 08 August 2013 - 13:56.

  • 0

Делай добро и бросай его в воду!


#12 Станислав

Станислав
  • JBZoo User (rus)
  • User rate: 18
  • posts: 211
  • topics: 7

Posted 08 August 2013 - 14:52   Best Answer

Кстати, на так называемом демонстрационном сайте итемы тоже почему--то разнесены по разным приложениям...

 

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

 

И вы правильно заметили по поводу "Как узнать возможности стороннего компонента (в данном случае JBZoo), как не применив его на практике?". В данном случае вами совершенно неумышленно была допущена ошибка на стадии проектирования, которая привела к проблемам при использовании конкретного продукта. Без ложной скромности скажу, что я знаю внутренности ZOO и JBZoo довольно неплохо, но работаю с ZOO еще с бета версии и более года с JBZoo, потому есть опыт и знание нюансов построения сложных приложений на JBZoo. Советуют вам правильно - переносите все в одно приложение и при необходимости дополнительно разделяйте типы категориями. С такой логикой построения каталога проблем не возникало. Если есть тип айтема - производитель и тип айтема - товар, то, например, привязать к производителю список производимых им товаров будет несложно (я так понял у вас задача примерно такого плана стоит). Если же разнести по разным экземплярам приложений (как в демо), то это уже вызывает дополнительные проблемы, с которыми вы и столкнулись.


  • 1

«Ну и зачем все это, лучше бы водки выпили». Из писем Белинского Гоголю.

 


#13 Sliapy

Sliapy
  • JBZoo User (rus)
  • User rate: 50.5
  • posts: 6393
  • topics: 15

Posted 08 August 2013 - 15:10

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


  • 0
[color=#aa0000]Не забывайте нажимать кнопку "Вопрос Решён" под сообщением, которое решило Вашу проблему.[/color]

#14 mindguru

mindguru
  • Topic Starter
  • JBZoo User (rus)
  • User rate: -0.2
  • posts: 173
  • topics: 57

Posted 08 August 2013 - 15:36

Для того, чтобы перенести, допустим, потребителей в товарный каталог, достаточно в записи каждого из них изменить всего-навсего одну ссылку - и вот они уже  в другом приложении! Что мы получаем:

+ Related Items (из-за чего всеь сыр-бор, собственно);

- настройки главной страницы приложения;

- в админке изначально все товары и производители будут в одной таблице (а если к ним ещё магазины добавить...);

- настройки шаблонов;

- поиск/фильтры;

- ограничения модулей...

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



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

 

Уважаемый joejoker! Давайте с костылями разберусь уже я сам несколько позже (после сдачи проекта), а Вы сейчас подскажите, какие костыли и где мне поставить.


  • 0

Делай добро и бросай его в воду!


#15 Станислав

Станислав
  • JBZoo User (rus)
  • User rate: 18
  • posts: 211
  • topics: 7

Posted 08 August 2013 - 17:20

Для того, чтобы перенести, допустим, потребителей в товарный каталог, достаточно в записи каждого из них изменить всего-навсего одну ссылку - и вот они уже  в другом приложении! Что мы получаем:

+ Related Items (из-за чего всеь сыр-бор, собственно);

- настройки главной страницы приложения;

- в админке изначально все товары и производители будут в одной таблице (а если к ним ещё магазины добавить...);

- настройки шаблонов;

- поиск/фильтры;

- ограничения модулей...

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

 

Думаю, вы несколько погорячились с выводами насчет минусов.

Я могу согласиться только насчет главной страницы в том виде как она есть.

 

По поводу остального, опять-таки - это вопрос опыта проектирования приложений на ZOO

 

- в админке изначально все товары и производители будут в одной таблице (а если к ним ещё магазины добавить...

 

Они и так находятся в одной физической таблице. Если речь идет о списках айтемов экзмпляров приложений, то у списков есть фильтры по типу айтемов и вы можете выбрать товары и производителей в 1 клик. Ровно столько же, сколько вы делаете переключаясь во вкладку другого приложения.

 

- настройки шаблонов;

 

Вы не можете настроить шаблоны по типу айтема, но я не зря упоминал о том, что каждому типу айтемов присваиваю свою категорию. Каждая категория имеет свои собственные настройки шаблонов и общие настройки. Вы можете настраивать их как угодно. Я не голословно утверждаю, что это именно так, а не иначе и реально работает. Вот вам пример вывода товаров разных типов в разных шаблонах из ОДНОГО каталога:

Шины - http://www.autokoles...mtel/nordmaster

Диски - http://www.autokoles.../advan/671-rg-d

Автотовары - http://www.autokolesa.com.ua/spares

 

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

wcwhzHD.jpg

 

 

Про фильтры, поиск и модули - то же самое, в этом вы можете убедиться на том же сайте. Обратите внимание на модули подбора шин и дисков справа на страницах http://www.autokolesa.com.ua/tyres и http://www.autokolesa.com.ua/wheels

Они ведь тоже настроены на фильтрацию из одного и того же приложения, где айтемы разных типов в одном и том же списке.

 

Если резюмировать, то располагая разные типы айтемов в одно приложение, мы на самом деле не имеем никаких проблем за исключением главной страницы. Да ито для себя я это ограничение обошел легким хаком:

1) вместо главной страницы в пункте меню указывается ссылка на категорию, привязанную в к типу айтема.

2) во все типы айтемов добавляется пользовательское поле "Избранное" с чекбоксом.

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

 

Mindgure, надеюсь, что мой пост поможет вам немного.


Edited by Станислав, 08 August 2013 - 17:22.

  • 3

«Ну и зачем все это, лучше бы водки выпили». Из писем Белинского Гоголю.

 


#16 mindguru

mindguru
  • Topic Starter
  • JBZoo User (rus)
  • User rate: -0.2
  • posts: 173
  • topics: 57

Posted 08 August 2013 - 18:10

Большое спасибо. Большой пост, содержательный. Думаю, на разбор потребуется какое-то время...

В любом случае - большое спасибо!

Кстати (ну это уж совсем оффтопик, просто к слову пришлось). Как Вы решаете проблему хлебных крошек? Поясню. Категории Zoo на моём сайте броузятся отдельным скриптом, с него же переход потом уже непосредственно на итем. Так вот, чтобы после перехода в хлебных крошках осталось название категории, обязательно нужно в ссылке указать Itemid пункта меню. Это означает обязательное создание пунктов меню по количеству категорий, что далеко не всегда бывает удобно. Что Вы посоветуете в этом случае?


  • 0

Делай добро и бросай его в воду!


#17 Станислав

Станислав
  • JBZoo User (rus)
  • User rate: 18
  • posts: 211
  • topics: 7

Posted 08 August 2013 - 20:38

Кстати (ну это уж совсем оффтопик, просто к слову пришлось). Как Вы решаете проблему хлебных крошек? Поясню. Категории Zoo на моём сайте броузятся отдельным скриптом, с него же переход потом уже непосредственно на итем. Так вот, чтобы после перехода в хлебных крошках осталось название категории, обязательно нужно в ссылке указать Itemid пункта меню. Это означает обязательное создание пунктов меню по количеству категорий, что далеко не всегда бывает удобно. Что Вы посоветуете в этом случае?

 

Ну это известная проблема (фича?) ZOO. Вот официальный срач по этому поводу :)

 

Чтобы сделать нормально, а критерием нормальности я считаю вид: category_level_1_alias / category_level_2_alias / ... /item_alias , и не использовать сторонние компоненты, то есть только один путь - переписывать роутер под себя.

 

Метода простая. В роутере вы отслеживаете id категории айтема и начинаете из таблиц zoo_category_item и zoo_categories по полю parent "раскручивать" дерево категорий от текущего уровня вверх до корня. Каждый уровень - это 1 уточняющий наличие родительской категории SQL запрос. Если у вас 1 категория - 1 запрос, 2 категории - 2 запроса и т.д. Раскрутив категории в динамические массив, потом вы по сегментам можете "собрать" требуемый путь, чтобы было красиво. То же самое можно делать при помощи объектной модели ZOO , используя методы класса Item - getRelatedCategoryIds(),  getPrimaryCategory(), getPrimaryCategoryId() и методов класса Category - hasChildren(), getParent(), getPathway().

 

У этого способа множество недостатков. Первый и самый важный: и при прямых запросах и при объектном программированни при количестве вложенности категорий более двух MySQL танцует ламбаду от навалившихся на него запросов на каждый генерящийся на странице линк. Если у вас 20 айтемов на странице категории 3ей вложенности - это +60 запросов. А если это 100 айтемов в табличном выводе с линками на "подробно"? Это уже 300. При высокой посещаемости проекта вам понадобится очень хороший сервер, да и то, не факт, что не будет космических лагов. Разработчикам сторонних роутеров пофиг - они продают коммерческое решение, не особо задумываясь о ресурсах пользователя, потому они акцентируют внимание на результат, а не на скорость работы продукта. Но смею вас заверить, приведенная мною методика с использованием SQL запросов - единственный путь получить требуемый результат, потому вы в любом случае получите нагрузку. Ну или надо линковать все категории и айтемы в меню, сохраняя иерархию. Думаю, что последний вариант для серьезного проекта не подходит.

 

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

 

Простой пример. Я начинающий сайтостроитель и не знаю что такое атрибуты товара, зато я научился делать категории и присваивать их в админке. Я продаю каски. Военные и строительные. Хаки и оранжевые. Я делаю категорию "По назначению" и в ней 2 подкатегории "Военные" и "Строительные", а потом еще делаю категорию "Цвет" и в ней 2 подкатегории "Хаки" и "Оранжевые". Товару "Строительная каска оранжевая" я присваиваю 2 категории - "По назначению/Строительная" и "Цвет/Оранжевые". Эта каска у нас отображается например в модуле ZOO Items. В данном случае линк на этот товар может иметь 2 абсолютно корректных пути -  "По назначению/Строительная/Строительная каска оранжевая" и "Цвет/Оранжевые/Строительная каска оранжевая". Какой путь будет выбран - зависит от прописанного в роутере алгоритма: используется ли проверка множественности категорий, и если да, то какая именно запись принадлежности айтема к категории из zoo_category_item будет использована - та что, про назначение или та, что про цвета. 

 

Думаю, что совокупность этих недостатков, в конченом итоге, и привела разработчиков ZOO именно к тому решению, которое мы видим в данный момент.

Иногда "продвинутые" SEF-помешанные клиенты все-таки настаивают, потому рождаются компромиссы. Пример с того же сайта
http://autokolesa.com.ua/tyres - имеем путь Главные / Шины (это из меню)

 

Далее кликаем на бренд, попадаем сюда - http://autokolesa.com.ua/tyres/amtel и путь у нас Главная / Шины / Amtel. Это уже сгенерировано роутером, который убрал "category" иначе визуально было бы http://autokolesa.co...ategory/amtel.  Тем не менее, если пойти по "классическому" варианту, то он все равно работает, потому что мы предусмотрительные и пишем только качественные продукты :)

 

Далее кликаем на категорию Nordmaster, попадем сюда http://autokolesa.co...mtel/nordmaster и путь выглядит как хотел заказчик Главная / Шины / Amtel / NordMaster (Главная / Тип товара / Бренд / Модель ).

 

В итоге мы попадаем на страницу с тизерами 4 товаров в табличном виде, при это роутер делает 8 запросов: по 2 запроса на каждый айтем. Вроде немного. Но есть модели с большим количеством типоразмеров, от 30 и выше, это было 60 с лишним запросов и профайлер SQL явно показывал, что надо что-то делать. А сделано было вот что. Ввиду небольшого количества категорий первого уровня я жестко забил в роутер id категорий первого уровня, тем самым сэкономив 1 запрос на каждом уровне. При 30 запросах результаты стали приемлемые, а ввиду того, что категории первого уровня не меняются вообще, то клиент получил, что хотел, и с приемлемой скоростью работы, а я получил необходимость каждый раз восстанавливать модифицированный роутер при апдейте Zoo и теоретическую необходимость дорабатывать роутер, если клиенту вздумается добавить еще одну категорию первого уровня.

 

Вот теперь и думайте, надо ли такой ценой красивые "хлебные крошки" и красивые структурированные URL ;)



Кстати (ну это уж совсем оффтопик, просто к слову пришлось). Как Вы решаете проблему хлебных крошек? Поясню. Категории Zoo на моём сайте броузятся отдельным скриптом, с него же переход потом уже непосредственно на итем. Так вот, чтобы после перехода в хлебных крошках осталось название категории, обязательно нужно в ссылке указать Itemid пункта меню. Это означает обязательное создание пунктов меню по количеству категорий, что далеко не всегда бывает удобно. Что Вы посоветуете в этом случае?

 

Ну это известная проблема (фича?) ZOO. Вот официальный срач по этому поводу :)

 

Чтобы сделать нормально, а критерием нормальности я считаю вид: category_level_1_alias / category_level_2_alias / ... /item_alias , и не использовать сторонние компоненты, то есть только один путь - переписывать роутер под себя.

 

Метода простая. В роутере вы отслеживаете id категории айтема и начинаете из таблиц zoo_category_item и zoo_categories по полю parent "раскручивать" дерево категорий от текущего уровня вверх до корня. Каждый уровень - это 1 уточняющий наличие родительской категории SQL запрос. Если у вас 1 категория - 1 запрос, 2 категории - 2 запроса и т.д. Раскрутив категории в динамические массив, потом вы по сегментам можете "собрать" требуемый путь, чтобы было красиво. То же самое можно делать при помощи объектной модели ZOO , используя методы класса Item - getRelatedCategoryIds(),  getPrimaryCategory(), getPrimaryCategoryId() и методов класса Category - hasChildren(), getParent(), getPathway().

 

У этого способа множество недостатков. Первый и самый важный: и при прямых запросах и при объектном программированни при количестве вложенности категорий более двух MySQL танцует ламбаду от навалившихся на него запросов на каждый генерящийся на странице линк. Если у вас 20 айтемов на странице категории 3ей вложенности - это +60 запросов. А если это 100 айтемов в табличном выводе с линками на "подробно"? Это уже 300. При высокой посещаемости проекта вам понадобится очень хороший сервер, да и то, не факт, что не будет космических лагов. Разработчикам сторонних роутеров пофиг - они продают коммерческое решение, не особо задумываясь о ресурсах пользователя, потому они акцентируют внимание на результат, а не на скорость работы продукта. Но смею вас заверить, приведенная мною методика с использованием SQL запросов - единственный путь получить требуемый результат, потому вы в любом случае получите нагрузку. Ну или надо линковать все категории и айтемы в меню, сохраняя иерархию. Думаю, что последний вариант для серьезного проекта не подходит.

 

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

 

Простой пример. Я начинающий сайтостроитель и не знаю что такое атрибуты товара, зато я научился делать категории и присваивать их в админке. Я продаю каски. Военные и строительные. Хаки и оранжевые. Я делаю категорию "По назначению" и в ней 2 подкатегории "Военные" и "Строительные", а потом еще делаю категорию "Цвет" и в ней 2 подкатегории "Хаки" и "Оранжевые". Товару "Строительная каска оранжевая" я присваиваю 2 категории - "По назначению/Строительная" и "Цвет/Оранжевые". Эта каска у нас отображается например в модуле ZOO Items. В данном случае линк на этот товар может иметь 2 абсолютно корректных пути -  "По назначению/Строительная/Строительная каска оранжевая" и "Цвет/Оранжевые/Строительная каска оранжевая". Какой путь будет выбран - зависит от прописанного в роутере алгоритма: используется ли проверка множественности категорий, и если да, то какая именно запись принадлежности айтема к категории из zoo_category_item будет использована - та что, про назначение или та, что про цвета. 

 

Думаю, что совокупность этих недостатков, в конечном итоге, и привела разработчиков ZOO именно к тому решению, которое мы видим в данный момент.
 

Иногда "продвинутые" SEF-помешанные клиенты все-таки настаивают, потому рождаются компромиссы. Пример с того же сайта
http://autokolesa.com.ua/tyres - имеем путь Главные / Шины (это из меню)

Далее кликаем на бренд, попадаем сюда - http://autokolesa.com.ua/tyres/amtel и путь у нас Главная / Шины / Amtel. Это уже сгенерировано роутером, который убрал "category" иначе визуально было бы http://autokolesa.co...ategory/amtel.  Тем не менее, если пойти по "классическому" варианту, то он все равно работает, потому что мы предусмотрительные и пишем только качественные продукты  

Далее кликаем на категорию Nordmaster, попадем сюда http://autokolesa.co...mtel/nordmaster и путь выглядит как хотел заказчик Главная / Шины / Amtel / NordMaster (Главная / Тип товара / Бренд / Модель ).

В итоге мы попадаем на страницу с тизерами 4 товаров в табличном виде, при это роутер делает 8 запросов: по 2 запроса на каждый айтем. Вроде немного. Но есть модели с большим количеством типоразмеров, от 30 и выше, это было 60 с лишним запросов и профайлер SQL явно показывал, что надо что-то делать. А сделано было вот что. Ввиду небольшого количества категорий первого уровня я жестко забил в роутер id категорий первого уровня, тем самым сэкономив 1 запрос на каждом уровне. При 30 запросах результаты стали приемлемые, а ввиду того, что категории первого уровня не меняются вообще, то клиент получил, что хотел, и с приемлемой скоростью работы, а я получил необходимость каждый раз восстанавливать модифицированный роутер при апдейте Zoo и теоретическую необходимость дорабатывать роутер, если клиенту вздумается добавить еще одну категорию первого уровня.

Вот теперь и думайте, надо ли такой ценой красивые "хлебные крошки" и красивые структурированные URL 


Edited by Станислав, 08 August 2013 - 20:39.

  • 2

«Ну и зачем все это, лучше бы водки выпили». Из писем Белинского Гоголю.

 


#18 mindguru

mindguru
  • Topic Starter
  • JBZoo User (rus)
  • User rate: -0.2
  • posts: 173
  • topics: 57

Posted 09 August 2013 - 10:32

То Станислав:

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

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

2. Если речь идет о списках айтемов экзмпляров приложений, то у списков есть фильтры по типу айтемов и вы можете выбрать товары и производителей в 1 клик. Ровно столько же, сколько вы делаете переключаясь во вкладку другого приложения.

Может быть. Но лично для меня нажать на вкладку выглядит более логично.

3. смею вас заверить, приведенная мною методика с использованием SQL запросов - единственный путь получить требуемый результат

Высоконагруженный вариант, поэтому далеко не всегда приемлемый.

4. Ну или надо линковать все категории и айтемы в меню, сохраняя иерархию. Думаю, что последний вариант для серьезного проекта не подходит.

Почему же? Просто при создании любой категории динамически создаётся пункт меню. Зато нагрузка на сервер при генерации страницы в разы меньше.

А вообще - спасибо, что поделились опытом. Разработчики как-то затихли...


  • 0

Делай добро и бросай его в воду!


#19 Sliapy

Sliapy
  • JBZoo User (rus)
  • User rate: 50.5
  • posts: 6393
  • topics: 15

Posted 09 August 2013 - 11:32

А каких еще ответов Вы ждете от разработчиков? В их задачи не входит обучение Вас написанию каких-то элементов или доработка компонента под Ваши нужды.


  • 0
[color=#aa0000]Не забывайте нажимать кнопку "Вопрос Решён" под сообщением, которое решило Вашу проблему.[/color]

#20 mindguru

mindguru
  • Topic Starter
  • JBZoo User (rus)
  • User rate: -0.2
  • posts: 173
  • topics: 57

Posted 09 August 2013 - 11:41

После вчерашних разговоров о философии я уже ничего не жду. Ясно ведь сказали: НЕВОЗМОЖНО. Только сомнения ведь всё равно есть...



мне никто так толком и не обьяснил, в чём конкретно проблема вывести на одной странице итемы разных типов из разных приложений.

  • 0

Делай добро и бросай его в воду!





Click to return to top of page in style!