static function getInfoRecentProduct($args) { $model = new Models_Product(); $stringRelated = ' null'; $sortRelated = array(); foreach ($args as $item) { $stringRelated .= ',' . DB::quote($item); $sortRelated[$item] = $item; } $stringRelated = substr($stringRelated, 1); $data['products'] = $model->getProductByUserFilter(' p.code IN (' . $stringRelated . ') and p.activity = 1 '); if (!empty($data['products'])) { $data['currency'] = MG::getSetting('currency'); foreach ($data['products'] as $item) { $img = explode('|', $item['image_url']); $item['img'] = $img[0]; $item['url'] = SITE . '/' . (isset($item["category_url"]) ? $item["category_url"] : 'catalog') . '/' . $item["product_url"]; $item['price'] = MG::priceCourse($item['price_course']); $sortRelated[$item['code']] = $item; } $data['products'] = array(); //сортируем связанные товары в том порядке, в котором они идут в строке артикулов foreach ($sortRelated as $item) { if (!empty($item['id']) && is_array($item)) { $data['products'][$item['id']] = $item; } } } return self::htmlRecentlyProducts($data); }
static function counterView($arg) { $model = new Models_Product(); $product = $model->getProduct(URL::getQueryParametr('id')); $user_ip = $_SERVER['REMOTE_ADDR']; $date = date('Y-m-d'); $id_product = $product['id']; $visits_today = DB::query("SELECT `id` FROM `" . PREFIX . self::$pluginName . '_visits' . "` WHERE `date`='" . $date . "'"); $product = DB::query("SELECT `id` FROM `" . PREFIX . self::$pluginName . '_visits' . "` WHERE id_product='" . $id_product . "'"); if (!DB::numRows($product)) { DB::query("INSERT INTO `" . PREFIX . self::$pluginName . '_visits' . "` SET `views`=1, `id_product`='" . $id_product . "', `date`='" . $date . "'"); } else { DB::query("UPDATE `" . PREFIX . self::$pluginName . '_visits' . "` SET `date`='" . $date . "', `views`=`views`+1 WHERE `id_product`='" . $id_product . "'"); } return $arg['result']; }
function __construct() { $model = new Models_Product(); // Требуется только пересчет цены товара. if (!empty($_REQUEST['calcPrice'])) { $model->calcPrice(); exit; } $product = Storage::get(md5('ControllersProduct' . URL::getUrl())); if ($product == null) { $settings = MG::get('settings'); $product = $model->getProduct(URL::getQueryParametr('id')); if (empty($product)) { MG::redirect('/404'); exit; } $product['meta_title'] = $product['meta_title'] ? $product['meta_title'] : $product['title']; $product['currency'] = $settings['currency']; $blockVariants = $model->getBlockVariants($product['id']); $blockedProp = $model->noPrintProperty(); $propertyFormData = $model->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => $product['thisUserFields'], 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => false, 'noneButton' => $product['count'] ? false : true, 'titleBtn' => MG::getSetting('buttonBuyName'), 'blockVariants' => $blockVariants, 'currency_iso' => $product['currency_iso'])); // Легкая форма без характеристик. $liteFormData = $model->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => false, 'noneButton' => $product['count'] ? false : true, 'titleBtn' => MG::getSetting('buttonBuyName'), 'blockVariants' => $blockVariants)); //echo viewData($propertyFormData['defaultSet']); $product['price_course'] += $propertyFormData['marginPrice']; $currencyRate = MG::getSetting('currencyRate'); $currencyShopIso = MG::getSetting('currencyShopIso'); $product['currency_iso'] = $product['currency_iso'] ? $product['currency_iso'] : $currencyShopIso; $product['old_price'] = $product['old_price'] * $currencyRate[$product['currency_iso']]; $product['old_price'] = $product['old_price'] ? $product['old_price'] : 0; $product['price'] = MG::priceCourse($product['price_course']); $product['propertyForm'] = $propertyFormData['html']; $product['propertyNodummy'] = $propertyFormData['propertyNodummy']; $product['stringsProperties'] = $propertyFormData['stringsProperties']; $product['liteFormData'] = $liteFormData['html']; $product['description'] = MG::inlineEditor(PREFIX . 'product', "description", $product['id'], $product['description']); $product['title'] = MG::modalEditor('catalog', $product['title'], 'edit', $product["id"]); // Информация об отсутствии товара на складе. if (MG::getSetting('printRemInfo') == "true") { $message = 'Здравствуйте, меня интересует товар "' . str_replace("'", """, $product['title']) . '" с артикулом "' . $product['code'] . '", но его нет в наличии. Сообщите, пожалуйста, о поступлении этого товара на склад. '; if ($product['count'] != 0) { $style = 'style="display:none;"'; } $product['remInfo'] = "<span class='rem-info' " . $style . ">Товара временно нет на складе!<br/><a href='" . SITE . "/feedback?message=" . $message . "'>Сообщить когда будет в наличии.</a></span>"; } if ($product['count'] < 0) { $product['count'] = "много"; } $product['related'] = $model->createRelatedForm($product['related']); Storage::save(md5('ControllersProduct' . URL::getUrl()), $product); } // MG::set('propertyNodummy',$product['propertyNodummy']); // $_SESSION['propertyNodummy'] = $product['propertyNodummy']; $this->data = $product; }
function getBestSeller($count = 4) { $getOrder = DB::query("SELECT order_content FROM `" . PREFIX . 'order' . "`"); if (DB::numRows($getOrder) != 0) { $product = new Models_Product(); while ($row = DB::fetchArray($getOrder)) { $orderData[] = unserialize(stripslashes($row['order_content'])); } $res = array(); foreach ($orderData as $k => $v) { foreach ($v as $key => $val) { $res[] = $product->getProduct($val['id']); } } $goodsSale = getCount($res); return array_slice($goodsSale, 0, $count); } }
function __construct() { $model = new Models_Product(); // Требуется только пересчет цены товара. if (!empty($_REQUEST['calcPrice'])) { $model->calcPrice(); exit; } $settings = MG::get('settings'); $product = $model->getProduct(URL::getQueryParametr('id')); $product['meta_title'] = $product['meta_title'] ? $product['meta_title'] : $product['title']; $product['currency'] = $settings['currency']; $blockVariants = $model->getBlockVariants($product['id']); $propertyFormData = $model->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => $product['thisUserFields'], 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => array(), 'noneAmount' => false, 'titleBtn' => "В корзину", 'blockVariants' => $blockVariants)); // Легкая форма без характеристик. $liteFormData = $model->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => array(), 'noneAmount' => false, 'titleBtn' => "В корзину", 'blockVariants' => $blockVariants)); $product['price'] += $propertyFormData['marginPrice']; $product['propertyForm'] = $propertyFormData['html']; $product['liteFormData'] = $liteFormData['html']; $product['description'] = MG::inlineEditor(PREFIX . 'product', "description", $product['id'], $product['description']); $product['title'] = MG::modalEditor('catalog', $product['title'], 'edit', $product["id"]); $product["recommend"] = 0; $product["new"] = 0; $product['cat_title'] = $model->getTitleCat($product['cat_id']); // Случайные продукты $modelCatalog = new Models_Catalog(); $likeGoods = $modelCatalog->getRandomProduct($product['cat_id'], $product['id']); $product['like_goods'] = $likeGoods; // Информация об отсутствии товара на складе. if (MG::getSetting('printRemInfo') == "true" && $product['count'] == 0) { $product['remInfo'] = "<span class='rem-info'>Товара временно нет на складе!</style>"; } if ($product['count'] < 0) { $product['count'] = "∞"; } $this->data = $product; }
/** * Парсинг XML и импортв БД товаров. * @param $filename - путь к файлу архива с данными. */ public function processImportXml($filename) { $importOnlyNew = false; $sep = DIRECTORY_SEPARATOR; $dirname = dirname(__FILE__); $realDocumentRoot = str_replace($sep . 'mg-core' . $sep . 'controllers', '', $dirname); $lastPositionProduct = $_SESSION['lastCountProduct1cImport']; $lastPositionOffer = $_SESSION['lastCountOffer1cImport']; $xml = $this->getImportXml($filename); if ($xml && $filename == 'import.xml') { foreach ($xml->Каталог->attributes() as $key => $val) { if ($key == 'СодержитТолькоИзменения' && $val == "true") { $importOnlyNew = true; } } if (isset($xml->Каталог->СодержитТолькоИзменения)) { $importOnlyNew = $xml->Каталог->СодержитТолькоИзменения[0] == 'true' ? true : false; } if (empty($lastPositionProduct) && $importOnlyNew == false) { // если установлена директива CLEAR_CATALOG = 1 в config.ini, то удаляем товары перед синхронизацией с 1с if (CLEAR_1С_CATALOG != 'CLEAR_1С_CATALOG' && CLEAR_1С_CATALOG != 0) { DB::query('DELETE FROM `' . PREFIX . 'product` WHERE 1'); DB::query('DELETE FROM `' . PREFIX . 'category` WHERE 1'); } } $category = $this->groupsGreate($xml->Классификатор, $category, 0); $this->propertyСreate($xml->Классификатор->Свойства); $model = new Models_Product(); $currentPosition = 0; foreach ($xml->Каталог->Товары[0] as $item) { $currentPosition++; if ($currentPosition <= $lastPositionProduct) { continue; } // Добавляем изображение товара в папку uploads $imageUrl = array(); if (isset($item->Картинка)) { foreach ($item->Картинка as $img) { $path = $item->Картинка; $image = basename($item->Картинка); if (!empty($image) && is_file($path)) { copy($path, $realDocumentRoot . $sep . 'uploads' . $sep . $image); $widthPreview = MG::getSetting('widthPreview') ? MG::getSetting('widthPreview') : 200; $widthSmallPreview = MG::getSetting('widthSmallPreview') ? MG::getSetting('widthSmallPreview') : 50; $heightPreview = MG::getSetting('heightPreview') ? MG::getSetting('heightPreview') : 100; $heightSmallPreview = MG::getSetting('heightSmallPreview') ? MG::getSetting('heightSmallPreview') : 50; $upload = new Upload(false); $upload->_reSizeImage('70_' . $image, $realDocumentRoot . $sep . 'uploads' . $sep . $image, $widthPreview, $heightPreview); // миниатюра по размерам из БД (150*100) $upload->_reSizeImage('30_' . $image, $realDocumentRoot . $sep . 'uploads' . $sep . $image, $widthSmallPreview, $heightSmallPreview); } $imageUrl[] = $image; } } $imageUrl = implode($imageUrl, "|"); $id = (string) $item->Группы->Ид[0]; $name = (string) $item->Наименование[0]; $description = ''; if (isset($item->Описание)) { $description = nl2br((string) $item->Описание[0], true); } foreach ($item->ЗначенияРеквизитов->ЗначениеРеквизита as $row) { if ($row->Наименование == 'Полное наименование') { $name = $row->Значение; } } $code = !empty($item->Артикул[0]) ? $item->Артикул[0] : $item->ШтрихКод[0]; $id_1c = (string) $item->Ид[0]; $dataProd = array('title' => $name, 'url' => str_replace('\\', '-', URL::prepareUrl(MG::translitIt($name), true)), 'code' => $code, 'price' => 0, 'description' => $description, 'old_price' => '', 'image_url' => $imageUrl, 'count' => 0, 'cat_id' => $category[$id]['category_id'], 'meta_title' => $name, 'meta_keywords' => $name, 'meta_desc' => MG::textMore($description, 157), 'recommend' => 0, 'activity' => 1, 'new' => 0, 'related' => '', 'inside_cat' => '', '1c_id' => $id_1c, 'weight' => '0'); if ($importOnlyNew) { unset($dataProd['description']); unset($dataProd['image_url']); unset($dataProd['meta_title']); unset($dataProd['meta_keywords']); unset($dataProd['recommend']); unset($dataProd['activity']); unset($dataProd['new']); unset($dataProd['related']); unset($dataProd['inside_cat']); unset($dataProd['weight']); } //MG::loger(print_r($dataProd,1)); $res = DB::query('SELECT * FROM ' . PREFIX . 'product WHERE `1c_id`=' . DB::quote($id_1c)); if ($row = DB::fetchAssoc($res)) { DB::query(' UPDATE `' . PREFIX . 'product` SET ' . DB::buildPartQuery($dataProd) . ' WHERE `1c_id`=' . DB::quote($id_1c)); } else { $model->addProduct($dataProd); } // Привязываем свойства. if (isset($item->ЗначенияСвойств)) { foreach ($item->ЗначенияСвойств->ЗначенияСвойства as $prop) { $this->propertyConnect($id_1c, $prop->Ид, $prop->Значение, $category[$id]['category_id']); } } $execTime = microtime(true) - $this->startTime; if ($execTime + 1 >= $this->maxExecTime) { header("Content-type: text/xml; charset=utf-8"); echo ""; echo "progress\r\n"; echo "Выгружено товаров: {$currentPosition}"; $_SESSION['lastCountProduct1cImport'] = $currentPosition; exit; } } if ($this->unlinkFile) { unlink($filename); } $_SESSION['lastCountProduct1cImport'] = 0; } elseif ($xml && $filename == 'offers.xml') { $currentPosition = 0; foreach ($xml->ПакетПредложений[0]->Предложения[0] as $item) { $currentPosition++; if ($currentPosition <= $lastPositionOffer) { continue; } $id = (string) $item->Ид[0]; $price = (string) $item->Цены->Цена->ЦенаЗаЕдиницу[0]; $count = (string) $item->Количество[0]; $partProd = array('price' => $price, 'count' => $count, 'price_course' => $price); DB::query(' UPDATE `' . PREFIX . 'product` SET ' . DB::buildPartQuery($partProd) . ' WHERE 1c_id = ' . DB::quote($id) . ' '); $execTime = microtime(true) - $this->startTime; if ($execTime + 1 >= $this->maxExecTime) { header("Content-type: text/xml; charset=utf-8"); echo ""; echo "progress\r\n"; echo "Выгружено предложений: {$currentPosition}"; $_SESSION['lastCountOffer1cImport'] = $currentPosition; exit; } } if ($this->unlinkFile) { unlink($filename); } $_SESSION['lastCountOffer1cImport'] = 0; Storage::clear(); } else { echo "Ошибка загрузки XML\n"; foreach (libxml_get_errors() as $error) { echo "\t", $error->message; exit; } } }
/** * Получает данные об ошибке произошедшей в админке и отправляет на support@moguta.ru. * @return boolean */ public function sendBugReport() { $this->messageSucces = "Отчет отправлен"; $this->messageError = "Неудалось отправить отчет"; $body .= 'Непредвиденная ошибка на сайте ' . $_SERVER['SERVER_NAME']; $body .= '<br/><br/><br/><strong>Информация о системе</strong>'; $body .= '<br/>Версия Moguta.CMS: ' . VER; $body .= '<br/>Версия php: ' . phpversion(); $body .= '<br/>USER_AGENT: ' . $_SERVER['HTTP_USER_AGENT']; $body .= '<br/>IP: ' . $_SERVER['SERVER_ADDR']; $body .= '<br/><strong>Информация о магазине</strong>'; $product = new Models_Product(); $body .= '<br/>Количество товаров: ' . $product->getProductsCount(); $body .= '<br/>Количество категорий: ' . MG::get('category')->getCategoryCount(); $body .= '<br/>Шаблон: ' . MG::getSetting('templateName'); $body .= '<br/>E-mail администратора: ' . MG::getSetting('adminEmail'); $body .= '<br/><strong>Баг-репорт</strong>'; $body .= '<br/>' . $_POST['text']; $body .= '<br/><br/><img alt="Embedded Image" src="data:' . $_POST['screen'] . '" />'; Mailer::addHeaders(array("Reply-to" => MG::getSetting('adminEmail'))); Mailer::sendMimeMail(array('nameFrom' => MG::getSetting('adminEmail'), 'emailFrom' => MG::getSetting('adminEmail'), 'nameTo' => "*****@*****.**", 'emailTo' => "*****@*****.**", 'subject' => "Отчет об ошибке с сайта " . $_SERVER['SERVER_NAME'], 'body' => $body, 'html' => true)); return true; }
} ?> <div class="hidder-element" <?php echo $data['noneButton'] ? 'style="display:none"' : ''; ?> > <input type="hidden" name="inCartProductId" value="<?php echo $data['id']; ?> "> <?php $count = $data['maxCount']; if ($count == 0) { $model = new Models_Product(); $variants = $model->getVariants($data['id']); if ($variants) { $count = 0; // вычисляем общее число вариантов foreach ($variants as $variant) { $count += $variant['count']; } } } ?> <?php if (!$data['noneButton'] || ($count > 0 || $count < 0)) { ?> <?php
/** * Возвращает данные о всех продуктах в корзине. * @return array */ public function getItemsCart() { $productPositions = array(); // Создает модель для работы с продуктами. $itemPosition = new Models_Product(); $totalSumm = 0; if (!empty($_SESSION['cart'])) { foreach ($_SESSION['cart'] as $key => $item) { $variant = ''; if (!empty($item['variantId'])) { $variants = $itemPosition->getVariants($item['id']); $variant = $variants[$item['variantId']]; } // Заполняет массив информацией о каждом продукте по id из куков. // Если куки не актуальны, пропускает товар. $product = $itemPosition->getProduct($item['id']); if (!empty($product)) { $product['property'] = $_SESSION['cart'][$key]['propertySetId']; $product['property_html'] = htmlspecialchars_decode(str_replace('&', '&', $_SESSION['cart'][$key]['property'])); $product['propertySetId'] = $_SESSION['cart'][$key]['propertySetId']; if (!empty($variant)) { $product['price'] = $variant['price']; $product['code'] = $variant['code']; $product['count'] = $variant['count']; $product['title'] .= " " . $variant['title_variant']; $product['variantId'] = $variant['id']; } $price = $product['price']; if ($item['id'] == $product['id']) { $count = $item['count']; $price = SmalCart::plusPropertyMargin($price, $item['propertyReal']); $product['price'] = $price; // применение скидки по купону $product['price'] = $this->applyCoupon($_SESSION['couponCode'], $product['price'], $product); $product['priceInCart'] = $price * $count . " " . MG::getSetting('currency'); $arrayImages = explode("|", $product['image_url']); if (!empty($arrayImages)) { $product['image_url'] = $arrayImages[0]; } } $product['countInCart'] = $item['count']; if ($product['countInCart'] > 0) { $productPositions[] = $product; } $totalSumm += $product['price'] * $item['count']; } } } $result = array('items' => $productPositions, 'totalSumm' => $totalSumm); $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Получает информацию о каждом товаре. * @param array $viewCategoryId - массив id категорий. */ public function getInfoProducts($viewCategoryId) { if (empty($viewCategoryId)) { return false; } $listProductsArray = array(); $countProduct = 0; foreach ($viewCategoryId as $k => $id) { $listProductsIdTemp = $_SESSION['compareList'][$id]; $countProduct += count($_SESSION['compareList'][$id]); $listProductsArray = array_merge($listProductsArray, $listProductsIdTemp); } $listProductsId = implode(',', $listProductsArray); $catalogModel = new Models_Catalog(); $productModel = new Models_Product(); if (!empty($listProductsId)) { $arrProduct = $catalogModel->getListByUserFilter($countProduct, ' p.id IN (' . DB::quote($listProductsId, true) . ')'); } $currencyRate = MG::getSetting('currencyRate'); $currencyShopIso = MG::getSetting('currencyShopIso'); $currencyShopIso = MG::getSetting('currencyShopIso'); foreach ($arrProduct['catalogItems'] as &$product) { $blockVariants = $productModel->getBlockVariants($product['id']); $blockedProp = $productModel->noPrintProperty(); $propertyFormData = $productModel->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => $product['thisUserFields'], 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => false, 'titleBtn' => MG::getSetting('buttonBuyName'), 'blockVariants' => $blockVariants, 'printStrProp' => 'false', 'printCompareButton' => 'false', 'currency_iso' => $product['currency_iso'])); if ($product['count'] < 0) { $product['count'] = "много"; } $product['price'] += $propertyFormData['marginPrice']; $product['currency_iso'] = $product['currency_iso'] ? $product['currency_iso'] : $currencyShopIso; $product['currency'] = MG::getSetting('currency'); $product['old_price'] = $product['old_price'] * $currencyRate[$product['currency_iso']]; $product['old_price'] = $product['old_price'] ? MG::priceCourse($product['old_price']) : 0; $product['price'] = MG::priceCourse($product['price_course'], true, true); $product['propertyForm'] = $propertyFormData['html']; $product['propertyNodummy'] = $propertyFormData['propertyNodummy']; $product['stringsProperties'] = $propertyFormData['stringsProperties']; $product['image_url'] = explode('|', $product['image_url']); $product['image_url'] = $product['image_url'][0]; } return array('catalogItems' => $arrProduct['catalogItems']); }
/** * Создает информацию для последующего сохранения свойства для товара положенного в корзину из входящего массива. * @param mixed $arr */ public function createProperty($arr) { $productId = $arr['inCartProductId']; $product = new Models_Product(); unset($arr['inCartProductId']); unset($arr['buyWithProp']); unset($arr['amount_input']); unset($arr['ajax']); unset($arr['updateCart']); unset($arr['delFromCart']); unset($arr['propertySetId']); unset($arr['calcPrice']); $property = ''; // Фиктивная информация о характеристиках, выводимая в публичной части, в понятном пользователям виде. $propertyReal = ''; // Реальная защищенная информация о характеристиках, не выводимая в публичной части, хранящаяся в сессии в корзине. foreach ($arr as $key => $value) { // Разбор зашифрованых ключей (номер характеристики#номер пункта), для множественной характеристики (чекбоксы). $keyParse = array(); $pattern = "/^(.*)#(.*)\$/"; preg_match($pattern, $key, $matches); if (isset($matches[1]) && isset($matches[2])) { // Получили данные из ключа, теперь по ним можно достать реальную информацию о добавочной стоимости пункта. $keyParse = array('property_id' => $matches[1], 'numberElement' => $matches[2]); } // В значении тоже может передаваться дополнительная стоимость, это если доступен только один пункт (select и radiobutton). $valueParse = array(); preg_match($pattern, $value, $matches); if (isset($matches[1]) && isset($matches[2])) { // Получили данные из ключа, теперь по ним можно достать реальную информацию о добавочной стоимости пункта. $valueParse = array('property_id' => $matches[1], 'numberElement' => $matches[2]); } $parseData = null; // Если и ключ и значение удалось распарсить, приоритет ключу. if (!empty($keyParse)) { $parseData = $keyParse; } elseif (!empty($valueParse)) { $parseData = $valueParse; } if (in_array($keyParse['property_id'], array(60, 61, 63))) { unset($parseData); //return array('property' => $property, 'propertyReal' => $propertyReal); } // Если ключ расшифрован найден, надо дописывать добавочные стоимости. if (!empty($parseData)) { $item = $product->getProduct($productId); // воспроизводим набор реальных характеристик, чтобы избежать бага с перезаписью сессиии из второй вкладки $propertyFormData = $product->createPropertyForm($param = array('id' => $productId, 'productUserFields' => $item['thisUserFields'], 'maxCount' => $item['count'], 'blockedProp' => $product->noPrintProperty(), 'currency_iso' => $item['currency_iso'])); $currencyRate = MG::getSetting('currencyRate'); $currencyShort = MG::getSetting('currencyShort'); $currencyRate = $currencyRate[$item['currency_iso']]; $currencyShort = $currencyShort[$item['currency_iso']]; $realVal = $propertyFormData['propertyNodummy'][$parseData['property_id']][$parseData['numberElement']]['value']; $realName = $propertyFormData['propertyNodummy'][$parseData['property_id']][$parseData['numberElement']]['name']; $data = $product->parseMarginToProp($realVal); if (empty($data) && !empty($realVal)) { $data['name'] = $realVal; $data['margin'] = 0; } if (!empty($data)) { $plus = $product->addMarginToProp($data['margin'], $currencyRate); $plus = OUTPUT_MARGIN == '0' ? '' : $plus; $property .= '<div class="prop-position"> <span class="prop-name">' . $realName . ': ' . str_replace('_', ' ', $data['name']) . '</span> <span class="prop-val">' . $plus . '</span></div>'; $propertyReal .= '<div class="prop-position"> <span class="prop-name">' . $realName . ': ' . str_replace('_', ' ', $data['name']) . '</span> <span class="prop-val"> ' . $realVal . '</span></div>'; } } else { if (in_array($keyParse['property_id'], array(60, 61, 63))) { $realName = $productId == 63 ? "Ткани для блузок" : ($productId == 60 ? "Ткани для платьев" : "Ткани для юбок"); $data_v = explode("#", $value); $property .= '<div class="prop-position"> <span class="prop-name">' . $realName . ': ' . str_replace('_', ' ', $data_v[0]) . '</span> <span class="prop-val"> ' . $data_v[1] . ' руб.</span></div>'; $propertyReal .= '<div class="prop-position"> <span class="prop-name">' . $realName . ': ' . str_replace('_', ' ', $data_v[0]) . '</span> <span class="prop-val"> ' . $value . '</span></div>'; //unset($keyParse); //return array('property' => $property, 'propertyReal' => $propertyReal); } else { // Иначе, выбрана обычная характеристика без стоимости. $property .= '<div class="prop-position"> <span class="prop-name">' . str_replace('_', ' ', $key) . '</span>: <span class="prop-val">' . $value . '</span></div>'; } } } return array('property' => $property, 'propertyReal' => $propertyReal); }
public function __construct() { $aUri = URL::getSections(); $settings = MG::get('settings'); // Если нажата кнопка купить. $_REQUEST['category_id'] = URL::getQueryParametr('category_id'); if (!empty($_REQUEST['inCartProductId'])) { $cart = new Models_Cart(); $property = $cart->createProperty($_POST); $cart->addToCart($_REQUEST['inCartProductId'], $_REQUEST['amount_input'], $property); SmalCart::setCartData(); MG::redirect('/cart'); } $countСatalogProduct = $settings['countСatalogProduct']; // Показать первую страницу выбранного раздела. $page = 1; // Запрашиваемая страница. if (isset($_REQUEST['p'])) { $page = $_REQUEST['p']; } $sortType = 'desc'; $countGoods = $settings['countСatalogProduct']; $isStock = 0; // Обработка GET параметров if (isset($_GET['count'])) { switch ($_GET['count']) { case 8: $countGoods = 8; break; case 12: $countGoods = 12; break; case 16: $countGoods = 16; break; default: $countGoods = 8; break; } } if (isset($_GET['sort'])) { switch ($_GET['sort']) { case 'priceDesc': $sortType = 'desc'; break; case 'priceAsc': $sortType = 'asc'; break; case 'comments': $sortType = 'comments'; break; case 'popular': $sortType = 'popular'; break; default: $sortType = 'desc'; break; } } if (isset($_GET['stock'])) { if ($_GET['stock'] == 1) { $isStock = 1; } else { $isStock = 0; } } $model = new Models_Catalog(); $isMainCat = TRUE; $subCat = MG::get('category')->getCategoryList($_REQUEST['category_id']); if (empty($subCat)) { $isMainCat = FALSE; } // Если происходит поиск по ключевым словам. $keyword = URL::getQueryParametr('search'); if (!empty($keyword)) { $items = $model->getListProductByKeyWord($keyword, false, false, false, $sortType, $isStock, $countGoods); $searchData = array('keyword' => $keyword, 'count' => $items['numRows']); } else { if ($isMainCat) { $model->categoryId = MG::get('category')->getCategoryList($_REQUEST['category_id']); $model->categoryId[] = $_REQUEST['category_id']; $subCatList = $model->getChildCat(); if (!empty($subCatList)) { $productList = $model->getMainCatProduct($subCatList); $catList = $model->getMainCatInfo($subCatList); $i = 0; foreach ($catList as $cat) { foreach ($productList as $prd) { if ($prd['cat_id'] == $cat['id']) { $imagesUrl = explode("|", $prd['image_url']); if (!empty($imagesUrl[0])) { $prd['image_url'] = $imagesUrl[0]; } $catList[$i]['items'][] = $prd; } } $i++; } } } else { // Получаем список вложенных категорий, для вывода всех продуктов, на страницах текущей категории. $model->categoryId = MG::get('category')->getCategoryList($_REQUEST['category_id']); // В конец списка, добавляем корневую текущую категорию. $model->categoryId[] = $_REQUEST['category_id']; $items = $model->getList($countGoods, false, true, $sortType, $isStock); } } $settings = MG::get('settings'); if (!$isMainCat) { foreach ($items['catalogItems'] as $item) { $productIds[] = $item['id']; } $product = new Models_Product(); $blocksVariants = $product->getBlocksVariantsToCatalog($productIds); foreach ($items['catalogItems'] as $k => $item) { $items['catalogItems'][$k]["recommend"] = 0; $items['catalogItems'][$k]["new"] = 0; $imagesUrl = explode("|", $item['image_url']); $items['catalogItems'][$k]["image_url"] = ""; if (!empty($imagesUrl[0])) { $items['catalogItems'][$k]["image_url"] = $imagesUrl[0]; } $items['catalogItems'][$k]['title'] = MG::modalEditor('catalog', $item['title'], 'edit', $item["id"]); // Формируем варианты товара. if ($item['variant_exist']) { // Легкая форма без характеристик. $liteFormData = $product->createPropertyForm($param = array('id' => $item['id'], 'maxCount' => $item['count'], 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => array(), 'noneAmount' => true, 'titleBtn' => "В корзину", 'blockVariants' => $blocksVariants[$item['id']])); $items['catalogItems'][$k]['liteFormData'] = $liteFormData['html']; } } } $categoryDesc = MG::get('category')->getDesctiption($_REQUEST['category_id']); if ($_REQUEST['category_id']) { $categoryDesc = MG::inlineEditor(PREFIX . 'category', "html_content", $_REQUEST['category_id'], $categoryDesc); } if ($isMainCat) { $data = array('titeCategory' => $model->currentCategory['title'], 'cat_desc' => $categoryDesc, 'meta_title' => !empty($model->currentCategory['meta_title']) ? $model->currentCategory['meta_title'] : $model->currentCategory['title'], 'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "товары,продукты,изделия", 'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "В каталоге нашего магазина есть все.", 'is_main_cat' => $isMainCat, 'category_info' => $catList, 'currency' => MG::getSetting('currency'), 'id_category' => $model->getCurrentId(), 'searchData' => empty($searchData) ? '' : $searchData); } else { $data = array('items' => $items['catalogItems'], 'titeCategory' => $model->currentCategory['title'], 'cat_desc' => $categoryDesc, 'pager' => $items['pager'], 'searchData' => empty($searchData) ? '' : $searchData, 'meta_title' => !empty($model->currentCategory['meta_title']) ? $model->currentCategory['meta_title'] : $model->currentCategory['title'], 'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "товары,продукты,изделия", 'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "В каталоге нашего магазина есть все.", 'currency' => $settings['currency'], 'actionButton' => MG::getSetting('actionInCatalog') === "true" ? 'actionBuy' : 'actionView', 'is_main_cat' => $isMainCat, 'id_category' => $model->getCurrentId()); } if ($keyword) { $data['meta_title'] = 'Поиск по фразе: ' . $keyword; } $this->data = $data; if ($aUri[1] == 'catalog' && empty($aUri[2]) && empty($_GET['search'])) { MG::redirect('/'); } }
/** * Возвращает список найденных продуктов соответствующих поисковой фразе. * @param string $keyword - поисковая фраза. * @param string $allRows - получить сразу все записи. * @param string $onlyActive - учитывать только активные продукты. * @param boolean $adminPanel - запрос из публичной части или админки. * @return array */ public function getListProductByKeyWord($keyword, $allRows = false, $onlyActive = false, $adminPanel = false, $sort = NULL, $isStock = NULL, $count = NULL) { $settings = MG::get('settings'); if (!$count) { $count = $settings['countСatalogProduct']; } $result = array(); // Поиск по точному соответствию. $model = new Models_Catalog(); if (!isset($_GET["page"])) { $result = $model->getListByUserFilter(1, " p.title =" . DB::quote(trim($keyword)) . " OR p.code =" . DB::quote(trim($keyword))); } if (count($result['catalogItems']) !== 0) { foreach ($result['catalogItems'] as &$item) { $imagesUrl = explode("|", $item["image_url"]); $item["image_url"] = ""; if (!empty($imagesUrl[0])) { $item["image_url"] = $imagesUrl[0]; } $item['currency'] = MG::getSetting('currency'); } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); } // Пример $keyword = " 'красный', зеленый " // Убираем начальные пробелы и конечные. $keyword = trim($keyword); //$keyword = "'красный', зеленый" // Вырезаем спец символы из поисковой фразы. $keyword = preg_replace('/[-`~!#$%^&*()_=+\\\\|\\/\\[\\]{};:"\',<>?]+/', '', $keyword); //$keyword = "красный зеленый" // Замена повторяющихся пробелов на на один. $keyword = preg_replace('/ +/', ' ', $keyword); //$keyword = "красный зеленый" // Обрамляем каждое слово в звездочки, для расширенного поиска. $keyword = str_replace(' ', '* *', $keyword); //$keyword = "красный* *зеленый" // Добавляем по краям звездочки. $keyword = '*' . $keyword . '*'; //$keyword = "*красный* *зеленый*" if ($sort == 'popular') { $sql = " \n SELECT distinct p.code, v.views, CONCAT(c.parent_url,c.url) AS category_url, \n p.url AS product_url, p.*, pv.product_id as variant_exist\n FROM `" . PREFIX . "product` AS p\n LEFT JOIN `mg_popular-goods_visits` v ON v.id_product = p.id\n LEFT JOIN `" . PREFIX . "category` AS c ON c.id = p.cat_id\n LEFT JOIN `" . PREFIX . "product_variant` AS pv ON p.id = pv.product_id"; } else { $sql = " \n SELECT distinct p.code, CONCAT(c.parent_url,c.url) AS category_url, \n p.url AS product_url, p.*, pv.product_id as variant_exist\n FROM `" . PREFIX . "product` AS p\n LEFT JOIN `" . PREFIX . "category` AS c ON c.id = p.cat_id\n LEFT JOIN `" . PREFIX . "product_variant` AS pv ON p.id = pv.product_id"; } if (!$adminPanel) { $sql .= " LEFT JOIN (\n SELECT pv.product_id, SUM( pv.count ) AS varcount\n FROM `" . PREFIX . "product_variant` AS pv\n GROUP BY pv.product_id\n ) AS temp ON p.id = temp.product_id"; } $product = new Models_Product(); $fulltext = ""; // Проверяем наличие записей в вариантах если их нет, то не включаем // в поиск полнотекстовые индесты таблицы вариантов. if ($product->getVariants($id)) { $fulltext = ", pv.`code`, pv.`title_variant`"; } $sql .= " WHERE MATCH (\n p.`title` , p.`description` , p.`code` , p.`meta_title` , p.`meta_keywords` , p.`meta_desc` " . $fulltext . "\n )\n AGAINST (\n '" . $keyword . "'\n IN BOOLEAN\n MODE\n ) "; if ($onlyActive) { $sql .= ' AND p.`activity` = 1'; } if ($isStock) { $sql .= " AND (temp.`varcount` > 0 OR temp.`varcount` < 0 OR p.count>0 OR p.count<0)"; } if ($sort == 'desc') { $sql .= ' ORDER BY price DESC'; } else { if ($sort == 'asc') { $sql .= ' ORDER BY price ASC'; } else { if ($sort == 'popular') { $sql .= ' ORDER BY v.views DESC'; } } } $page = URL::get("page"); $navigator = new Navigator($sql, $page, $count, $linkCount = 6, $allRows); // Определяем класс. $this->pages = $navigator->getRowsSql(); $idsProduct = array(); if (!empty($this->pages)) { foreach ($this->pages as $key => $product) { $idsProduct[$product['id']] = $key; // Назначаем для продукта позьзовательские характеристики по умолчанию, заданные категорией. $this->pages[$key]['thisUserFields'] = MG::get('category')->getUserPropertyCategoryById($product['cat_id']); $this->pages[$key]['currency'] = $settings['currency']; $this->pages[$key]['actionBuy'] = '<a href="' . SITE . '/catalog?inCartProductId=' . $product["id"] . '" class="addToCart product-buy" data-item-id="' . $product["id"] . '">В корзину</a>'; $this->pages[$key]['actionView'] = '<a href="' . SITE . '/' . (isset($product["category_url"]) ? $product["category_url"] : 'catalog') . '/' . $product["product_url"] . '" class="product-info">Подробнее</a>'; $imagesUrl = explode("|", $this->pages[$key]['image_url']); $this->pages[$key]["image_url"] = ""; if (!empty($imagesUrl[0])) { $this->pages[$key]["image_url"] = $imagesUrl[0]; } } } if ($findPart = trim(DB::quote(implode(',', array_keys($idsProduct))), "'")) { // Формируем список id продуктов к которым нужно найти пользовательские характеристики. $where = ' IN (' . $findPart . ')'; } else { $findPart = ' IN (0)'; } $res = DB::query("\n SELECT pup.property_id, pup.value, pup.product_id, pup.type_view, prop.*\n FROM `" . PREFIX . "product_user_property` as pup\n LEFT JOIN `" . PREFIX . "property` as prop\n ON pup.property_id = prop.id\n WHERE pup.`product_id` " . $where); while ($userFields = DB::fetchAssoc($res)) { if (!empty($this->pages)) { $this->pages[$idsProduct[$userFields['product_id']]]['thisUserFields'][$userFields['property_id']] = $userFields; } } $this->pager = $navigator->getPager(); $result = array('catalogItems' => $this->pages, 'pager' => $this->pager, 'numRows' => $navigator->getNumRowsSql()); if (count($result['catalogItems']) == 0) { //примитивный поиск по названию. 100% соответствие $sql = " \n SELECT id\n FROM `" . PREFIX . "product` AS p\n WHERE title = " . DB::quote($keyword) . " OR code = " . DB::quote($keyword); if ($row = DB::fetchAssoc($sql)) { $product = new Models_Product(); } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Полученнияе статистики заказов за выбранный период. * @param $dateFrom дата "от". * @param $dateTo дата "До". * @return array */ public function getStatisticPeriod($dateFrom, $dateTo) { $dateFromRes = $dateFrom; $dateToRes = $dateTo; $dateFrom = date('Y-m-d', strtotime($dateFrom)); $dateTo = date('Y-m-d', strtotime($dateTo)); $period = "AND `add_date` >= " . DB::quote($dateFrom) . "\n AND `add_date` <= " . DB::quote($dateTo); // Количество закрытых заказов всего. $ordersCount = $this->getOrderCount('WHERE status_id = 5 ' . $period); $noclosed = $this->getOrderCount('WHERE status_id <> 5 ' . $period); // Cумма заработанная за все время работы магазина. $res = DB::query("\n SELECT sum(summ) as 'summ' FROM `" . PREFIX . "order`\n WHERE status_id = 5 " . $period); if ($row = DB::fetchAssoc($res)) { $summ = $row['summ']; } $product = new Models_Product(); $productsCount = $product->getProductsCount(); $res = DB::query("SELECT id FROM `" . PREFIX . "user`"); $usersCount = DB::numRows($res); $result = array('from_date_stat' => $dateFromRes, 'to_date_stat' => $dateToRes, "orders" => $ordersCount ? $ordersCount : "0", "noclosed" => $noclosed ? $noclosed : "0", "summ" => $summ ? $summ : "0", "users" => $usersCount ? $usersCount : "0", "products" => $productsCount ? $productsCount : "0"); return $result; }
/** * Возвращает правильно сформированную картинку для продукта в HTML. * Со всеми параметрами, для эфекта перелета в корщину. * @param type $data - параметры продукта * @return string. */ function mgImageProduct($data) { $product = new Models_Product(); $data["image_url"] = basename($data["image_url"]); $imagesData = $product->imagesConctruction($data["image_url"], $data["image_title"], $data["image_alt"], $data['id']); $src = SITE . "/uploads/no-img.jpg"; $dir = floor($data["id"] / 100) . '00'; $imagesData["image_url"] = basename($imagesData["image_url"]); $srcLarge = mgImageProductPath($data["image_url"], $data["id"]); if (file_exists(URL::$documentRoot . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . 'product' . DIRECTORY_SEPARATOR . $dir . DIRECTORY_SEPARATOR . $data["id"] . DIRECTORY_SEPARATOR . 'thumbs' . DIRECTORY_SEPARATOR . '70_' . $imagesData["image_url"])) { $src = SITE . '/uploads/product/' . $dir . '/' . $data['id'] . '/thumbs/70_' . $imagesData["image_url"]; } elseif (file_exists(URL::$documentRoot . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . 'thumbs' . DIRECTORY_SEPARATOR . '70_' . $imagesData["image_url"])) { $src = SITE . '/uploads/thumbs/70_' . $imagesData["image_url"]; } return '<img data-transfer="true" data-product-id="' . $data["id"] . '" src="' . $src . '" alt="' . $imagesData["image_alt"] . '" title="' . $imagesData["image_title"] . '" data-large="' . $srcLarge . '">'; }
} $sorterData = explode('|', $_POST['sorter']); if ($sorterData[1] > 0) { $sorterData[3] = 'desc'; } else { $sorterData[3] = 'asc'; } $countPrintRowsProduct = MG::getSetting('countPrintRowsProduct'); if (!empty($userFilter)) { $catalog = $model->getListByUserFilter($countPrintRowsProduct, $userFilter, true); } else { $catalog = $model->getList($countPrintRowsProduct, true); } //категории: $listCategories = MG::get('category')->getCategoryTitleList(); $arrayCategories = $model->categoryId = MG::get('category')->getHierarchyCategory(0); $categoriesOptions = MG::get('category')->getTitleCategory($arrayCategories, URL::get('category_id')); $product = new Models_Product(); $this->productsCount = $product->getProductsCount(); $this->catalog = $catalog['catalogItems']; $this->listCategories = $listCategories; $this->categoriesOptions = $categoriesOptions; $this->countPrintRowsProduct = $countPrintRowsProduct; $this->pagination = $catalog['pager']; $this->displayFilter = $_POST['cat_id'] != "null" && !empty($_POST['cat_id']) || isset($_POST['displayFilter']); // так проверяем произошол ли запрос по фильтрам или нет $this->settings = MG::get('settings'); $this->sorterData = $sorterData; $exampleName = $product->getProductByUserFilter(' 1=1 LIMIT 0,1'); $ids = array_keys($exampleName); $this->exampleName = $exampleName[$ids[0]]['title'];
/** * Создает временную таблицу import_cat_prop, для сохранения связей характеристик и категорий */ public function greateTempTableImport() { DB::query("DROP TABLE IF EXISTS " . PREFIX . "import_prod"); DB::query("DROP TABLE IF EXISTS " . PREFIX . "import_cat"); DB::query("\r\n CREATE TABLE IF NOT EXISTS " . PREFIX . "import_cat (\r\n `cat_id` int(11) NOT NULL, \r\n `title` varchar(2048) NOT NULL,\r\n `parent` varchar(2048) NOT NULL \r\n ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); DB::query("\r\n CREATE TABLE IF NOT EXISTS " . PREFIX . "import_prod (\r\n `product_id` int(11) NOT NULL, \r\n `title` varchar(2048) NOT NULL, \r\n `url_cpu_cat` varchar(2048) NOT NULL,\r\n `category_id` int(11) NOT NULL,\r\n `variant` int(1) NOT NULL\r\n ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); $sql = ' SELECT c.id as category_id, c.title as category_title, CONCAT(c.parent_url,c.url) as category_url, p.url as product_url, p.* FROM `' . PREFIX . 'product` p LEFT JOIN `' . PREFIX . 'category` c ON c.id = p.cat_id'; $res = DB::query($sql); $product = new Models_Product(); while ($row = DB::fetchAssoc($res)) { $parent = $row['category_url']; // Подставляем всесто URL названия разделов. $resultPath = ''; while ($parent) { $url = URL::parsePageUrl($parent); $parent = URL::parseParentUrl($parent); $parent = $parent != '/' ? $parent : ''; $alreadyParentCat = MG::get('category')->getCategoryByUrl($url, $parent); $resultPath = $alreadyParentCat['title'] . '/' . $resultPath; } $resultPath = trim($resultPath, '/'); $variants = $product->getVariants($row['id']); $variant = 0; DB::query("\r\n INSERT INTO `" . PREFIX . "import_prod` \r\n (`product_id`, `title`, `url_cpu_cat`, `category_id`, `variant`) \r\n VALUES (" . DB::quote($row['id']) . ", " . DB::quote($row['title']) . ", " . DB::quote($row['category_url']) . ", " . DB::quote($row['category_id']) . ", " . $variant . ")"); } //---------------------наполняем таблицу для категорий----------------------------- $sql = ' SELECT `id`, `title`, `parent_url`, url, CONCAT(parent_url,url) as category_url FROM `' . PREFIX . 'category` c'; $res = DB::query($sql); while ($row = DB::fetchAssoc($res)) { $parent = $row['parent_url']; // Подставляем вместо URL названия разделов. $resultPath = ''; while ($parent) { $url = URL::parsePageUrl($parent); $parent = URL::parseParentUrl($parent); $parent = $parent != '/' ? $parent : ''; $alreadyParentCat = MG::get('category')->getCategoryByUrl($url, $parent); $resultPath = $alreadyParentCat['title'] . '/' . $resultPath; } $resultPath = trim($resultPath, '/'); DB::query("\r\n INSERT INTO `" . PREFIX . "import_cat` \r\n (`cat_id`, `title`, `parent`) \r\n VALUES (" . DB::quote($row['id']) . ", " . DB::quote($row['title']) . ", " . DB::quote($resultPath) . ")"); } }
/** * Возвращает правильно сформированную картинку для продукта в HTML. * Со всеми параметрами, для эфекта перелета в корщину. * @param type $data - параметры продукта * @return string. */ function mgImageProduct($data) { $product = new Models_Product(); $imagesData = $product->imagesConctruction($data["image_url"], $data["image_title"], $data["image_alt"]); $src = SITE . "/uploads/no-img.jpg"; if (file_exists(URL::$documentRoot . DIRECTORY_SEPARATOR . 'uploads' . DIRECTORY_SEPARATOR . 'thumbs' . DIRECTORY_SEPARATOR . '70_' . $data["image_url"])) { $src = SITE . '/uploads/thumbs/70_' . $data["image_url"]; } return '<img data-transfer="true" data-product-id="' . $data["id"] . '" src="' . $src . '" alt="' . $imagesData["image_alt"] . '" title="' . $imagesData["image_title"] . '">'; }
/** * Парсинг XML и импортв БД товаров. * @param $filename - путь к файлу архива с данными. */ public function processImportXml($filename) { $importOnlyNew = false; $sep = DIRECTORY_SEPARATOR; $dirname = dirname(__FILE__); $realDocumentRoot = str_replace($sep . 'mg-core' . $sep . 'controllers', '', $dirname); $lastPositionProduct = $_SESSION['lastCountProduct1cImport']; $lastPositionOffer = $_SESSION['lastCountOffer1cImport']; $xml = $this->getImportXml($filename); if ($xml && $filename == 'import.xml') { foreach ($xml->Каталог->attributes() as $key => $val) { if ($key == 'СодержитТолькоИзменения' && $val == "true") { $importOnlyNew = true; } } if (isset($xml->Каталог->СодержитТолькоИзменения)) { $importOnlyNew = $xml->Каталог->СодержитТолькоИзменения[0] == 'true' ? true : false; } if (empty($lastPositionProduct) && $importOnlyNew == false) { // если установлена директива CLEAR_CATALOG = 1 в config.ini, то удаляем товары перед синхронизацией с 1с if (CLEAR_1С_CATALOG != 'CLEAR_1С_CATALOG' && CLEAR_1С_CATALOG != 0) { DB::query('DELETE FROM `' . PREFIX . 'product` WHERE 1'); DB::query('DELETE FROM `' . PREFIX . 'category` WHERE 1'); DB::query('DELETE FROM `' . PREFIX . 'product_variant` WHERE 1'); } } $category = $this->groupsGreate($xml->Классификатор, $category, 0); $this->propertyСreate($xml->Классификатор->Свойства); $model = new Models_Product(); $currentPosition = 0; $upload = new Upload(false); $widthPreview = MG::getSetting('widthPreview') ? MG::getSetting('widthPreview') : 200; $widthSmallPreview = MG::getSetting('widthSmallPreview') ? MG::getSetting('widthSmallPreview') : 50; $heightPreview = MG::getSetting('heightPreview') ? MG::getSetting('heightPreview') : 100; $heightSmallPreview = MG::getSetting('heightSmallPreview') ? MG::getSetting('heightSmallPreview') : 50; foreach ($xml->Каталог->Товары[0] as $item) { $currentPosition++; if ($currentPosition <= $lastPositionProduct) { continue; } // Добавляем изображение товара в папку uploads $imageUrl = array(); $realImgPath = array(); if (isset($item->Картинка)) { foreach ($item->Картинка as $img) { $path = 'tempcml' . $sep . $img; $realImgPath[] = $path; $image = basename($img); $imageUrl[] = $image; } } $imageUrl = implode($imageUrl, "|"); $id = (string) $item->Группы->Ид[0]; $name = (string) $item->Наименование[0]; $description = ''; $desExist = false; if (isset($item->Описание)) { $description = nl2br((string) $item->Описание[0], true); $desExist = true; } foreach ($item->ЗначенияРеквизитов->ЗначениеРеквизита as $row) { if ($row->Наименование == 'Полное наименование') { // если в файле нет специального тега с описанием, то берем из полного наименования if (!$desExist) { $description = (string) $row->Значение ? (string) $row->Значение : $description; $description = nl2br($description, true); } else { // иначе полное наименование подставляем в title товара $name = (string) $row->Значение ? (string) $row->Значение : $name; } } } $code = !empty($item->Артикул[0]) ? $item->Артикул[0] : $item->ШтрихКод[0]; $id_1c = (string) $item->Ид[0]; $dataProd = array('title' => $name, 'url' => str_replace('\\', '-', URL::prepareUrl(MG::translitIt($name), true)), 'code' => $code, 'price' => 0, 'description' => $description, 'old_price' => '', 'image_url' => $imageUrl, 'count' => 0, 'cat_id' => $category[$id]['category_id'], 'meta_title' => $name, 'meta_keywords' => $name, 'meta_desc' => MG::textMore($description, 157), 'recommend' => 0, 'activity' => 1, 'new' => 0, 'related' => '', 'inside_cat' => '', '1c_id' => $id_1c, 'weight' => '0'); if ($importOnlyNew) { unset($dataProd['description']); unset($dataProd['image_url']); unset($dataProd['meta_title']); unset($dataProd['meta_keywords']); unset($dataProd['recommend']); unset($dataProd['activity']); unset($dataProd['new']); unset($dataProd['related']); unset($dataProd['inside_cat']); unset($dataProd['weight']); } $res = DB::query('SELECT * FROM ' . PREFIX . 'product WHERE `1c_id`=' . DB::quote($id_1c)); if ($row = DB::fetchAssoc($res)) { DB::query(' UPDATE `' . PREFIX . 'product` SET ' . DB::buildPartQuery($dataProd) . ' WHERE `1c_id`=' . DB::quote($id_1c)); $productId = $row['id']; } else { $newProd = $model->addProduct($dataProd); $productId = $newProd['id']; } $arImgPath = explode('/', $realImgPath[0]); array_pop($arImgPath); $path = implode($sep, $arImgPath); $imageUrl = explode('|', $imageUrl); $dir = floor($productId / 100) . '00'; if (!empty($realImgPath)) { foreach ($realImgPath as $cell => $image) { if (!empty($image) && is_file($image)) { $upload->_reSizeImage('70_' . $imageUrl[$cell], $realDocumentRoot . $sep . $image, $widthPreview, $heightPreview, 'PROPORTIONAL', 'uploads' . $sep . $addPath . 'thumbs' . $sep); $upload->_reSizeImage('30_' . $imageUrl[$cell], $realDocumentRoot . $sep . $image, $widthSmallPreview, $heightSmallPreview, 'PROPORTIONAL', 'uploads/' . $addPath . 'thumbs/'); } } $model->movingProductImage($imageUrl, $productId, $path); } // Привязываем свойства. if (isset($item->ЗначенияСвойств)) { foreach ($item->ЗначенияСвойств->ЗначенияСвойства as $prop) { $propVal = ''; $tempProp = '' . $prop->Значение[0]; if (!empty($_SESSION['variant_value'][$tempProp])) { $propVal = $_SESSION['variant_value'][$tempProp]; } if (empty($propVal)) { $propVal = ''; $idVal = '' . $prop->ИдЗначения; if (!empty($_SESSION['variant_value'][$idVal])) { $propVal = $_SESSION['variant_value'][$idVal]; } } $this->propertyConnect($id_1c, $prop->Ид, $propVal, $category[$id]['category_id']); } } $execTime = microtime(true) - $this->startTime; if ($execTime + 1 >= $this->maxExecTime) { header("Content-type: text/xml; charset=utf-8"); echo ""; echo "progress\r\n"; echo "Выгружено товаров: {$currentPosition}"; $_SESSION['lastCountProduct1cImport'] = $currentPosition; exit; } } if ($this->unlinkFile) { unlink($realDocumentRoot . '/tempcml/' . $filename); } $_SESSION['lastCountProduct1cImport'] = 0; } elseif ($xml && $filename == 'offers.xml') { $currentPosition = 0; $model = new Models_Product(); $currencyRate = MG::getSetting('currencyRate'); $currencyShort = MG::getSetting('currencyShort'); foreach ($xml->ПакетПредложений[0]->Предложения[0] as $item) { $currentPosition++; if ($currentPosition <= $lastPositionOffer) { continue; } $id = (string) $item->Ид[0]; $price = (string) $item->Цены->Цена->ЦенаЗаЕдиницу[0]; $iso = $this->getIsoByCode((string) $item->Цены->Цена->Валюта[0]); if ($iso == 'NULL') { $iso = substr(MG::translitIt((string) $item->Цены->Цена->Валюта[0]), 0, 3); } $count = (string) $item->Количество[0]; // если валюта товара не задана ранее в магазине, то добавим ее. (Курс нужно будет установить вручную в настройках) $currency = array(); if (empty($currencyRate[$iso])) { $currency['iso'] = htmlspecialchars($iso); $currency['short'] = $currency['iso']; $currency['rate'] = 1; $currencyRate[$currency['iso']] = $currency['rate']; $currencyShort[$currency['iso']] = $currency['short']; MG::setOption(array('option' => 'currencyRate', 'value' => addslashes(serialize($currencyRate)))); MG::setOption(array('option' => 'currencyShort', 'value' => addslashes(serialize($currencyShort)))); } $partProd = array('price' => $price, 'count' => $count < 0 ? 0 : $count, 'currency_iso' => $iso); // проверяем, вдруг это предложение является вариантом для товара $ids1c = explode('#', (string) $item->Ид[0]); $variantId = ''; // если id варианта не найден if (empty($ids1c[1])) { // просто товар, не вариант DB::query(' UPDATE `' . PREFIX . 'product` SET ' . DB::buildPartQuery($partProd) . ' , `price_course` = ROUND(' . DB::quote($price * $currencyRate[$iso], TRUE) . ',2) WHERE 1c_id = ' . DB::quote($ids1c[0]) . ' '); } else { // если товарное предложение является вариантом для продукта $productId = ''; $variantId = $ids1c[1]; $variant = array(); $dbRes = DB::query(' SELECT id FROM `' . PREFIX . 'product` WHERE 1c_id = ' . DB::quote($ids1c[0]) . ' '); if ($row = DB::fetchArray($dbRes)) { $productId = $row['id']; $name = array(); foreach ($item->ХарактеристикиТовара->ХарактеристикаТовара as $prop) { $name[] = $prop->Значение; } $name = implode(', ', $name); $titleVariant = $name; $variant = array('title_variant' => $titleVariant, 'code' => $item->Артикул[0], 'price' => $price, 'old_price' => '', 'image' => '', 'count' => $count < 0 ? 0 : $count, '1c_id' => $variantId, 'weight' => '0', 'activity' => 1, 'currency_iso' => $iso); // ****** // ищем варианты для этого товара $dbRes = DB::query(' SELECT id FROM `' . PREFIX . 'product_variant` WHERE product_id = ' . DB::quote($productId) . ' '); // если еще ни одного небыло, то создаем и обновляем в таблице product значения по первому варианту if ($row != DB::fetchArray($dbRes)) { DB::query(' UPDATE `' . PREFIX . 'product` SET ' . DB::buildPartQuery($partProd) . ' , `price_course` = ROUND(' . DB::quote($price * $currencyRate[$iso], TRUE) . ',2) WHERE 1c_id = ' . DB::quote($ids1c[0]) . ' '); } // ****** // проверяем, импортирован ли ранее этот вариант $dbRes = DB::query(' SELECT id FROM `' . PREFIX . 'product_variant` WHERE 1c_id = ' . DB::quote($ids1c[1]) . ' '); // если еще нет, то получаем массив всех имеющихся вариантов по этому продукту, // добавляем к нему новый вариант и обновляем массив вариантов стандартными средствами if (!($row = DB::fetchArray($dbRes))) { $arrVariants = array(); $res = DB::query(' SELECT pv.* FROM `' . PREFIX . 'product_variant` pv WHERE pv.product_id = ' . DB::quote($productId) . ' ORDER BY sort '); if (!empty($res)) { while ($var = DB::fetchAssoc($res)) { $arrVariants[$var['id']] = $var; } } $variant['price_course'] = round($price * $currencyRate[$iso], 2); $arrVariants[] = $variant; $model->saveVariants($arrVariants, $productId); } else { // обновить вариант DB::query(' UPDATE `' . PREFIX . 'product_variant` SET ' . DB::buildPartQuery($variant) . ',`price_course` = ROUND(' . DB::quote($price * $currencyRate[$iso], TRUE) . ',2) WHERE 1c_id = ' . DB::quote($ids1c[0]) . ' '); } } } $execTime = microtime(true) - $this->startTime; if ($execTime + 1 >= $this->maxExecTime) { header("Content-type: text/xml; charset=utf-8"); echo ""; echo "progress\r\n"; echo "Выгружено предложений: {$currentPosition}"; $_SESSION['lastCountOffer1cImport'] = $currentPosition; exit; } } if ($this->unlinkFile) { unlink($realDocumentRoot . '/tempcml/' . $filename); } $_SESSION['lastCountOffer1cImport'] = 0; Storage::clear(); } else { echo "Ошибка загрузки XML\n"; foreach (libxml_get_errors() as $error) { echo "\t", $error->message; exit; } } }
if ($row = DB::fetchAssoc($res)) { $totalSumm = $row['totalsum']; } $this->totalSumm = $totalSumm; // Десериализация строки в массив (состав заказа) foreach ($orders as $k => $order) { $orders[$k]['order_content'] = unserialize(stripslashes($order['order_content'])); if ($orders[$k]['number'] == '') { $orders[$k]['number'] = $orders[$k]['id']; DB::query("UPDATE `" . PREFIX . "order` SET `number`= " . DB::quote($orders[$k]['number']) . " WHERE `id`=" . DB::quote($orders[$k]['id']) . ""); } } $propertyOrder = MG::getOption('propertyOrder'); $propertyOrder = stripslashes($propertyOrder); $propertyOrder = unserialize($propertyOrder); $product = new Models_Product(); $exampleName = $product->getProductByUserFilter(' 1=1 LIMIT 0,1'); $ids = array_keys($exampleName); $this->exampleName = $exampleName[$ids[0]]['title']; $this->assocStatus = Models_Order::$status; $this->assocStatusClass = array('get-paid', 'get-paid', 'paid', 'get-paid', 'dont-paid', 'paid', 'get-paid'); // цветная подсветка статусов $model = new Models_Order(); $this->assocDelivery = $model->getListDelivery(); $this->assocPay = $model->getListPayment(); $this->orders = $orders; $this->pager = $navigator->getPager('forAjax'); $this->orderCount = $model->getOrderCount(); $this->countPrintRowsOrder = $countPrintRowsOrder; $this->displayFilter = $_POST['status_id'] != "null" && !empty($_POST['status_id']) || isset($_POST['applyFilter']); // так проверяем произошол ли запрос по фильтрам или нет
/** * Пересчитывает количество остатков продуктов при редактировании заказа. * @param int $orderId - id заказа. * $content - новое содержимое содержимое заказа * @return bool */ public function refreshCountAfterEdit($orderId, $content) { // Если количество товара меняется, то пересчитываем остатки продуктов из заказа. $order = $this->getOrder(' id = ' . DB::quote($orderId, true)); $order_content_old = unserialize(stripslashes($order[$orderId]['order_content'])); $order_content_new = unserialize(stripslashes($content)); $product = new Models_Product(); $codes = array(); foreach ($order_content_old as $item_old) { $codes[] = array('id' => $item_old['id'], 'code' => $item_old['code'], 'count' => $item_old['count']); } foreach ($order_content_new as $item_new) { $flag = 0; foreach ($codes as $key => $info) { if (in_array($item_new['code'], $info)) { $codes[$key] = array('id' => $item_new['id'], 'code' => $item_new['code'], 'count' => $info['count'] - $item_new['count']); $flag = 1; } } if ($flag === 0) { $codes[] = array('id' => $item_new['id'], 'code' => $item_new['code'], 'count' => $item_new['count'] * -1); } } foreach ($codes as $prod) { if ($prod['count'] > 0) { $product->increaseCountProduct($prod['id'], $prod['code'], $prod['count']); } elseif ($prod['count'] < 0) { $product->decreaseCountProduct($prod['id'], $prod['code'], abs($prod['count'])); } } $result = $flag; $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Определяет поведение при изменении и удаление данных в корзине, * а так же выводит список позиций к заказу * * @return void */ public function __construct() { if (!empty($_REQUEST['updateCart'])) { $this->updateCart(); exit; } if (!empty($_REQUEST['delFromCart'])) { $this->delFromCart(); exit; } if (!empty($_POST['coupon'])) { $this->applyCoupon(); } $model = new Models_Cart(); // Если пользователь изменил данные в корзине. if (!empty($_REQUEST['refresh'])) { $update = array(); $refreshData = $_REQUEST; // Пробегаем по массиву, находим пометки на удаление и на изменение количества. foreach ($refreshData as $key => $val) { $id = ''; if ('item_' == substr($key, 0, 5)) { $id = substr($key, 5); // Находим propertyReal для текущего ID продукта. $propertyReal = array(); $variantId = array(); if (!empty($_SESSION['cart'])) { foreach ($_SESSION['cart'] as $item) { if ($item['id'] == $id) { $propertyReal[] = $item['propertyReal']; $variantId[] = $item['variantId']; } } } if (!empty($val)) { $product = new Models_Product(); foreach ($val as $k => $count) { $propertySetId = $refreshData['property_' . $id][$k]; if ($count > 0) { $tempProduct = $product->getProduct($id); $countMax = $tempProduct['count']; if ($variantId[$k]) { $tempProdVar = $product->getVariants($id); $countMax = $tempProdVar[$variantId[$k]]['count']; } if ($count > $countMax && $countMax > 0) { $count = $countMax; } if (isset($refreshData['del_' . $id])) { continue; } $update[] = array('id' => $id, 'count' => $count >= 0 ? $count : 0, 'property' => $_SESSION['propertySetArray'][$propertySetId], 'propertyReal' => $propertyReal[$k], 'propertySetId' => $propertySetId, 'variantId' => $variantId[$k]); } else { if (!empty($_SESSION['propertySetArray'][$propertySetId])) { unset($_SESSION['propertySetArray'][$propertySetId]); } } } } } elseif ('del_' == substr($key, 0, 4)) { $id = substr($ItemId, 4); $count = 0; } } // Передаем в модель данные для обновления корзины. $model->refreshCart($update); // Пересчитываем маленькую корзину. echo "<meta http-equiv=\"refresh\" content=\"0;url=" . $_SERVER['HTTP_REFERER'] . "\">"; exit; } if (!empty($_REQUEST['clear'])) { $model->clearCart(); // Пересчитываем маленькую корзину. SmalCart::setCartData(); header('Location: ' . SITE . '/cart'); exit; } $settings = MG::get('settings'); $cartData = $model->getItemsCart(); // Формируем стандартный массив для представления. $this->data = array('isEmpty' => $model->isEmptyCart(), 'productPositions' => $cartData['items'], 'totalSumm' => $cartData['totalSumm'], 'meta_title' => 'Корзина', 'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "корзина,покупки,заказ,купленные товары", 'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "Положите понравившиеся товары в корзину и вы сможете оформить заказ.", 'currency' => $settings['currency']); }
function __construct() { $settings = MG::get('settings'); // Если нажата кнопка купить. $_REQUEST['type'] = $_GET['type']; $countСatalogProduct = $settings['countСatalogProduct']; // Показать первую страницу выбранного раздела. $page = 1; // Запрашиваемая страница. if (isset($_REQUEST['p'])) { $page = $_REQUEST['p']; } $model = new Models_Catalog(); $currencyRate = MG::getSetting('currencyRate'); $currencyShopIso = MG::getSetting('currencyShopIso'); if (!empty($_REQUEST['type'])) { $titeCategory = 'Группы товаров'; if ($_REQUEST['type'] == 'recommend') { $titeCategory = "Рекомендуемые товары"; $classTitle = "m-p-recommended-products-title"; // Формируем список товаров для блока рекомендуемой продукции. $items = $model->getListByUserFilter(MG::getSetting('countRecomProduct'), ' p.recommend = 1 and p.activity=1 ORDER BY sort ASC'); } elseif ($_REQUEST['type'] == 'latest') { $titeCategory = "Новинки"; $classTitle = "m-p-new-products-title"; // Формируем список товаров для блока новинок. $items = $model->getListByUserFilter(MG::getSetting('countNewProduct'), ' p.new = 1 and p.activity=1 ORDER BY sort ASC'); } elseif ($_REQUEST['type'] == 'sale') { $titeCategory = "Распродажа"; $classTitle = "m-p-sale-products-title"; // Формируем список товаров со старой ценой. $items = $model->getListByUserFilter(MG::getSetting('countSaleProduct'), ' (p.old_price>0 || pv.old_price>0) and p.activity=1 ORDER BY sort ASC'); } $settings = MG::get('settings'); if (!empty($items)) { foreach ($items['catalogItems'] as $k => $item) { $productIds[] = $item['id']; $items['catalogItems'][$k]['currency_iso'] = $item['currency_iso'] ? $item['currency_iso'] : $currencyShopIso; // $item['price'] *= $currencyRate[$item['currency_iso']]; $items['catalogItems'][$k]['old_price'] = $item['old_price'] * $currencyRate[$item['currency_iso']]; $items['catalogItems'][$k]['old_price'] = $item['old_price'] ? MG::priceCourse($item['old_price']) : 0; $items['catalogItems'][$k]['price'] = MG::priceCourse($item['price_course']); } } $product = new Models_Product(); $blocksVariants = $product->getBlocksVariantsToCatalog($productIds); $blockedProp = $product->noPrintProperty(); if (!empty($items)) { foreach ($items['catalogItems'] as $k => $item) { $imagesUrl = explode("|", $item['image_url']); $items['catalogItems'][$k]["image_url"] = ""; if (!empty($imagesUrl[0])) { $items['catalogItems'][$k]["image_url"] = $imagesUrl[0]; } $item['currency_iso'] = $item['currency_iso'] ? $item['currency_iso'] : $currencyShopIso; //$item['price'] *= $currencyRate[$item['currency_iso']]; $item['old_price'] = $item['old_price'] * $currencyRate[$item['currency_iso']]; $item['old_price'] = $item['old_price'] ? MG::priceCourse($item['old_price']) : 0; $item['price'] = MG::priceCourse($item['price_course']); $items['catalogItems'][$k]['title'] = MG::modalEditor('catalog', $item['title'], 'edit', $item["id"]); // Формируем варианты товара. // if ($item['variant_exist']) { // Легкая форма без характеристик. $liteFormData = $product->createPropertyForm($param = array('id' => $item['id'], 'maxCount' => $item['count'], 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => true, 'titleBtn' => MG::getSetting('buttonBuyName'), 'buyButton' => $items['catalogItems'][$k]['count'] == 0 ? $items['catalogItems'][$k]['actionView'] : '', 'blockVariants' => $blocksVariants[$item['id']])); $items['catalogItems'][$k]['liteFormData'] = $liteFormData['html']; // } // опледеляем для каждого продукта тип выводимой формы: упрощенная, с кнопками или без. if (!$items['catalogItems'][$k]['liteFormData']) { if ($items['catalogItems'][$k]['count'] == 0) { $buyButton = $items['catalogItems'][$k]['actionView']; } else { $buyButton = $items['catalogItems'][$k][$actionButton]; } } else { $buyButton = $items['catalogItems'][$k]['liteFormData']; } $items['catalogItems'][$k]['buyButton'] = $buyButton; } } $data = array('items' => $items['catalogItems'], 'titeCategory' => $titeCategory, 'pager' => $items['pager'], 'meta_title' => $titeCategory, 'meta_keywords' => "новинки, рекомендуемые, распродажа", 'meta_desc' => "Новинки, рекомендуемые, распродажа", 'currency' => $settings['currency'], 'actionButton' => MG::getSetting('actionInCatalog') === "true" ? 'actionBuy' : 'actionView', 'class_title' => $classTitle, 'actionButton' => MG::getSetting('actionInCatalog') === "true" ? 'actionBuy' : 'actionView', 'currency' => MG::getSetting('currency')); } else { $groupsData = $this->getGroupsData(); $data = array('titeCategory' => $titeCategory, 'items' => array(), 'recommendProducts' => !empty($groupsData['recommendProducts']['catalogItems']) ? $groupsData['recommendProducts']['catalogItems'] : array(), 'newProducts' => !empty($groupsData['newProducts']['catalogItems']) ? $groupsData['newProducts']['catalogItems'] : array(), 'saleProducts' => !empty($groupsData['saleProducts']['catalogItems']) ? $groupsData['saleProducts']['catalogItems'] : array(), 'meta_title' => 'Группы товаров', 'meta_keywords' => "новинки, рекомендуемые, распродажа", 'meta_desc' => "Новинки, рекомендуемые, распродажа", 'actionButton' => MG::getSetting('actionInCatalog') === "true" ? 'actionBuy' : 'actionView', 'currency' => MG::getSetting('currency')); } $this->data = $data; }
/** * Обновляет корзину в соответствии с внесенными изменениями. */ public function updateCart() { $cart = new Models_Cart(); // Если был выбран вариант, то запоминаем его ID. $variantId = null; if (!empty($_POST["variant"])) { $variantId = $_POST["variant"]; unset($_POST["variant"]); } // Если происходит обновление по заданному id набора характеристик. if (isset($_POST['propertySetId'])) { foreach ($_SESSION['cart'] as $key => $item) { if ($item['propertySetId'] == $_POST['propertySetId'] && $item['id'] == $_POST['inCartProductId']) { $_SESSION['cart'][$key]['count'] = $_REQUEST['amount_input']; } } $response = array('status' => 'success', 'data' => SmalCart::getCartData()); echo json_encode($response); exit; } // Если характеристик не передано , то возможно // была нажата кнопка купить из мини карточки, в этом случае самостоятельно вычисляем набор // параметров, которые были бы указаны при открытии карточки товара. if (empty($_POST) || isset($_POST['updateCart']) && isset($_POST['inCartProductId']) && (count($_POST) == 3 || count($_POST) == 2)) { $modelProduct = new Models_Product(); $product = $modelProduct->getProduct($_REQUEST['inCartProductId']); $blockVariants = $modelProduct->getBlockVariants($product['id']); if (!$variantId) { $variants = $modelProduct->getVariants($product['id']); $variantsKey = array_keys($variants); $variantId = $variantsKey[0]; } $blockedProp = $modelProduct->noPrintProperty(); $propertyFormData = $modelProduct->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => $product['thisUserFields'], 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => false, 'titleBtn' => MG::getSetting('buttonBuyName'), 'blockVariants' => $blockVariants, 'currency_iso' => $product['id'])); $_POST = $propertyFormData['defaultSet']; $_POST['inCartProductId'] = $product['id']; } $property = $cart->createProperty($_POST); $cart->addToCart($_REQUEST['inCartProductId'], $_REQUEST['amount_input'], $property, $variantId); $response = array('status' => 'success', 'data' => SmalCart::getCartData()); echo json_encode($response); exit; }
function __construct() { $settings = MG::get('settings'); // Если нажата кнопка купить. $_REQUEST['category_id'] = URL::getQueryParametr('category_id'); if (!empty($_REQUEST['inCartProductId'])) { $cart = new Models_Cart(); // Если параметров товара не передано // возможно была нажата кнопка купить из мини карточки, // в этом случае самостоятельно вычисляем набор // параметров, которые были бы указаны при открытии карточки товара. if (empty($_POST) || isset($_POST['updateCart']) && isset($_POST['inCartProductId']) && count($_POST) == 2) { $modelProduct = new Models_Product(); $product = $modelProduct->getProduct($_REQUEST['inCartProductId']); if (empty($product)) { MG::redirect('/404'); exit; } $blockVariants = $modelProduct->getBlockVariants($product['id']); $blockedProp = $modelProduct->noPrintProperty(); $propertyFormData = $modelProduct->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => $product['thisUserFields'], 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => false, 'titleBtn' => MG::getSetting('buttonBuyName'), 'blockVariants' => $blockVariants, 'currency_iso' => $product['currency_iso'])); $_POST = $propertyFormData['defaultSet']; $_POST['inCartProductId'] = $product['id']; } $property = $cart->createProperty($_POST); $cart->addToCart($_REQUEST['inCartProductId'], $_REQUEST['amount_input'], $property); SmalCart::setCartData(); MG::redirect('/cart'); } if (!empty($_REQUEST['fastsearch'])) { $this->getSearchData(); } $countСatalogProduct = $settings['countСatalogProduct']; // Показать первую страницу выбранного раздела. $page = 1; // Запрашиваемая страница. if (isset($_REQUEST['p'])) { $page = $_REQUEST['p']; } $model = new Models_Catalog(); // Если происходит поиск по ключевым словам. $keyword = MG::defenderXss_decode(urldecode(URL::getQueryParametr('search'))); if (!empty($keyword)) { $keyword = $this->convertLang($keyword); $items = $model->getListProductByKeyWord($keyword, false, true, false, 'groupBy'); $searchData = array('keyword' => $keyword, 'count' => $items['numRows']); } else { // Получаем список вложенных категорий, // для вывода всех продуктов, на страницах текущей категории. if (empty($_REQUEST['category_id'])) { $_REQUEST['category_id'] = 0; } $model->categoryId = MG::get('category')->getCategoryList($_REQUEST['category_id']); // В конец списка, добавляем корневую текущую категорию. $model->categoryId[] = $_REQUEST['category_id']; // Записываем в глобальную переменную список всех вложенных категорий, // чтобы использовать в других местах кода, например в фильтре по характеристикам $_REQUEST['category_ids'] = $model->categoryId; // Передаем номер требуемой страницы, и количество выводимых объектов. $countСatalogProduct = $settings['countСatalogProduct']; $items = $model->getList($countСatalogProduct, false, true); } // Если с фильтра пришел запрос только на количество позиций. if (!empty($_REQUEST['getcount']) && !empty($_REQUEST['filter'])) { echo $items['totalCountItems'] ? $items['totalCountItems'] : 0; exit; } $settings = MG::get('settings'); if (empty($items['catalogItems'])) { $items['catalogItems'] = array(); } else { foreach ($items['catalogItems'] as $item) { if ($item['id']) { $productIds[] = $item['id']; } } $product = new Models_Product(); $blocksVariants = empty($productIds) ? null : $product->getBlocksVariantsToCatalog($productIds); $blockedProp = $product->noPrintProperty(); $actionButton = MG::getSetting('actionInCatalog') === "true" ? 'actionBuy' : 'actionView'; foreach ($items['catalogItems'] as $k => $item) { $imagesUrl = explode("|", $item['image_url']); $items['catalogItems'][$k]["image_url"] = ""; if (!empty($imagesUrl[0])) { $items['catalogItems'][$k]["image_url"] = $imagesUrl[0]; } $items['catalogItems'][$k]['title'] = MG::modalEditor('catalog', $item['title'], 'edit', $item["id"]); if ($items['catalogItems'][$k]['count'] == 0) { $buyButton = $items['catalogItems'][$k]['actionView']; } else { $buyButton = $items['catalogItems'][$k][$actionButton]; if (!empty($items['catalogItems'][$k]['variants'])) { foreach ($items['catalogItems'][$k]['variants'] as $variant) { if ($variant['count'] == 0) { $buyButton = $items['catalogItems'][$k]['actionView']; } } } } // Легкая форма без характеристик. $liteFormData = $product->createPropertyForm($param = array('id' => $item['id'], 'maxCount' => $item['count'], 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => true, 'titleBtn' => "В корзину", 'blockVariants' => $blocksVariants[$item['id']], 'buyButton' => $buyButton)); $items['catalogItems'][$k]['liteFormData'] = $liteFormData['html']; $buyButton = $items['catalogItems'][$k]['liteFormData']; $items['catalogItems'][$k]['buyButton'] = $buyButton; } } $categoryDesc = MG::get('category')->getDesctiption($_REQUEST['category_id']); if ($_REQUEST['category_id']) { $categoryDesc = MG::inlineEditor(PREFIX . 'category', "html_content", $_REQUEST['category_id'], $categoryDesc); } $catImg = MG::get('category')->getImageCategory($_REQUEST['category_id']); //$model->currentCategory['title'] = $_REQUEST['category_id'] ? $model->currentCategory['title'] : 0, //var_dump($model->currentCategory['title']); $data = array('items' => $items['catalogItems'], 'titeCategory' => $model->currentCategory['title'], 'cat_desc' => $categoryDesc, 'cat_img' => $catImg, 'cat_id' => $_REQUEST['category_id'] ? $_REQUEST['category_id'] : 0, 'filterBar' => $items['filterBarHtml'], 'totalCountItems' => $items['totalCountItems'], 'pager' => $items['pager'], 'searchData' => empty($searchData) ? '' : $searchData, 'meta_title' => !empty($model->currentCategory['meta_title']) ? $model->currentCategory['meta_title'] : $model->currentCategory['title'], 'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "товары,продукты,изделия", 'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "В каталоге нашего магазина есть все.", 'currency' => $settings['currency'], 'actionButton' => $actionButton); if (URL::isSection('catalog') || MG::getSetting('catalogIndex') == 'true' && (URL::isSection('index') || URL::isSection(''))) { $html = MG::get('pages')->getPageByUrl('catalog'); $html['html_content'] = MG::inlineEditor(PREFIX . 'page', "html_content", $html['id'], $html['html_content']); $data['meta_title'] = $html['meta_title'] ? $html['meta_title'] : $html['title']; $data['meta_title'] = $data['meta_title'] ? $data['meta_title'] : $model->currentCategory['title']; $data['meta_keywords'] = $html['meta_keywords']; $data['meta_desc'] = $html['meta_desc']; $data['cat_desc'] = $html['html_content']; $data['titeCategory'] = $html['title']; } if ($keyword) { $data['meta_title'] = 'Поиск по фразе: ' . $keyword; } $this->data = $data; }
/** * Метод добавляет к массиву продуктов информацию о характеристиках * для каждого продукта * @param $arrayProducts - массив с продуктами * @return float. */ public function addPropertyToProduct($arrayProducts) { $categoryIds = array(); $whereCat = ''; $idsProduct = array(); $currency = MG::getSetting("currency"); $currencyRate = MG::getSetting('currencyRate'); $currencyShopIso = MG::getSetting('currencyShopIso'); $prod = new Models_Product(); $idsVariantProduct = array(); foreach ($arrayProducts as $key => $product) { $arrayProducts[$key]['category_url'] = SHORT_LINK == '1' && !URL::isSection('mg-admin') ? '' : $arrayProducts[$key]['category_url'] . '/'; $product['category_url'] = SHORT_LINK == '1' ? '' : $product['category_url'] . '/'; if ($product['variant_exist'] && $product['variant_id']) { $variants = $prod->getVariants($product['id']); $variantsKey = array_keys($variants); $product['variant_id'] = $variantsKey[0]; $idsVariantProduct[$product['id']][] = $key; $variant = $variants[$product['variant_id']]; $arrayProducts[$key]['price_course'] = $variant['price_course']; $arrayProducts[$key]['price'] = $variant['price']; $arrayProducts[$key]['image_url'] = $variant['image'] ? $variant['image'] : $arrayProducts[$key]['image_url']; } $idsProduct[$product['id']] = $key; $categoryIds[] = $product['cat_id']; // Назначаем для продукта позьзовательские // характеристики по умолчанию, заданные категорией. $arrayProducts[$key]['thisUserFields'] = MG::get('category')->getUserPropertyCategoryById($product['cat_id']); $arrayProducts[$key]['propertyIdsForCat'] = MG::get('category')->getPropertyForCategoryById($product['cat_id']); $arrayProducts[$key]['currency'] = $currency; // Формируем ссылки подробнее и в корзину. $arrayProducts[$key]['actionBuy'] = '<a href="' . SITE . '/catalog?inCartProductId=' . $product["id"] . '" class="addToCart product-buy" data-item-id="' . $product["id"] . '">' . MG::getSetting('buttonBuyName') . '</a>'; $arrayProducts[$key]['actionCompare'] = '<a href="' . SITE . '/compare?inCompareProductId=' . $product["id"] . '" class="addToCompare" data-item-id="' . $product["id"] . '">' . MG::getSetting('buttonCompareName') . '</a>'; $arrayProducts[$key]['actionView'] = '<a href="' . SITE . '/' . (isset($product["category_url"]) ? $product["category_url"] : 'catalog') . '/' . $product["product_url"] . '" class="product-info">' . MG::getSetting('buttonMoreName') . '</a>'; $arrayProducts[$key]['link'] = SITE . '/' . (isset($product["category_url"]) ? $product["category_url"] : 'catalog/') . $product["product_url"]; if (empty($arrayProducts[$key]['currency_iso'])) { $arrayProducts[$key]['currency_iso'] = $currencyShopIso; } $arrayProducts[$key]['real_old_price'] = $arrayProducts[$key]['old_price']; $arrayProducts[$key]['old_price'] *= $currencyRate[$arrayProducts[$key]['currency_iso']]; $arrayProducts[$key]['real_price'] = $arrayProducts[$key]['price']; $arrayProducts[$key]['price'] = MG::priceCourse($arrayProducts[$key]['price_course']); $imagesConctructions = $prod->imagesConctruction($arrayProducts[$key]['image_url'], $arrayProducts[$key]['image_title'], $arrayProducts[$key]['image_alt']); $arrayProducts[$key]['images_product'] = $imagesConctructions['images_product']; $arrayProducts[$key]['images_title'] = $imagesConctructions['images_title']; $arrayProducts[$key]['images_alt'] = $imagesConctructions['images_alt']; $arrayProducts[$key]['image_url'] = $imagesConctructions['image_url']; $arrayProducts[$key]['image_title'] = $imagesConctructions['image_title']; $arrayProducts[$key]['image_alt'] = $imagesConctructions['image_alt']; $imagesUrl = explode("|", $arrayProducts[$key]['image_url']); $arrayProducts[$key]["image_url"] = ""; if (!empty($imagesUrl[0])) { $arrayProducts[$key]["image_url"] = $imagesUrl[0]; } } $model = new Models_Product(); $arrayVariants = $model->getBlocksVariantsToCatalog(array_keys($idsProduct), true); foreach (array_keys($idsProduct) as $id) { $arrayProducts[$idsProduct[$id]]['variants'] = $arrayVariants[$id]; } // Собираем все ID продуктов в один запрос. if ($prodSet = trim(DB::quote(implode(',', array_keys($idsProduct))), "'")) { // Формируем список id продуктов, к которым нужно найти пользовательские характеристики. $where = ' IN (' . $prodSet . ') '; } else { $where = ' IN (0) '; } //Определяем id категории, в которой находимся $catCode = URL::getLastSection(); $sql = ' SELECT pup.property_id, pup.value, pup.product_id, prop.*, pup.type_view, pup.product_margin FROM `' . PREFIX . 'product_user_property` as pup LEFT JOIN `' . PREFIX . 'property` as prop ON pup.property_id = prop.id '; if ($catSet = trim(DB::quote(implode(',', $categoryIds)), "'")) { $categoryIds = array_unique($categoryIds); $sql .= ' LEFT JOIN `' . PREFIX . 'category_user_property` as cup ON cup.property_id = prop.id '; $whereCat = ' AND cup.category_id IN (' . $catSet . ') '; } $sql .= 'WHERE pup.`product_id` ' . $where . $whereCat; $sql .= 'ORDER BY `sort` DESC'; $res = DB::query($sql); while ($userFields = DB::fetchAssoc($res)) { // viewDAta($userFields['property_id']); // viewDAta($arrayProducts[$key]['propertyIdsForCat']); // Обновляет данные позначениям характеристик, только для тех хар. которые назначены для категории текущего товара. // Это не работает в фильтрах и сравнениях. // if(in_array($userFields['property_id'],$arrayProducts[$key]['propertyIdsForCat'])){ // дописываем в массив пользовательских характеристик, // все переопределенные для каждого тоавара, оставляя при // этом не измененные характеристики по умолчанию $arrayProducts[$idsProduct[$userFields['product_id']]]['thisUserFields'][$userFields['property_id']] = $userFields; // добавляем польз характеристики ко всем вариантам продукта if (!empty($idsVariantProduct[$userFields['product_id']])) { foreach ($idsVariantProduct[$userFields['product_id']] as $keyPages) { $arrayProducts[$keyPages]['thisUserFields'][$userFields['property_id']] = $userFields; } } // } } return $arrayProducts; }