コード例 #1
0
ファイル: cart.php プロジェクト: nellka/mebel
 /**
  * Добавляет товар в корзину.
  *
  * @param int $id id товара.
  * @param int $count количество.
  * @return bool
  */
 public function addToCart($id, $count = 1, $property = array('property' => '', 'propertyReal' => ''), $variantId = null)
 {
     $propertyReal = $property['propertyReal'];
     $property = $property['property'];
     if (empty($count) || !is_numeric($count)) {
         $count = 1;
     }
     $property = str_replace('%', '%', $property);
     $property = str_replace('&', '&', htmlspecialchars($property));
     // Если есть в корзине такой товар с этими характеристиками.
     $key = $this->alreadyInCart($id, $property, $variantId);
     if ($key !== null) {
         $product = new Models_Product();
         $tempProduct = $product->getProduct($id);
         $countMax = $tempProduct['count'];
         if ($variantId) {
             $tempProdVar = $product->getVariants($id);
             $countMax = $tempProdVar[$variantId]['count'];
         }
         if ($count + $_SESSION['cart'][$key]['count'] > $countMax && $countMax > 0) {
             $_SESSION['cart'][$key]['count'] = $countMax;
         } else {
             // Увеличиваем счетчик.
             $_SESSION['cart'][$key]['count'] += $count;
         }
     } else {
         $_SESSION['propertySetArray'][] = $property;
         $lastKey = array_keys($_SESSION['propertySetArray']);
         $lastKey = end($lastKey);
         if ($variant) {
             $id = $variant;
         }
         if (count($_SESSION['cart']) < MAX_COUNT_CART) {
             $_SESSION['cart'][] = array('id' => $id, 'count' => $count, 'property' => $property, 'propertyReal' => $propertyReal, 'propertySetId' => $lastKey, 'variantId' => $variantId);
         }
     }
     $args = func_get_args();
     $result = true;
     return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args);
 }
