msProducts + все изображения товара CONCAT Новый

Дополнение: minishop2, pdoTools

Ребята) есть задача выводить 10 популярных товаров со всеми изображениями выбранных товаров
Вызывать сниппет msGallery в количестве 10 раз не предлагать)
Взял на основу стандартный SQL который формируется при вызове сниппета
{set $popularProducts = $_modx->runSnippet('!msProducts', [
        'parents' => 0,
        'tpl' => 'tpl.popular.products.row',
        'limit' => ($limit?$limit:4),
        'includeThumbs' => '120x90,360x270',
        'where' => [
            'Data.popular' => 1
        ],
        'showLog' => 1
    ])}
    {$popularProducts?:'К сожалению популярных продуктов не найдено.'}
Мною был взят сформированный SQL, добавлен CONCAT и вроде на выходе то, что нужно, но как это все подружить со сниппетом не представляю.

Запрос
SELECT SQL_CALC_FOUND_ROWS `msProduct`.`id`, `msProduct`.`type`, `msProduct`.`contentType`, `msProduct`.`pagetitle`, `msProduct`.`longtitle`, `msProduct`.`description`, `msProduct`.`alias`, `msProduct`.`link_attributes`, `msProduct`.`published`, `msProduct`.`pub_date`, `msProduct`.`unpub_date`, `msProduct`.`parent`, `msProduct`.`isfolder`, `msProduct`.`introtext`, `msProduct`.`richtext`, `msProduct`.`template`, `msProduct`.`menuindex`, `msProduct`.`searchable`, `msProduct`.`cacheable`, `msProduct`.`createdby`, `msProduct`.`createdon`, `msProduct`.`editedby`, `msProduct`.`editedon`, `msProduct`.`deleted`, `msProduct`.`deletedon`, `msProduct`.`deletedby`, `msProduct`.`publishedon`, `msProduct`.`publishedby`, `msProduct`.`menutitle`, `msProduct`.`donthit`, `msProduct`.`privateweb`, `msProduct`.`privatemgr`, `msProduct`.`content_dispo`, `msProduct`.`hidemenu`, `msProduct`.`class_key`, `msProduct`.`context_key`, `msProduct`.`content_type`, `msProduct`.`uri`, `msProduct`.`uri_override`, `msProduct`.`hide_children_in_tree`, `msProduct`.`show_in_tree`, `msProduct`.`properties`, `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`, `Data`.`composition`, `Data`.`material`, `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`, `120x90`.url as `120x90`, `360x270`.url as `360x270`, GROUP_CONCAT(`files`.`url` SEPARATOR '||') as `images` FROM `modx_site_content` AS `msProduct` 

LEFT JOIN `modx_ms2_products` `Data` ON `msProduct`.`id` =  `Data`.`id` 
LEFT JOIN `modx_ms2_vendors` `Vendor` ON Data.vendor=Vendor.id 
LEFT JOIN `modx_ms2_product_files` `120x90` ON `120x90`.product_id = msProduct.id AND `120x90`.rank = 0 AND `120x90`.path LIKE '%/120x90/%' 
LEFT JOIN `modx_ms2_product_files` `360x270` ON `360x270`.product_id = msProduct.id AND `360x270`.rank = 0 AND `360x270`.path LIKE '%/360x270/%' 
LEFT JOIN `modx_ms2_product_files` `files` ON `files`.product_id = msProduct.id AND `files`.type = 'image'

WHERE  ( `msProduct`.`class_key` = 'msProduct' AND `Data`.`popular` = '1' AND `msProduct`.`published` = 1 AND `msProduct`.`deleted` = 0 )  GROUP BY msProduct.id, `120x90`.url, `360x270`.url ORDER BY msProduct.id ASC LIMIT 8
Добавлен еще один JOIN в таблицу modx_ms2_product_files и в SELECT выражение
GROUP_CONCAT(`files`.`url` SEPARATOR '||') as `images` 
Исходный код сниппета msProducts
$select = array(
    'msProduct' => !empty($includeContent)
        ? $modx->getSelectColumns('msProduct', 'msProduct')
        : $modx->getSelectColumns('msProduct', 'msProduct', '', array('content'), true),
    'Data' => $modx->getSelectColumns('msProductData', 'Data', '', array('id'), true),
    'Vendor' => $modx->getSelectColumns('msVendor', 'Vendor', 'vendor.', array('id'), true),
);
Как добавить CONCAT?
В таком случае можно сделать доп параметр при вызове сниппета с подключением всех изображений данного товара
12 сентября 2016, 16:26    lexikon   
0    594 0

Комментарии (1)

  1. lexikon 12 сентября 2016, 17:23 # 0
    Короче в сниппет добавляем в нужно место.
    if (!empty($includeImages)) {
        $select['images'] = 'GROUP_CONCAT(`images`.`url` SEPARATOR \';\') as `images`';
        $leftJoin['images'] = array(
            'class' => 'msProductFile',
            'on' => "`images`.product_id = msProduct.id AND `images`.type = 'image' AND `images`.path NOT LIKE '%x%'",
        );
    }
    в
    {$images|split:';'}
    будет массив всех фотографий. Сниппет вызываем с параметром includeImages
    Вы должны авторизоваться, чтобы оставлять комментарии.