Пример #1
0
 /**
  * Проверяет корректность введенных данных в форме регистрации.
  * 
  * @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);
 }
Пример #2
0
 /**
  * Проверяет корректность ввода данных.
  *
  * @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);
 }
Пример #3
0
 /**
  * Функция дешифрования
  * @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);
 }
Пример #4
0
 /**
  * Конвертирует рускоязычны 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);
 }
Пример #5
0
 /**
  * Функция смены пароля пользователя
  *
  * После проверки корректности введеных данных производит хэширование и внесения в БД пароля пользователя
  *
  * @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);
 }
Пример #6
0
 /**
  * Получает параметры способа доставки по его 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);
 }
Пример #7
0
 /**
  * Возвращает меню в 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);
 }
Пример #8
0
 /**
  * Действие при оплате заказа
  * Обновляет статус заказа на Оплачен, отправляет письма оповещения, генерирует хук.
  */
 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);
 }
Пример #9
0
 /**
  * Вычисляет общую стоимость содержимого, а также количество.
  * @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('&amp;', '&', $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);
 }
Пример #10
0
 /**
  * Проверяет есть в заказе комплект или нет при копировании заказа
  * @param array $id - id товара
  */
 public function notSetGoods($id)
 {
     $result = true;
     $args = func_get_args();
     return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args);
 }
Пример #11
0
 /**
  * Возвращает 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);
 }
Пример #12
0
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();
Пример #13
0
 /**
 * Создает форму пользовательских характеристик для товара.
 * В качестве входящего параметра получает массив:
 * <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);
 }
Пример #14
0
<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>&larr; <?php 
echo $lang['BACK_PLUGIN'];
?>
</span></a>

        <?php 
MG::createHook(URL::getQueryParametr('mguniqueurl'));
?>
</div>

<div class="clear"></div>
</div>
Пример #15
0
 /**
  * Применяет скидку по купону
  * @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);
 }
Пример #16
0
 /**
  * Отправляет запрос на сервер, с целью получить данные о последней версии.
  *
  * @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);
 }
Пример #17
0
 /**
  * Удаляет заказ из базы данных.
  * @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);
 }
Пример #18
0
 /**
  * Возвращает список найденных продуктов соответствующих поисковой фразе.
  * @param string $keyword - поисковая фраза.
  * @param string $allRows - получить сразу все записи.
  * @param string $onlyActive - учитывать только активные продукты.
  * @param boolean $adminPanel - запрос из публичной части или админки.
  * @return array
  */
 public function getListProductByKeyWord($keyword, $allRows = false, $onlyActive = false, $adminPanel = false, $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);
 }