コード例 #2
0
ファイル: order.php プロジェクト: kostiukoleg/all4web.loc
 /**
  * Сохраняет заказ в базу сайта.
  * Добавляет в массив корзины третий параметр 'цена товара', для сохранения в заказ.
  * Это нужно для тогою чтобы в последствии вывести детальную информацию о заказе.
  * Если оставить только id то информация может оказаться неверной, так как цены меняютcя.
  * @return int $id номер заказа.
  */
 public function addOrder($adminOrder = false)
 {
     $itemPosition = new Models_Product();
     $cart = new Models_Cart();
     $catalog = new Models_Catalog();
     $categoryArray = $catalog->getCategoryArray();
     $this->summ = 0;
     $currencyRate = MG::getSetting('currencyRate');
     $currencyShopIso = MG::getSetting('currencyShopIso');
     // Массив запросов на обновление количества товаров.
     $updateCountProd = array();
     // Добавляем в массив корзины параметр 'цена товара'.
     if ($adminOrder) {
         $this->email = $adminOrder['user_email'];
         $this->phone = $adminOrder['phone'];
         $this->address = $adminOrder['address'];
         $this->delivery = $adminOrder['delivery_id'];
         $this->dateDelivery = $adminOrder['date_delivery'];
         $this->delivery_cost = $adminOrder['delivery_cost'];
         $this->payment = $adminOrder['payment_id'];
         $this->fio = $adminOrder['name_buyer'];
         $formatedDate = date('Y-m-d H:i:s');
         // Форматированная дата ГГГГ-ММ-ДД ЧЧ:ММ:СС.
         foreach ($adminOrder['order_content'] as $item) {
             $product = $itemPosition->getProduct($item['id']);
             $_SESSION['couponCode'] = $item['coupon'];
             $product['category_url'] = $product['category_url'] ? $product['category_url'] : 'catalog';
             $productUrl = $product['category_url'] . '/' . $product['url'];
             $itemCount = $item['count'];
             if (!empty($product)) {
                 $fulPrice = $item['fulPrice'];
                 // полная стоимость без скидки
                 $product['price'] = $item['price'];
                 // $product['price'] = $item['price_course'];
                 //$product['currency_iso'] = $product['currency_iso']?$product['currency_iso']:$currencyShopIso;
                 //$product['price'] *= $currencyRate[$product['currency_iso']];
                 $discount = 0;
                 if (!empty($item['price']) && (!empty($item['coupon']) || stristr($item['discSyst'], 'true') !== false)) {
                     $discount = 100 - $product['price'] * 100 / $fulPrice;
                 }
                 $productPositions[] = array('id' => $product['id'], 'name' => $item['title'], 'url' => $productUrl, 'code' => $item['code'], 'price' => $product['price'], 'count' => $itemCount, 'property' => $item['property'], 'coupon' => $_SESSION['couponCode'], 'discount' => round($discount, 1), 'fulPrice' => $fulPrice, 'weight' => $product['weight'], 'currency_iso' => $currencyShopIso, 'discSyst' => !empty($item['discSyst']) ? $item['discSyst'] : '');
                 $this->summ += $product['price'] * $itemCount;
                 // По ходу формируем массив запросов на обновление количества товаров.
                 if ($item['variant'] == 0) {
                     $product['count'] = $product['count'] - $itemCount >= 0 ? $product['count'] - $itemCount : 0;
                     $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count`= " . DB::quote($product['count']) . " WHERE `id`=" . DB::quote($product['id']) . " AND `count`>0";
                 } else {
                     $count = DB::query('
           SELECT count
           FROM `' . PREFIX . 'product_variant`
           WHERE id = ' . DB::quote($item['variant']));
                     $count = DB::fetchAssoc($count);
                     $product['count'] = $count['count'] - $itemCount >= 0 ? $count['count'] - $itemCount : 0;
                     $updateCountProd[] = "UPDATE `" . PREFIX . "product_variant` SET `count`= " . DB::quote($product['count']) . " WHERE `id`=" . DB::quote($item['variant']) . " AND `count`>0";
                     $variants = $itemPosition->getVariants($product['id']);
                     $firstVariant = reset($variants);
                     if ($firstVariant['id'] == $item['variant']) {
                         // если приобретен вариант товара, то выясним является ли он первым в наборе, если да то обновим информацию в mg_product
                         $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count`= " . DB::quote($product['count']) . " WHERE `id`=" . DB::quote($product['id']) . " AND `count`>0";
                     }
                 }
                 $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count_buy`= `count_buy` + 1 WHERE `id`=" . DB::quote($product['id']);
             }
         }
     } elseif (!empty($_SESSION['cart'])) {
         foreach ($_SESSION['cart'] as $item) {
             $product = $itemPosition->getProduct($item['id']);
             // Дописываем к массиву продуктов данные о выбранных характеристиках из корзины покупок, чтобы приплюсовать к сумме заказа.
             if ($item['id'] == $product['id']) {
                 $product['property_html'] = $item['propertyReal'];
             }
             $variant = null;
             $discount = null;
             $promocode = null;
             if (!empty($item['variantId']) && $item['id'] == $product['id']) {
                 $variants = $itemPosition->getVariants($product['id']);
                 $variant = $variants[$item['variantId']];
                 $product['price'] = $variant['price_course'];
                 $fulPrice = $product['price'];
                 $priceWithCoupon = $cart->applyCoupon($_SESSION['couponCode'], $product['price'], $product);
                 $priceWithDiscount = $cart->applyDiscountSystem($product['price']);
                 //$product['price'] = $priceWithCoupon < $priceWithDiscount['price'] ? $priceWithCoupon : $priceWithDiscount['price'];
                 $product['price'] = $cart->customPrice(array('product' => $product, 'priceWithCoupon' => $priceWithCoupon, 'priceWithDiscount' => $priceWithDiscount['price']));
                 $product['code'] = $variant['code'];
                 $product['count'] = $variant['count'];
                 $product['weight'] = $variant['weight'];
                 $product['title'] .= " " . $variant['title_variant'];
                 $discountSystem = $priceWithDiscount['discounts'];
                 $promocode = $priceWithDiscount['discounts'] != '' ? $priceWithDiscount['promo'] : $_SESSION['couponCode'];
                 //По ходу формируем массив запросов на обновление количества товаров
                 $resCount = $variant['code'];
                 $resCount = $variant['count'] - $item['count'] >= 0 ? $variant['count'] - $item['count'] : 0;
                 $updateCountProd[] = "UPDATE `" . PREFIX . "product_variant` SET `count`= " . DB::quote($resCount) . " WHERE `id`=" . DB::quote($item['variantId']) . " AND `count`>0";
             }
             $product['category_url'] = $product['category_url'] ? $product['category_url'] : 'catalog';
             $productUrl = $product['category_url'] . '/' . $product['url'];
             // Eсли куки не актуальны исключает попадание несуществующего продукта в заказ
             if (!empty($product)) {
                 if (!$variant) {
                     $product['price'] = $product['price_course'];
                     $fulPrice = $product['price'];
                 }
                 $product['price'] = SmalCart::plusPropertyMargin($fulPrice, $product['property_html'], $currencyRate[$product['currency_iso']]);
                 //$product['currency_iso'] = $product['currency_iso']?$product['currency_iso']:$currencyShopIso;
                 //$product['price'] *= $currencyRate[$product['currency_iso']];
                 $fulPrice = $product['price'];
                 $tempPrice = $product['price'];
                 //   if (!$variant) {
                 $priceWithCoupon = $cart->applyCoupon($_SESSION['couponCode'], $product['price'], $product);
                 $priceWithDiscount = $cart->applyDiscountSystem($product['price']);
                 //$product['price'] = $priceWithCoupon < $priceWithDiscount['price'] ? $priceWithCoupon : $priceWithDiscount['price'];
                 $product['price'] = $cart->customPrice(array('product' => $product, 'priceWithCoupon' => $priceWithCoupon, 'priceWithDiscount' => $priceWithDiscount['price']));
                 $discountSystem = $priceWithDiscount['discounts'];
                 $promocode = $priceWithDiscount['discounts'] != '' ? $priceWithDiscount['promo'] : $_SESSION['couponCode'];
                 //    }
                 $discount = 0;
                 if (!empty($tempPrice)) {
                     $discount = 100 - $product['price'] * 100 / $tempPrice;
                 }
                 $productPositions[] = array('id' => $product['id'], 'name' => $product['title'], 'url' => $productUrl, 'code' => $product['code'], 'price' => $product['price'], 'count' => $item['count'], 'property' => $item['property'], 'coupon' => $promocode, 'discount' => round($discount), 'fulPrice' => $fulPrice, 'weight' => $product['weight'], 'currency_iso' => $currencyShopIso, 'discSyst' => $discountSystem ? $discountSystem : '');
                 $this->summ += $product['price'] * $item['count'];
                 if (!$resCount) {
                     $resCount = $product['count'] - $item['count'] >= 0 ? $product['count'] - $item['count'] : 0;
                 }
                 //По ходу формируем массив запросов на обновление количества товаров
                 if (!$variant) {
                     $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count`= " . DB::quote($resCount) . " WHERE `id`=" . DB::quote($product['id']) . " AND `count`>0";
                 } else {
                     $firstVariant = reset($variants);
                     if ($firstVariant['id'] == $item['variantId']) {
                         // если приобретен вариант товара, то выясним является ли он первым в наборе, если да то обновим информацию в mg_product
                         $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count`= " . DB::quote($resCount) . " WHERE `id`=" . DB::quote($product['id']) . " AND `count`>0";
                     }
                 }
                 $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count_buy`= `count_buy` + 1 WHERE `id`=" . DB::quote($product['id']);
                 $resCount = null;
             }
         }
     }
     // Сериализует данные в строку для записи в бд.
     $orderContent = addslashes(serialize($productPositions));
     // Сериализует данные в строку для записи в бд информации об юридическом лице.
     $yurInfo = '';
     if (!empty($adminOrder['yur_info'])) {
         $yurInfo = addslashes(serialize($adminOrder['yur_info']));
     }
     if (!empty($_POST['yur_info'])) {
         $yurInfo = addslashes(serialize($_POST['yur_info']));
     }
     // Создает новую модель корзины, чтобы узнать сумму заказа.
     $cart = new Models_Cart();
     // Генерируем уникальный хэш для подтверждения заказа.
     $hash = $this->_getHash($this->email);
     //Достаем настройки заказов, чтобы установить статус для нового заказа.
     $propertyOrder = MG::getOption('propertyOrder');
     $propertyOrder = stripslashes($propertyOrder);
     $propertyOrder = unserialize($propertyOrder);
     $order_status_id = $this->payment == 3 && $propertyOrder['order_status'] == 1 ? 3 : $propertyOrder['order_status'];
     // Формируем массив параметров для SQL запроса.
     $array = array('user_email' => $this->email, 'summ' => number_format($this->summ, 2, '.', ''), 'order_content' => $orderContent, 'phone' => $this->phone, 'address' => $this->address, 'delivery_id' => $this->delivery, 'delivery_cost' => $this->delivery_cost, 'payment_id' => $this->payment, 'paided' => '0', 'status_id' => $order_status_id, 'confirmation' => $hash, 'yur_info' => $yurInfo, 'name_buyer' => $this->fio, 'date_delivery' => $this->dateDelivery, 'user_comment' => $this->info, 'ip' => $_SERVER['REMOTE_ADDR']);
     // Если заказ оформляется через админку.
     if ($adminOrder) {
         $array['comment'] = $adminOrder['comment'];
         $array['status_id'] = $adminOrder['status_id'];
         $array['add_date'] = $formatedDate;
         $array['date_delivery'] = $adminOrder['date_delivery'];
         DB::buildQuery("INSERT INTO `" . PREFIX . "order` SET ", $array);
     } else {
         // Отдает на обработку  родительской функции buildQuery.
         DB::buildQuery("INSERT INTO `" . PREFIX . "order` SET add_date = now(), ", $array);
     }
     // Заказ номер id добавлен в базу.
     $id = null;
     $id = DB::insertId();
     $_SESSION['usedCouponCode'] = $_SESSION['couponCode'];
     unset($_SESSION['couponCode']);
     $orderNumber = $this->getOrderNumber($id);
     $hashStatus = '';
     $linkToStatus = '';
     if (MG::getSetting('autoRegister') == "false" && !USER::isAuth()) {
         $hashStatus = md5($id . $this->email . rand(9999));
         $linkToStatus = '<a href="' . SITE . '/order?hash=' . $hashStatus . '" target="blank">' . SITE . '/order?hash=' . $hashStatus . '</a>';
     }
     DB::query("UPDATE `" . PREFIX . "order` SET `number`= " . DB::quote($orderNumber) . ", `hash`=" . DB::quote($hashStatus) . " WHERE `id`=" . DB::quote($id) . "");
     // Ссылка для подтверждения заказа
     $link = 'ссылке <a href="' . SITE . '/order?sec=' . $hash . '&id=' . $id . '" target="blank">' . SITE . '/order?sec=' . $hash . '&id=' . $id . '</a>';
     $table = "";
     // Формирование тела письма.
     if ($id) {
         // Уменьшаем количество купленных товаров
         if (!empty($updateCountProd)) {
             foreach ($updateCountProd as $sql) {
                 DB::query($sql);
             }
             foreach ($productPositions as $product) {
                 Storage::clear(md5('ControllersProduct' . $product['url']));
             }
         }
         // Если заказ создался, то уменьшаем количество товаров на складе.
         $settings = MG::get('settings');
         $delivery = $this->getDeliveryMethod(false, $this->delivery);
         $sitename = $settings['sitename'];
         $currency = MG::getSetting('currency');
         $paymentArray = $this->getPaymentMethod($this->payment);
         $subj = 'Оформлена заявка №' . ($orderNumber != "" ? $orderNumber : $id) . ' на сайте ' . $sitename;
         foreach ($productPositions as &$item) {
             foreach ($item as &$v) {
                 $v = rawurldecode($v);
             }
         }
         $paramToMail = array('orderNumber' => $orderNumber, 'siteName' => MG::getSetting('sitename'), 'delivery' => $delivery, 'currency' => MG::getSetting('currency'), 'fio' => $this->fio, 'email' => $this->email, 'phone' => $this->phone, 'address' => $this->address, 'delivery' => $delivery['description'], 'payment' => $paymentArray['name'], 'adminOrder' => $adminOrder, 'result' => $this->summ, 'deliveryCost' => $this->delivery_cost, 'date_delivery' => $this->dateDelivery, 'total' => $this->delivery_cost + $this->summ, 'confirmLink' => $link, 'ip' => $this->ip, 'lastvisit' => $_SESSION['lastvisit'], 'firstvisit' => $_SESSION['firstvisit'], 'supportEmail' => MG::getSetting('noReplyEmail'), 'shopName' => MG::getSetting('shopName'), 'shopPhone' => MG::getSetting('shopPhone'), 'formatedDate' => date('Y-m-d H:i:s'), 'productPositions' => $productPositions, 'couponCode' => $_SESSION['couponCode'], 'toKnowStatus' => $linkToStatus);
         $emailToUser = MG::layoutManager('email_order', $paramToMail);
         $paramToMail['adminMail'] = true;
         $emailToAdmin = MG::layoutManager('email_order', $paramToMail);
         $mails = explode(',', MG::getSetting('adminEmail'));
         foreach ($mails as $mail) {
             if (preg_match('/^[-._a-zA-Z0-9]+@(?:[a-zA-Z0-9][-a-zA-Z0-9]+\\.)+[a-zA-Z]{2,6}$/', $mail)) {
                 Mailer::addHeaders(array("Reply-to" => $this->email));
                 Mailer::sendMimeMail(array('nameFrom' => $this->fio, 'emailFrom' => MG::getSetting('noReplyEmail'), 'nameTo' => $sitename, 'emailTo' => $mail, 'subject' => $subj, 'body' => $emailToAdmin, 'html' => true));
             }
         }
         // Отправка заявки пользователю.
         Mailer::sendMimeMail(array('nameFrom' => $sitename, 'emailFrom' => MG::getSetting('noReplyEmail'), 'nameTo' => $this->fio, 'emailTo' => $this->email, 'subject' => $subj, 'body' => $emailToUser, 'html' => true));
         // Если заказ успешно записан, то очищает корзину.
         if (!$adminOrder) {
             $cart->clearCart();
         }
     }
     $result = array('id' => $id, 'orderNumber' => $orderNumber);
     // Возвращаем номер созданого заказа.
     $args = func_get_args();
     return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args);
 }
