Вывод категорий с присоединением товара (вывод категории с изображением первого товара в ней)
Здравствуйте!
Прошу подсказать, где я ошибся:
Нужно вывести на главной странице сайта список подкатегорий товаров из заданной главной категории. В списке категория должна содержать Пункт меню и Изображение первого выбранного товара из этой категории. У подкаегорий могут быть дочерние подкатегории, то есть, глубина вложенности может быть разная. По сути, нужно решить старую задачу, которую разбирал Василий Наумкин вот тут https://bezumkin.ru/sections/tips_and_tricks/2058/.
Пытаюсь собрать результат вот так
Спасибо в карму всем, кто поделиться полезной информацией.
Прошу подсказать, где я ошибся:
Нужно вывести на главной странице сайта список подкатегорий товаров из заданной главной категории. В списке категория должна содержать Пункт меню и Изображение первого выбранного товара из этой категории. У подкаегорий могут быть дочерние подкатегории, то есть, глубина вложенности может быть разная. По сути, нужно решить старую задачу, которую разбирал Василий Наумкин вот тут https://bezumkin.ru/sections/tips_and_tricks/2058/.
Пытаюсь собрать результат вот так
{'msProducts'| snippet : [
'class' => 'msCategory',
'select' => '{
"msCategory":"msCategory.id,msCategory.parent,msCategory.menutitle,"
,"msProduct":"msProduct.id as product_id, msProduct.uri as product_uri, msProduct.pagetitle as product_pagetitle"
,"small":"small.url as small"
}',
'innerJoin' => '{
"msProduct": {"class":"msProduct", "alias":"msProduct", "on":"msProduct.parent = msCategory.id AND msProduct.class_key = msProduct"}
}',
'leftJoin' => '{
"small": {"class":"msProductFile","alias":"small", "on": "small.product_id = msProduct.id AND small.path LIKE %/small/ AND small.rank=0"}
}',
'tpl' => 'msCategoryHomeFilter',
'includeTVs' => 'class',
'where' => '{"class_key":"msCategory"}',
'depth' => 20,
'wrapIfEmpty' => 0,
'sortby' => 'msCategory.menuindex',
'sortdir' => 'ASC',
'limit' => 100,
'showLog' => 1
]}
но получаю ошибку:Could not process query, error #1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN `kr_ms2_vendors` `Vendor` ON Data.vendor=Vendor.id LEFT JOIN `kr_ms2_produc' at line 1результат лога:
0.0000000: pdoTools loaded.
0.0000000: Conditions prepared
0.0010002: xPDO query object created
0.0000000: Included list of tvs: class
0.0000000: innerJoined msProduct as msProduct
0.0009999: leftJoined msProductData as Data
0.0000000: leftJoined msVendor as Vendor
0.0020001: leftJoined msProductFile as small
0.0000000: leftJoined modTemplateVarResource as TVclass
0.0000000: Grouped by msProduct.id
0.0000000: Added selection of msProduct: msProduct.id as product_id, msProduct.uri as product_uri, msProduct.pagetitle as product_pagetitle
0.0000000: Added selection of msProductData: `article`, `price`, `old_price`, `weight`, `image`, `thumb`, `vendor`, `made_in`, `new`, `popular`, `favorite`, `tags`, `color`, `size`, `source`
0.0000000: Added selection of msVendor: `name` AS `vendor.name`, `resource` AS `vendor.resource`, `country` AS `vendor.country`, `logo` AS `vendor.logo`, `address` AS `vendor.address`, `phone` AS `vendor.phone`, `fax` AS `vendor.fax`, `email` AS `vendor.email`, `description` AS `vendor.description`, `properties` AS `vendor.properties`
0.0000000: Added selection of msCategory: msCategory.id,msCategory.parent,msCategory.menutitle,
0.0000000: Added selection of msProductFile: small.url as small
0.0000000: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `class`
0.0000000: Replaced TV conditions
0.0009999: Processed additional conditions
0.0009999: Added where condition: class_key=msCategory, msCategory.parent:IN(2,4,5,15,128,134,139,153,154,155,103,104,105,106,107,108,109,110,111,112,126,113,114,115,116,117,118,119,120,121,122,123,124,125,127,129,130,131,132,133,137,138,140,141,142,143,144,145,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185), msCategory.published=1, msCategory.deleted=0
0.0009999: Replaced TV conditions
0.0009999: Sorted by msCategory.menuindex, ASC
0.0000000: Limited to 100, offset 0
0.0000000: SQL prepared "SELECT msProduct.id as product_id, msProduct.uri as product_uri, msProduct.pagetitle as product_pagetitle, `Data`.`article`, `Data`.`price`, `Data`.`old_price`, `Data`.`weight`, `Data`.`image`, `Data`.`thumb`, `Data`.`vendor`, `Data`.`made_in`, `Data`.`new`, `Data`.`popular`, `Data`.`favorite`, `Data`.`tags`, `Data`.`color`, `Data`.`size`, `Data`.`source`, `Vendor`.`name` AS `vendor.name`, `Vendor`.`resource` AS `vendor.resource`, `Vendor`.`country` AS `vendor.country`, `Vendor`.`logo` AS `vendor.logo`, `Vendor`.`address` AS `vendor.address`, `Vendor`.`phone` AS `vendor.phone`, `Vendor`.`fax` AS `vendor.fax`, `Vendor`.`email` AS `vendor.email`, `Vendor`.`description` AS `vendor.description`, `Vendor`.`properties` AS `vendor.properties`, msCategory.id, msCategory.parent, msCategory.menutitle, ``, small.url as small, IFNULL(`TVclass`.`value`, '') AS `class` FROM `kr_site_content` AS `msCategory` JOIN `kr_site_content` `msProduct` ON msProduct.parent = msCategory.id AND msProduct.class_key = msProduct LEFT JOIN `kr_ms2_products` `Data` ON LEFT JOIN `kr_ms2_vendors` `Vendor` ON Data.vendor=Vendor.id LEFT JOIN `kr_ms2_product_files` `small` ON small.product_id = msProduct.id AND small.path LIKE %/small/ AND small.rank=0 LEFT JOIN `kr_site_tmplvar_contentvalues` `TVclass` ON `TVclass`.`contentid` = `msCategory`.`id` AND `TVclass`.`tmplvarid` = 1 WHERE ( `msCategory`.`class_key` = 'msCategory' AND `msCategory`.`parent` IN (2,4,5,15,128,134,139,153,154,155,103,104,105,106,107,108,109,110,111,112,126,113,114,115,116,117,118,119,120,121,122,123,124,125,127,129,130,131,132,133,137,138,140,141,142,143,144,145,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185) AND `msCategory`.`published` = 1 AND `msCategory`.`deleted` = 0 ) GROUP BY msProduct.id ORDER BY msCategory.menuindex ASC LIMIT 100 "
0.0010002: Could not process query, error #1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'JOIN `kr_ms2_vendors` `Vendor` ON Data.vendor=Vendor.id LEFT JOIN `kr_ms2_produc' at line 1
0.0070002: Total time
6 291 456: Memory usage
Пытаюсь собрать ручным MySQL запросом вот так:SELECT
msCategory.id,
msCategory.parent,
msCategory.menutitle,
`msProductData`.`image`,
`msProductData`.`thumb`,
image.url as image
FROM `kr_site_content` AS `msCategory`
JOIN `kr_site_content` `msProduct`ON msProduct.class_key = 'msProduct' AND msProduct.parent = msCategory.id
JOIN `kr_ms2_products` `msProductData` ON msProduct.id = msProductData.id
LEFT JOIN `kr_ms2_product_files` `image` ON image.product_id = msProduct.id AND image.path LIKE '%/small/' AND image.rank=0
WHERE msCategory.class_key = 'msCategory' AND msCategory.published = 1 AND msCategory.deleted = 0 AND msCategory.parent = 4
GROUP BY msCategory.id
ORDER BY msCategory.menuindex
Но в результате получаю только те категории, у которых есть прямые дочерние продукты, без вложенных категорий.Спасибо в карму всем, кто поделиться полезной информацией.
Комментарии: 2
Из-за того, что уровень вложенности может быть разный, решить такую задачу за один запрос вряд ли получится. Попробуйте просто внутри tpl вызывать обычный msProducts, передав в него parent={$id} и limit=1. Если категорий немного, то нагрузки особо не будет.
Если много, то лучше посмотреть в сторону плагина — при сохранении товара проверить его menuindex. Если menuindex=0, то получать все его родительские категории и записывать в ТВ-шки пункт меню и путь к картинке. Тогда вывод категорий на сайте будет тривиальным.
Если много, то лучше посмотреть в сторону плагина — при сохранении товара проверить его menuindex. Если menuindex=0, то получать все его родительские категории и записывать в ТВ-шки пункт меню и путь к картинке. Тогда вывод категорий на сайте будет тривиальным.
Спасибо большое, Илья! Воспользуюсь первым вариантом из Вашего совета, на первое время хватит ), так как категорий не более 20 пока, вряд ли будет больше…
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.