Minishop2 - цена товара через pdoResources в custom сниппете - решено
Приветствую всех!
Только начинаю осваивать MODX, возникла необходимость вывести на главной табы, где каждый таб — категория Minishop2, а в области контента выводятся товары этой категории, готовых сниппетов для этой задачи не нашёл, решил это частично через свой сниппет, но к товарам не прикрепляется поле стоимости. Если я правильно понял стоимость это TV поле, передал его при вызове pdoResources в параметр includeTVs, но оно не выводится, при этом созданное мной TV поле image выводится.
Вопрос в том, как подтянуть стоимость товара в данном случае?
Вот код:
Дополнил позже:
Неправильно понял, price относится не к TV полям, а к отдельному объекту, который хранится в таблице modx_ms2_products, в этой же таблице хранятся и многие другие параметры, которые при необходимости можно получить перечислив их в select->msProductData из примера ниже.
Вот решение с помощью sql билдера:
А вот так можно получить товары присвоенные нескольким категориям:
Только начинаю осваивать 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.Комментарии: 2
Используйте вместо pdoResources msProducts из поставки miniShop2.
Вывести категории и товары в них можно двойным вызовом. Сначала получаете категории (тем же pdoResources), а в чанке уже используете их ID в качестве parents:
Вывести категории и товары в них можно двойным вызовом. Сначала получаете категории (тем же pdoResources), а в чанке уже используете их ID в качестве parents:
[[msProducts?
&parents=`[[+id]]`
.......
]]
Благодарю, но такой вариант не подошёл бы наверно, так как будет много запросов к базе, вкладки и товары должны автоматом же формироваться и их может быть 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'
));
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.