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; }
static function counterView($arg) { $model = new Models_Product(); $product = $model->getProduct(URL::getQueryParametr('id')); $user_ip = $_SERVER['REMOTE_ADDR']; $date = date('Y-m-d'); $id_product = $product['id']; $visits_today = DB::query("SELECT `id` FROM `" . PREFIX . self::$pluginName . '_visits' . "` WHERE `date`='" . $date . "'"); $product = DB::query("SELECT `id` FROM `" . PREFIX . self::$pluginName . '_visits' . "` WHERE id_product='" . $id_product . "'"); if (!DB::numRows($product)) { DB::query("INSERT INTO `" . PREFIX . self::$pluginName . '_visits' . "` SET `views`=1, `id_product`='" . $id_product . "', `date`='" . $date . "'"); } else { DB::query("UPDATE `" . PREFIX . self::$pluginName . '_visits' . "` SET `date`='" . $date . "', `views`=`views`+1 WHERE `id_product`='" . $id_product . "'"); } return $arg['result']; }
function getBestSeller($count = 4) { $getOrder = DB::query("SELECT order_content FROM `" . PREFIX . 'order' . "`"); if (DB::numRows($getOrder) != 0) { $product = new Models_Product(); while ($row = DB::fetchArray($getOrder)) { $orderData[] = unserialize(stripslashes($row['order_content'])); } $res = array(); foreach ($orderData as $k => $v) { foreach ($v as $key => $val) { $res[] = $product->getProduct($val['id']); } } $goodsSale = getCount($res); return array_slice($goodsSale, 0, $count); } }
function __construct() { $model = new Models_Product(); // Требуется только пересчет цены товара. if (!empty($_REQUEST['calcPrice'])) { $model->calcPrice(); exit; } $settings = MG::get('settings'); $product = $model->getProduct(URL::getQueryParametr('id')); $product['meta_title'] = $product['meta_title'] ? $product['meta_title'] : $product['title']; $product['currency'] = $settings['currency']; $blockVariants = $model->getBlockVariants($product['id']); $propertyFormData = $model->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => $product['thisUserFields'], 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => array(), 'noneAmount' => false, 'titleBtn' => "В корзину", 'blockVariants' => $blockVariants)); // Легкая форма без характеристик. $liteFormData = $model->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => array(), 'noneAmount' => false, 'titleBtn' => "В корзину", 'blockVariants' => $blockVariants)); $product['price'] += $propertyFormData['marginPrice']; $product['propertyForm'] = $propertyFormData['html']; $product['liteFormData'] = $liteFormData['html']; $product['description'] = MG::inlineEditor(PREFIX . 'product', "description", $product['id'], $product['description']); $product['title'] = MG::modalEditor('catalog', $product['title'], 'edit', $product["id"]); $product["recommend"] = 0; $product["new"] = 0; $product['cat_title'] = $model->getTitleCat($product['cat_id']); // Случайные продукты $modelCatalog = new Models_Catalog(); $likeGoods = $modelCatalog->getRandomProduct($product['cat_id'], $product['id']); $product['like_goods'] = $likeGoods; // Информация об отсутствии товара на складе. if (MG::getSetting('printRemInfo') == "true" && $product['count'] == 0) { $product['remInfo'] = "<span class='rem-info'>Товара временно нет на складе!</style>"; } if ($product['count'] < 0) { $product['count'] = "∞"; } $this->data = $product; }
function __construct() { $settings = MG::get('settings'); // Если нажата кнопка купить. $_REQUEST['category_id'] = URL::getQueryParametr('category_id'); if (!empty($_REQUEST['inCartProductId'])) { $cart = new Models_Cart(); // Если параметров товара не передано // возможно была нажата кнопка купить из мини карточки, // в этом случае самостоятельно вычисляем набор // параметров, которые были бы указаны при открытии карточки товара. if (empty($_POST) || isset($_POST['updateCart']) && isset($_POST['inCartProductId']) && count($_POST) == 2) { $modelProduct = new Models_Product(); $product = $modelProduct->getProduct($_REQUEST['inCartProductId']); if (empty($product)) { MG::redirect('/404'); exit; } $blockVariants = $modelProduct->getBlockVariants($product['id']); $blockedProp = $modelProduct->noPrintProperty(); $propertyFormData = $modelProduct->createPropertyForm($param = array('id' => $product['id'], 'maxCount' => $product['count'], 'productUserFields' => $product['thisUserFields'], 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => false, 'titleBtn' => MG::getSetting('buttonBuyName'), 'blockVariants' => $blockVariants, 'currency_iso' => $product['currency_iso'])); $_POST = $propertyFormData['defaultSet']; $_POST['inCartProductId'] = $product['id']; } $property = $cart->createProperty($_POST); $cart->addToCart($_REQUEST['inCartProductId'], $_REQUEST['amount_input'], $property); SmalCart::setCartData(); MG::redirect('/cart'); } if (!empty($_REQUEST['fastsearch'])) { $this->getSearchData(); } $countСatalogProduct = $settings['countСatalogProduct']; // Показать первую страницу выбранного раздела. $page = 1; // Запрашиваемая страница. if (isset($_REQUEST['p'])) { $page = $_REQUEST['p']; } $model = new Models_Catalog(); // Если происходит поиск по ключевым словам. $keyword = MG::defenderXss_decode(urldecode(URL::getQueryParametr('search'))); if (!empty($keyword)) { $keyword = $this->convertLang($keyword); $items = $model->getListProductByKeyWord($keyword, false, true, false, 'groupBy'); $searchData = array('keyword' => $keyword, 'count' => $items['numRows']); } else { // Получаем список вложенных категорий, // для вывода всех продуктов, на страницах текущей категории. if (empty($_REQUEST['category_id'])) { $_REQUEST['category_id'] = 0; } $model->categoryId = MG::get('category')->getCategoryList($_REQUEST['category_id']); // В конец списка, добавляем корневую текущую категорию. $model->categoryId[] = $_REQUEST['category_id']; // Записываем в глобальную переменную список всех вложенных категорий, // чтобы использовать в других местах кода, например в фильтре по характеристикам $_REQUEST['category_ids'] = $model->categoryId; // Передаем номер требуемой страницы, и количество выводимых объектов. $countСatalogProduct = $settings['countСatalogProduct']; $items = $model->getList($countСatalogProduct, false, true); } // Если с фильтра пришел запрос только на количество позиций. if (!empty($_REQUEST['getcount']) && !empty($_REQUEST['filter'])) { echo $items['totalCountItems'] ? $items['totalCountItems'] : 0; exit; } $settings = MG::get('settings'); if (empty($items['catalogItems'])) { $items['catalogItems'] = array(); } else { foreach ($items['catalogItems'] as $item) { if ($item['id']) { $productIds[] = $item['id']; } } $product = new Models_Product(); $blocksVariants = empty($productIds) ? null : $product->getBlocksVariantsToCatalog($productIds); $blockedProp = $product->noPrintProperty(); $actionButton = MG::getSetting('actionInCatalog') === "true" ? 'actionBuy' : 'actionView'; foreach ($items['catalogItems'] as $k => $item) { $imagesUrl = explode("|", $item['image_url']); $items['catalogItems'][$k]["image_url"] = ""; if (!empty($imagesUrl[0])) { $items['catalogItems'][$k]["image_url"] = $imagesUrl[0]; } $items['catalogItems'][$k]['title'] = MG::modalEditor('catalog', $item['title'], 'edit', $item["id"]); if ($items['catalogItems'][$k]['count'] == 0) { $buyButton = $items['catalogItems'][$k]['actionView']; } else { $buyButton = $items['catalogItems'][$k][$actionButton]; if (!empty($items['catalogItems'][$k]['variants'])) { foreach ($items['catalogItems'][$k]['variants'] as $variant) { if ($variant['count'] == 0) { $buyButton = $items['catalogItems'][$k]['actionView']; } } } } // Легкая форма без характеристик. $liteFormData = $product->createPropertyForm($param = array('id' => $item['id'], 'maxCount' => $item['count'], 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => $blockedProp, 'noneAmount' => true, 'titleBtn' => "В корзину", 'blockVariants' => $blocksVariants[$item['id']], 'buyButton' => $buyButton)); $items['catalogItems'][$k]['liteFormData'] = $liteFormData['html']; $buyButton = $items['catalogItems'][$k]['liteFormData']; $items['catalogItems'][$k]['buyButton'] = $buyButton; } } $categoryDesc = MG::get('category')->getDesctiption($_REQUEST['category_id']); if ($_REQUEST['category_id']) { $categoryDesc = MG::inlineEditor(PREFIX . 'category', "html_content", $_REQUEST['category_id'], $categoryDesc); } $catImg = MG::get('category')->getImageCategory($_REQUEST['category_id']); //$model->currentCategory['title'] = $_REQUEST['category_id'] ? $model->currentCategory['title'] : 0, //var_dump($model->currentCategory['title']); $data = array('items' => $items['catalogItems'], 'titeCategory' => $model->currentCategory['title'], 'cat_desc' => $categoryDesc, 'cat_img' => $catImg, 'cat_id' => $_REQUEST['category_id'] ? $_REQUEST['category_id'] : 0, 'filterBar' => $items['filterBarHtml'], 'totalCountItems' => $items['totalCountItems'], 'pager' => $items['pager'], 'searchData' => empty($searchData) ? '' : $searchData, 'meta_title' => !empty($model->currentCategory['meta_title']) ? $model->currentCategory['meta_title'] : $model->currentCategory['title'], 'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "товары,продукты,изделия", 'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "В каталоге нашего магазина есть все.", 'currency' => $settings['currency'], 'actionButton' => $actionButton); if (URL::isSection('catalog') || MG::getSetting('catalogIndex') == 'true' && (URL::isSection('index') || URL::isSection(''))) { $html = MG::get('pages')->getPageByUrl('catalog'); $html['html_content'] = MG::inlineEditor(PREFIX . 'page', "html_content", $html['id'], $html['html_content']); $data['meta_title'] = $html['meta_title'] ? $html['meta_title'] : $html['title']; $data['meta_title'] = $data['meta_title'] ? $data['meta_title'] : $model->currentCategory['title']; $data['meta_keywords'] = $html['meta_keywords']; $data['meta_desc'] = $html['meta_desc']; $data['cat_desc'] = $html['html_content']; $data['titeCategory'] = $html['title']; } if ($keyword) { $data['meta_title'] = 'Поиск по фразе: ' . $keyword; } $this->data = $data; }
/** * Создает информацию для последующего сохранения свойства для товара положенного в корзину из входящего массива. * @param 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); }
/** * Отправляет письмо со ссылками на приобретенные электронные товары * @param string $orderNamber - номер заказа. */ public function sendLinkForElectro($orderId) { $linksElectro = array(); $orderInfo = $this->getOrder(' id = ' . DB::quote($orderId, true)); $orderInfo[$orderId]['order_content'] = unserialize(stripslashes($orderInfo[$orderId]['order_content'])); $product = new Models_Product(); foreach ($orderInfo[$orderId]['order_content'] as $item) { $productInfo = $product->getProduct($item['id']); if ($productInfo['link_electro']) { $linksElectro[] = $productInfo['link_electro']; } } // если нет электронных товаров в заказе, то не высылаем письмо if (empty($linksElectro)) { return false; } $siteName = MG::getSetting('sitename'); $adminEmail = MG::getSetting('adminEmail'); $userEmail = $orderInfo[$orderId]['user_email']; $orderNumber = $orderInfo['orderNumber'] != '' ? $orderInfo['orderNumber'] : $orderId; $subj = 'Ссылка для скачивания по заказу' . $orderNamber . ' на сайте ' . $siteName; $paramToMail = array('orderNumber' => $orderNumber, 'getElectro' => SITE . '/order?getFileToOrder=' . $orderId); $emailToUser = MG::layoutManager('email_order_electro', $paramToMail); if (preg_match('/^[-._a-zA-Z0-9]+@(?:[a-zA-Z0-9][-a-zA-Z0-9]+\\.)+[a-zA-Z]{2,6}$/', $userEmail)) { Mailer::sendMimeMail(array('nameFrom' => $siteName, 'emailFrom' => MG::getSetting('noReplyEmail'), 'nameTo' => $userEmail, 'emailTo' => $userEmail, 'subject' => $subj, 'body' => $emailToUser, 'html' => true)); } $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::sendMimeMail(array('nameFrom' => $siteName, 'emailFrom' => MG::getSetting('noReplyEmail'), 'nameTo' => $sitename, 'emailTo' => $mail, 'subject' => $subj, 'body' => 'Пользователю ' . $userEmail . ' выслана ссылка на электронные товары', 'html' => true)); } } }
/** * Получает параметры заказа */ public function getOrderData() { $model = new Models_Order(); $orderData = $model->getOrder(" id = " . DB::quote($_POST['id'])); $orderData = $orderData[$_POST['id']]; if ($orderData['number'] == '') { $orderData['number'] = $orderData['id']; DB::query("UPDATE `" . PREFIX . "order` SET `number`= " . DB::quote($orderData['number']) . " WHERE `id`=" . DB::quote($orderData['id']) . ""); } $orderData['yur_info'] = unserialize(stripslashes($orderData['yur_info'])); $orderData['order_content'] = unserialize(stripslashes($orderData['order_content'])); // Запрос для проверки, существует ли система скидок $percent = false; $discountSyst = false; $res = DB::query('SELECT * FROM `' . PREFIX . 'plugins` WHERE `folderName` = "discount-system"'); $act = DB::fetchArray($res); $result = DB::query('SHOW TABLES LIKE "' . PREFIX . 'discount-system%"'); if (DB::numRows($result) == 2 && $act['active']) { $percent = 0; $discountSyst = true; } if (!empty($orderData['order_content'])) { $product = new Models_Product(); foreach ($orderData['order_content'] as &$item) { foreach ($item as &$v) { $v = rawurldecode($v); } } foreach ($orderData['order_content'] as &$items) { $res = $product->getProduct($items['id']); $items['image_url'] = $res['image_url']; $items['property'] = htmlspecialchars_decode(str_replace('&', '&', $items['property'])); $response['discount'] = $items['discount']; $percent = $items['discount']; $items['maxCount'] = $res['count']; $variants = DB::query("SELECT `id`, `count` FROM `" . PREFIX . "product_variant`\n WHERE `product_id`=" . DB::quote($items['id']) . " AND `code`=" . DB::quote($items['code'])); if ($variant = DB::fetchAssoc($variants)) { $items['variant'] = $variant['id']; $items['maxCount'] = $variant['count']; } } } //заменить на получение скидки $codes = array(); // Запрос для проверки , существуют ли промокоды. $result = DB::query('SHOW TABLES LIKE "' . PREFIX . 'promo-code"'); if (DB::numRows($result)) { $res = DB::query('SELECT * FROM `' . PREFIX . 'plugins` WHERE `folderName` = "promo-code"'); $act = DB::fetchArray($res); if ($act['active']) { $res = DB::query('SELECT code, percent FROM `' . PREFIX . 'promo-code` WHERE invisible = 1 AND now() >= `from_datetime` AND now() <= `to_datetime`'); while ($code = DB::fetchAssoc($res)) { $codes[] = $code['code']; if ($code['code'] == $orderData['order_content'][0]['coupon']) { $percent = $percent == 0 ? $code['percent'] : $percent; } } } } $response['order'] = $orderData; $response['order']['discountsSystem'] = $discountSyst; $response['order']['discontPercent'] = $percent; $response['order']['promoCodes'] = $codes; $response['order']['date_delivery'] = $orderData['date_delivery'] ? date('d.m.Y', strtotime($orderData['date_delivery'])) : ''; $deliveryArray = $model->getDeliveryMethod(); $response['deliveryArray'] = $deliveryArray; $paymentArray = array(); $i = 1; while ($payment = $model->getPaymentMethod($i)) { $paymentArray[$i] = $payment; $i++; } $response['paymentArray'] = $paymentArray; $this->data = $response; return true; }
/** * Возвращает данные о всех продуктах в корзине. * @return array */ public function getItemsCart() { $productPositions = array(); // Создает модель для работы с продуктами. $itemPosition = new Models_Product(); $totalSumm = 0; if (!empty($_SESSION['cart'])) { foreach ($_SESSION['cart'] as $key => $item) { $variant = ''; if (!empty($item['variantId'])) { $variants = $itemPosition->getVariants($item['id']); $variant = $variants[$item['variantId']]; } // Заполняет массив информацией о каждом продукте по id из куков. // Если куки не актуальны, пропускает товар. $product = $itemPosition->getProduct($item['id']); if (!empty($product)) { $product['property'] = $_SESSION['cart'][$key]['propertySetId']; $product['property_html'] = htmlspecialchars_decode(str_replace('&', '&', $_SESSION['cart'][$key]['property'])); $product['propertySetId'] = $_SESSION['cart'][$key]['propertySetId']; if (!empty($variant)) { $product['price'] = $variant['price']; $product['code'] = $variant['code']; $product['count'] = $variant['count']; $product['title'] .= " " . $variant['title_variant']; $product['variantId'] = $variant['id']; } $price = $product['price']; if ($item['id'] == $product['id']) { $count = $item['count']; $price = SmalCart::plusPropertyMargin($price, $item['propertyReal']); $product['price'] = $price; // применение скидки по купону $product['price'] = $this->applyCoupon($_SESSION['couponCode'], $product['price'], $product); $product['priceInCart'] = $price * $count . " " . MG::getSetting('currency'); $arrayImages = explode("|", $product['image_url']); if (!empty($arrayImages)) { $product['image_url'] = $arrayImages[0]; } } $product['countInCart'] = $item['count']; if ($product['countInCart'] > 0) { $productPositions[] = $product; } $totalSumm += $product['price'] * $item['count']; } } } $result = array('items' => $productPositions, 'totalSumm' => $totalSumm); $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Обновляет корзину в соответствии с внесенными изменениями. */ 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; }
/** * Определяет поведение при изменении и удаление данных в корзине, * а так же выводит список позиций к заказу * * @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']); }
/** * Сохраняет заказ в базу сайта. * Добавляет в массив корзины третий параметр 'цена товара', для сохранения в заказ. * Это нужно для тогою чтобы в последствии вывести детальную информацию о заказе. * Если оставить только 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('&', '&', $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); }
/** * Определяет поведение при изменении и удаление данных в корзине, * а так же выводит список позиций к заказу. * @return void */ public function __construct() { $productModel = new Models_Product(); if (isset($_GET['delCompareProductId'])) { foreach ($_SESSION['compareList'] as $key => $category) { unset($_SESSION['compareList'][$key][$_GET['delCompareProductId']]); } foreach ($_SESSION['compareList'] as $key => $category) { if (empty($category)) { unset($_SESSION['compareList'][$key]); } } } if (isset($_GET['delCompare'])) { unset($_SESSION['compareList']); } if (isset($_GET['inCompareProductId'])) { $prodData = $productModel->getProduct($_GET['inCompareProductId']); if ($prodData) { if ($prodData['cat_id'] >= 0) { $_GET['viewCategory'] === $prodData['cat_id']; $_SESSION['compareList'][$prodData['cat_id']][$_GET['inCompareProductId']] = $_GET['inCompareProductId']; } } } // Если не задана категория, то выводим товары из первой. if (!isset($_GET['viewCategory'])) { if (!empty($_SESSION['compareList'])) { $idCategory = array_keys($_SESSION['compareList']); $_GET['viewCategory'] = $idCategory[0]; } } $error = ''; if (MG::getSetting('compareCategory') != 'true') { $listCatId[] = $_GET['viewCategory']; } else { foreach ($_SESSION['compareList'] as $idCat => $idsProd) { $listCatId[] = $idCat; } } $info = $this->getInfoProducts($listCatId); if (!empty($info)) { $catalogItems = $info['catalogItems']; } else { $error = "Нет товаров для сравнения в этой категории"; } $arrCategory = MG::get('category')->getArrayCategory(); $catIds = array(0); $arrCategoryTitle = array(); if (!empty($_SESSION['compareList'])) { $catIds = array(); foreach ($_SESSION['compareList'] as $catId => $v) { if ($catId > 0) { $arrCategoryTitle[$catId] = $arrCategory[$catId]['title']; } if ($catId === 0) { $arrCategoryTitle[$catId] = 'Каталог'; } $catIds[] = $catId; } } $moreThanThree = ''; if (count($catalogItems) > 3) { $moreThanThree = 'more-than-three'; } $_SESSION['compareCount'] = 0; if (!empty($_SESSION['compareList'])) { foreach ($_SESSION['compareList'] as $category) { $_SESSION['compareCount'] += count($category); } } if (isset($_GET['updateCompare'])) { $array = array('count' => $_SESSION['compareCount']); echo json_encode($array); exit; } // Получаем все характеристики для текущей категории и вложенных в нее, // а также характеристики выводимые для всех категорий. $catIds = implode(',', $catIds); $sql = "\r\n SELECT * FROM `" . PREFIX . "property` as pp\r\n LEFT JOIN `" . PREFIX . "category_user_property` as cp\r\n ON pp.id = cp.property_id\r\n WHERE cp.category_id IN (" . DB::quote($catIds, true) . ") and pp.filter = 1\r\n ORDER BY pp.sort DESC\r\n "; $res = DB::query($sql); while ($row = DB::fetchAssoc($res)) { $property[$row['name']] = $row['description']; } $this->data = array('error' => $error, 'compareList' => $_SESSION['compareList'], 'catalogItems' => $catalogItems, 'arrCategoryTitle' => $arrCategoryTitle, 'moreThanThree' => $moreThanThree, 'meta_title' => 'Список сравнения товаров', 'meta_keywords' => !empty($model->currentCategory['meta_keywords']) ? $model->currentCategory['meta_keywords'] : "сравнение,сравнить", 'meta_desc' => !empty($model->currentCategory['meta_desc']) ? $model->currentCategory['meta_desc'] : "Список сравнения товаров", 'property' => $property); }