Minishop2 - цена товара через pdoResources в custom сниппете - решено

Приветствую всех!

Только начинаю осваивать MODX, возникла необходимость вывести на главной табы, где каждый таб — категория Minishop2, а в области контента выводятся товары этой категории, готовых сниппетов для этой задачи не нашёл, решил это частично через свой сниппет, но к товарам не прикрепляется поле стоимости. Если я правильно понял стоимость это TV поле, передал его при вызове pdoResources в параметр includeTVs, но оно не выводится, при этом созданное мной TV поле image выводится.

Вопрос в том, как подтянуть стоимость товара в данном случае?

Вот код:
$parent_id = isset($parent_id) ? $parent_id : 1;
$select = isset( $select ) ? $select.',id,parent,isfolder' : 'id,parent,isfolder,pagetitle,description,introtext,uri';
$includeTVs = isset( $includeTVs ) ? $includeTVs : 'price,image';
$tpl_tabs = isset( $tpl_tabs ) ? $tpl_tabs : 'tpl_cat_tabs';
$tpl_items = isset( $tpl_items ) ? $tpl_items : 'tpl_cat_items';

$json = $modx->runSnippet('pdoResources', array(
'parents'   => $parent_id,
'sortby'    => 'menuindex',
'sortdir'   => 'ASC',
'level'     => '2',
'select'    => $select,
'includeTVs'=> $includeTVs,
'return'    => 'json'
));

$rows = json_decode($json);

$output = '';
$tabs = array();
$items = array();

foreach($rows as $row)
{
    if($row->isfolder)
    {
        $tabs[$row->parent][] = $row;
    }
    else
    {
        $items[$row->parent][] = $row;
    }
}

echo 'Tabs <pre>';
print_r($tabs);
echo '</pre>';

Array
(
    [21] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 14
                    [parent] => 21
                    [isfolder] => 1
                    [pagetitle] => Категория 1
                    [description] => 
                    [introtext] => 
                    [uri] => katalog/cat1/
                    [tv.image] => 
                )
            [1] => stdClass Object
                (
                    [id] => 15
                    [parent] => 21
                    [isfolder] => 1
                    [pagetitle] => Категория 2
                    [description] => 
                    [introtext] => 
                    [uri] => katalog/cat2/
                    [tv.image] => 
                )
            [2] => stdClass Object
                (
                    [id] => 16
                    [parent] => 21
                    [isfolder] => 1
                    [pagetitle] => Категория 3
                    [description] => 
                    [introtext] => 
                    [uri] => katalog/cat3/
                    [tv.image] => 
                )
        )
)

echo 'Items <pre>';
print_r($items);
echo '</pre>';

Array
(
    [14] => Array
        (
            [0] => stdClass Object
                (
                    [id] => 20
                    [parent] => 14
                    [isfolder] => 0
                    [pagetitle] => Тестовый продукт 1
                    [description] => 
                    [introtext] => 
                    [uri] => katalog/cat1/20.html
                    [tv.image] => /assets/images/1.jpg
                )
            [1] => stdClass Object
                (
                    [id] => 22
                    [parent] => 14
                    [isfolder] => 0
                    [pagetitle] => Тестовый продукт 2
                    [description] => 
                    [introtext] => 
                    [uri] => katalog/cat1/22.html
                    [tv.image] => /assets/images/2.jpg
                )
        )
)

Дополнил позже:
Неправильно понял, price относится не к TV полям, а к отдельному объекту, который хранится в таблице modx_ms2_products, в этой же таблице хранятся и многие другие параметры, которые при необходимости можно получить перечислив их в select->msProductData из примера ниже.

Вот решение с помощью sql билдера:

$json = $modx->runSnippet('pdoResources', array(
'parents'   => $parent_id,
'select' => array(
        'modResource' => $select,
        'msProductData' => 'price'),
'class' => 'modResource',
        'leftJoin' => array(
        'msProductData' => array(
        'class' => 'msProductData',
        'on' => 'msProductData.id = modResource.id')
),
'includeTVs'=> $includeTVs,
'return'    => 'json'
));

А вот так можно получить товары присвоенные нескольким категориям:

$json = $modx->runSnippet('pdoResources', array(
'parents'   => $parent_id,
'select' => array('modResource' => $select, 'msProductData' => 'price', 'msCategoryMember' => 'category_id'),
'class' => 'modResource',
'leftJoin' => array(
    'msProductData' => array('class' => 'msProductData','on' => 'msProductData.id = modResource.id'),
    'msCategoryMember' => array('class' => 'msCategoryMember','on' => 'msCategoryMember.product_id = modResource.id'),
),

'includeTVs'=> $includeTVs,
'sortby'    => 'menuindex',
'sortdir'   => 'ASC',
'level'     => '2',
'return'    => 'json'
));
И средствами PHP продублировать их в нужные табы по признаку category_id.
Сергей
16 февраля 2019, 15:28
modx.pro
1
1 645
0

Комментарии: 2

Павел Романов
16 февраля 2019, 18:06
0
Используйте вместо pdoResources msProducts из поставки miniShop2.

Вывести категории и товары в них можно двойным вызовом. Сначала получаете категории (тем же pdoResources), а в чанке уже используете их ID в качестве parents:
[[msProducts? 
&parents=`[[+id]]`
.......
]]
    Сергей
    16 февраля 2019, 19:18
    1
    0
    Благодарю, но такой вариант не подошёл бы наверно, так как будет много запросов к базе, вкладки и товары должны автоматом же формироваться и их может быть n-е количество, но нашёл решение с билдером запросов, много времени потратил правда, в документации неточность была.

    Вот решение моей задачи если кому-то пригодится:

    $json = $modx->runSnippet('pdoResources', array(
    'parents'   => $parent_id,
    'select' => array(
            'modResource' => $select,
            'msProductData' => 'price'),
    'class' => 'modResource',
        'leftJoin' => array(
            'msProductData' => array(
            'class' => 'msProductData',
            'on' => 'msProductData.id = modResource.id')
    ),
    'includeTVs'=> $includeTVs,
    'return'    => 'json'
    ));
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    2