コード例 #3
0
ファイル: actioner.php プロジェクト: WinGood/24karcher
 /**
  * Получает параметры редактируемого продукта.
  */
 public function getProductData()
 {
     $this->messageError = $this->lang['ACT_NOT_GET_POD'];
     $model = new Models_Product();
     $product = $model->getProduct($_POST['id']);
     $maskField = array('title', 'meta_title', 'meta_keywords', 'meta_desc', 'image_title', 'image_alt');
     foreach ($product as $k => $v) {
         if (in_array($k, $maskField)) {
             $product[$k] = htmlspecialchars_decode($v);
         }
     }
     if (empty($product)) {
         return false;
     }
     $this->data = $product;
     // Получаем весь набор пользовательских характеристик.
     $res = DB::query("SELECT * FROM `" . PREFIX . "property`");
     while ($userFields = DB::fetchAssoc($res)) {
         $this->data['allProperty'][] = $userFields;
     }
     $variants = $model->getVariants($_POST['id']);
     foreach ($variants as $variant) {
         $this->data['variants'][] = $variant;
     }
     $stringRelated = ' null';
     $sortRelated = array();
     foreach (explode(',', $product['related']) as $item) {
         $stringRelated .= ',' . DB::quote($item);
         if (!empty($item)) {
             $sortRelated[$item] = $item;
         }
     }
     $stringRelated = substr($stringRelated, 1);
     //$productsRelated = $model->getProductByUserFilter(' id IN ('.($product['related']?$product['related']:'0').')');
     $res = DB::query('
   SELECT  CONCAT(c.parent_url,c.url) as category_url,
     p.url as product_url, p.id, p.image_url,p.price_course as price,p.title,p.code
   FROM `' . PREFIX . 'product` p
     LEFT JOIN `' . PREFIX . 'category` c
     ON c.id = p.cat_id
   WHERE p.code IN (' . $stringRelated . ')');
     while ($row = DB::fetchAssoc($res)) {
         $img = explode('|', $row['image_url']);
         $row['image_url'] = $img[0];
         $sortRelated[$row['code']] = $row;
     }
     $productsRelated = array();
     //сортируем связанные товары в том порядке, в котором они идут в строке артикулов
     if (!empty($sortRelated)) {
         foreach ($sortRelated as $item) {
             if (is_array($item)) {
                 $productsRelated[] = $item;
             }
         }
     }
     $this->data['relatedArr'] = $productsRelated;
     $_POST['produtcId'] = $_POST['id'];
     $_POST['categoryId'] = $product['cat_id'];
     $tempDataResult = $this->data;
     $this->data = null;
     $this->getProdDataWithCat();
     $tempDataResult['prodData'] = $this->data;
     $this->data = $tempDataResult;
     //$this->data['prodData'] = $this->getProdDataWithCat();
     return true;
 }
コード例 #4
0
ファイル: import.php プロジェクト: nellka/mebel
 /**
  * Создает временную таблицу 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) . ")");
     }
 }
コード例 #5
0
ファイル: cart.php プロジェクト: WinGood/24karcher
 /**
  * Возвращает данные о всех продуктах в корзине.
  * @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);
 }
コード例 #6
0
ファイル: layout_property.php プロジェクト: nellka/mebel
?>

  <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 
    if ($data['ajax']) {
コード例 #7
0
ファイル: catalog.php プロジェクト: WinGood/24karcher
 /**
  * Метод добавляет к массиву продуктов информацию о характеристиках
  * для каждого продукта
  * @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;
 }
コード例 #8
0
ファイル: cart.php プロジェクト: nellka/mebel
 /**
  * Обновляет корзину в соответствии с внесенными изменениями.
  */
 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;
 }
