/** * Проверяет корректность введенных данных в форме регистрации. * * @param array $userData массив данных пользователя. * @param string $mode режим проверки данных (full|pass) полный (по умолчанию) или только пароль. * @return string ошибка в случае не верного ввода данных в одном из полей. */ public function validDataForm($userData, $mode = 'full') { // Проверка электронного адреса. if (USER::getUserInfoByEmail($userData['email']) && 'full' == $mode) { $error .= '<span class="email-in-use">Указанный email уже используется</span>'; } // Пароль должен быть больше 5-ти символов. if (strlen($userData['pass']) < 5) { $error .= '<span class="passError">Пароль менее 5 символов</span>'; } // Проверяем равенство введенных паролей. if (URL::getQueryParametr('pass2') != $userData['pass']) { $error .= '<span class="wrong-pass">Введенные пароли не совпадают</span>'; } if ('full' == $mode) { // Проверка электронного адреса. if (!preg_match('/^[-._a-zA-Z0-9]+@(?:[a-zA-Z0-9][-a-zA-Z0-9]{0,61}+\\.)+[a-zA-Z]{2,6}$/', $userData['email'])) { $error .= '<span class="errorEmail">Неверно заполнено email</span>'; } if (MG::getSetting('useCaptcha') == "true") { if (strtolower(URL::getQueryParametr('capcha')) != strtolower($_SESSION['capcha'])) { $error .= "<span class='error-captcha-text'>Текст с картинки введен неверно!</span>"; } } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $error, $args); }
/** * Проверяет корректность ввода данных. * * @param array $arrayData массив с данными введенными пользователем. * @return bool|string $error сообщение с ошибкой в случае некорректных данных. */ public function isValidData($arrayData) { $result = false; if (!preg_match('/^[-._a-zA-Z0-9]+@(?:[a-zA-Z0-9][-a-zA-Z0-9]{0,61}+\\.)+[a-zA-Z]{2,6}$/', $arrayData['email'])) { $error = '<span class="error-email">E-mail не существует!</span>'; } elseif (!trim($arrayData['message'])) { $error = 'Введите текст сообщения!'; } if (MG::getSetting('useCaptcha') == "true") { if (strtolower($arrayData['capcha']) != strtolower($_SESSION['capcha'])) { $error .= "<span class='error-captcha-text'>Текст с картинки введен неверно!</span>"; } } // Если нет ощибок, то заносит информацию в поля класса. if ($error) { $result = $error; } else { $this->fio = trim($arrayData['fio']); $this->email = trim($arrayData['email']); $this->message = trim($arrayData['message']); $result = false; } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Функция дешифрования * @param String $str Строка с закодированным текстом * @return String Строка с результатом Дешифрования */ function mgDecrypt($str) { $data = base64_decode($str); $result = str_replace(self::$_salt, '', $data); $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Конвертирует рускоязычны URL в транслит. * @param string $str рускоязычный url. * @return string|bool */ public static function createUrl($urlstr) { $result = false; if (preg_match('/[^A-Za-z0-9_\\-]/', $urlstr)) { $urlstr = translitIt($urlstr); $urlstr = preg_replace('/[^A-Za-z0-9_\\-]/', '', $urlstr); $result = $urlstr; } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Функция смены пароля пользователя * * После проверки корректности введеных данных производит хэширование и внесения в БД пароля пользователя * * @param string $newPass - новый пароль пользователя * @param int $id - id пользователя * @param bool $forgotPass - флаг для функции восстановления пароля, когда не происходит изменения данных пользователя находящихся в системе * @return string - сообщение о результате операции */ public function changePass($newPass, $id, $forgotPass = false) { $userData = array('pass' => $newPass); $registration = new Models_Registration(); if ($err = $registration->validDataForm($userData, 'pass')) { $msg = $err; } else { $userData['pass'] = crypt($userData['pass']); USER::update($id, $userData, $forgotPass); $msg = "Пароль изменен"; } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $msg, $args); }
/** * Получает параметры способа доставки по его id. * * @param string $url запрашиваемой категории. * @return array массив с данными о категории. * */ public function getDeliveryById($id) { $result = array(); $res = DB::query(' SELECT * FROM `' . PREFIX . 'delivery` WHERE id = ' . DB::quote($id)); if (!empty($res)) { if ($deliv = DB::fetchAssoc($res)) { $result = $deliv; } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Возвращает меню в HTML виде. * @return type */ public static function getMenu() { $menuItem = self::getArrayMenu(); $print = '<ul class="top-menu-list">'; foreach ($menuItem as $name => $item) { if ('Вход' == $item['title'] && '' != $_SESSION['User']) { $print .= '<li><a href=' . SITE . '"/enter">' . $_SESSION['User'] . '</a><a class="logOut" href="enter?out=1"><span style="font-size:10px">[ выйти ]</span></a></li>'; } else { $item['title'] = MG::contextEditor('page', $item['title'], $item["id"], 'page'); $print .= '<li><a href="' . $item['url'] . '">' . $item['title'] . '</a></li>'; } } $print .= '</ul>'; $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $print, $args); }
/** * Действие при оплате заказа * Обновляет статус заказа на Оплачен, отправляет письма оповещения, генерирует хук. */ public function actionWhenPayment($args) { $result = true; ob_start(); $order = new Models_Order(); if (method_exists($order, 'updateOrder')) { $order->updateOrder(array('id' => $args['paymentOrderId'], 'status_id' => 2)); } if (method_exists($order, 'sendMailOfPayed')) { $order->sendMailOfPayed($args['paymentOrderId'], $args['paymentAmount'], $args['paymentID']); } if (method_exists($order, 'sendLinkForElectro')) { $order->sendLinkForElectro($args['paymentOrderId']); } $content = ob_get_contents(); ob_end_clean(); // если в ходе работы метода допущен вывод контента, то записать в лог ошибку. if (!empty($content)) { MG::loger('ERROR PAYMENT: ' . $content); } return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Вычисляет общую стоимость содержимого, а также количество. * @return array массив с данными о количестве и цене. */ public static function getCartData() { $modelCart = new Models_Cart(); // Количество вещей в корзине. $res['cart_count'] = 0; // Общая стоимость. $res['cart_price'] = 0; // Если удалось получить данные из куков и они успешно десериализованы в $_SESSION['cart']. //self::getCokieCart() && if (!empty($_SESSION['cart'])) { $settings = MG::get('settings'); $totalPrice = 0; $totalCount = 0; if (!empty($_SESSION['cart'])) { $itemIds = array(); $variantsId = array(); foreach ($_SESSION['cart'] as $key => $item) { if (!empty($item['id'])) { if (!empty($item['variantId'])) { $variantsId[] = $item['variantId']; } $itemIds[] = $item['id']; } } if (!empty($itemIds)) { // Пробегаем по содержимому. $idsPr = implode(',', array_unique($itemIds)); $where = ' IN (' . trim(DB::quote($idsPr), "'") . ')'; } } else { $where = ' IN (0)'; } // Пробегаем по содержимому. // $where = ' IN ('.trim(DB::quote(implode(',',$itemIds)),"'").')'; $result = DB::query(' SELECT CONCAT(c.parent_url,c.url) AS category_url, p.url AS product_url, p.*, rate, (p.price_course + p.price_course * (IFNULL(rate,0))) as `price_course`, p.currency_iso FROM `' . PREFIX . 'product` AS p LEFT JOIN `' . PREFIX . 'category` AS c ON c.id = p.cat_id WHERE p.id ' . $where); $array_variants = array(); if (!empty($variantsId)) { $ids = implode(',', $variantsId); $variants_res = DB::query('SELECT pv.*, c.rate,(pv.price_course + pv.price_course *(IFNULL(c.rate,0))) as `price_course`, p.currency_iso FROM `' . PREFIX . 'product_variant` pv LEFT JOIN `' . PREFIX . 'product` as p ON p.id = pv.product_id LEFT JOIN `' . PREFIX . 'category` as c ON c.id = p.cat_id WHERE pv.id IN (' . trim(DB::quote($ids, true)) . ')'); while ($variant_row = DB::fetchAssoc($variants_res)) { $array_variants[$variant_row['id']] = $variant_row; } } $currencyRate = MG::getSetting('currencyRate'); $currencyShopIso = MG::getSetting('currencyShopIso'); $products_row = array(); while ($prod = DB::fetchAssoc($result)) { $products_row[$prod['id']] = $prod; } foreach ($_SESSION['cart'] as $key => $item) { $variant = null; $row = $products_row[$item['id']]; $arrayImages = explode("|", $row['image_url']); if (!empty($item['variantId'])) { $variant = $array_variants[$item['variantId']]; $image = $variant['image'] ? $variant['image'] : $arrayImages[0]; $row['price'] = $variant['price']; $row['code'] = $variant['code']; $row['count'] = $variant['count']; $row['image_url'] = $variant['image'] ? $variant['image'] : $row['image_url']; $row['image_url_new'] = mgImageProductPath($image, $item['id'], 'small'); $row['weight'] = $variant['weight']; $row['title'] = $row['title'] . " " . $variant['title_variant']; $row['variantId'] = $variant['id']; $row['price_course'] = $variant['price_course']; } $price = $row['price_course']; if ($item['id'] == $row['id']) { $count = $item['count']; $row['countInCart'] = $count; $row['property_html'] = htmlspecialchars_decode(str_replace('&', '&', $item['property'])); $price = self::plusPropertyMargin($price, $item['propertyReal'], $currencyRate[$row['currency_iso']]); $row['property'] = $item['propertySetId']; $priceWithCoupon = $modelCart->applyCoupon($_SESSION['couponCode'], $price, $row); //$row['currency_iso'] = $row['currency_iso']?$row['currency_iso']:$currencyShopIso; //$price *= $currencyRate[$row['currency_iso']]; $priceWithDiscount = $modelCart->applyDiscountSystem($price); //$price = $priceWithCoupon < $priceWithDiscount['price'] ? $priceWithCoupon : $priceWithDiscount['price']; $price = $modelCart->customPrice(array('product' => $row, 'priceWithCoupon' => $priceWithCoupon, 'priceWithDiscount' => $priceWithDiscount['price'])); // если выбран формат без копеек, то округляем стоимость до ворматирования. if (in_array(MG::getSetting('priceFormat'), array('1234', '1 234', '1,234'))) { $price = round($price); } $row['priceInCart'] = MG::priceCourse($price * $count) . " " . $settings['currency']; if (!empty($arrayImages)) { $row['image_url'] = $arrayImages[0]; $row['image_url_new'] = mgImageProductPath($arrayImages[0], $item['id'], 'small'); } $row['category_url'] = SHORT_LINK == '1' ? '' : $row['category_url'] . '/'; $row['price'] = $price; $res['dataCart'][] = $row; $totalPrice += $price * $count; $totalCount += $count; $itemIds[] = $item['id']; } } $res['cart_price_wc'] = MG::priceCourse($totalPrice) . " " . $settings['currency']; $res['cart_count'] = $totalCount; $res['cart_price'] = MG::priceCourse($totalPrice); } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $res, $args); }
/** * Проверяет есть в заказе комплект или нет при копировании заказа * @param array $id - id товара */ public function notSetGoods($id) { $result = true; $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Возвращает HTML блок связанных товаров * @param type $args * @return type */ public function createRelatedForm($args, $title = 'С этим товаром покупают', $layout = 'layout_related') { if ($args) { $data['title'] = $title; $stringRelated = ' null'; $sortRelated = array(); foreach (explode(',', $args) as $item) { $stringRelated .= ',' . DB::quote($item); $sortRelated[$item] = $item; } $stringRelated = substr($stringRelated, 1); $data['products'] = $this->getProductByUserFilter(' p.code IN (' . $stringRelated . ') and p.activity = 1 '); if (!empty($data['products'])) { $data['currency'] = MG::getSetting('currency'); foreach ($data['products'] as $item) { $img = explode('|', $item['image_url']); $item['img'] = $img[0]; $item['category_url'] = SHORT_LINK == '1' ? '' : $item['category_url'] . '/'; $item['url'] = SITE . '/' . (isset($item["category_url"]) ? $item["category_url"] : 'catalog/') . $item["product_url"]; $item['price'] = MG::priceCourse($item['price_course']); $sortRelated[$item['code']] = $item; } $data['products'] = array(); //сортируем связанные товары в том порядке, в котором они идут в строке артикулов foreach ($sortRelated as $item) { if (!empty($item['id']) && is_array($item)) { $data['products'][$item['id']] = $item; } } $result = MG::layoutManager($layout, $data); } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
DB::init(); Storage::init(); PM::init(); MG::init(); URL::init(); User::init(); Mailer::init(); // Если сайт временно закрыт, то выводитя заглушка, хранящаяся в корне движка. if (MG::isDowntime()) { require_once 'downTime.html'; exit; } // Запоминает откуда пришел пользователь. MG::logReffererInfo(); // Подключить index.php всех плагинов. PM::includePlugins(); // Хук выполняющийся до запуска движка. MG::createHook('mg_start'); // Запуск движка. $moguta = new Moguta(); $moguta = $moguta->run(); // Вывод результата на экран, предварительно обработав все возможные шорткоды. echo PM::doShortcode(MG::printGui($moguta)); // Хук выполняющийся после того как отработал движок. MG::createHook('mg_end', true, $moguta); // Ввывод консоли запросов к БД. if (DEBUG_SQL) { echo DB::console(); } // Завершение процесса кэширвания. Storage::close();
/** * Создает форму пользовательских характеристик для товара. * В качестве входящего параметра получает массив: * <code> $param = array( 'id' => null, // id товара. 'maxCount' => null, // максимальное количество товара на складе. 'productUserFields' => null, // массив пользовательских полей для данного продукта. 'action' => "/catalog", // ссылка для метода формы. 'method' => "POST", // тип отправки данных на сервер. 'ajax' => true, // использовать ajax для пересчета стоимости товаров. 'blockedProp' => array(), // массив из ID свойств, которые ненужно выводить в форме. 'noneAmount' => false, // не выводить input для количества. 'titleBtn' => "В корзину", // название кнопки. 'blockVariants' => '', // блок вариантов. 'classForButton' => 'addToCart buy-product buy', // классы для кнопки. 'noneButton' => false, // не выводить кнопку отправки. 'addHtml' => '' // добавить HTML в содержимое формы. ) * </code> * @param int $param - массив параметров. * $blockedProp - массив с ID свойствам, которые не надо выводить. * @return string html форма. */ public function createPropertyForm($param = array('id' => null, 'maxCount' => null, 'productUserFields' => null, 'action' => "/catalog", 'method' => "POST", 'ajax' => true, 'blockedProp' => array(), 'noneAmount' => false, 'titleBtn' => "В корзину", 'blockVariants' => '', 'classForButton' => 'addToCart buy-product buy', 'noneButton' => false, 'addHtml' => '')) { extract($param); if (empty($classForButton)) { $classForButton = 'addToCart buy-product buy'; } if ($id === null || $maxCount === null) { return "error param!"; } // если используется аяксовый метод выбора, то подключаем доп класс для работы с формой. $marginPrice = 0; // добавочная цена, в зависимости от выбраных автоматом характеристик $secctionCartNoDummy = array(); //Не подставной массив характеристик, все характеристики с настоящими #ценами# //в сессию записать реальные значения, в паблик подмену, с привязкой в конце #№ $html = '<form action="' . SITE . $action . '" method="' . $method . '" class="property-form">'; if ($ajax) { mgAddMeta("<script type=\"text/javascript\" src=\"" . SITE . "/mg-core/script/jquery.form.js\"></script>"); } if (!empty($productUserFields)) { foreach ($productUserFields as $property) { if (in_array($property['id'], $blockedProp)) { continue; } /* 'select' - набор значений, можно интерпретировать как выпадающий список либо набор радиокнопок 'assortment' - мультиселект 'string' - пара ключь значение 'assortmentCheckBox' - набор чекбоксов */ switch ($property['type']) { case 'select': $html .= ""; break; case 'assortmentCheckBox': $html .= ""; break; case 'assortment': $html .= ""; break; case 'string': $marginStoper = $marginPrice; if (!empty($property['value'])) { $html .= '<p>' . $property['name'] . ': <span class="label-black">' . (!empty($property['value']) ? $property['value'] : $property['data']) . '</span></p>'; } break; default: if (!empty($property['data'])) { $html .= '' . $property['name'] . ': <span class="label-black">' . str_replace("|", ",", $property['data']) . '</span>'; } break; } } $_SESSION['propertyNodummy'] = $secctionCartNoDummy; } $html .= '<div class="buy-container">'; if ($maxCount == "0") { $hidder = 'style="display:none"'; } if (!$noneAmount) { $html .= '<div class="hidder-element" ' . $hidder . ' ><p class="qty-text">Количество:</p> <div class="cart_form"> <input type="text" name="amount_input" class="amount_input" data-max-count="' . $maxCount . '" value="1" /> <div class="amount_change"> <a href="#" class="up">+</a> <a href="#" class="down">-</a> </div> </div> </div>'; } $html .= '<div class="hidder-element" ' . $hidder . ' ><input type="hidden" name="inCartProductId" value="' . $id . '">'; if (!$noneButton) { // Если товаров на складе нет, то не выводить кнопку в корзину. if ($ajax) { $html .= '<a class="' . $classForButton . '" href="' . SITE . '/catalog?inCartProductId=' . $id . '" data-item-id="' . $id . '">' . $titleBtn . '</a><input type="submit" name="buyWithProp" onclick="return false;" style="display:none">'; } else { $html .= '<input type="submit" name="buyWithProp">'; } } $html .= $addHtml; $html .= '</div> </div>'; $html .= '</form>'; $result = array('html' => $html, 'marginPrice' => $marginPrice); $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
<div class="widget-table-wrapper"> <div class="widget-table-title"> <h4 class="settings-table-icon"><?php $lang = MG::get('lang'); echo $lang['SETTINGS_PLUGIN']; ?> "<?php echo URL::getQueryParametr('pluginTitle'); ?> "</h4> </div> <div class="widget-table-body"> <a href="javascript:void(0);" onclick="$('a[id=plugins]').click();" class="go-back-plugins"><span>← <?php echo $lang['BACK_PLUGIN']; ?> </span></a> <?php MG::createHook(URL::getQueryParametr('mguniqueurl')); ?> </div> <div class="clear"></div> </div>
/** * Применяет скидку по купону * @param string $code - код купона товара. * @param string $price - входящая стоимость. * @param string $product - информация о продукте. * @return double - возвращает новую стоимость товара */ public function applyCoupon($code, $price, $product = null) { $result = $price; $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Отправляет запрос на сервер, с целью получить данные о последней версии. * * @param string $url адрес сервера. * @param string $post параметры для POST запроса. * @return string ответ сервера. */ private static function sendCurl($url, $post) { // Иницализация библиотеки curl. $ch = curl_init(); // Устанавливает URL запроса. curl_setopt($ch, CURLOPT_URL, $url); // При значении true CURL включает в вывод заголовки. curl_setopt($ch, CURLOPT_HEADER, false); // Куда помещать результат выполнения запроса: // false – в стандартный поток вывода, // true – в виде возвращаемого значения функции curl_exec. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Нужно явно указать, что будет POST запрос. curl_setopt($ch, CURLOPT_POST, true); // Здесь передаются значения переменных. curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // Максимальное время ожидания в секундах. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15); // Выполнение запроса. $res = curl_exec($ch); // return array(); // Освобождение ресурса. curl_close($ch); $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $res, $args); }
/** * Удаляет заказ из базы данных. * @param int $id id удаляемого заказа * @return bool */ public function deleteOrder($id) { $result = false; if (DB::query(' DELETE FROM `' . PREFIX . 'order` WHERE id = %d ', $id)) { $result = true; } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Возвращает список найденных продуктов соответствующих поисковой фразе. * @param string $keyword - поисковая фраза. * @param string $allRows - получить сразу все записи. * @param string $onlyActive - учитывать только активные продукты. * @param boolean $adminPanel - запрос из публичной части или админки. * @return array */ public function getListProductByKeyWord($keyword, $allRows = false, $onlyActive = false, $adminPanel = false, $mode = false) { $result = array('catalogItems' => array(), 'pager' => null, 'numRows' => null); $keyword = htmlspecialchars($keyword); $keywordUnTrim = $keyword; $keyword = trim($keyword); if (empty($keyword) || strlen($keyword) <= 2) { return $result; } $currencyRate = MG::getSetting('currencyRate'); $currencyShopIso = MG::getSetting('currencyShopIso'); // Поиск по точному соответствию. // Пример $keyword = " 'красный', зеленый " // Убираем начальные пробелы и конечные. $keyword = trim($keyword); //$keyword = "'красный', зеленый" if (SEARCH_FULLTEXT) { // Вырезаем спец символы из поисковой фразы. $keyword = preg_replace('/[`~!#$%^*()=+\\\\|\\/\\[\\]{};:"\',<>?]+/', '', $keyword); //$keyword = "красный зеленый" // Замена повторяющихся пробелов на на один. $keyword = preg_replace('/ +/', ' ', $keyword); //$keyword = "красный зеленый" // Обрамляем каждое слово в звездочки, для расширенного поиска. $keyword = str_replace(' ', '* +', $keyword); //$keyword = "красный* *зеленый" // Добавляем по краям звездочки. $keyword = '+' . $keyword . '*'; //$keyword = "*красный* *зеленый*" $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, pv.id as variant_id, rate,(p.price_course + p.price_course * (IFNULL(rate,0))) as `price_course`\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"; } $prod = new Models_Product(); $fulltext = ""; $sql .= " WHERE "; $match = " MATCH (\n p.`title` , p.`code`, p.`description` " . $fulltextInVar . " " . $fulltext . "\n )\n AGAINST (\n '" . $keyword . "'\n IN BOOLEAN\n MODE\n ) "; DB::query("SELECT id FROM `" . PREFIX . "product_variant` LIMIT 1"); //Если есть варианты товаров то будеи искать и в них. if (DB::numRows(DB::query("SELECT id FROM `" . PREFIX . "product_variant` LIMIT 1"))) { $fulltextInVar = ', pv.`title_variant`, pv.`code` '; $match = "(" . $match . " OR MATCH (pv.`title_variant`, pv.`code`)\n AGAINST (\n '" . $keyword . "'\n IN BOOLEAN\n MODE\n )) "; } $sql .= $match; // Проверяем чтобы в вариантах была хотябы одна единица. if (!$adminPanel) { if (MG::getSetting('printProdNullRem') == "true") { $sql .= " AND (temp.`varcount` > 0 OR temp.`varcount` < 0 OR p.count>0 OR p.count<0)"; } } if ($onlyActive) { $sql .= ' AND p.`activity` = 1'; } } else { $sql = "\n SELECT distinct p.id, CONCAT(c.parent_url,c.url) AS category_url,\n p.url AS product_url, p.*, pv.product_id as variant_exist, pv.id as variant_id, rate,(p.price_course + p.price_course * (IFNULL(rate,0))) as `price_course`, \n p.currency_iso\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"; } $prod = new Models_Product(); $fulltext = ""; //Если есть варианты товаров то будеи искать и в них. if (DB::numRows(DB::query("SELECT id FROM `" . PREFIX . "product_variant` LIMIT 1"))) { $fulltextInVar = " OR\n pv.`title_variant` LIKE '%" . DB::quote($keyword, true) . "%'\n OR\n pv.`code` LIKE '%" . DB::quote($keyword, true) . "%'"; } $sql .= " WHERE (\n p.`title` LIKE '%" . DB::quote($keyword, true) . "%'\n OR\n p.`code` LIKE '%" . DB::quote($keyword, true) . "%'\n " . $fulltextInVar . ')'; // Проверяем чтобы в вариантах была хотябы одна единица. if (!$adminPanel) { if (MG::getSetting('printProdNullRem') == "true") { $sql .= " AND (temp.`varcount` > 0 OR temp.`varcount` < 0 OR p.count>0 OR p.count<0)"; } } if ($onlyActive) { $sql .= ' AND p.`activity` = 1'; } } $page = URL::get("page"); $settings = MG::get('settings'); //if ($mode=='groupBy') { $sql .= ' GROUP BY p.id'; //} if ($allRows) { $sql .= ' LIMIT 15'; } $navigator = new Navigator($sql, $page, $settings['countСatalogProduct'], $linkCount = 6, $allRows); // Определяем класс. $this->products = $navigator->getRowsSql(); // добавим к полученым товарам их свойства $this->products = $this->addPropertyToProduct($this->products); $this->pager = $navigator->getPager(); $result = array('catalogItems' => $this->products, 'pager' => $this->pager, 'numRows' => $navigator->getNumRowsSql()); if (count($result['catalogItems']) > 0) { // упорядочивание списка найденых продуктов // первыми в списке будут стоять те товары, у которых полностью совпала поисковая фраза // затем будут слова в начале которых встретилось совпадение // в конце слова в середине которых встретилось совпадение // // $keyword = str_replace('*', '', $keyword); $resultTemp = $result['catalogItems']; $prioritet0 = array(); $prioritet1 = array(); $prioritet2 = array(); foreach ($resultTemp as $key => $item) { $title = mb_convert_case($item['title'], MB_CASE_LOWER, "UTF-8"); $keyword = mb_convert_case($keyword, MB_CASE_LOWER, "UTF-8"); if (trim($title) == $keyword) { $prioritet0[] = $item; continue; } if (strpos($title, $keyword) === 0) { $prioritet1[] = $item; } else { $prioritet2[] = $item; } } $result['catalogItems'] = array_merge($prioritet0, $prioritet1, $prioritet2); } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Возвращает список найденных продуктов соответствующих поисковой фразе. * @param string $keyword - поисковая фраза. * @param string $allRows - получить сразу все записи. * @param string $onlyActive - учитывать только активные продукты. * @param boolean $adminPanel - запрос из публичной части или админки. * @return array */ public function getListProductByKeyWord($keyword, $allRows = false, $onlyActive = false, $adminPanel = false, $sort = NULL, $isStock = NULL, $count = NULL) { $settings = MG::get('settings'); if (!$count) { $count = $settings['countСatalogProduct']; } $result = array(); // Поиск по точному соответствию. $model = new Models_Catalog(); if (!isset($_GET["page"])) { $result = $model->getListByUserFilter(1, " p.title =" . DB::quote(trim($keyword)) . " OR p.code =" . DB::quote(trim($keyword))); } if (count($result['catalogItems']) !== 0) { foreach ($result['catalogItems'] as &$item) { $imagesUrl = explode("|", $item["image_url"]); $item["image_url"] = ""; if (!empty($imagesUrl[0])) { $item["image_url"] = $imagesUrl[0]; } $item['currency'] = MG::getSetting('currency'); } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); } // Пример $keyword = " 'красный', зеленый " // Убираем начальные пробелы и конечные. $keyword = trim($keyword); //$keyword = "'красный', зеленый" // Вырезаем спец символы из поисковой фразы. $keyword = preg_replace('/[-`~!#$%^&*()_=+\\\\|\\/\\[\\]{};:"\',<>?]+/', '', $keyword); //$keyword = "красный зеленый" // Замена повторяющихся пробелов на на один. $keyword = preg_replace('/ +/', ' ', $keyword); //$keyword = "красный зеленый" // Обрамляем каждое слово в звездочки, для расширенного поиска. $keyword = str_replace(' ', '* *', $keyword); //$keyword = "красный* *зеленый" // Добавляем по краям звездочки. $keyword = '*' . $keyword . '*'; //$keyword = "*красный* *зеленый*" if ($sort == 'popular') { $sql = " \n SELECT distinct p.code, v.views, CONCAT(c.parent_url,c.url) AS category_url, \n p.url AS product_url, p.*, pv.product_id as variant_exist\n FROM `" . PREFIX . "product` AS p\n LEFT JOIN `mg_popular-goods_visits` v ON v.id_product = p.id\n LEFT JOIN `" . PREFIX . "category` AS c ON c.id = p.cat_id\n LEFT JOIN `" . PREFIX . "product_variant` AS pv ON p.id = pv.product_id"; } else { $sql = " \n SELECT distinct p.code, CONCAT(c.parent_url,c.url) AS category_url, \n p.url AS product_url, p.*, pv.product_id as variant_exist\n FROM `" . PREFIX . "product` AS p\n LEFT JOIN `" . PREFIX . "category` AS c ON c.id = p.cat_id\n LEFT JOIN `" . PREFIX . "product_variant` AS pv ON p.id = pv.product_id"; } if (!$adminPanel) { $sql .= " LEFT JOIN (\n SELECT pv.product_id, SUM( pv.count ) AS varcount\n FROM `" . PREFIX . "product_variant` AS pv\n GROUP BY pv.product_id\n ) AS temp ON p.id = temp.product_id"; } $product = new Models_Product(); $fulltext = ""; // Проверяем наличие записей в вариантах если их нет, то не включаем // в поиск полнотекстовые индесты таблицы вариантов. if ($product->getVariants($id)) { $fulltext = ", pv.`code`, pv.`title_variant`"; } $sql .= " WHERE MATCH (\n p.`title` , p.`description` , p.`code` , p.`meta_title` , p.`meta_keywords` , p.`meta_desc` " . $fulltext . "\n )\n AGAINST (\n '" . $keyword . "'\n IN BOOLEAN\n MODE\n ) "; if ($onlyActive) { $sql .= ' AND p.`activity` = 1'; } if ($isStock) { $sql .= " AND (temp.`varcount` > 0 OR temp.`varcount` < 0 OR p.count>0 OR p.count<0)"; } if ($sort == 'desc') { $sql .= ' ORDER BY price DESC'; } else { if ($sort == 'asc') { $sql .= ' ORDER BY price ASC'; } else { if ($sort == 'popular') { $sql .= ' ORDER BY v.views DESC'; } } } $page = URL::get("page"); $navigator = new Navigator($sql, $page, $count, $linkCount = 6, $allRows); // Определяем класс. $this->pages = $navigator->getRowsSql(); $idsProduct = array(); if (!empty($this->pages)) { foreach ($this->pages as $key => $product) { $idsProduct[$product['id']] = $key; // Назначаем для продукта позьзовательские характеристики по умолчанию, заданные категорией. $this->pages[$key]['thisUserFields'] = MG::get('category')->getUserPropertyCategoryById($product['cat_id']); $this->pages[$key]['currency'] = $settings['currency']; $this->pages[$key]['actionBuy'] = '<a href="' . SITE . '/catalog?inCartProductId=' . $product["id"] . '" class="addToCart product-buy" data-item-id="' . $product["id"] . '">В корзину</a>'; $this->pages[$key]['actionView'] = '<a href="' . SITE . '/' . (isset($product["category_url"]) ? $product["category_url"] : 'catalog') . '/' . $product["product_url"] . '" class="product-info">Подробнее</a>'; $imagesUrl = explode("|", $this->pages[$key]['image_url']); $this->pages[$key]["image_url"] = ""; if (!empty($imagesUrl[0])) { $this->pages[$key]["image_url"] = $imagesUrl[0]; } } } if ($findPart = trim(DB::quote(implode(',', array_keys($idsProduct))), "'")) { // Формируем список id продуктов к которым нужно найти пользовательские характеристики. $where = ' IN (' . $findPart . ')'; } else { $findPart = ' IN (0)'; } $res = DB::query("\n SELECT pup.property_id, pup.value, pup.product_id, pup.type_view, prop.*\n FROM `" . PREFIX . "product_user_property` as pup\n LEFT JOIN `" . PREFIX . "property` as prop\n ON pup.property_id = prop.id\n WHERE pup.`product_id` " . $where); while ($userFields = DB::fetchAssoc($res)) { if (!empty($this->pages)) { $this->pages[$idsProduct[$userFields['product_id']]]['thisUserFields'][$userFields['property_id']] = $userFields; } } $this->pager = $navigator->getPager(); $result = array('catalogItems' => $this->pages, 'pager' => $this->pager, 'numRows' => $navigator->getNumRowsSql()); if (count($result['catalogItems']) == 0) { //примитивный поиск по названию. 100% соответствие $sql = " \n SELECT id\n FROM `" . PREFIX . "product` AS p\n WHERE title = " . DB::quote($keyword) . " OR code = " . DB::quote($keyword); if ($row = DB::fetchAssoc($sql)) { $product = new Models_Product(); } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Получает описание категории. * @param type $id - номер категории * @return type */ public function getDesctiption($id) { $result = null; $res = DB::query(' SELECT html_content FROM `' . PREFIX . 'category` WHERE id = "%d" ', $id); if (!empty($res)) { if ($cat = DB::fetchArray($res)) { $result = $cat['html_content']; } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
private function getOrderNumber($id) { $orderNum = MG::getSetting('orderNumber'); $prefix = PREFIX_ORDER != 'PREFIX_ORDER' ? PREFIX_ORDER : ''; if ($orderNum == 'false') { $result = $prefix . $id; } else { $str = mt_rand(10000, 9999999999.0); $result = str_pad((string) $str, 10, '0', STR_PAD_LEFT); $result = $prefix . $result; } // Возвращаем номер или префикс заказа. $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Создает hook - крючок, для пользовательских функций и плагинов. * может быть вызван несколькими спообами: * 1. createHook('userFunction'); - в любом месте программы выполнится пользовательская функция userFunction() из плагина; * 2. createHook('userFunction', $args); - в любом месте программы выполнится пользовательская функция userFunction($args) из плагина с параметрами; * 3. return createHook('thisFunctionInUserEnviroment', $result, $args); - хук прописывается перед. * возвращением результата какой либо функции, * в качестве параметров передается результат работы текущей функции, * и начальные параметры, которые были переданы ей. * * @param array $arr параметры, которые надо защитить. * @return array $arr теже параметры, но уже безопасные. */ function mgCreateHook($hookName) { MG::createHook($hookName); }
/** * Метод управляющий подключением верстки для писем и HTML блоков движка. * @param string $layout - название файла с версткой * @param string $param - массив переменных, которые будут доступны в layout * @return string html верстка. */ public static function layoutManager($layout, $data) { $content = ""; $path = ''; $layoutPath = PATH_TEMPLATE . '/layout/'; // если идет обращение к лэйауту из админки, например отправка письма // то вместо PATH_TEMPLATE в котором для админки всегда хранится путь к дефолтному шаблону // берем путь до указанного в настройках шаблона, чтобы использовались нужные лайауты if (URL::isSection('mg-admin')) { $selectedTemplate = self::getSetting('templateName'); $layoutPath = 'mg-templates/' . $selectedTemplate . '/layout/'; } if (file_exists($layoutPath . $layout . '.php')) { $path = $layoutPath; } elseif (file_exists(CORE_DIR . 'layout/' . $layout . '.php')) { $path = CORE_DIR . '/layout/'; } if ($path) { //extract($param); ob_start(); include $path . $layout . '.php'; $content = ob_get_contents(); ob_end_clean(); // если в layout для писем не отменен вывод в общем шаблоне. // чтобы отключить вывод в шаблоне, можно прям в layout определить $data['noTemplate'] = true; if (empty($data['noTemplate']) && strpos($layout, 'email_') === 0) { ob_start(); include $path . 'email_template.php'; $content = ob_get_contents(); ob_end_clean(); } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $content, $args); }
/** * Получает список пользователей. * @param $id - пользователя. * @return void */ public static function getListUser() { $result = false; $res = DB::query(' SELECT * FROM `' . PREFIX . 'user` ', $id); while ($row = DB::fetchObject($res)) { $result[] = $row; } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Проверяет, может ли контролер 'Product' обработать ЧПУ ссылку. * Если ссылка действительно запрашивает какой-то существующий продукт * в имеющейся категории, то метод возвращает в качестве названия контролера строку "product". * В противном случае метод считает, что именем контролера должена являться * последняя секция в ссылке. * * @return string - имя контролера. */ public function convertCpuProduct() { // вычисляем url для возможной категории. // если запрошен адрес http://[сайт]/templates/free/my/templ2.html // то на выходе $categoryUrl будет равно /templates/free/my , а $productUrl=templ2 $arraySections = URL::getSections(); unset($arraySections[0]); unset($arraySections[count($arraySections)]); $categoryUrl = implode('/', $arraySections); $productUrl = URL::getLastSection(); // Получает id продукта по заданной секции. $sql = ' SELECT CONCAT(c.parent_url,c.url) as category_url, p.url as product_url, p.id FROM `' . PREFIX . 'product` p LEFT JOIN `' . PREFIX . 'category` c ON c.id=p.cat_id WHERE p.url = "%s" '; $result = DB::query($sql, $productUrl); if ($obj = DB::fetchObject($result)) { // Для товаров без категорий формируется ссылка [site]/catalog/[product]. $obj->category_url = $obj->category_url !== NULL ? $obj->category_url : 'catalog'; if ($categoryUrl == $obj->category_url) { URL::setQueryParametr('id', $obj->id); $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, 'product', $args); } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $productUrl, $args); }
/** * Применяет скидку по ситеме скидок - накопительная или объемная * @param string $price - входящая стоимость. * @return double - возвращает новую стоимость товара, информация о том какая система скидок применена и скидочный купон */ public function applyDiscountSystem($price) { $result = array('price' => $price, 'discounts' => '', 'promo' => ''); $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }
/** * Возвращает страницы, которые должны быть выведены в меню. * @return array массив страниц. */ public function getPageInMenu() { $result = array(); $res = DB::query(' SELECT id, title, url, sort FROM `' . PREFIX . 'page` WHERE print_in_menu = 1 ORDER BY `sort` ASC '); if (!empty($res)) { while ($page = DB::fetchAssoc($res)) { $result[] = $page; } } $args = func_get_args(); return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args); }