public function process()
 {
     $result = array();
     $queryAll = array('class' => $this->classKey, 'where' => $this->modx->toJSON(['key' => 'tags']), 'select' => $this->modx->toJSON(['value' => 'msProductOption.value']), 'groupby' => 'msProductOption.value', 'limit' => 0, 'fastMode' => true, 'sortby' => 'msProductOption.value', 'sortdir' => 'ASC', 'return' => 'data');
     $this->pdoFetch->setConfig($queryAll);
     $tagsAll = $this->pdoFetch->run();
     $tagsAll = array_map(function ($tag) {
         return array('id' => $tag['value'], 'text' => $tag['value']);
     }, $tagsAll);
     $result['all'] = $tagsAll;
     if ($this->pid !== '0') {
         $queryProduct = array('class' => $this->classKey, 'where' => $this->modx->toJSON(['product_id' => $this->pid, 'key' => 'tags']), 'select' => $this->modx->toJSON(['value' => 'msProductOption.value']), 'groupby' => 'msProductOption.value', 'limit' => 0, 'fastMode' => true, 'sortby' => 'msProductOption.value', 'sortdir' => 'ASC', 'return' => 'data');
         $this->pdoFetch->setConfig($queryProduct);
         $tagsProduct = $this->pdoFetch->run();
         $tagsProduct = array_map(function ($tag) {
             return $tag['value'];
         }, $tagsProduct);
         $result['product'] = $tagsProduct;
     }
     return $this->success('', $result);
 }
$dataColumns = $modx->getSelectColumns('msProductData', 'Data', '', array('id'), true) . ',`Data`.`price` as `original_price`';
$vendorColumns = $modx->getSelectColumns('msVendor', 'Vendor', 'vendor.', array('id'), true);
$orderProductColumns = $modx->getSelectColumns('msOrderProduct', 'msOrderProduct', '', array('id'), true);
// Tables for joining
$leftJoin = '{"class":"msProduct","alias":"msProduct","on":"msProduct.id=msOrderProduct.product_id"},{"class":"msProductData","alias":"Data","on":"msProduct.id=Data.id"},{"class":"msVendor","alias":"Vendor","on":"Data.vendor=Vendor.id"}';
if (!empty($thumbsLeftJoin)) {
    $leftJoin .= $thumbsLeftJoin;
}
$select = '"msProduct":"' . $resourceColumns . '","Data":"' . $dataColumns . '","OrderProduct":"' . $orderProductColumns . '","Vendor":"' . $vendorColumns . '"';
if (!empty($thumbsSelect)) {
    $select .= ',' . implode(',', $thumbsSelect);
}
$default = array('class' => 'msOrderProduct', 'where' => '{"msOrderProduct.order_id":"' . $id . '"}', 'leftJoin' => '[' . $leftJoin . ']', 'select' => '{' . $select . '}', 'sortby' => 'id', 'sortdir' => 'ASC', 'groupby' => 'msOrderProduct.id', 'fastMode' => false, 'limit' => 0, 'return' => 'data', 'nestedChunkPrefix' => 'minishop2_');
// Merge all properties and run!
$scriptProperties['tpl'] = $scriptProperties['tplRow'];
$pdoFetch->setConfig(array_merge($default, $scriptProperties));
$rows = $pdoFetch->run();
/* @var msOrderProduct $row */
foreach ($rows as $row) {
    $outer['cart_count'] += $row['count'];
    $row['old_price'] = $miniShop2->formatPrice($row['original_price'] != $row['price'] ? $row['original_price'] : $row['old_price']);
    $row['price'] = $miniShop2->formatPrice($row['price']);
    $row['cost'] = $miniShop2->formatPrice($row['cost']);
    $row['weight'] = $miniShop2->formatWeight($row['weight']);
    // Additional properties of product
    $options = !is_array($row['options']) ? $modx->fromJSON($row['options']) : $row['options'];
    if (!empty($options) && is_array($options)) {
        foreach ($options as $key => $value) {
            $row['option.' . $key] = $value;
        }
    }
// Fields to select
$resourceColumns = !empty($includeContent) ? $modx->getSelectColumns('msProduct', 'msProduct') : $modx->getSelectColumns('msProduct', 'msProduct', '', array('content'), true);
$dataColumns = $modx->getSelectColumns('msProductData', 'Data', '', array('id'), true);
$vendorColumns = $modx->getSelectColumns('msVendor', 'Vendor', 'vendor.', array('id'), true);
// Tables for joining
$leftJoin = '{"class":"msProductData","alias":"Data","on":"msProduct.id=Data.id"},{"class":"msVendor","alias":"Vendor","on":"Data.vendor=Vendor.id"}';
if (!empty($thumbsLeftJoin)) {
    $leftJoin .= $thumbsLeftJoin;
}
$select = '"msProduct":"' . $resourceColumns . '","Data":"' . $dataColumns . '","Vendor":"' . $vendorColumns . '"';
if (!empty($thumbsSelect)) {
    $select .= ',' . implode(',', $thumbsSelect);
}
$pdoFetch->addTime('Query parameters are prepared.');
$scriptProperties['tpl'] = $scriptProperties['tplRow'];
$pdoFetch->setConfig($scriptProperties);
// Working
$outer = array('goods' => '', 'total_count' => 0, 'total_weight' => 0, 'total_cost' => 0);
foreach ($cart as $k => $v) {
    $default = array('class' => 'msProduct', 'where' => '{"msProduct.id":"' . $v['id'] . '","class_key":"msProduct"}', 'leftJoin' => '[' . $leftJoin . ']', 'select' => '{' . $select . '}', 'sortby' => 'id', 'sortdir' => 'ASC', 'groupby' => 'msProduct.id', 'fastMode' => false, 'limit' => 0, 'return' => 'data', 'nestedChunkPrefix' => 'minishop2_');
    // Merge all properties and run!
    $pdoFetch->config = array_merge($pdoFetch->config, $default, $scriptProperties);
    $rows = $pdoFetch->run();
    // If not empty and relevant to the context, then show
    if (!empty($rows[0]) && (empty($v['ctx']) || $v['ctx'] == $modx->context->key)) {
        $row = $rows[0];
        $row['key'] = $k;
        $row['count'] = $v['count'];
        $row['old_price'] = $miniShop2->formatPrice($row['price'] != $v['price'] ? $row['price'] : $row['old_price']);
        $row['price'] = $miniShop2->formatPrice($v['price']);
        $row['weight'] = $miniShop2->formatWeight($v['weight']);