Пример #19
0
 /**
  * Возвращает список найденных продуктов соответствующих поисковой фразе.
  * @param string $keyword - поисковая фраза.
  * @param string $allRows - получить сразу все записи.
  * @param string $onlyActive - учитывать только активные продукты.
  * @param boolean $adminPanel - запрос из публичной части или админки.
  * @return array
  */
 public function getListProductByKeyWord($keyword, $allRows = false, $onlyActive = false, $adminPanel = false, $sort = NULL, $isStock = NULL, $count = NULL)
 {
     $settings = MG::get('settings');
     if (!$count) {
         $count = $settings['countСatalogProduct'];
     }
     $result = array();
     // Поиск по точному соответствию.
     $model = new Models_Catalog();
     if (!isset($_GET["page"])) {
         $result = $model->getListByUserFilter(1, " p.title =" . DB::quote(trim($keyword)) . " OR p.code =" . DB::quote(trim($keyword)));
     }
     if (count($result['catalogItems']) !== 0) {
         foreach ($result['catalogItems'] as &$item) {
             $imagesUrl = explode("|", $item["image_url"]);
             $item["image_url"] = "";
             if (!empty($imagesUrl[0])) {
                 $item["image_url"] = $imagesUrl[0];
             }
             $item['currency'] = MG::getSetting('currency');
         }
         $args = func_get_args();
         return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args);
     }
     // Пример $keyword = " 'красный',   зеленый "
     // Убираем начальные пробелы и конечные.
     $keyword = trim($keyword);
     //$keyword = "'красный',   зеленый"
     // Вырезаем спец символы из поисковой фразы.
     $keyword = preg_replace('/[-`~!#$%^&*()_=+\\\\|\\/\\[\\]{};:"\',<>?]+/', '', $keyword);
     //$keyword = "красный   зеленый"
     // Замена повторяющихся пробелов на на один.
     $keyword = preg_replace('/ +/', ' ', $keyword);
     //$keyword = "красный зеленый"
     // Обрамляем каждое слово в звездочки, для расширенного поиска.
     $keyword = str_replace(' ', '* *', $keyword);
     //$keyword = "красный* *зеленый"
     // Добавляем по краям звездочки.
     $keyword = '*' . $keyword . '*';
     //$keyword = "*красный* *зеленый*"
     if ($sort == 'popular') {
         $sql = " \n        SELECT distinct p.code, v.views, CONCAT(c.parent_url,c.url) AS category_url, \n          p.url AS product_url, p.*, pv.product_id as variant_exist\n        FROM  `" . PREFIX . "product` AS p\n        LEFT JOIN `mg_popular-goods_visits` v ON v.id_product = p.id\n        LEFT JOIN  `" . PREFIX . "category` AS c ON c.id = p.cat_id\n        LEFT JOIN  `" . PREFIX . "product_variant` AS pv ON p.id = pv.product_id";
     } else {
         $sql = " \n        SELECT distinct p.code, CONCAT(c.parent_url,c.url) AS category_url, \n          p.url AS product_url, p.*, pv.product_id as variant_exist\n        FROM  `" . PREFIX . "product` AS p\n        LEFT JOIN  `" . PREFIX . "category` AS c ON c.id = p.cat_id\n        LEFT JOIN  `" . PREFIX . "product_variant` AS pv ON p.id = pv.product_id";
     }
     if (!$adminPanel) {
         $sql .= " LEFT JOIN (\n        SELECT pv.product_id, SUM( pv.count ) AS varcount\n        FROM  `" . PREFIX . "product_variant` AS pv\n        GROUP BY pv.product_id\n      ) AS temp ON p.id = temp.product_id";
     }
     $product = new Models_Product();
     $fulltext = "";
     // Проверяем наличие записей в вариантах если их нет, то не включаем
     // в поиск полнотекстовые индесты таблицы вариантов.
     if ($product->getVariants($id)) {
         $fulltext = ", pv.`code`, pv.`title_variant`";
     }
     $sql .= " WHERE MATCH (\n        p.`title` , p.`description` , p.`code` , p.`meta_title` , p.`meta_keywords` , p.`meta_desc` " . $fulltext . "\n        )\n        AGAINST (\n        '" . $keyword . "'\n        IN BOOLEAN\n        MODE\n        ) ";
     if ($onlyActive) {
         $sql .= ' AND p.`activity` = 1';
     }
     if ($isStock) {
         $sql .= " AND (temp.`varcount` > 0 OR temp.`varcount` < 0 OR p.count>0 OR p.count<0)";
     }
     if ($sort == 'desc') {
         $sql .= ' ORDER BY price DESC';
     } else {
         if ($sort == 'asc') {
             $sql .= ' ORDER BY price ASC';
         } else {
             if ($sort == 'popular') {
                 $sql .= ' ORDER BY v.views DESC';
             }
         }
     }
     $page = URL::get("page");
     $navigator = new Navigator($sql, $page, $count, $linkCount = 6, $allRows);
     // Определяем класс.
     $this->pages = $navigator->getRowsSql();
     $idsProduct = array();
     if (!empty($this->pages)) {
         foreach ($this->pages as $key => $product) {
             $idsProduct[$product['id']] = $key;
             // Назначаем для продукта позьзовательские характеристики по умолчанию, заданные категорией.
             $this->pages[$key]['thisUserFields'] = MG::get('category')->getUserPropertyCategoryById($product['cat_id']);
             $this->pages[$key]['currency'] = $settings['currency'];
             $this->pages[$key]['actionBuy'] = '<a href="' . SITE . '/catalog?inCartProductId=' . $product["id"] . '" class="addToCart product-buy" data-item-id="' . $product["id"] . '">В корзину</a>';
             $this->pages[$key]['actionView'] = '<a href="' . SITE . '/' . (isset($product["category_url"]) ? $product["category_url"] : 'catalog') . '/' . $product["product_url"] . '" class="product-info">Подробнее</a>';
             $imagesUrl = explode("|", $this->pages[$key]['image_url']);
             $this->pages[$key]["image_url"] = "";
             if (!empty($imagesUrl[0])) {
                 $this->pages[$key]["image_url"] = $imagesUrl[0];
             }
         }
     }
     if ($findPart = trim(DB::quote(implode(',', array_keys($idsProduct))), "'")) {
         // Формируем список id продуктов к которым нужно найти пользовательские характеристики.
         $where = ' IN (' . $findPart . ')';
     } else {
         $findPart = ' IN (0)';
     }
     $res = DB::query("\n      SELECT pup.property_id, pup.value, pup.product_id, pup.type_view, prop.*\n      FROM `" . PREFIX . "product_user_property` as pup\n      LEFT JOIN `" . PREFIX . "property` as prop\n        ON pup.property_id = prop.id\n      WHERE pup.`product_id` " . $where);
     while ($userFields = DB::fetchAssoc($res)) {
         if (!empty($this->pages)) {
             $this->pages[$idsProduct[$userFields['product_id']]]['thisUserFields'][$userFields['property_id']] = $userFields;
         }
     }
     $this->pager = $navigator->getPager();
     $result = array('catalogItems' => $this->pages, 'pager' => $this->pager, 'numRows' => $navigator->getNumRowsSql());
     if (count($result['catalogItems']) == 0) {
         //примитивный поиск по названию. 100% соответствие
         $sql = " \n        SELECT id\n        FROM  `" . PREFIX . "product` AS p\n        WHERE title = " . DB::quote($keyword) . " OR code = " . DB::quote($keyword);
         if ($row = DB::fetchAssoc($sql)) {
             $product = new Models_Product();
         }
     }
     $args = func_get_args();
     return MG::createHook(__CLASS__ . "_" . __FUNCTION__, $result, $args);
 }
Пример #20
0
 /**
  * Получает описание категории.
  * @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);
 }
Пример #21
0
 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);
 }
Пример #22
0
/**
 * Создает 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);
}
Пример #23
0
 /**
  * Метод управляющий подключением верстки для писем и 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);
 }
Пример #24
0
 /**
  * Получает список пользователей.
  * @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);
 }
Пример #25
0
 /**
  * Проверяет, может ли контролер '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);
 }
Пример #26
0
 /**
  * Применяет скидку по ситеме скидок - накопительная или объемная
  * @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);
 }
Пример #27
0
 /**
  * Возвращает страницы, которые должны быть выведены в меню.
  * @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);
 }