config['lang']; switch($lang) { case "ru": $l = 'en'; break; case "en": $l = 'ru'; break; } $link = $modx->documentIdentifier == $modx->config['site_start'] ? '/' : '/'.$_GET['q']; $res = '' . $l . ''; break; /** * Отображение изображений прикрепленных к документу по его id * @var get = getImages * @var did = ID документа, если не передан - берётся ID текущего документа * @var tpl = чанк для отображения одной записи * @var isOrient = проверка на ориентацию изображения, для включения передать цифру 1 * * @return image = путь к изображению * @return alt = альт изображения * @return title = заголовок изображения * @return description = описание изображения * @return link = сыылка для баннера * @return rotate = как ориентировано изображение (1 - широкое, 2 - высокое, 3 - квадратное) */ case "getImages": $did = (isset($did) && (int)$did > 0) ? (int)$did : $modx->documentIdentifier; $i = 1; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $images = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS * FROM `modx_a_images` LEFT JOIN `modx_a_images_fields` ON image_id = image_image_id AND image_lang = '$lang' WHERE image_parent = $did ORDER BY image_position ASC $limit "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } while ($image = $modx->db->getRow($images)) { $image['i'] = $i; $image['image'] = "/assets/images/collections/" . $image['image_parent'] . "/" . $image['image_file']; $image['title'] = str_replace(["<", ">", """], ["<", ">", '"'], $image['image_title']); $image['description'] = str_replace(["<", ">", """], ["<", ">", '"'], $image['image_description']); if ((int)$image['image_link'] > 0) { $image['link'] = $modx->makeUrl($image['image_link']); } else { $image['link'] = ''; } if (isset($isOrient) && (int)$isOrient > 0) { $imageinfo = getimagesize(MODX_BASE_PATH . $image['image']); // широкая if (round($imageinfo[1] / $imageinfo[0]) < 1) { $image['rotate'] = 1; // высокая } elseif (round($imageinfo[1] / $imageinfo[0]) > 1) { $image['rotate'] = 2; // квадратная } else { $image['rotate'] = 3; } } if (!empty($image['image_alt'])) { $image['alt'] = $image['image_alt']; } elseif (!empty($image['image_title'])) { $image['alt'] = $image['image_title']; } else { $image['alt'] = $image['image_file']; } $res .= $modx->parseChunk($tpl, $image); $i++; } $modx->setPlaceholder('getImagesCount', $i - 1); break; /** * Формирование меню * @var get = getMenu * @var did = ID документа, если не передан - берётся ID текущего документа * @var tpl = чанк для отображения не активного пункта меню * @var tplActive = чанк для отображения активного пункта меню * @var tplSub = чанк для отображения не активного пункта меню, содержащего подменю * @var dept = глубина вложенности меню * @var order = поле и направление сортировки результатов выборки * @var exclude = исключить из запроса документы с указанными ID (передать список через запятую) * @var subExclude = не выводить дочернее меню для документов с указанными ID (передать список через запятую) * * @return alias = алиас пункта меню * @return menutitle = заголовок пункта меню * @return link = ссылка для пункта меню * @return isfolder = имеет подменю * @return submenu = список пунктов подменю */ case "getMenu": $arrMenu = []; $dept = (int)$dept > 0 ? $dept : 1; $did = is_numeric($did) ? (int)$did : $modx->documentIdentifier; $ids = array_values($modx->getChildIds($did, $dept)); $ids = implode(',', $ids); if ($ids) { $i = 1; if (isset($exclude) && $exclude != '') { $ex = explode(',', $exclude); $excl = ' AND id <> ' . implode(' AND id <> ', $ex); } else { $excl = ''; } if (isset($subExclude) && $subExclude != '') { $subExclude = explode(',', $subExclude); } else { $subExclude = []; } $order = (isset($order) && $order != '') ? $order : 'c.menuindex ASC'; $query = $modx->db->makeArray($modx->db->query(" SELECT c.id, c.alias, c.isfolder, c.parent, c.pagetitle_$lang AS 'pagetitle', c.menutitle_$lang AS 'menutitle', (SELECT COUNT(id) FROM `modx_site_content` WHERE published = 1 AND deleted = 0 AND hidemenu = 0 AND parent = " . (int)$parent . " $excl) AS 'count', (SELECT redirect_target FROM `modx_a_redirect` WHERE redirect_code = 301 AND redirect_source = CONCAT(c.alias, '/')) AS 'redirect' FROM `modx_site_content` c WHERE c.published = 1 AND c.deleted = 0 AND c.hidemenu = 0 AND c.id IN ({$ids}) {$excl} ORDER BY {$order} ")); if (is_array($query)) { foreach ($query as $value) { if ($value['parent'] == $did) { $arrMenu[] = $value; } } foreach ($arrMenu as $key => $value) { foreach ($query as $v) { if ($v['parent'] == $value['id'] && !in_array($value['id'], $subExclude)) { $arrMenu[$key]['submenu'][] = $v; } } } } foreach ($arrMenu as $menu) { $menu['i'] = $i; $menu['link'] = $modx->makeUrl($menu['id']); $menu['menutitle'] = $menu['menutitle'] != '' ? $menu['menutitle'] : $menu['pagetitle']; if ($menu['id'] == $modx->documentIdentifier || $menu['redirect'] == $menu['alias'] . '/' . $modx->documentObject['alias'] . '/') { $subres = ''; if (is_array($menu['submenu'])) { foreach ($menu['submenu'] as $submenu) { $submenu['link'] = $modx->makeUrl($submenu['id']); $submenu['menutitle'] = $submenu['menutitle'] != '' ? $submenu['menutitle'] : $submenu['pagetitle']; $subres .= $modx->parseChunk($tplSub, $submenu); } $menu['submenu'] = $subres; } $res .= $modx->parseChunk($tplActive, $menu); } elseif (isset($menu['submenu']) && is_array($menu['submenu'])) { $subres = ''; foreach ($menu['submenu'] as $submenu) { $submenu['link'] = $modx->makeUrl($submenu['id']); $submenu['menutitle'] = $submenu['menutitle'] != '' ? $submenu['menutitle'] : $submenu['pagetitle']; if ($submenu['id'] == $modx->documentIdentifier) { $subres .= $modx->parseChunk($tplActive, $submenu); } else { $subres .= $modx->parseChunk($tplSub, $submenu); } } $menu['submenu'] = $subres; $res .= $modx->parseChunk($tpl, $menu); } else { $res .= $modx->parseChunk($tpl, $menu); } $i++; } } break; /** * Формирование категорий вопросов * @var get = getFaqsCategories * @var did = ID документа, если не передан - берётся ID текущего документа * @var tpl = чанк для отображения не активной категории * @var tplActive = чанк для отображения активной категории * @var tplSub = чанк для отображения не активной категории, содержащей подкатегорию * @var dept = глубина вложенности категорий * @var order = поле и направление сортировки результатов выборки * @var exclude = исключить из запроса документы с указанными ID (передать список через запятую) * @var subExclude = не выводить дочернее меню для документов с указанными ID (передать список через запятую) * * @return alias = алиас пункта меню * @return menutitle = заголовок пункта меню * @return link = ссылка для пункта меню * @return isfolder = имеет подменю * @return submenu = список пунктов подменю */ case "getFaqsCategories": $arrMenu = []; $dept = (int)$dept > 0 ? $dept : 1; $did = is_numeric($did) ? (int)$did : $modx->documentIdentifier; $ids = array_values($modx->getChildIds($did, $dept)); $ids = implode(',', $ids); if ($ids) { $i = 1; if (isset($exclude) && $exclude != '') { $ex = explode(',', $exclude); $excl = ' AND id <> ' . implode(' AND id <> ', $ex); } else { $excl = ''; } if (isset($subExclude) && $subExclude != '') { $subExclude = explode(',', $subExclude); } else { $subExclude = []; } $order = (isset($order) && $order != '') ? $order : 'c.menuindex ASC'; $query = $modx->db->makeArray($modx->db->query(" SELECT c.id, c.alias, c.isfolder, c.parent, c.pagetitle_$lang AS 'pagetitle', c.menutitle_$lang AS 'menutitle', (SELECT COUNT(id) FROM `modx_site_content` WHERE published = 1 AND deleted = 0 AND hidemenu = 0 AND parent = " . (int)$parent . " $excl) AS 'count', (SELECT COUNT(faq_id) FROM `modx_a_faqs` WHERE faq_active = 1 AND faq_category = c.id GROUP BY faq_category) AS 'num_faq_at_cat', (SELECT redirect_target FROM `modx_a_redirect` WHERE redirect_code = 301 AND redirect_source = CONCAT(c.alias, '/')) AS 'redirect' FROM `modx_site_content` c WHERE c.published = 1 AND c.deleted = 0 AND c.hidemenu = 0 AND c.id IN ({$ids}) ORDER BY {$order} ")); //Получаем вопросы из указанной категории и подсчитываем их количество if (is_array($query)) { foreach ($query as $value) { if ($value['parent'] == $did) { $arrMenu[] = $value; } } foreach ($arrMenu as $key => $value) { foreach ($query as $v) { if ($v['parent'] == $value['id'] && !in_array($value['id'], $subExclude)) { $arrMenu[$key]['submenu'][] = $v; } } } } foreach ($arrMenu as $menu) { $menu['i'] = $i; $menu['link'] = $modx->makeUrl($menu['id']); $menu['menutitle'] = $menu['menutitle'] != '' ? $menu['menutitle'] : $menu['pagetitle']; if ($menu['id'] == $modx->documentIdentifier || $menu['redirect'] == $menu['alias'] . '/' . $modx->documentObject['alias'] . '/') { $subres = ''; if (is_array($menu['submenu'])) { foreach ($menu['submenu'] as $submenu) { $submenu['link'] = $modx->makeUrl($submenu['id']); $submenu['menutitle'] = $submenu['menutitle'] != '' ? $submenu['menutitle'] : $submenu['pagetitle']; $subres .= $modx->parseChunk($tplSub, $submenu); } $menu['submenu'] = $subres; } $res .= $modx->parseChunk($tplActive, $menu); } elseif (isset($menu['submenu']) && is_array($menu['submenu'])) { $subres = ''; foreach ($menu['submenu'] as $submenu) { $submenu['link'] = $modx->makeUrl($submenu['id']); $submenu['menutitle'] = $submenu['menutitle'] != '' ? $submenu['menutitle'] : $submenu['pagetitle']; if ($submenu['id'] == $modx->documentIdentifier) { $subres .= $modx->parseChunk($tplActive, $submenu); } else { $subres .= $modx->parseChunk($tplSub, $submenu); } } $menu['submenu'] = $subres; $res .= $modx->parseChunk($tpl, $menu); } else { $res .= $modx->parseChunk($tpl, $menu); } $i++; } } break; /** * Получить дочерние записи контента * @var get = getContents (Обязательный) * @var tpl = чанк для формирования единици контента (Обязательный) * @var did = ID документа (Если не передан - берётся ID текущего документа) * @var limit = ограничить количество ресурсов в выборке * @var order = поле и направление сортировки результатов выборки (по умолчанию menuindex в прямом порядке) * @var pagin = включение постраничной навигации, для включения передать цифру 1 * @var tplImg = чанк для отображения коллекции изображений * @var exclude = ID документов, которые не нужно показывать * @var include = ID документов, которые нужно показывать */ case "getContents": $did = is_numeric($did) ? (int)$did : $modx->documentIdentifier; $order = (isset($order) && $order != '') ? $modx->db->escape($order) : 'menuindex ASC'; $i = 1; $time_delay = 0; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $excl = (isset($exclude) && $exclude != '') ? ' AND c.id NOT IN (' . $modx->db->escape($exclude) . ') ' : ''; $incl = (isset($include) && $include != '') ? ' AND c.id IN (' . $modx->db->escape($include) . ') ' : ''; $content = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS c.id, c.alias, c.pub_date, c.pagetitle_$lang AS 'pagetitle', c.menutitle_$lang AS 'menutitle', c.longtitle_$lang AS 'longtitle', c.description_$lang AS 'description', c.introtext_$lang AS 'introtext', c.content_$lang AS 'content', (SELECT GROUP_CONCAT(image_file ORDER BY image_position ASC SEPARATOR '|') FROM `modx_a_images` WHERE image_parent = c.id) AS 'images', (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img') LIMIT 1) AS 'tv_img', (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img_blackListChildren') LIMIT 1) AS 'tv_img_blackListChildren', (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img_gallerySection') LIMIT 1) AS 'tv_img_gallerySection', IFNULL( (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img_alt_$lang') LIMIT 1), (SELECT default_text FROM `modx_site_tmplvars` WHERE name = 'tv_img_alt_$lang' LIMIT 1) ) AS 'tv_img_alt', IFNULL( (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img_blackListChildren_alt_$lang') LIMIT 1), (SELECT default_text FROM `modx_site_tmplvars` WHERE name = 'tv_img_blackListChildren_alt_$lang' LIMIT 1) ) AS 'tv_img_blackListChildren_alt' FROM `modx_site_content` c WHERE c.parent = " . (int)$did . " AND c.published = 1 AND c.deleted = 0 AND c.hidemenu = 0 {$excl} {$incl} ORDER BY c.$order $limit "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } while ($cont = $modx->db->getRow($content)) { if (isset($cont['images']) && !empty($cont['images'])) { $images = explode("|", $cont['images']); $cont['image'] = ""; $j = 1; foreach ($images as $img) { $img = is_file(MODX_BASE_PATH . "/assets/images/collections/" . $cont['id'] . "/" . $img) ? "/assets/images/collections/" . $cont['id'] . "/" . $img : 'assets/snippets/phpthumb/noimage.png'; $cont['image'] .= $modx->parseChunk($tplImg, ["img" => $img, "alt" => $cont['pagetitle'] . ' ' . $j]); } } $cont['total_records'] = $content->num_rows; $cont['i'] = $i; $cont['time_delay'] = $time_delay; $cont['menutitle'] = $cont['menutitle'] != '' ? $cont['menutitle'] : $cont['pagetitle']; $res .= $modx->parseChunk($tpl, $cont); $i++; $time_delay += 200; } break; /** * Получить дочерние записи контента и установить плейсхолдеры (Блок инфографики на главной) * @var get = getContents (Обязательный) * @var tplSteps = чанк дляформирования списка шагов (навигация)(Обязательный) * @var tplSlides = чанк для формирования слайдера(Обязательный) * @var tplStepListLeft = чанк дляформирования списка шагов левая часть (контент)(Обязательный) * @var tplStepListRight = чанк дляформирования списка шагов правая часть (контент)(Обязательный) * @var limit = ограничить количество ресурсов в выборке */ case "getContentsStagesEmployements": $stepsnavigation = ''; $slides = ''; $stepListLeft = ''; $stepListRight = ''; $did = is_numeric($did) ? (int)$did : $modx->documentIdentifier; $order = (isset($order) && $order != '') ? $modx->db->escape($order) : 'menuindex ASC'; $i = 1; if (isset($limit) && (int)$limit > 0) { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $content = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS c.id, c.alias, c.pub_date, c.pagetitle_$lang AS 'pagetitle', c.menutitle_$lang AS 'menutitle', c.longtitle_$lang AS 'longtitle', c.description_$lang AS 'description', c.introtext_$lang AS 'introtext', c.content_$lang AS 'content', (SELECT GROUP_CONCAT(image_file ORDER BY image_position ASC SEPARATOR '|') FROM `modx_a_images` WHERE image_parent = c.id) AS 'images', (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_svg_infographic') LIMIT 1) AS 'tv_svg_infographic' FROM `modx_site_content` c WHERE c.parent = " . (int)$did . " AND c.published = 1 AND c.deleted = 0 AND c.hidemenu = 0 $limit "); while ($cont = $modx->db->getRow($content)) { $cont['i'] = $i; $stepsnavigation .= $modx->parseChunk($tplSteps, $cont); $slides .= $modx->parseChunk($tplSlides, $cont); $stepListLeft .= $modx->parseChunk($tplStepListLeft, $cont); $stepListRight .= $modx->parseChunk($tplStepListRight, $cont); $i++; } $modx->setPlaceholder('stepsNavigation', $stepsnavigation); $modx->setPlaceholder('slides', $slides); $modx->setPlaceholder('steplistleft', $stepListLeft); $modx->setPlaceholder('steplistright', $stepListRight); break; /** * Получить дочерние записи контента и установить плейсхолдеры (Слайдер с доп. изображением) * @var get = getContents (Обязательный) * @var tplSlider = чанк дляформирования единицы контента слайдера(Обязательный) * @var tplImages = чанк для формирования единицы изображения(Обязательный) * @var limit = ограничить количество ресурсов в выборке */ case "getContentsOpportunities": $slides = ''; $additionalImages = ''; $did = is_numeric($did) ? (int)$did : $modx->documentIdentifier; $order = (isset($order) && $order != '') ? $modx->db->escape($order) : 'menuindex ASC'; $i = 1; if (isset($limit) && (int)$limit > 0) { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $content = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS c.id, c.alias, c.pub_date, c.pagetitle_$lang AS 'pagetitle', c.menutitle_$lang AS 'menutitle', c.longtitle_$lang AS 'longtitle', c.description_$lang AS 'description', c.introtext_$lang AS 'introtext', c.content_$lang AS 'content', (SELECT GROUP_CONCAT(image_file ORDER BY image_position ASC SEPARATOR '|') FROM `modx_a_images` WHERE image_parent = c.id) AS 'images', (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img') LIMIT 1) AS 'tv_img' FROM `modx_site_content` c WHERE c.parent = " . (int)$did . " AND c.published = 1 AND c.deleted = 0 AND c.hidemenu = 0 $limit "); while ($cont = $modx->db->getRow($content)) { if (isset($cont['images']) && !empty($cont['images'])) { $images = explode("|", $cont['images']); $cont['image'] = ""; $j = 1; $img = is_file(MODX_BASE_PATH . "/assets/images/collections/" . $cont['id'] . "/" . $images[0]) ? "/assets/images/collections/" . $cont['id'] . "/" . $images[0] : 'assets/snippets/phpthumb/noimage.png'; $cont['image'] = $img; } $cont['i'] = $i; $slides .= $modx->parseChunk($tplSlider, $cont); $additionalImages .= $modx->parseChunk($tplImages, $cont); $i++; } $modx->setPlaceholder('slidesOpportunities', $slides); $modx->setPlaceholder('images', $additionalImages); break; /** * Получить одну запись контента * @var get = getContent (Обязательный) * @var did = ID документа (Обязательный) * @var tpl = чанк для формирования единици контента - обязательный параметр */ case "getContent": if ((int)$did) { $content = $modx->db->query(" SELECT c.id, c.alias, c.pub_date, c.pagetitle_$lang AS 'pagetitle', c.menutitle_$lang AS 'menutitle', c.longtitle_$lang AS 'longtitle', c.description_$lang AS 'description', c.introtext_$lang AS 'introtext', c.content_$lang AS 'content', (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img') LIMIT 1) AS 'tv_img', IFNULL( (SELECT value FROM `modx_site_tmplvar_contentvalues` WHERE contentid = c.id AND tmplvarid = (SELECT id FROM `modx_site_tmplvars` WHERE name = 'tv_img_alt_$lang') LIMIT 1), (SELECT default_text FROM `modx_site_tmplvars` WHERE name = 'tv_img_alt_$lang' LIMIT 1) ) AS 'tv_img_alt' FROM `modx_site_content` c WHERE c.id = " . (int)$did . " AND c.published = 1 AND c.deleted = 0 "); $cont = $modx->db->getRow($content); $res .= $modx->parseChunk($tpl, $cont); } break; /** * Получить список изображений товара для слайдера * @var get = getProductImages * @var pid = ID товара * @var tpl = чанк для формирования единици контента * @var type_slider = тип слайдера (slide - для "галереи клуба", slide_home - для "места проживания"") */ case "getProductImages": $pid = is_numeric($pid) ? (int)$pid : $modx->documentObject['product_id']; $i = 1; $t_slider = $modx->db->escape($type_slider); if (isset($type_slider) && !empty($type_slider)) { $type_slider = "AND image_use = " . "'" . $modx->db->escape($type_slider) . "'"; } else { $type_slider = ""; } $images = $modx->db->makeArray($modx->db->query(" SELECT * FROM `modx_a_product_images` LEFT JOIN `modx_a_product_image_fields` ON image_id = image_image_id AND image_lang = '$lang' WHERE image_product_id = {$pid} {$type_slider} ORDER BY image_position ASC, image_use ASC ")); if (is_array($images) && count($images) > 0) { $imgs_present = 1; foreach ($images as $image) { $image['i'] = $i; if ($t_slider == 'slider_home') { $image['image'] = "/assets/images/products/" . $image['image_product_id'] . "_home/" . $image['image_file']; } else { $image['image'] = "/assets/images/products/" . $image['image_product_id'] . "/" . $image['image_file']; } $image['title'] = $image['image_title']; $image['description'] = $image['image_description']; if (!empty($image['image_alt'])) { $image['alt'] = $image['image_alt']; } elseif (!empty($image['image_title'])) { $image['alt'] = $image['image_title']; } else { $image['alt'] = $image['image_file']; } $slider .= $modx->parseChunk($tpl, $image); $i++; } } else { $imgs_present = 0; } $modx->setPlaceholder('slider', $slider); $modx->setPlaceholder('imgs_present', $imgs_present); break; /** * Получить список товаров по их ID * @var get = getProductsSelect * @var ids = список ID товаров * @var tab = признак таба * @var tpl = чанк для формирования единицы контента * @var tplCharac = чанк для формирования характеристик товара */ case "getProductsSelect": $i = 0; $ids = str_replace(".", ",", $ids); $ids = explode(",", $ids); $ids = array_filter($ids, function ($element) { return !empty($element) && (int)$element > 0; }); if (count($ids) > 0) { $ids = implode(",", $ids); $content = $modx->db->makeArray($modx->db->query(" SELECT p.product_id, p.product_price AS 'price', p.product_price_old AS 'price_old', p.product_url AS 'alias', p.product_status, p.product_discont, p.product_video_link, p.product_availability, ps.product_name, (SELECT COUNT(review_id) FROM `modx_a_reviews` WHERE review_product = p.product_id) AS 'product_review_count', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'cover' LIMIT 1) AS 'cover', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'second' LIMIT 1) AS 'second', (SELECT CONCAT('[', GROUP_CONCAT( '{\"filter_name\":\"',COALESCE(filter_name,''),'\", \"filter_type\":\"',COALESCE(filter_type,''),'\", \"filter_value\":\"',COALESCE(filter_value_{$lang},''),'\", \"filter_value_num\":\"',COALESCE(filter_value_num,''),'\"}'), ']' ) FROM `modx_a_product_filter_values` pfv LEFT JOIN `modx_a_filters` f ON pfv.filter_id = f.filter_id LEFT JOIN `modx_a_filter_strings` fs ON pfv.filter_id = fs.filter_id AND string_locate = '{$lang}' LEFT JOIN `modx_a_filter_values` vs ON pfv.value_id = vs.value_id AND string_locate = '{$lang}' WHERE f.filter_feature = 0 AND pfv.product_id = p.product_id) AS 'characteristics' FROM `modx_a_products` p LEFT JOIN `modx_a_product_strings` ps ON ps.product_id = p.product_id AND ps.string_locate = '$lang' WHERE p.product_id IN (" . $ids . ") AND p.product_active = 1 ")); if (count($content) > 0) { foreach ($content as $cont) { if ($_SESSION['currency'] == 'usd') { $cont['sing'] = ""; $cont['sing_usd'] = $_SESSION["sign"]; } else { $cont['sing'] = $_SESSION["sign"]; $cont['sing_usd'] = ""; } if ($characteristics = $shop->is_json($cont['characteristics'])) { if (is_array($characteristics)) { foreach ($characteristics as $characteristic) { $cont['characteristic'] .= $modx->parseChunk($tplCharac, $characteristic); } } } $cont['i'] = $i++; $cont['link'] = $modx->makeUrl($modx->config['shop_page_item']) . $cont['alias'] . '/'; $cont['cover'] = !empty($cont['cover']) ? '/assets/images/products/' . $cont['product_id'] . '/' . $cont['cover'] : 'assets/snippets/phpthumb/noimage.png'; $cont['second'] = !empty($cont['second']) ? '/assets/images/products/' . $cont['product_id'] . '/' . $cont['second'] : 'assets/snippets/phpthumb/noimage.png'; $cont['price'] = $shop->getPrice($cont['price'], $_SESSION['currency']); $cont['price_old'] = $shop->getPrice($cont['price_old'], $_SESSION['currency']); $cont['cart_count'] = count($_SESSION['cart']); $res .= $modx->parseChunk($tpl, $cont); } $modx->setPlaceholder('productCount' . $tab, count($content)); } else { $modx->setPlaceholder('productCount' . $tab, 0); } } else { $modx->setPlaceholder('productCount' . $tab, 0); } break; /** * Получить товар по ID * @var get = getProductSingle * @var id = ID товара * @var tpl = чанк для формирования единицы контента * @var tplCharac = чанк для формирования характеристик товара */ case "getProductSingle": $i = 0; if (isset($id) && (int)$id > 0) { $id = (int)$id; } else { $id = (int)$modx->documentObject['product_id']; } $modx->db->query(" SET SESSION group_concat_max_len = 100000;"); $content = $modx->db->getRow($modx->db->query(" SELECT p.product_id, p.product_price AS 'price', p.product_price_old AS 'price_old', p.product_url AS 'alias', p.product_status, p.product_discont, p.product_video_link, p.product_availability, ps.product_name, (SELECT COUNT(review_id) FROM `modx_a_reviews` WHERE review_product = p.product_id) AS 'product_review_count', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'cover' LIMIT 1) AS 'cover', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'second' LIMIT 1) AS 'second', ( SELECT CONCAT('[', GROUP_CONCAT( '{\"filter_id\":\"',COALESCE(f.filter_id,''),'\", \"filter_name\":\"',COALESCE(filter_name,''),'\", \"filter_type\":\"',COALESCE(filter_type,''),'\", \"filter_value\":\"',COALESCE(filter_value_{$lang},''),'\", \"filter_value_num\":\"',COALESCE(filter_value_num,''),'\", \"filter_icon\":\"',COALESCE(filter_icon,''),'\"}' ORDER BY f.filter_sort ASC ), ']' ) FROM `modx_a_product_filter_values` pfv LEFT JOIN `modx_a_filters` f ON pfv.filter_id = f.filter_id LEFT JOIN `modx_a_filter_strings` fs ON pfv.filter_id = fs.filter_id AND string_locate = '{$lang}' LEFT JOIN `modx_a_filter_values` vs ON pfv.value_id = vs.value_id AND string_locate = '{$lang}' WHERE pfv.product_id = p.product_id ) AS 'characteristics' FROM `modx_a_products` p LEFT JOIN `modx_a_product_strings` ps ON ps.product_id = p.product_id AND ps.string_locate = '$lang' WHERE p.product_id = (" . $id . ") AND p.product_active = 1 ")); if ($characteristics = $shop->is_json($content['characteristics'])) { foreach ($characteristics as $characteristic) { if ((int)$characteristic['filter_id'] == 10) { $modx->setPlaceholder('city', $characteristic['filter_value']); } $characteristic['filter_value'] = htmlspecialchars_decode($characteristic['filter_value']); $content['characteristic'] .= $modx->parseChunk($tplCharac, $characteristic); } } $content['i'] = $i++; $content['link'] = $modx->makeUrl($modx->config['shop_page_item']) . $content['alias'] . '/'; $content['cover'] = !empty($content['cover']) ? '/assets/images/products/' . $content['product_id'] . '/' . $content['cover'] : 'assets/snippets/phpthumb/noimage.png'; $content['second'] = !empty($content['second']) ? '/assets/images/products/' . $content['product_id'] . '/' . $content['second'] : 'assets/snippets/phpthumb/noimage.png'; $content['price'] = $shop->getPrice($content['price'], $_SESSION['currency']); $content['price_old'] = $shop->getPrice($content['price_old'], $_SESSION['currency']); $res .= $modx->parseChunk($tpl, $content); $modx->setPlaceholder('second', $content['second']); break; /** * Получить список товаров категории * @var get = getCatalog (Обязательный) * @var tpl = чанк для формирования единицы контента (Обязательный) * @var tplCharac = чанк для формирования характеристик товара * @var tplEmpty = чанк, ели нет товаров * @var did = ID категории (Если не передан - берётся ID текущего документа) * @var where = условие для фильтрации * * @return product_name = название * @return cover = главное изображение * @return price = цена * @return sing_usd = отображение знака доллара * @return sing = отображение знака валюты, если не доллар */ case "getCatalog": $i = 1; $where = []; $sort = ""; $did = (int)$did ?: ((int)$modx->documentIdentifier > 1 ? $modx->documentIdentifier : $modx->config['shop_catalog_root']); $ids = array_values($modx->getChildIds($did)); array_push($ids, $did); $filter_ids = (isset($filter_ids) && $filter_ids != '') ? 'AND f.filter_id IN (' . $modx->db->escape($filter_ids) . ') ' : ''; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } if (isset($_GET['sort']) && !empty($_GET['sort'])) { switch ($_GET['sort']) { case "price-up" : $sort = "ORDER BY p.product_price ASC"; break; case "price-down" : $sort = "ORDER BY p.product_price DESC"; break; case "in-stock" : $sort = "ORDER BY p.product_availability DESC"; break; case "first-action" : $sort = "ORDER BY CASE WHEN (p.product_status = 3 AND CAST(p.product_status AS SIGNED) = 3) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "first-top" : $sort = "ORDER BY CASE WHEN (p.product_status = 4 AND CAST(p.product_status AS SIGNED) = 4) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "first-hit" : $sort = "ORDER BY CASE WHEN (p.product_status = 5 AND CAST(p.product_status AS SIGNED) = 5) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "first-new" : $sort = "ORDER BY CASE WHEN (p.product_status = 1 AND CAST(p.product_status AS SIGNED) = 1) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "rating" : $sort = "ORDER BY p.product_rating DESC"; break; } } if ($filters = $modx->getPlaceholder("filters")) { $filters = explode(";", $filters); if (is_array($filters)) { foreach ($filters as $filter) { $filter = explode("=", $filter); if ($filter[0] == "price") { $range = explode("-", $filter[1]); $where[] = "p.product_price BETWEEN " . (int)$shop->getPriceToDefault($range[0], $_SESSION['currency']) . " AND " . (int)$shop->getPriceToDefault($range[1], $_SESSION['currency']); } else { $values = explode(",", $filter[1]); if (is_array($values)) { $whereValue = []; foreach ($values as $value) { $whereValue[] = "p.product_id IN ( SELECT product_id FROM `modx_a_product_filter_values` WHERE filter_id = ( SELECT filter_id FROM `modx_a_filters` WHERE filter_url = '" . $modx->db->escape($filter[0]) . "' ) AND value_id = ( SELECT value_id FROM `modx_a_filter_values` WHERE filter_url = '" . $modx->db->escape($value) . "' ) )"; } $where[] = "(" . implode(" OR ", $whereValue) . ")"; } } } } } if (count($where) > 0) { $where = "AND " . implode(" AND ", $where); } else { $where = ""; } if (count($ids) > 0) { $ids = implode(",", $ids); $modx->db->query(" SET SESSION group_concat_max_len = 100000;"); $query = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS *, (SELECT COUNT(review_id) FROM `modx_a_reviews` WHERE review_product = p.product_id) AS 'product_review_count', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'cover' LIMIT 1) AS 'cover', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'second' LIMIT 1) AS 'second', (SELECT CONCAT('[', GROUP_CONCAT( '{\"filter_name\":\"',COALESCE(filter_name,''),'\", \"filter_type\":\"',COALESCE(filter_type,''),'\", \"filter_icon\":\"',COALESCE(filter_icon,''),'\", \"filter_url\":\"',COALESCE(vs.filter_url,''),'\", \"filter_value\":\"',COALESCE(filter_value_{$lang},''),'\", \"filter_value_num\":\"',COALESCE(filter_value_num,''),'\", \"filter_id\":\"',COALESCE(f.filter_id,''),'\"}'), ']' ) FROM `modx_a_product_filter_values` pfv JOIN `modx_a_filters` f ON pfv.filter_id = f.filter_id {$filter_ids} LEFT JOIN `modx_a_filter_strings` fs ON pfv.filter_id = fs.filter_id AND string_locate = '{$lang}' LEFT JOIN `modx_a_filter_values` vs ON pfv.value_id = vs.value_id AND string_locate = '{$lang}' WHERE pfv.product_id = p.product_id) AS 'characteristics' FROM `modx_a_products` p LEFT JOIN `modx_a_product_strings` ps ON p.product_id = ps.product_id AND string_locate = '{$lang}' WHERE p.product_id IN (SELECT DISTINCT product_id FROM `modx_a_product_categories` WHERE modx_id IN ({$ids})) AND p.product_active = 1 {$where} {$sort} {$limit} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } $content = $modx->db->makeArray($query); if (count($content) > 0) { foreach ($content as $cont) { if ($_SESSION['currency'] == 'usd') { $cont['sing'] = ""; $cont['sing_usd'] = $_SESSION["sign"]; } else { $cont['sing'] = $_SESSION["sign"]; $cont['sing_usd'] = ""; } if ($characteristics = $shop->is_json($cont['characteristics'])) { if (is_array($characteristics)) { $childCharacteristics = $characteristics; foreach ($characteristics as $characteristic) { if ((int)$characteristic['filter_id'] === 6) { foreach ($childCharacteristics as $childCharacteristic) { if ((int)$childCharacteristic['filter_id'] === 10) { $city_country_string = $characteristic['filter_value'] . "/" . $childCharacteristic['filter_value']; } } } $characteristic['country_city'] = $city_country_string; $cont['characteristic'] .= $modx->parseChunk($tplCharac, $characteristic); } } } $cont['product_url'] = $modx->makeUrl($modx->config['shop_catalog_root']) . $cont['product_url'] . '/'; $cont['cover'] = !empty($cont['cover']) ? '/assets/images/products/' . $cont['product_id'] . '/' . $cont['cover'] : 'assets/snippets/phpthumb/noimage.png'; $cont['second'] = !empty($cont['second']) ? '/assets/images/products/' . $cont['product_id'] . '/' . $cont['second'] : 'assets/snippets/phpthumb/noimage.png'; $cont['price'] = $shop->getPrice($cont['product_price'], $_SESSION['currency']); $cont['price_old'] = $shop->getPrice($cont['product_price_old'], $_SESSION['currency']); $cont['cart_count'] = count($_SESSION['cart']); $res .= $modx->parseChunk($tpl, $cont); } } } $res = empty($res) ? $modx->getChunk($tplEmpty) : $res; break; /** * Получить список всех товаров (из корня магазина) * @var get = getCatalogRoot (Обязательный) * @var tpl = чанк для формирования единицы контента (Обязательный) * @var tplCharac = чанк для формирования характеристик товара * @var did = ID категории (Если не передан - берётся ID текущего документа) * @var slideAvail = условие для фильтрации * @var filter_ids = ID фильтров и характеристик которые нужно получить * * @return product_name = название * @return cover = главное изображение * @return price = цена * @return sing_usd = отображение знака доллара * @return sing = отображение знака валюты, если не доллар */ case "getCatalogRoot": $i = 1; $where = []; $sort = ""; $slideAvail = (isset($slideAvail) && (int)$slideAvail == 1) ? 'WHERE p.product_availability = 1' : ''; $did = (int)$did ?: ((int)$modx->documentIdentifier > 1 ? $modx->documentIdentifier : $modx->config['shop_catalog_root']); $ids = array_values($modx->getChildIds($did)); array_push($ids, $did); $filter_ids = (isset($filter_ids) && $filter_ids != '') ? 'AND f.filter_id IN (' . $modx->db->escape($filter_ids) . ') ' : ''; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } if (isset($_GET['sort']) && !empty($_GET['sort'])) { switch ($_GET['sort']) { case "price-up" : $sort = "ORDER BY p.product_price ASC"; break; case "price-down" : $sort = "ORDER BY p.product_price DESC"; break; case "in-stock" : $sort = "ORDER BY p.product_availability DESC"; break; case "first-action" : $sort = "ORDER BY CASE WHEN (p.product_status = 3 AND CAST(p.product_status AS SIGNED) = 3) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "first-top" : $sort = "ORDER BY CASE WHEN (p.product_status = 4 AND CAST(p.product_status AS SIGNED) = 4) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "first-hit" : $sort = "ORDER BY CASE WHEN (p.product_status = 5 AND CAST(p.product_status AS SIGNED) = 5) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "first-new" : $sort = "ORDER BY CASE WHEN (p.product_status = 1 AND CAST(p.product_status AS SIGNED) = 1) THEN CAST(p.product_status AS SIGNED) ELSE -999999999 END DESC"; break; case "rating" : $sort = "ORDER BY p.product_rating DESC"; break; } } if ($filters = $modx->getPlaceholder("filters")) { $filters = explode(";", $filters); if (is_array($filters)) { foreach ($filters as $filter) { $filter = explode("=", $filter); if ($filter[0] == "price") { $range = explode("-", $filter[1]); $where[] = "p.product_price BETWEEN " . (int)$shop->getPriceToDefault($range[0], $_SESSION['currency']) . " AND " . (int)$shop->getPriceToDefault($range[1], $_SESSION['currency']); } else { $values = explode(",", $filter[1]); if (is_array($values)) { $whereValue = []; foreach ($values as $value) { $whereValue[] = "p.product_id IN ( SELECT product_id FROM `modx_a_product_filter_values` WHERE filter_id = ( SELECT filter_id FROM `modx_a_filters` WHERE filter_url = '" . $modx->db->escape($filter[0]) . "' ) AND value_id = ( SELECT value_id FROM `modx_a_filter_values` WHERE filter_url = '" . $modx->db->escape($value) . "' ) )"; } $where[] = "(" . implode(" OR ", $whereValue) . ")"; } } } } } if (count($where) > 0) { $where = "AND " . implode(" AND ", $where); } else { $where = ""; } if (count($ids) > 0) { $ids = implode(",", $ids); $modx->db->query(" SET SESSION group_concat_max_len = 100000;"); $query = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS *, (SELECT COUNT(review_id) FROM `modx_a_reviews` WHERE review_product = p.product_id) AS 'product_review_count', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'cover' LIMIT 1) AS 'cover', (SELECT image_file FROM `modx_a_product_images` WHERE image_product_id = p.product_id AND image_use = 'second' LIMIT 1) AS 'second', (SELECT CONCAT('[', GROUP_CONCAT( '{\"filter_name\":\"',COALESCE(filter_name,''),'\", \"filter_type\":\"',COALESCE(filter_type,''),'\", \"filter_url\":\"',COALESCE(vs.filter_url,''),'\", \"filter_value\":\"',COALESCE(filter_value_{$lang},''),'\", \"filter_value_num\":\"',COALESCE(filter_value_num,''),'\", \"filter_id\":\"',COALESCE(f.filter_id,''),'\"}'), ']' ) FROM `modx_a_product_filter_values` pfv INNER JOIN `modx_a_filters` f ON pfv.filter_id = f.filter_id {$filter_ids} LEFT JOIN `modx_a_filter_strings` fs ON pfv.filter_id = fs.filter_id AND string_locate = '{$lang}' LEFT JOIN `modx_a_filter_values` vs ON pfv.value_id = vs.value_id AND string_locate = '{$lang}' WHERE pfv.product_id = p.product_id) AS 'characteristics' FROM `modx_a_products` p LEFT JOIN `modx_a_product_strings` ps ON p.product_id = ps.product_id AND string_locate = '{$lang}' {$slideAvail} {$where} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } $content = $modx->db->makeArray($query); if (count($content) > 0) { foreach ($content as $cont) { if ($_SESSION['currency'] == 'usd') { $cont['sing'] = ""; $cont['sing_usd'] = $_SESSION["sign"]; } else { $cont['sing'] = $_SESSION["sign"]; $cont['sing_usd'] = ""; } if ($characteristics = $shop->is_json($cont['characteristics'])) { if (is_array($characteristics)) { $childCharacteristics = $characteristics; foreach ($characteristics as $characteristic) { if ((int)$characteristic['filter_id'] === 6) { foreach ($childCharacteristics as $childCharacteristic) { if ((int)$childCharacteristic['filter_id'] === 10) { $city_country_string = $characteristic['filter_value'] . "/" . $childCharacteristic['filter_value']; } } } $characteristic['country_city'] = $city_country_string; $cont['characteristic'] .= $modx->parseChunk($tplCharac, $characteristic); } } } $cont['product_url'] = $modx->makeUrl($modx->config['shop_catalog_root']) . $cont['product_url'] . '/'; $cont['cover'] = !empty($cont['cover']) ? '/assets/images/products/' . $cont['product_id'] . '/' . $cont['cover'] : 'assets/snippets/phpthumb/noimage.png'; $cont['second'] = !empty($cont['second']) ? '/assets/images/products/' . $cont['product_id'] . '/' . $cont['second'] : 'assets/snippets/phpthumb/noimage.png'; $cont['price'] = $shop->getPrice($cont['product_price'], $_SESSION['currency']); $cont['price_old'] = $shop->getPrice($cont['product_price_old'], $_SESSION['currency']); $cont['cart_count'] = count($_SESSION['cart']); $res_tpl .= $modx->parseChunk($tpl, $cont); } $modx->setPlaceholder('res_tpl', $res_tpl); } } $res_empty = empty($res_tpl) ? $modx->getChunk($tplEmpty) : $res; $modx->setPlaceholder('res_empty', $res_empty); break; /** * проверка на наличие выбранных фильтров */ case "checkFilters": if ($modx->getPlaceholder('filters')) { $res = $modx->getChunk($tpl); } break; /** * */ case "showAdvantages": $filters = $modx->getPlaceholder('filters'); if($filters){ $values = $shop->checkAdvantagesForValues($filters); if($values){ $res = $modx->parseChunk($tpl, [ 'values' => implode(', ', array_column($values, 'value')) ]); } } break; /** * Получить фильтры категории * @var get = getFilters * @var did = ID категории * @var tpl = Чанк для формирования единицы контента * @var tplInner = Чанк для формирования внутренней записи * * @return filter_inner = Список значений фильтра * @return filter_name = Название фильтра * @return filter_value = Значение фильтра * @return value_url = Значение url фильтра * @return filter_active= Если фильтр уже отмечен */ case "getFilters": $i = 2; $query = $modx->db->makeArray($modx->db->query(" SELECT f.filter_id, f.filter_url, f.filter_sort, fv.filter_url AS 'value_url', fv.value_id, fv.filter_value_{$lang}, (SELECT filter_name FROM `modx_a_filter_strings` WHERE filter_id = f.filter_id AND string_locate = '{$lang}') AS 'filter_name' FROM `modx_a_filters` f LEFT JOIN `modx_a_filter_values` fv ON f.filter_id = fv.filter_id WHERE f.filter_feature = 1 ORDER BY f.filter_sort, value_url ")); $url_filter = array(); if ($urlFilters = $modx->getPlaceholder("filters")) { $urlFilters = explode(";", $urlFilters); if (is_array($urlFilters)) { foreach ($urlFilters as $urlFilter) { $urlFilter = explode("=", $urlFilter); if ($urlFilter[0] != "price") { $values = explode(",", $urlFilter[1]); if (is_array($values)) { foreach ($values as $value) { $urlFltr[$urlFilter[0]][] = $value; $url_filter[$modx->db->getValue('Select `filter_id` from modx_a_filters where `filter_url`="'.$urlFilter[0].'"')][] = $modx->db->getValue('Select `value_id` from modx_a_filter_values where `filter_url`="'.$value.'"'); } } } } } } $url_filter_ex = array(); $joins = array(); if (count($url_filter)) { foreach($url_filter as $key => $val) { $url_filter_ex[$key] = '(t'.$key.'.value_id in ('.implode(',',$val).') and t'.$key.'.filter_id='.$key.')'; $joins[] = 'left join modx_a_product_filter_values as t'.$key.' on t.product_id = t'.$key.'.product_id'; } } //$modx->logEvent(0, 3, '
'.print_r($url_filter_ex,1).'
', 'filter'); $sqls = array(); if (is_array($query)) { foreach ($query as $q) { $filters[$q['filter_id']]['filter_name'] = $q['filter_name']; $filters[$q['filter_id']]['filter_values'][$q['value_id']]['filter_value'] = $q['filter_value_' . $lang]; $filters[$q['filter_id']]['filter_values'][$q['value_id']]['value_url'] = $q['value_url']; $filters[$q['filter_id']]['filter_values'][$q['value_id']]['filter_url'] = $q['filter_url']; $filters[$q['filter_id']]['filter_values'][$q['value_id']]['filter_active'] = 0; //$filters[$q['filter_id']]['filter_values'][$q['value_id']]['disabled'] = 'disabled'; if (is_array($urlFltr)) { foreach ($urlFltr as $k => $v) { if ($q['filter_url'] == $k && in_array($q['value_url'], $v)) { $filters[$q['filter_id']]['filter_values'][$q['value_id']]['filter_active'] = 1; } } } } } $sqls = array(); if (is_array($filters)) { foreach ($filters as $filter_id => $filter) { $filter['filter_values'] = $shop->customMultiSort($filter['filter_values'], 'filter_value'); if (is_array($filter['filter_values'])) { $iterate = 1; foreach ($filter['filter_values'] as $item) { $filter_value = $modx->db->getValue('Select `value_id` from modx_a_filter_values where `filter_url`="'.$modx->db->escape($item['value_url']).'"'); if (count($url_filter_ex)) { $url_filter_ex2 = array(); foreach($url_filter_ex as $k => $v) if ($k!=$filter_id) $url_filter_ex2[] = $v; if (count($url_filter_ex2)) $url_filter_exp = ' and '.implode(' and ',$url_filter_ex2); else $url_filter_exp = 'and 1'; } $sql = 'select count(*) from modx_a_product_filter_values as t join modx_a_products as p on t.product_id = p.product_id '.implode(' ',$joins).' where (t.filter_id in ('.$filter_id.') and t.value_id='.$filter_value.') '.$url_filter_exp; $sqls[] = $sql; $item['count'] = $modx->db->getValue($sql); $item['i'] = $iterate; $filter['filter_inner'] .= $modx->parseChunk($tplInner, $item); $iterate++; } } $filter['i'] = $i++; $res .= $modx->parseChunk($tpl, $filter); } } //$modx->logEvent(0, 3, implode('
',$sqls), 'filter'); break; /** * Вывод отзывов на фронтенд * @var get = getRewievs * @var tpl = чанк для отображения одной записи * @var home = отображение отзывов помеченых для главной * @var pagin = включает постраничную навигацию * @var limit = ограничивает количество записей в выборке * * @return image = путь к изображению */ case "getRewievs": $i = 1; $where = []; if (isset($home) && (int)$home > 0) { $where[] = "review_home = 1"; } if (isset($product) && (int)$product > 0) { $where[] = "review_product = " . (int)$product; } if (count($where) > 0) { $where = "AND " . implode(" AND ", $where); } else { $where = ""; } if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $rewievs = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS *, (CASE WHEN r.review_product > 0 THEN (SELECT product_name FROM `modx_a_product_strings` WHERE string_locate = '{$lang}' AND product_id = r.review_product) ELSE '' END) AS 'review_product_name' FROM `modx_a_reviews` r LEFT JOIN `modx_a_review_strings` rs ON r.review_id = rs.review_id AND string_locate = '{$lang}' WHERE review_active = 1 {$where} ORDER BY review_created DESC {$limit} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } while ($rewiev = $modx->db->getRow($rewievs)) { $rewiev['review_content'] = htmlspecialchars_decode($rewiev['review_content']); $slider_img = []; $rewiev['i'] = $i; if (isset($rewiev['review_cover']) && $rewiev['review_cover'] != '') { $rewiev['image'] = "/assets/images/reviews/" . $rewiev['review_id'] . "/" . $rewiev['review_cover']; } else { $rewiev['image'] = "/assets/images/noimage.png"; } $all_images = scandir(MODX_BASE_PATH . "assets/images/reviews/" . $rewiev['review_id']); foreach ($all_images as $key => $image) { if ($image != '.' && $image != '..') { $slider_img[] = $image; } } $avatar_in_folder = array_search($rewiev['review_cover'], $slider_img); unset($slider_img[$avatar_in_folder]); foreach ($slider_img as $img) { $single_img['id'] = $rewiev['review_id']; $single_img['image'] = "/assets/images/reviews/" . $rewiev['review_id'] . "/" . $img; $rewiev['slider'] .= $modx->parseChunk($tplSlider, $single_img); } $res .= $modx->parseChunk($tpl, $rewiev); $i++; } $modx->setPlaceholder('getReviewsCount', $i - 1); break; /** * Вывод новостей на фронтенд * @var get = getNews * @var tpl = Чанк для отображения одной записи * @var tplEmpty = Чанк для отображения в случае отсутствия записей * @var limit = Лимит колличества записей в выборке * @var pagin = Включает постраничную навигацию * @var pid = тип записи * @var parentid = тип записи(id страницы для формирования URL записи) * * @return image = Путь к изображению * @return link = Ссылка на статью * @return news_title = Заголовок * @return news_introtext = Вводный текст */ case "getNews": $i = 1; $parentid = (int)$parentid; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $newss = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS * FROM `modx_a_news` n LEFT JOIN `modx_a_news_translate` nt ON n.news_id = nt.news_tr_id AND nt.news_locate = '{$lang}' WHERE news_published = 1 AND news_pub_page = '{$parentid}' ORDER BY news_pub_date DESC {$limit} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } if((int)$pages['cnt'] > 0) { while ($news = $modx->db->getRow($newss)) { $news['i'] = $i; if ($news['news_photo'] != '') { $news['image'] = "/assets/images/news/" . $news['news_photo']; } else { $news['image'] = "/assets/images/noimage.png"; } $news['link'] = $modx->makeUrl($parentid) . $news['news_alias'] . "/"; $res .= $modx->parseChunk($tpl, $news); $i++; } } else { $res = $modx->parseChunk($tplEmpty, []); } $modx->setPlaceholder('getNewsCount', $i - 1); break; /** * Вывод новостей на фронтенд * @var get = getNews * @var tpl = Чанк для отображения одной записи * @var limit = Лимит колличества записей в выборке * @var pagin = Включает постраничную навигацию * @var pid = тип записи * @var parentid = тип записи(id страницы для формирования URL записи) * * @return image = Путь к изображению * @return link = Ссылка на статью * @return news_title = Заголовок * @return news_introtext = Вводный текст */ case "getNewsRoot": $i = 1; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $newss = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS * FROM `modx_a_news` n LEFT JOIN `modx_a_news_translate` nt ON n.news_id = nt.news_tr_id AND nt.news_locate = '{$lang}' WHERE news_published = 1 ORDER BY news_pub_date DESC {$limit} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } while ($news = $modx->db->getRow($newss)) { $news['i'] = $i; if ($news['news_photo'] != '') { $news['image'] = "/assets/images/news/" . $news['news_photo']; } else { $news['image'] = "/assets/images/noimage.png"; } $news['link'] = $modx->makeUrl($news['news_pub_page']) . $news['news_alias'] . "/"; $res .= $modx->parseChunk($tpl, $news); $i++; } $modx->setPlaceholder('getNewsCount', $i - 1); break; /** * Вывод вопрос/ответ на фронтенд * @var get = getFaqs * @var tpl = чанк для отображения одной записи * @var tplInner * @var limit = лимит колличества записей в выборке * @var pagin = включает постраничную навигацию * * @return image = путь к изображению */ case "getFaqs": if (isset($_REQUEST['faq_cat']) && $_REQUEST['faq_cat'] != '') { $faq_cat = (int)$_REQUEST['faq_cat']; } $i = 1; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $faq_cat = (isset($faq_cat) && $faq_cat != '') ? 'AND f.faq_category = ' . $faq_cat : ''; $faqs = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS f.faq_category, fs.faq_question, fs.faq_answer, (SELECT pagetitle_" . $lang . " FROM `modx_site_content` WHERE id = f.faq_category) AS 'faq_category_name' FROM `modx_a_faqs` f LEFT JOIN `modx_a_faq_strings` fs ON f.faq_id = fs.faq_id AND fs.string_locate = '{$lang}' WHERE f.faq_active = 1 AND f.faq_category > 0 $faq_cat ORDER BY faq_category_name ASC {$limit} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } while ($faq = $modx->db->getRow($faqs)) { $fs[$faq['faq_category']]['faq_category'] = $faq['faq_category_name']; $fs[$faq['faq_category']]['faq_questions'][] = $faq; } if (is_array($fs)) { foreach ($fs as $f) { $inner = ''; if (is_array($f['faq_questions'])) { foreach ($f['faq_questions'] as $faq_question) { $faq_question['faq_question'] = htmlspecialchars_decode($faq_question['faq_question']); $faq_question['faq_answer'] = htmlspecialchars_decode($faq_question['faq_answer']); $inner .= $modx->parseChunk($tplInner, $faq_question); } } $f['i'] = $i; $f['questions'] = $inner; $res .= $modx->parseChunk($tpl, $f); $i++; } } break; /** * Вывод вопрос/ответ на фронтенд родительской категории * @var get = getFaqsParentCategory * @var tpl = чанк для отображения одной записи * @var tplInner * @var limit = лимит колличества записей в выборке * @var pagin = включает постраничную навигацию * * @return image = путь к изображению */ case "getFaqsParentCategory": if (isset($_REQUEST['parent_cat_id']) && $_REQUEST['parent_cat_id'] != '') { $parent_cat_id = (int)$_REQUEST['parent_cat_id']; } $i = 1; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } $faqs_child_cats = $modx->db->getRow($modx->db->query(" SELECT GROUP_CONCAT(id SEPARATOR ',') AS child_categories FROM `modx_site_content` WHERE parent = {$parent_cat_id} ")); $slideAvail = (isset($slideAvail) && (int)$slideAvail == 1) ? 'WHERE p.product_availability = 1' : ''; $result_faq_cats = (isset($faqs_child_cats['child_categories']) && $faqs_child_cats['child_categories'] != '') ? $parent_cat_id . ',' . $faqs_child_cats['child_categories'] : $parent_cat_id; $faqs = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS f.faq_category, fs.faq_question, fs.faq_answer, (SELECT pagetitle_" . $lang . " FROM `modx_site_content` WHERE id = f.faq_category) AS 'faq_category_name' FROM `modx_a_faqs` f LEFT JOIN `modx_a_faq_strings` fs ON f.faq_id = fs.faq_id AND fs.string_locate = '{$lang}' WHERE f.faq_active = 1 AND f.faq_category > 0 AND f.faq_category IN ({$result_faq_cats}) ORDER BY faq_category_name ASC {$limit} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } while ($faq = $modx->db->getRow($faqs)) { $fs[$faq['faq_category']]['faq_category'] = $faq['faq_category_name']; $fs[$faq['faq_category']]['faq_questions'][] = $faq; } if (is_array($fs)) { foreach ($fs as $f) { $inner = ''; if (is_array($f['faq_questions'])) { foreach ($f['faq_questions'] as $faq_question) { $faq_question['faq_question'] = htmlspecialchars_decode($faq_question['faq_question']); $faq_question['faq_answer'] = htmlspecialchars_decode($faq_question['faq_answer']); $inner .= $modx->parseChunk($tplInner, $faq_question); } } $f['i'] = $i; $f['questions'] = $inner; $res .= $modx->parseChunk($tpl, $f); $i++; } } break; /** * Сформировать токен * @var get = setToken */ case "setToken": $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; $randstring = ''; for ($i = 0; $i < 10; $i++) { $randstring .= $characters[rand(0, strlen($characters))]; } $res = $randstring; break; /** * Формирование минифицированного номера телефона * @var get = setMiniPhone * @var string = строка для очистки */ case "setMiniPhone": $res = str_replace([" ", "(", ")", "-"], "", trim($string)); break; /** * Формирование даты http://php.net/manual/ru/datetime.createfromformat.php * @var get = getDate * @var date = строка, содержащая дату * @var from = входной формат даты ('U' - Unixtime, 'Y-m-d H:i:s' - Timestamp) * @var to = выходной формат даты */ case "getDate": $from = isset($from) ? $from : 'U'; $to = isset($to) ? $to : 'd. m. Y'; $resdt = DateTime::createFromFormat($from, $date); $newdt = $resdt->format($to); switch ($lang) { case "ua": $res = str_replace( ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"], $newdt); break; case "ru": $res = str_replace( ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"], $newdt); break; default: $res = $newdt; break; } break; /** * Текущий год * @var get = setCurrentYear */ case "setCurrentYear": $res = date("Y"); break; /** * Установить срок действия куки * @var get = setСookieTime */ case "setСookieTime": $date = date("Y-m-d H:i:s", strtotime("+1 year")); $format = isset($format) ? $format : 'Y-m-d H:i:s'; $to = isset($to) ? $to : 'D, d M Y H:i:s e'; $date = DateTime::createFromFormat($format, $date); $res = $date->format($to); break; /** * Постраничная навигация * @var get = getPaginate * @var tpl = шаблон одного пункта * @var tpl_current = шаблон текущего пункта * @var tpl_prev = шаблон предыдущего пункта * @var tpl_next = шаблон следующего пункта * @var tpl_indent = шаблон пункта отступов * * @return page_title = номер страницы * @return page_value = ссылка на страницу * @return page_prev = ссылка на предыдущую страницу * @return page_next = ссылка на следующую страницу */ case "getPaginate": if ($modx->getPlaceholder("maxitem") != '' && $modx->getPlaceholder("limitem") != '') { $pages['all'] = ceil($modx->getPlaceholder("maxitem") / $modx->getPlaceholder("limitem")); } $url = $modx->makeUrl($modx->documentIdentifier); $surl1 = ''; $surl1 .= (isset($_GET['search']) && $_GET['search'] != '') ? '&search=' . $_GET['search'] : ''; $surl1 .= (isset($_GET['filter']['type']) && $_GET['filter']['type'] != '') ? '&filter[type]=' . $_GET['filter']['type'] : ''; $surl2 = ''; $surl2 .= (isset($_GET['search']) && $_GET['search'] != '') ? '?search=' . $_GET['search'] : ''; $surl2 .= (isset($_GET['filter']['type']) && $_GET['filter']['type'] != '') ? '?filter[type]=' . $_GET['filter']['type'] : ''; if ($pages['all'] > 1 && $_GET['p'] <= $pages['all']) { $limit_pagination = 5; $curent = isset($_REQUEST['p']) ? $_REQUEST['p'] : 1; $start = $curent - $limit_pagination; $end = $curent + $limit_pagination; $start = $start < 1 ? 1 : $start; $end = $end > $pages['all'] ? $pages['all'] : $end; if ($curent > 1) { $res .= $modx->parseChunk($tpl_prev, ['page_prev' => $url . ($curent > 2 ? '?p=' . ($curent - 1) . $surl1 : $surl2)]); $modx->setPlaceholder('rel_previous', ''); } if ($curent > ($limit_pagination + 1)) { $res .= $modx->getChunk($tpl_indent); } for ($i = $start; $i < ($end + 1); $i++) { if ($i == $curent) { $res .= $modx->parseChunk($tpl_current, ['page_title' => $i]); $modx->setPlaceholder('rel_canonical', $url); } else { $res .= $modx->parseChunk($tpl, ['page_value' => $url . ($i > 1 ? '?p=' . $i . $surl1 : $surl2), 'page_title' => $i]); } } if ($curent < ($pages['all'] - $limit_pagination)) { $res .= $modx->getChunk($tpl_indent); } if ($curent != $pages['all']) { $res .= $modx->parseChunk($tpl_next, ['page_next' => $url . '?p=' . ($curent + 1) . $surl1]); $modx->setPlaceholder('rel_next', ''); } } break; /** * Отправка письма, настройки почты берутся из общего конфига сайта * @var get = sendmail * @var to = получатель * @var body = html верстка письма * @var subject = тема письма */ case "sendmail": if (!class_exists('PHPMailer')) { require MODX_BASE_PATH . MGR_DIR . "/includes/controls/phpmailer/class.phpmailer.php"; } $Password = $modx->config['smtppw']; $Password = substr($Password, 0, -7); $Password = str_replace('%', '=', $Password); $Password = base64_decode($Password); $mail = new PHPMailer(); //$mail->IsSMTP(); //$mail->SMTPDebug = 1; //$mail->SMTPAuth = true; //$mail->SMTPSecure = "ssl"; // для gmail открыть $mail->CharSet = 'UTF-8'; /*$mail->Host = $modx->config['smtp_host']; $mail->Port = $modx->config['smtp_port']; $mail->Username = $modx->config['smtp_username']; $mail->Password = $Password;*/ $mail->Subject = $subject; $mail->SetFrom($modx->config['smtp_username'], $modx->config['site_name']); $mail->AddAddress($to); $mail->MsgHTML($body); $m = $mail->Send(); //$shop->dd($m); break; /** * Получить видео отзывы * @var get = getRewievsVideo * @var did = ID категории * @var tpl = Чанк для формирования единицы контента * @var limit = Лимит колличества записей в выборке * @var pagin = Включает постраничную навигацию * @var visible = Учитывать ли флаг видимости (home_visible) для главной страницы (1 - учитывать, 0 или ничего - не учитывать) */ case "getRewievsVideo": $i = 1; if (isset($pagin) && (int)$pagin > 0) { $lim = (isset($limit) && (int)$limit > 0) ? (int)$limit : 10; $start = (int)$_GET['p'] > 1 ? ((int)$_GET['p'] - 1) * $limit : 0; $limit = "LIMIT " . $start . "," . $limit . ""; } else { $limit = (isset($limit) && (int)$limit > 0) ? ' LIMIT ' . (int)$limit : ''; } if (isset($visible) && (int)$visible > 0) { $visible = 'AND home_visible = 1'; } else { $visible = ''; } $video_reviews = $modx->db->query(" SELECT SQL_CALC_FOUND_ROWS * FROM `modx_a_reviews_video` r WHERE status = 1 {$visible} {$limit} "); if (isset($pagin) && (int)$pagin > 0) { $pages = $modx->db->getRow($modx->db->query("SELECT FOUND_ROWS() AS 'cnt'")); $modx->setPlaceholder('maxitem', $pages['cnt']); $modx->setPlaceholder('limitem', $lim); } while ($video_review = $modx->db->getRow($video_reviews)) { $video_review['i'] = $i; if (!empty($video_review['poster'])) { $video_review['poster'] = '/assets/images/video_reviews_poster/' . $video_review['id'] . "/" . $video_review['poster']; } else { $video_review['poster'] = "assets/images/noimage.jpg"; } $video_review['date_add'] = ($video_review['date_add'] == '0000-00-00 00:00:00') ? "" : $video_review['date_add']; $video_review['annotation'] = $video_review['annotation_' . $lang]; $res .= $modx->parseChunk($tpl, $video_review); $i++; } $modx->setPlaceholder('getNewsCount', $i - 1); break; /** * Получение координат города от Google API * @var get = getCoordinates * @var city = Город * @var key = Ключ API */ case "getCoordinates": //TODO:Вывести все метки на карту $city = str_replace(['-', '_'], '%20', trim(explode(",", $city)[0])); if(!empty(trim($city))) { $coordinate = file_get_contents("https://maps.googleapis.com/maps/api/geocode/json?address=" . $city . "&key=" . $key . "&results=1"); $api_json = json_decode($coordinate, true); $lat = $api_json['results'][0]['geometry']['location']['lat']; $lng = $api_json['results'][0]['geometry']['location']['lng']; $coord = $lat . ", " . $lng; $modx->setPlaceholder('city_coordinates', $coord); } else { $modx->setPlaceholder('city_coordinates', ''); } break; /** * Постороение HTML-карты сайта * @var get = getHtmlMap * @var did = ID документа, если не передан - берётся ID текущего документа * @var tpl = чанк для отображения не активного пункта меню * @var tplActive = чанк для отображения активного пункта меню * @var tplSub = чанк для отображения не активного пункта меню, содержащего подменю * @var dept = глубина вложенности меню * @var order = поле и направление сортировки результатов выборки * @var exclude = исключить из запроса документы с указанными ID (передать список через запятую) * @var subExclude = не выводить дочернее меню для документов с указанными ID (передать список через запятую) * * @return alias = алиас пункта меню * @return menutitle = заголовок пункта меню * @return link = ссылка для пункта меню * @return isfolder = имеет подменю * @return submenu = список пунктов подменю */ case "getHtmlMap": $arrMenu = []; $dept = (int)$dept > 0 ? $dept : 1; $did = 0; $ids = array_values($modx->getChildIds($did, $dept)); $ids = implode(',', $ids); $excl_parent = !empty($modx->db->escape($excl_parent)) ? ' AND c.parent NOT IN (' . $modx->db->escape($excl_parent) . ')' : ''; if ($ids) { $i = 1; if (isset($exclude) && $exclude != '') { $ex = explode(',', $exclude); $excl = ' AND id <> ' . implode(' AND id <> ', $ex); } else { $excl = ''; } if (isset($subExclude) && $subExclude != '') { $subExclude = explode(',', $subExclude); } else { $subExclude = []; } $order = (isset($order) && $order != '') ? $order : 'c.menuindex ASC'; $query = $modx->db->makeArray($modx->db->query(" SELECT c.id, c.alias, c.isfolder, c.parent, c.searchable, c.pagetitle_$lang AS 'pagetitle', c.menutitle_$lang AS 'menutitle', (SELECT COUNT(id) FROM `modx_site_content` WHERE published = 1 AND deleted = 0 AND hidemenu = 0 AND parent = " . (int)$parent . " $excl) AS 'count', (SELECT redirect_target FROM `modx_a_redirect` WHERE redirect_code = 301 AND redirect_source = CONCAT(c.alias, '/')) AS 'redirect' FROM `modx_site_content` c WHERE c.published = 1 AND c.deleted = 0 AND c.hidemenu = 0 AND c.searchable = 1 AND c.id IN ({$ids}) {$excl} {$excl_parent} ORDER BY {$order} ")); $query_vacancies = $modx->db->makeArray($modx->db->query(" SELECT p.`product_url`, ps.`product_name` as 'menutitle' FROM `modx_a_products` p LEFT JOIN `modx_a_product_strings` ps ON p.product_id = ps.product_id AND string_locate = '{$lang}' WHERE p.product_id IN (SELECT DISTINCT product_id FROM `modx_a_product_categories` WHERE modx_id IN ({$ids})) AND p.product_active = 1 {$where} {$sort} {$limit} ")); if (is_array($query)) { foreach ($query as $value) { if ($value['parent'] == $did) { $arrMenu[] = $value; } } foreach ($arrMenu as $key => $value) { foreach ($query as $v) { if ($v['parent'] == $value['id'] && !in_array($value['id'], $subExclude)) { $arrMenu[$key]['submenu'][] = $v; } } } } foreach ($arrMenu as $menu) { $menu['i'] = $i; $menu['link'] = $modx->makeUrl($menu['id']); $menu['menutitle'] = $menu['menutitle'] != '' ? $menu['menutitle'] : $menu['pagetitle']; if ($menu['id'] == $modx->documentIdentifier || $menu['redirect'] == $menu['alias'] . '/' . $modx->documentObject['alias'] . '/') { $subres = ''; if (is_array($menu['submenu'])) { foreach ($menu['submenu'] as $submenu) { $submenu['link'] = $modx->makeUrl($submenu['id']); $submenu['menutitle'] = $submenu['menutitle'] != '' ? $submenu['menutitle'] : $submenu['pagetitle']; $subres .= $modx->parseChunk($tplSub, $submenu); } $menu['submenu'] = $subres; } $res .= $modx->parseChunk($tplActive, $menu); } elseif (isset($menu['submenu']) && is_array($menu['submenu'])) { $subres = ''; foreach ($menu['submenu'] as $submenu) { $submenu['link'] = $modx->makeUrl($submenu['id']); $submenu['menutitle'] = $submenu['menutitle'] != '' ? $submenu['menutitle'] : $submenu['pagetitle']; if ($submenu['id'] == $modx->documentIdentifier) { $subres .= $modx->parseChunk($tplActive, $submenu); } else { $subres .= $modx->parseChunk($tplSub, $submenu); } } $menu['submenu'] = $subres; $res .= $modx->parseChunk($tpl, $menu); } else { $res .= $modx->parseChunk($tpl, $menu); } $i++; } //Выводим вакансии в карту сайта if(is_array($query_vacancies) && count($query_vacancies) > 0) { foreach ($query_vacancies as $vacancy) { $vacancy['link'] = $modx->makeUrl($modx->config['shop_catalog_root']) . $vacancy['product_url'] . '/'; $res .= $modx->parseChunk($tpl, $vacancy); } } } break; } /** * Включение кеширования сниппета * @var get = название сниппета * @var cache = строка, уникальный идентификатор для кеша * @var setMinify = включить сжатие html кода в результате, для включения передать цифру 1 * * @return res = возвращает файл, в случае его наличия */ if (isset($cache)) { if (isset($setMinify) && (int)$setMinify > 0) { file_put_contents($file_name, str_replace([chr(9), chr(10), chr(13)], '', $modx->parseDocumentSource($res))); } else { file_put_contents($file_name, $modx->parseDocumentSource($res)); } }