コード例 #9
0
ファイル: cart.php プロジェクト: WinGood/24karcher
 /**
  * Определяет поведение при изменении и удаление данных в корзине,
  * а так же выводит список позиций к заказу
  *
  * @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']);
 }
コード例 #10
0
ファイル: catalog.php プロジェクト: WinGood/24karcher
 /**
  * Возвращает список найденных продуктов соответствующих поисковой фразе.
  * @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);
 }
コード例 #11
0
ファイル: order.php プロジェクト: WinGood/24karcher
 /**
  * Сохраняет заказ в базу сайта.
  * Добавляет в массив корзины третий параметр 'цена товара', для сохранения в заказ.
  * Это нужно для тогою чтобы в последствии вывести детальную информацию о заказе.
  * Если оставить только id то информация может оказаться неверной, так как цены меняютcя.
  * @return int $id номер заказа.
  */
 public function addOrder($adminOrder = false)
 {
     $itemPosition = new Models_Product();
     $cart = new Models_Cart();
     $catalog = new Models_Catalog();
     $categoryArray = $catalog->getCategoryArray();
     $this->summ = 0;
     // Массив запросов на обновление количества товаров.
     $updateCountProd = array();
     // Добавляем в массив корзины параметр 'цена товара'.
     if ($adminOrder) {
         $this->email = $adminOrder['user_email'];
         $this->phone = $adminOrder['phone'];
         $this->address = $adminOrder['address'];
         $this->delivery = $adminOrder['delivery_id'];
         $this->delivery_cost = $adminOrder['delivery_cost'];
         $this->payment = $adminOrder['payment_id'];
         $this->fio = $adminOrder['user_email'];
         $formatedDate = date('Y-m-d H:i:s');
         // Форматированная дата ГГГГ-ММ-ДД ЧЧ:ММ:СС.
         foreach ($adminOrder['order_content'] as $item) {
             $product = $itemPosition->getProduct($item['id']);
             $_SESSION['couponCode'] = $item['coupon'];
             $productUrl = $product['category_url'] . '/' . $product['url'];
             $itemCount = $item['count'];
             if (!empty($product)) {
                 $product['price'] = $item['price'];
                 $product['price'] = $cart->applyCoupon($_SESSION['couponCode'], $product['price'], $product);
                 $discount = 100 - $product['price'] * 100 / $item['price'];
                 $productPositions[] = array('id' => $product['id'], 'name' => $item['title'], 'url' => $productUrl, 'code' => $item['code'], 'price' => $product['price'], 'count' => $itemCount, 'property' => $item['property'], 'coupon' => $_SESSION['couponCode'], 'discount' => $discount, 'info' => $this->info);
                 $this->summ += $product['price'] * $itemCount;
                 $product['count'] = $product['count'] - $itemCount >= 0 ? $product['count'] - $itemCount : 0;
                 // По ходу формируем массив запросов на обновление количества товаров.
                 $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count`= " . DB::quote($product['count']) . " WHERE `id`=" . DB::quote($product['id']) . " AND `count`>0";
             }
         }
     } elseif (!empty($_SESSION['cart'])) {
         foreach ($_SESSION['cart'] as $item) {
             $product = $itemPosition->getProduct($item['id']);
             // Дописываем к массиву продуктов данные о выбранных характеристиках из корзины покупок, чтобы приплюсовать к сумме заказа.
             if ($item['id'] == $product['id']) {
                 $product['property_html'] = $item['propertyReal'];
             }
             $variant = null;
             if (!empty($item['variantId']) && $item['id'] == $product['id']) {
                 $variants = $itemPosition->getVariants($product['id']);
                 $variant = $variants[$item['variantId']];
                 $product['price'] = $variant['price'];
                 $product['price'] = $cart->applyCoupon($_SESSION['couponCode'], $product['price'], $product);
                 $product['code'] = $variant['code'];
                 $product['count'] = $variant['count'];
                 $product['title'] .= " " . $variant['title_variant'];
                 //По ходу формируем массив запросов на обновление количества товаров
                 $resCount = $variant['code'];
                 $resCount = $variant['count'] - $item['count'] >= 0 ? $variant['count'] - $item['count'] : 0;
                 $updateCountProd[] = "UPDATE `" . PREFIX . "product_variant` SET `count`= " . DB::quote($resCount) . " WHERE `id`=" . DB::quote($item['variantId']) . " AND `count`>0";
             }
             $productUrl = $product['category_url'] . '/' . $product['url'];
             // Eсли куки не актуальны исключает попадание несуществующего продукта в заказ
             if (!empty($product)) {
                 $product['price'] = SmalCart::plusPropertyMargin($product['price'], $product['property_html']);
                 $tempPrice = $product['price'];
                 $product['price'] = $cart->applyCoupon($_SESSION['couponCode'], $product['price'], $product);
                 $discount = 100 - $product['price'] * 100 / $tempPrice;
                 $productPositions[] = array('id' => $product['id'], 'name' => $product['title'], 'url' => $productUrl, 'code' => $product['code'], 'price' => $product['price'], 'count' => $item['count'], 'property' => $item['property'], 'coupon' => $_SESSION['couponCode'], 'discount' => $discount, 'info' => $this->info);
                 $this->summ += $product['price'] * $item['count'];
                 if (!$resCount) {
                     $resCount = $product['count'] - $item['count'] >= 0 ? $product['count'] - $item['count'] : 0;
                 }
                 //По ходу формируем массив запросов на обновление количества товаров
                 $updateCountProd[] = "UPDATE `" . PREFIX . "product` SET `count`= " . DB::quote($resCount) . " WHERE `id`=" . DB::quote($product['id']) . " AND `count`>0";
                 $resCount = null;
             }
         }
     }
     // Сериализует данные в строку для записи в бд.
     $orderContent = addslashes(serialize($productPositions));
     // Сериализует данные в строку для записи в бд информации об юридическом лице.
     $yurInfo = '';
     if (!empty($adminOrder['yur_info'])) {
         $yurInfo = addslashes(serialize($adminOrder['yur_info']));
     }
     if (!empty($_POST['yur_info'])) {
         $yurInfo = addslashes(serialize($_POST['yur_info']));
     }
     // Создает новую модель корзины, чтобы узнать сумму заказа.
     $cart = new Models_Cart();
     // Генерируем уникальный хэш для подтверждения заказа.
     $hash = $this->_getHash($this->email);
     // Формируем массив параметров для SQL запроса.
     $array = array('user_email' => $this->email, 'summ' => $this->summ, 'order_content' => $orderContent, 'phone' => $this->phone, 'address' => $this->address, 'delivery_id' => $this->delivery, 'delivery_cost' => $this->delivery_cost, 'payment_id' => $this->payment, 'paided' => '0', 'status_id' => '0', 'confirmation' => $hash, 'yur_info' => $yurInfo, 'name_buyer' => $this->fio);
     // Если заказ оформляется через админку.
     if ($adminOrder) {
         $array['comment'] = $adminOrder['comment'];
         $array['status_id'] = $adminOrder['status_id'];
         $array['add_date'] = $formatedDate;
         DB::buildQuery("INSERT INTO `" . PREFIX . "order` SET ", $array);
     } else {
         // Отдает на обработку  родительской функции buildQuery.
         DB::buildQuery("INSERT INTO `" . PREFIX . "order` SET add_date = now(), ", $array);
     }
     // Заказ номер id добавлен в базу.
     $id = null;
     $id = DB::insertId();
     unset($_SESSION['couponCode']);
     // Ссылка для подтверждения заказа
     $link = 'ссылке <a href="' . SITE . '/order?sec=' . $hash . '&id=' . $id . '" target="blank">' . SITE . '/order?sec=' . $hash . '&id=' . $id . '</a>';
     $table = "";
     // Формирование тела письма.
     if ($id) {
         // Уменьшаем количество купленных товаров
         if (!empty($updateCountProd)) {
             foreach ($updateCountProd as $sql) {
                 DB::query($sql);
             }
         }
         // Если заказ создался, то уменьшаем количество товаров на складе.
         $settings = MG::get('settings');
         $delivery = $this->getDeliveryMethod(false, $this->delivery);
         $sitename = $settings['sitename'];
         $currency = MG::getSetting('currency');
         $subj = 'Оформлена заявка №' . $id . ' на сайте ' . $sitename;
         $subj = str_replace('№', '#', $subj);
         if ($this->fio) {
             $table .= '<br/><b>Покупатель:</b> ' . $this->fio;
         }
         $table .= '<br/><b>E-mail:</b> ' . $this->email;
         $table .= '<br/><b>Тел:</b> ' . $this->phone;
         if ($this->address) {
             $table .= '<br/><b>Адрес:</b> ' . $this->address;
         }
         $table .= '<br/><b>Доставка:</b> ' . $delivery['description'];
         $paymentArray = $this->getPaymentMethod($this->payment);
         $table .= '<br/><b>Оплата:</b> ' . $paymentArray['name'];
         $table .= '
     <style>
       table {border: 4px double black;border-collapse: collapse;}
       th {text-align: left;background: #ccc;padding: 5px;border: 1px solid black;}
       td {padding: 5px;border: 1px solid black;}
     </style>';
         $table .= '<br><br><table>';
         if (!empty($_SESSION['cart']) || $adminOrder) {
             $table .= '
         <tr>
           <th>Наименование товара</th>
           <th>Артикул</th>
           <th>Стоимость</th>
           <th>Количество</th>
         </tr>';
             foreach ($productPositions as $product) {
                 $product['property'] = htmlspecialchars_decode(str_replace('&amp;', '&', $product['property']));
                 $table .= '
         <tr>
           <td>' . $product['name'] . $product['property'] . '</td>
           <td>' . $product['code'] . '</td>
           <td>' . $product['price'] . ' ' . $currency . '</td>
           <td>' . $product['count'] . ' шт.</td>
         </tr>';
             }
         }
         $table .= '</table>';
         $table .= '<br><b>Итого:</b> ' . $this->summ . ' ' . $currency;
         $table .= '<br/><b>Стоимость доставки:</b> ' . $this->delivery_cost . " " . $currency;
         $totalSumm = $this->delivery_cost + $this->summ;
         $table .= '<br/><b>Всего к оплате:</b> <span style="color:red">' . $totalSumm . ' ' . $currency . '</span>';
         $msg = MG::getSetting('orderMessage') . '<br><u>Обязательно подтвердите</u> свой заказ, перейдя по ' . $link . '.<br>' . $table;
         $msg = str_replace('#ORDER#', $id, $msg);
         $msg = str_replace('#SITE#', $sitename, $msg);
         $msg = str_replace('№', '#', $msg);
         $mails = explode(',', MG::getSetting('adminEmail'));
         // Отправка заявки админам.
         // Дополнительная информация для админов.
         $msgAdmin .= '<br/><br/><b>Покупатель перешел к нам на сайт из: </b><br/>' . $_SESSION['lastvisit'] . '<br/><br/><b>Покупатель впервые перешел к нам на сайт из: </b><br/>' . $_SESSION['firstvisit'];
         foreach ($mails as $mail) {
             if (preg_match('/^[-._a-z0-9]+@(?:[a-z0-9][-a-z0-9]+\\.)+[a-z]{2,6}$/', $mail)) {
                 Mailer::addHeaders(array("Reply-to" => $this->email));
                 Mailer::sendMimeMail(array('nameFrom' => $this->fio, 'emailFrom' => MG::getSetting('noReplyEmail'), 'nameTo' => $sitename, 'emailTo' => $mail, 'subject' => $subj, 'body' => $msg . $msgAdmin, 'html' => true));
             }
         }
         // Добавление в тело письма ссылки для задания пароля.
         $msg .= '<br>Подтвердите свой заказ, перейдя по ' . $link;
         // Отправка заявки пользователю.
         Mailer::sendMimeMail(array('nameFrom' => $sitename, 'emailFrom' => MG::getSetting('noReplyEmail'), 'nameTo' => $this->fio, 'emailTo' => $this->email, 'subject' => $subj, 'body' => $msg, 'html' => true));
         // Если заказ успешно записан, то очищает корзину.
         if (!$adminOrder) {
             $cart->clearCart();
         }
     }
     // Возвращаем номер созданого заказа.
     $args = func_get_args();
     return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $id, $args);
 }