Beispiel #1
0
 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);
 }
Beispiel #2
0
 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'];
 }
Beispiel #3
0
 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;
 }
Beispiel #4
0
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);
    }
}
Beispiel #5
0
 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;
 }
Beispiel #6
0
 /**
  * Парсинг 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;
         }
     }
 }
Beispiel #7
0
 /**
  * Получает данные об ошибке произошедшей в админке и отправляет на 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;
 }
Beispiel #8
0
}
?>

  <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 
Beispiel #9
0
 /**
  * Возвращает данные о всех продуктах в корзине.
  * @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('&amp;', '&', $_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);
 }
Beispiel #10
0
 /**
  * Получает информацию о каждом товаре.
  * @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']);
 }
Beispiel #11
0
 /**
  * Создает информацию для последующего сохранения свойства для товара положенного в корзину из входящего массива.
  * @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);
 }
Beispiel #12
0
 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('/');
     }
 }
Beispiel #13
0
 /**
  * Возвращает список найденных продуктов соответствующих поисковой фразе.
  * @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);
 }
Beispiel #14
0
 /**
  * Полученнияе статистики заказов за выбранный период. 
  * @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 . '">';
}
Beispiel #16
0
}
$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'];
Beispiel #17
0
 /**
  * Создает временную таблицу 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) . ")");
     }
 }
Beispiel #18
0
/**
 * Возвращает правильно сформированную картинку для продукта в 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"] . '">';
}
Beispiel #19
0
 /**
  * Парсинг 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;
         }
     }
 }
Beispiel #20
0
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']);
// так проверяем произошол ли запрос по фильтрам или нет
Beispiel #21
0
 /**
  * Пересчитывает количество остатков продуктов при редактировании заказа.
  * @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);
 }
Beispiel #22
0
 /**
  * Определяет поведение при изменении и удаление данных в корзине,
  * а так же выводит список позиций к заказу
  *
  * @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']);
 }
Beispiel #23
0
 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;
 }
Beispiel #24
0
 /**
  * Обновляет корзину в соответствии с внесенными изменениями.
  */
 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;
 }
Beispiel #25
0
 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;
 }
Beispiel #26
0
 /**
  * Метод добавляет к массиву продуктов информацию о характеристиках
  * для каждого продукта
  * @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;
 }