1
vitrina.php in web – MultiMag

source: web/vitrina.php @ ee33d0c

Last change on this file since ee33d0c was ee33d0c, checked in by Roman Lozovikov <lozovikov.ra@…>, 3 years ago

Починил обратно работу без js

  • Property mode set to 100644
File size: 116.6 KB
Line 
1<?php
2//      MultiMag v0.2 - Complex sales system
3//
4//      Copyright (C) 2005-2018, BlackLight, TND Team, http://tndproject.org
5//
6//      This program is free software: you can redistribute it and/or modify
7//      it under the terms of the GNU Affero General Public License as
8//      published by the Free Software Foundation, either version 3 of the
9//      License, or (at your option) any later version.
10//
11//      This program is distributed in the hope that it will be useful,
12//      but WITHOUT ANY WARRANTY; without even the implied warranty of
13//      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14//      GNU Affero General Public License for more details.
15//
16//      You should have received a copy of the GNU Affero General Public License
17//      along with this program.  If not, see <http://www.gnu.org/licenses/>.
18//
19
20include_once("core.php");
21include_once("include/doc.core.php");
22
23/// Класс витрины интернет-магазина
24class Vitrina {
25        var $is_pc_init;
26    /// Конструктор
27    function __construct() {
28        global $tmpl;
29        $tmpl->setTitle("Интернет - витрина");
30    }
31
32    /// Проверка и исполнение recode-запроса
33    function ProbeRecode() {
34        /// Обрабатывает запросы-ссылки  вида http://example.com/vitrina/ig/5.html
35        /// Возвращает false в случае неудачи.
36        $arr = explode('/', $_SERVER['REQUEST_URI']);
37        if (!is_array($arr)) {
38            return false;
39        }
40        if (count($arr) < 4) {
41            return false;
42        }
43        $block = @explode('.', $arr[3]);
44        $query = @explode('.', $arr[4]);
45        if (is_array($block)) {
46            $block = $block[0];
47        } else {
48            $block = $arr[3];
49        }
50        if (is_array($query)) {
51            $query = $query[0];
52        } else {
53            $query = $arr[4];
54        }
55        if ($arr[2] == 'ig') { // Индекс группы
56            $this->ViewGroup($query, $block);
57            return true;
58        } else if ($arr[2] == 'ip') { // Индекс позиции
59            $this->ProductCard($block);
60            return true;
61        } else if ($arr[2] == 'block') {// Заданный блок
62            $this->ViewBlock($block);
63            return true;
64        } else if ($arr[2] == 'ng') { // Наименование группы
65           
66        } else if ($arr[2] == 'np') { // Наименование позиции
67           
68        }
69        return false;
70    }
71
72    /// Исполнение заданной функции
73    /// @param $mode Название функции витрины
74    function ExecMode($mode) {
75        global $tmpl;
76        $page = rcvint('p');
77        $g = rcvint('g');
78        switch ($mode) {
79            case '':
80                $this->TopGroup();
81                break;
82            case 'group':
83                $this->ViewGroup($g, $page);
84                break;
85            case 'product':
86                $this->ProductCard($page);
87                break;
88            case'basket':
89                $this->Basket();
90                break;
91            case'block':
92                $this->ViewBlock($_REQUEST['type']);
93                break;
94            case'buy':
95                $this->Buy();
96                break;
97            case'delivery':
98                $this->Delivery();
99                break;
100            case'buyform':
101                $this->BuyMakeForm();
102                break;
103            case'makebuy':
104                $this->MakeBuy();
105                break;
106            case'pay':
107                $this->Payment($page);
108                break;
109            case'comm_add':
110                $this->tryComentAdd($page);
111                $this->ProductCard($page);
112                break;
113            case'basket_submit':
114                $this->tryBasketSubmit();
115                break;
116            case'korz_add':
117                $this->tryBasketAdd($page);
118                break;
119            case'korz_del':
120                $basket = Models\Basket::getInstance();
121                $basket->removeItem($page);
122                $basket->save();
123                $tmpl->msg("Товар убран из корзины!", "info", "<a class='urllink' href='/vitrina.php?mode=basket'>Ваша корзина</a>");
124                break;
125            case'korz_clear':
126                $basket = Models\Basket::getInstance();
127                $basket->clear();
128                $basket->save();
129                $tmpl->msg("Корзина очищена!", "info", "<a class='urllink' href='/vitrina.php'>Вернутья на витрину</a>");
130                break;
131            default:
132                throw new \NotFoundException("Неверная ссылка!");
133        }
134    }
135
136    /// Обработчик отправки корзины
137    protected function tryBasketSubmit() {
138        $basket = Models\Basket::getInstance();
139        if ($basket->getCount()) {
140            $basket_items = $basket->getItems();
141            foreach ($basket_items as $item) {
142                $new_cnt = request('cnt' . $item['pos_id']);
143                if ($new_cnt <= 0) {
144                    $basket->removeItem($item['pos_id']);
145                } else {
146                    $basket->setItem($item['pos_id'], round($new_cnt), request('comm' . $item['pos_id']));
147                }
148            }
149            $basket->save();
150        }
151        if (@$_REQUEST['button'] == 'recalc') {
152            if (getenv("HTTP_REFERER")) {
153                redirect(getenv("HTTP_REFERER"));
154            } else {
155                redirect('/vitrina.php?mode=basket');
156            }
157        } else {
158            redirect('/vitrina.php?mode=buy');
159        }
160    }
161   
162    /// Обработчик добавления товара в корзину
163    protected function tryBasketAdd($page) {
164        global $tmpl;
165        $cnt = rcvint('cnt');
166        if ($page) {
167            $basket = Models\Basket::getInstance();
168            $basket->setItem($page, $cnt);
169            $basket->save();
170            $tmpl->ajax = 1;
171
172            /// TODO: стандартизировать ввод
173            if (isset($_REQUEST['j']) || isset($_REQUEST['json'])) {
174                $basket_cnt = $basket->getCount();
175                $sum = 0;
176                if ($basket_cnt) {
177                    $pc = $this->priceCalcInit();
178                    $basket_items = $basket->getItems();
179
180                    foreach ($basket_items as $item) {
181                        $price = $pc->getPosAutoPriceValue($item['pos_id'], $item['cnt']);
182                        $sum += $price * $cnt;
183                    }
184                }
185
186                if (isset($_REQUEST['json'])) {
187                    echo json_encode(array('cnt' => $basket_cnt, 'sum' => $sum), JSON_UNESCAPED_UNICODE);
188                } else if (isset($_REQUEST['j'])) {
189                    if ($basket_cnt) {
190                        echo "Товаров: $basket_cnt на $sum руб.";
191                    } else {
192                        echo "Корзина пуста";
193                    }
194                }
195            } else {
196                    if(isAjaxRequest()) {
197                            $tmpl->msg("Товар добавлен в корзину!", "info", "<a class='urllink' href='/vitrina.php?mode=basket'>Ваша корзина</a>");
198                    } else {
199                            if (getenv("HTTP_REFERER")) {
200                                    redirect(getenv("HTTP_REFERER"));
201                            }
202                    }
203            }
204        } else {
205            throw new NotFoundException("ID товара не задан!");
206        }
207    }
208
209    /// Обработчик добавления комментария к товару
210    /// @param $page ID страницы = ID товара, к которому добавляется комментарий
211    protected function tryComentAdd($page) {
212        global $tmpl;
213        require_once("include/comments.inc.php");
214        if (!@$_SESSION['uid']) {
215            if ((strtoupper($_SESSION['captcha_keystring']) != strtoupper(@$_REQUEST['img'])) || ($_SESSION['captcha_keystring'] == '')) {
216                unset($_SESSION['captcha_keystring']);
217                throw new Exception("Защитный код введён неверно!");
218            }
219            unset($_SESSION['captcha_keystring']);
220            $cd = new CommentDispatcher('product', $page);
221            $cd->WriteComment(@$_REQUEST['text'], @$_REQUEST['rate'], @$_REQUEST['autor_name'], @$_REQUEST['autor_email']);
222        } else {
223            $cd = new CommentDispatcher('product', $page);
224            $cd->WriteComment(@$_REQUEST['text'], @$_REQUEST['rate']);
225        }
226        $tmpl->msg("Коментарий добавлен!", "ok");
227    }
228
229// ======== Приватные функции ========================
230// -------- Основные функции -------------------------
231/// Отобразить корень витрины
232protected function TopGroup() {
233        global $tmpl, $CONFIG;
234        $tmpl->addContent("<h1 id='page-title'>Витрина</h1>");
235        if($CONFIG['site']['vitrina_glstyle']=='item')  $this->GroupList_ItemStyle(0);
236        else                                            $this->GroupList_ImageStyle(0);
237}
238
239/// Отобразить список групп / подгрупп
240/// @param $group ID группы, которую нужно отобразить
241/// @param $page Номер страницы отображаемой группы
242    protected function ViewGroup($group, $page) {
243        global $tmpl, $CONFIG, $db;
244        settype($group, 'int');
245        settype($page, 'int');
246        if ($page < 1) {
247            header("Location: " . (empty($_SERVER['HTTPS']) ? "http" : "https") . "://" . $_SERVER['HTTP_HOST'] . html_in($this->GetGroupLink($group)), false, 301);
248            exit();
249        }
250        $pref = \pref::getInstance();
251        $res = $db->query("SELECT `name`, `pid`, `desc`, `title_tag`, `meta_keywords`, `meta_description` FROM `doc_group` WHERE `id`='$group' AND `hidelevel`='0'");
252        if (!$res->num_rows) {
253            throw new \NotFoundException('Группа не найдена! Воспользуйтесь каталогом.');
254        }
255
256        $group_data = $res->fetch_assoc();
257        $group_name_html = html_out($group_data['name']);
258
259        if (file_exists("{$CONFIG['site']['var_data_fs']}/category/$group.jpg")) {
260            $miniimg = new ImageProductor($group, 'g', 'jpg');
261            $miniimg->SetX(160);
262            $miniimg->SetY(160);
263            $tmpl->addContent("<div style='float: right; margin: 35px 35px 20px 20px;'>"
264                    . "<img src='" . $miniimg->GetURI() . "' alt='$group_name_html'>"
265                    . "</div>");
266        }
267
268        if ($group_data['title_tag']) {
269            $title = html_out($group_data['title_tag']);
270        } else {
271            $title = $group_name_html . ', цены, купить';
272        }
273        if ($page > 1) {
274            $title.=" - стр.$page";
275        }
276        $tmpl->setTitle($title);
277        if ($group_data['meta_keywords']) {
278            $tmpl->setMetaKeywords(html_out($group_data['meta_keywords']));
279        } else {
280            $k1 = array('купить цены', 'продажа цены', 'отзывы купить', 'продажа отзывы', 'купить недорого');
281            $meta_key = $group_name_html . ' ' . $k1[rand(0, count($k1) - 1)] . ' интернет-магазин ' . $pref->site_display_name;
282            $tmpl->setMetaKeywords($meta_key);
283        }
284
285        if ($group_data['meta_description']) {
286            $tmpl->setMetaDescription(html_out($group_data['meta_description']));
287        } else {
288            $d1 = array('купить', 'заказать', 'продажа', 'приобрести');
289            $d2 = array('доступной', 'отличной', 'хорошей', 'разумной', 'выгодной');
290            $d3 = array('цене', 'стоимости');
291            $d4 = array('Большой', 'Широкий', 'Огромный');
292            $d5 = array('выбор', 'каталог', 'ассортимент');
293            $d6 = array('товаров', 'продукции');
294            $d7 = array('Доставка', 'Экспресс-доставка', 'Доставка курьером', 'Почтовая доставка');
295            $d8 = array('по всей России', 'в любой город России', 'по РФ', 'в любой регион России');
296            $meta_desc = $group_name_html . ' - ' . $d1[rand(0, count($d1) - 1)] . ' в интернет-магазине ' . $pref->site_display_name . ' по ' . $d2[rand(0, count($d2) - 1)] . ' ' . $d3[rand(0, count($d3) - 1)] . '. ' . $d4[rand(0, count($d4) - 1)] . ' ' . $d5[rand(0, count($d5) - 1)] . ' ' . $d6[rand(0, count($d6) - 1)] . '. ' . $d7[rand(0, count($d7) - 1)] . ' ' . $d8[rand(0, count($d8) - 1)] . '.';
297            $tmpl->setMetaDescription($meta_desc);
298        }
299
300        $h1 = $group_name_html;
301        if ($page > 1) {
302            $h1.=" - стр.$page";
303        }
304        $tmpl->addContent("<h1 id='page-title'>$h1</h1>");
305        $tmpl->addContent("<div class='breadcrumbs'>" . $this->GetVitPath($group_data['pid']) . "</div>");
306        if ($group_data['desc']) {
307            $wikiparser = new WikiParser();
308            $text = $wikiparser->parse($group_data['desc']);
309            $tmpl->addContent("<div class='group-description'>$text</div><br>");
310        }
311        $tmpl->addContent("<div style='clear: right'></div>");
312        if ($CONFIG['site']['vitrina_glstyle'] == 'item') {
313            $this->GroupList_ItemStyle($group);
314        } else {
315            $this->GroupList_ImageStyle($group);
316        }
317
318        $this->ProductList($group, $page);
319    }
320
321    /// Список товаров в группе
322    /// @param $group ID группы, из которой нужно отбразить товары
323    /// @param $page Номер страницы отображаемой группы
324    protected function ProductList($group, $page) {
325        global $tmpl, $CONFIG, $db;
326        settype($group, 'int');
327        settype($page, 'int');
328        $pref = \pref::getInstance();
329        if (isset($_GET['op'])) {
330            $_SESSION['vit_photo_only'] = $_GET['op'] ? 1 : 0;
331        }
332
333        if (isset($_REQUEST['order'])) {
334            $order = $_REQUEST['order'];
335        } else if (isset($_SESSION['vitrina_order'])) {
336            $order = @$_SESSION['vitrina_order'];
337        } else {
338            $order = '';
339        }
340        if (!$order) {
341            $order = @$CONFIG['site']['vitrina_order'];
342        }
343
344        switch ($order) {
345            case 'n': $sql_order = '`doc_base`.`name`';
346                break;
347            case 'nd': $sql_order = '`doc_base`.`name` DESC';
348                break;
349            case 'vc': $sql_order = '`doc_base`.`vc`';
350                break;
351            case 'vcd': $sql_order = '`doc_base`.`vc` DESC';
352                break;
353            case 'c': $sql_order = '`doc_base`.`cost`';
354                break;
355            case 'cd': $sql_order = '`doc_base`.`cost` DESC';
356                break;
357            case 's': $sql_order = '`count`';
358                break;
359            case 'sd': $sql_order = '`count` DESC';
360                break;
361            default: $sql_order = '`doc_base`.`name`';
362                $order = 'n';
363        }
364        $_SESSION['vitrina_order'] = $order;
365
366        if (isset($_REQUEST['view'])) {
367            $view = $_REQUEST['view'];
368        } else if (isset($_SESSION['vitrina_view'])) {
369            $view = @$_SESSION['vitrina_view'];
370        } else {
371            $view = '';
372        }
373        if ($view != 'i' && $view != 'l' && $view != 't') {
374            if ($CONFIG['site']['vitrina_plstyle'] == 'imagelist') {
375                $view = 'i';
376            } else if ($CONFIG['site']['vitrina_plstyle'] == 'extable') {
377                $view = 't';
378            } else {
379                $view = 'l';
380            }
381        }
382        $_SESSION['vitrina_view'] = $view;
383
384        $sql_photo_only = @$_SESSION['vit_photo_only'] ? "AND `img_id` IS NOT NULL" : "";
385        $cnt_where = $pref->getSitePref('site_store_id') ? (" AND `doc_base_cnt`.`sklad`=" . intval($pref->getSitePref('site_store_id')) . " ") : '';
386        $sql = "SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`, `doc_base`.`eol`
387            , ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`) AS `count`
388            ,`doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`, `class_unit`.`rus_name1` AS `units`, `doc_base`.`vc`, `doc_base`.`buy_time`, `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
389        FROM `doc_base`
390        LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
391        LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
392        LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
393        LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
394        WHERE `doc_base`.`group`='$group' AND `doc_base`.`hidden`='0' $sql_photo_only
395        ORDER BY $sql_order";
396
397        $res = $db->query($sql);
398        $lim = intval($CONFIG['site']['vitrina_limit']);
399        if ($lim == 0) {
400            $lim = 100;
401        }
402
403        if ($res->num_rows) {
404            if ($page < 1 || $lim * ($page - 1) > $res->num_rows) {
405                header("Location: " . (empty($_SERVER['HTTPS']) ? "http" : "https") . "://" . $_SERVER['HTTP_HOST'] . html_in($this->GetGroupLink($group)), false, 301);
406                exit();
407            }
408            $this->OrderAndViewBar($group, $page, $order, $view);
409
410            $this->PageBar($group, $res->num_rows, $lim, $page);
411            if (($lim < $res->num_rows) && $page) {
412                $res->data_seek($lim * ($page - 1));
413            }
414
415            if ($view == 'i') {
416                $this->TovList_ImageList($res, $lim);
417            } else if ($view == 't') {
418                $this->TovList_ExTable($res, $lim);
419            } else {
420                $this->TovList_SimpleTable($res, $lim);
421            }
422
423            $this->PageBar($group, $res->num_rows, $lim, $page);
424            if (@$CONFIG['site']['grey_price_days']) {
425                $tmpl->addContent("<span style='color:#888'>Серая цена</span> требует уточнения<br>");
426            }
427        }
428        elseif (isset($page) && $page != 1) {
429            header("Location: " . (empty($_SERVER['HTTPS']) ? "http" : "https") . "://" . $_SERVER['HTTP_HOST'] . html_in($this->GetGroupLink($group)), false, 301);
430            exit();
431        }
432    }
433
434/// Отобразить блок товаров, выбранных по признаку, основанному на типе блока
435/// @param $block Тип отображаемого блока: stock - Распродажа, popular - Популярные товары, new - Новинки, transit - Товарв пути
436    protected function ViewBlock($block) {
437        global $tmpl, $CONFIG, $db;
438        $pref = \pref::getInstance();
439        $cnt_where = $pref->getSitePref('site_store_id') ? (" AND `doc_base_cnt`.`sklad`=" . intval($pref->getSitePref('site_store_id')) . " ") : '';
440
441        // Определение типа блока
442        if ($block == 'stock') {
443            $sql = "SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`,
444                ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`) AS `count`,
445                `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`, `class_unit`.`rus_name1` AS `units`, `doc_base`.`vc`, `doc_base`.`buy_time`, `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
446                FROM `doc_base`
447                LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
448                LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
449                LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
450                LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
451                WHERE `doc_base`.`hidden`='0' AND `doc_base`.`stock`!='0'
452                ORDER BY `doc_base`.`likvid` ASC";
453            $head = 'Распродажа';
454        } else if ($block == 'popular') {
455            $sql = "SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`,
456                ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`) AS `count`,
457                `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`, `class_unit`.`rus_name1` AS `units`, `doc_base`.`vc`, `doc_base`.`buy_time`, `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
458                FROM `doc_base`
459                INNER JOIN `doc_group` ON `doc_group`.`id`= `doc_base`.`group` AND `doc_group`.`hidelevel`='0'
460                LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
461                LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
462                LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
463                LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
464                WHERE `doc_base`.`hidden`='0'
465                ORDER BY `doc_base`.`likvid` DESC
466                LIMIT 48";
467            $head = 'Популярные товары';
468        } else if ($block == 'new') {
469            if ($CONFIG['site']['vitrina_newtime']) {
470                $new_time = date("Y-m-d H:i:s", time() - 60 * 60 * 24 * $CONFIG['site']['vitrina_newtime']);
471            } else {
472                $new_time = date("Y-m-d H:i:s", time() - 60 * 60 * 24 * 180);
473            }
474            $sql = "SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`,
475                ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`) AS `count`,
476                `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`, `class_unit`.`rus_name1` AS `units`, `doc_base`.`vc`, `doc_base`.`buy_time`, `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
477                FROM `doc_base`
478                INNER JOIN `doc_group` ON `doc_group`.`id`= `doc_base`.`group` AND `doc_group`.`hidelevel`='0'
479                LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
480                LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
481                LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
482                LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
483                WHERE `doc_base`.`hidden`='0' AND `doc_base`.`buy_time`>='$new_time'
484                ORDER BY `doc_base`.`buy_time` DESC
485                LIMIT 24";
486            $head = 'Новинки';
487        }
488        else if ($block == 'new_ns') {
489            if ($CONFIG['site']['vitrina_newtime']) {
490                $new_time = date("Y-m-d H:i:s", time() - 60 * 60 * 24 * $CONFIG['site']['vitrina_newtime']);
491            } else {
492                $new_time = date("Y-m-d H:i:s", time() - 60 * 60 * 24 * 180);
493            }
494            $sql = "SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`,
495                ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`) AS `count`,
496                `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`, `class_unit`.`rus_name1` AS `units`, `doc_base`.`vc`, `doc_base`.`buy_time`, `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
497                FROM `doc_base`
498                INNER JOIN `doc_group` ON `doc_group`.`id`= `doc_base`.`group` AND `doc_group`.`hidelevel`='0'
499                LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
500                LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
501                LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
502                LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
503                WHERE `doc_base`.`hidden`='0' AND `doc_base`.`create_time`>='$new_time' AND `doc_base`.`buy_time`='1970-01-01'
504                        AND ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`)=0
505                ORDER BY `doc_base`.`buy_time` DESC
506                LIMIT 24";
507            $head = 'Новые образцы';
508        }
509        else if ($block == 'best') {
510            $sql = "SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`,
511                ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`) AS `count`,
512                `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base`.`proizv`,
513                `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`, `class_unit`.`rus_name1` AS `units`, `doc_base`.`vc`, `doc_base`.`buy_time`,
514                `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
515                FROM `comments`
516                INNER JOIN `doc_base` ON `doc_base`.`id`=`comments`.`object_id` AND `comments`.`object_name`='product'
517                INNER JOIN `doc_group` ON `doc_group`.`id`= `doc_base`.`group` AND `doc_group`.`hidelevel`='0'
518                LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`comments`.`object_id`
519                LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`comments`.`object_id` AND `doc_base_img`.`default`='1'
520                LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
521                LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
522                WHERE `comments`.`rate`>0 AND `doc_base`.`hidden`='0'
523                GROUP BY `comments`.`object_id`
524                ORDER BY AVG(`comments`.`rate`)*3+COUNT(`comments`.`rate`)  DESC
525                LIMIT 24";
526
527            $head = 'Товары с лучшим рейтингом';
528        } else if ($block == 'transit') {
529            $sql = "SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`,
530                ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where GROUP BY `doc_base`.`id`) AS `count`,
531                `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`, `class_unit`.`rus_name1` AS `units`, `doc_base`.`vc`, `doc_base`.`buy_time`, `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
532                FROM `doc_base`
533                INNER JOIN `doc_group` ON `doc_group`.`id`= `doc_base`.`group` AND `doc_group`.`hidelevel`='0'
534                LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
535                LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
536                LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
537                LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
538                WHERE `doc_base`.`hidden`='0' AND `doc_base_dop`.`transit`>0
539                ORDER BY `doc_base`.`name`";
540            $head = 'Товар в пути';
541        } else {
542            throw new NotFoundException('Блок не найден!');
543        }
544
545        $page_name = $db->real_escape_string('vitrina:' . $block);
546        $text = '';
547        $wres = $db->query("SELECT `articles`.`name`, `a`.`name` AS `a_name`, `articles`.`date`, `articles`.`changed`, `b`.`name` AS `b_name`, `articles`.`text`, `articles`.`type`
548        FROM `articles`
549        LEFT JOIN `users` AS `a` ON `a`.`id`=`articles`.`autor`
550        LEFT JOIN `users` AS `b` ON `b`.`id`=`articles`.`changeautor`
551        WHERE `articles`.`name` = '$page_name'");
552        if ($nxt = $wres->fetch_assoc()) {
553            $text = $nxt['text'];
554            if ($nxt['type'] == 0) {
555                $text = strip_tags($text, '<nowiki>');
556            }
557            if ($nxt['type'] == 0 || $nxt['type'] == 2) {
558                $wikiparser = new WikiParser();
559                $text = $wikiparser->parse($text);
560                if (@$wikiparser->title) {
561                    $head = $wikiparser->title;
562                }
563            }
564        }
565
566        $tmpl->addContent("<div class='breadcrumbs'><a href='/vitrina.php'>Главная</a> <a href='/vitrina.php'>Витрина</a> $head</div>");
567        $tmpl->addContent("<h1 id='page-title'>$head</h1><div>$text</div>");
568        $tmpl->SetTitle($head);
569
570        $res = $db->query($sql);
571        $lim = 1000;
572        if ($res->num_rows) {
573            if ($CONFIG['site']['vitrina_plstyle'] == 'imagelist') {
574                $view = 'i';
575            } else if ($CONFIG['site']['vitrina_plstyle'] == 'extable') {
576                $view = 't';
577            } else {
578                $view = 'l';
579            }
580
581            if ($view == 'i') {
582                $this->TovList_ImageList($res, $lim);
583            } else if ($view == 't') {
584                $this->TovList_ExTable($res, $lim);
585            } else {
586                $this->TovList_SimpleTable($res, $lim);
587            }
588
589            if (@$CONFIG['site']['grey_price_days']) {
590                $tmpl->addContent("<span style='color:#888'>Серая цена</span> требует уточнения<br>");
591            }
592        } else {
593            $tmpl->msg("Товары в данной категории отсутствуют");
594        }
595    }
596
597/// Отобразить блок ссылок смены вида отображения и сортировки предложений в группе
598/// @param $group       ID текущей группы
599/// @param $page        Номер текущей страницы
600/// @param $order       Установелнная сортировка
601/// @param $view                Установелнный вид отображения
602    protected function OrderAndViewBar($group, $page, $order, $view) {
603        global $tmpl;
604        $tmpl->addContent("<div class='orderviewbar'>");
605        $tmpl->addContent("<div class='orderbar'>Показывать: ");
606        if ($view == 'i') {
607            $tmpl->addContent("<span class='selected'>Картинками</span> ");
608        } else {
609            $tmpl->addContent("<span><a href='" . $this->GetGroupLink($group, $page, 'view=i') . "'>Картинками</a></span> ");
610        }
611        if ($view == 't') {
612            $tmpl->addContent("<span class='selected'>Таблицей</span> ");
613        } else {
614            $tmpl->addContent("<span><a href='" . $this->GetGroupLink($group, $page, 'view=t') . "'>Таблицей</a></span> ");
615        }
616        if ($view == 'l') {
617            $tmpl->addContent("<span class='selected'>Списком</span> ");
618        } else {
619            $tmpl->addContent("<span><a href='" . $this->GetGroupLink($group, $page, 'view=l') . "'>Списком</a></span> ");
620        }
621        if (@$_SESSION['vit_photo_only']) {
622            $tmpl->addContent("<span class='selected'><a class='down'  href='" . $this->GetGroupLink($group, $page, 'op=0') . "'>Только с фото</a></span> ");
623        } else {
624            $tmpl->addContent("<span><a href='" . $this->GetGroupLink($group, $page, 'op=1') . "'>Только с фото</a></span> ");
625        }
626        $tmpl->addContent("</div>");
627        $tmpl->addContent("<div class='viewbar'>Сортировать по: ");
628        if ($order == 'n') {
629            $tmpl->addContent("<span class='selected'><a href='" . $this->GetGroupLink($group, $page, 'order=nd') . "'>Названию</a></span> ");
630        } else if ($order == 'nd') {
631            $tmpl->addContent("<span class='selected'><a class='down' href='" . $this->GetGroupLink($group, $page, 'order=n') . "'>Названию</a></span> ");
632        } else {
633            $tmpl->addContent("<span><a href='" . $this->GetGroupLink($group, $page, 'order=n') . "'>Названию</a></span> ");
634        }
635
636        if ($order == 'vc') {
637            $tmpl->addContent("<span class='selected'><a href='" . $this->GetGroupLink($group, $page, 'order=vcd') . "'>Коду</a></span> ");
638        } else if ($order == 'vcd') {
639            $tmpl->addContent("<span class='selected'><a href='" . $this->GetGroupLink($group, $page, 'order=vc') . "'>Коду</a></span> ");
640        } else {
641            $tmpl->addContent("<span><a class='down' href='" . $this->GetGroupLink($group, $page, 'order=vc') . "'>Коду</a></span> ");
642        }
643
644        if ($order == 'c') {
645            $tmpl->addContent("<span class='selected'><a href='" . $this->GetGroupLink($group, $page, 'order=cd') . "'>Цене</a></span> ");
646        } else if ($order == 'cd') {
647            $tmpl->addContent("<span class='selected'><a class='down' href='" . $this->GetGroupLink($group, $page, 'order=c') . "'>Цене</a></span> ");
648        } else {
649            $tmpl->addContent("<span><a href='" . $this->GetGroupLink($group, $page, 'order=c') . "'>Цене</a></span> ");
650        }
651
652        if ($order == 's') {
653            $tmpl->addContent("<span class='selected'><a href='" . $this->GetGroupLink($group, $page, 'order=sd') . "'>Наличию</a></span> ");
654        } else if ($order == 'sd') {
655            $tmpl->addContent("<span class='selected'><a class='down' href='" . $this->GetGroupLink($group, $page, 'order=s') . "'>Наличию</a></span> ");
656        } else {
657            $tmpl->addContent("<span><a href='" . $this->GetGroupLink($group, $page, 'order=s') . "'>Наличию</a></span> ");
658        }
659        $tmpl->addContent("</div><div class='clear'></div>");
660        $tmpl->addContent("</div>");
661    }
662   
663    /// Получить данные карточки товара
664    /// @param $product_id ID товара
665    /// @return ассоциативный массив с данными товара или false
666    protected function getProductData($product_id) {
667        global $db;
668        settype($product_id, 'int');
669        $pref = \pref::getInstance();
670        $cnt_where = $pref->getSitePref('site_store_id') ? (" AND `doc_base_cnt`.`sklad`=" . intval($pref->getSitePref('site_store_id')) . " ") : '';
671        $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`group`, `doc_base`.`cost`
672            , `doc_base`.`proizv`, `doc_base`.`vc`, `doc_base`.`title_tag`, `doc_base`.`meta_description`, `doc_base`.`meta_keywords`
673                , `doc_base`.`buy_time`, `doc_base`.`cost_date`, `doc_base`.`bulkcnt`, `doc_base`.`mult`, `doc_base`.`mass`
674                , `doc_base`.`analog_group`, `doc_base`.`eol`, `doc_base`.`create_time`
675            , `doc_group`.`printname` AS `group_printname`   
676            , `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`, `doc_base_dop`.`transit`
677            , `doc_base_dop_type`.`name` AS `type_name`           
678            , `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`           
679            , `class_unit`.`name` AS `units`, `class_unit`.`rus_name1` AS `units_min`
680            , ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where) AS `cnt`
681        FROM `doc_base`
682        INNER JOIN `doc_group` ON `doc_base`.`group`=`doc_group`.`id`
683        LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
684        LEFT JOIN `doc_base_dop_type` ON `doc_base_dop_type`.`id`=`doc_base_dop`.`type`
685        LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
686        LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
687        LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
688        WHERE `doc_base`.`id`=$product_id
689        ORDER BY `doc_base`.`name` ASC LIMIT 1");
690        return $res->fetch_assoc();
691    }
692   
693    /// Получить список аналогов для товара
694    /// @param $product_id  ID товара/услуги
695    /// @param $analog_group_name Имя группы аналогов
696    /// @return массив с данными аналогов
697    protected function getProductAnalogList($product_id, $analog_group_name) {
698        global $db;
699        if($analog_group_name=='') {
700            return array();
701        }
702        settype($product_id, 'int');
703        $pref = \pref::getInstance();
704        $analog_group_sql = $db->real_escape_string($analog_group_name);
705        $cnt_where = $pref->getSitePref('site_store_id') ? (" AND `doc_base_cnt`.`sklad`=" . intval($pref->getSitePref('site_store_id')) . " ") : '';
706        $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`, `doc_base`.`cost`
707                    , `doc_base`.`eol`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_base`.`vc`, `doc_base`.`buy_time`, `doc_base`.`create_time`
708                    , `doc_base`.`bulkcnt`, `doc_base`.`mult`
709                , `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`
710                , `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`
711                , `class_unit`.`rus_name1` AS `units`
712                , ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where 
713                    GROUP BY `doc_base`.`id`) AS `count`
714            FROM `doc_base`
715            LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
716            LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
717            LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
718            LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
719            INNER JOIN `doc_group` ON `doc_group`.`id`=`doc_base`.`group`
720            WHERE `doc_base`.`analog_group`='$analog_group_sql' AND `doc_base`.`hidden`='0' AND `doc_group`.`hidelevel`=0
721                AND `doc_base`.`id`!='$product_id'
722            ORDER BY `doc_base`.`id`");
723        $ret = array();
724        while($line = $res->fetch_assoc()) {
725            $ret[] = $line;
726        }
727        return $ret;
728    }
729   
730    /// Получить список связанных/сопутствующих товаров для товара
731    /// @param $product_id  ID товара/услуги
732    /// @return массив с данными аналогов
733    protected function getProductLinkedPos($product_id) {
734        global $db;
735        settype($product_id, 'int');
736        $pref = \pref::getInstance();
737        $cnt_where = $pref->getSitePref('site_store_id') ? (" AND `doc_base_cnt`.`sklad`=" . intval($pref->getSitePref('site_store_id')) . " ") : '';
738        $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`group`, `doc_base`.`name`, `doc_base`.`desc`, `doc_base`.`cost_date`
739                , `doc_base`.`cost`, `doc_base`.`eol`, `doc_base`.`mass`, `doc_base`.`proizv`, `doc_base`.`vc`, `doc_base`.`buy_time`
740                , `doc_base`.`create_time`, `doc_base`.`bulkcnt`, `doc_base`.`mult`
741            , `doc_base_dop`.`transit`, `doc_base_dop`.`d_int`, `doc_base_dop`.`d_ext`, `doc_base_dop`.`size`
742            , `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`
743            , `class_unit`.`rus_name1` AS `units`
744                , ( SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id` $cnt_where 
745                    GROUP BY `doc_base`.`id`) AS `count`
746            FROM `doc_base_links`
747            INNER JOIN `doc_base` ON `doc_base`.`id`=`doc_base_links`.`pos2_id`
748            LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
749            LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
750            LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
751            LEFT JOIN `class_unit` ON `doc_base`.`unit`=`class_unit`.`id`
752            WHERE `doc_base_links`.`pos1_id`='$product_id' AND `doc_base`.`hidden`='0'
753            ORDER BY `doc_base`.`id`");
754        $ret = array();
755        while($line = $res->fetch_assoc()) {
756            $ret[] = $line;
757        }
758        return $ret;
759    }
760   
761    /// Получить дерево параметров товара/услуги
762    protected function getProductParamsList($product_data) {
763        global $db;
764        $ret = array();
765        if ($product_data['d_int']) {
766            $ret[] = ['type'=>'item', 'name'=>'Внутренний диаметр', 'value'=>$product_data['d_int'], 'unit_name'=>'мм'];
767        }
768        if ($product_data['d_ext']) {
769            $ret[] = ['type'=>'item', 'name'=>'Внешний диаметр', 'value'=>$product_data['d_ext'], 'unit_name'=>'мм'];
770        }
771        if ($product_data['size']) {
772            $ret[] = ['type'=>'item', 'name'=>'Высота', 'value'=>$product_data['size'], 'unit_name'=>'мм'];
773        }
774        if ($product_data['mass']) {
775            $ret[] = ['type'=>'item', 'name'=>'Масса', 'value'=>$product_data['mass'], 'unit_name'=>'Кг'];
776        }
777        if ($product_data['proizv']) {
778            $ret[] = ['type'=>'item', 'name'=>'Производитель', 'value'=>$product_data['proizv'], 'unit_name'=>''];
779        }
780        //$ret[] = ['type'=>'item', 'name'=>'', 'value'=>''];
781        $param_res = $db->query("SELECT `doc_base_params`.`name`, `doc_base_values`.`value`, `class_unit`.`rus_name1` AS `unit_name`
782            FROM `doc_base_values`
783            LEFT JOIN `doc_base_params` ON `doc_base_params`.`id`=`doc_base_values`.`param_id`
784            LEFT JOIN `class_unit` ON `doc_base_params`.`unit_id`=`class_unit`.`id`
785            WHERE `doc_base_values`.`id`='{$product_data['id']}' AND `doc_base_params`.`group_id`='0' AND `doc_base_params`.`hidden`='0'
786                AND `doc_base_params`.`secret`='0'");
787        while ($params = $param_res->fetch_row()) {
788            $ret[] = ['type'=>'item', 'name'=>$params[0], 'value'=>$params[1], 'unit_name'=>$params[2]];
789        }
790
791        $resg = $db->query("SELECT `id`, `name` FROM `doc_base_gparams`");
792        while ($nxtg = $resg->fetch_row()) {
793            $sub = array();
794            $param_res = $db->query("SELECT `doc_base_params`.`name`, `doc_base_values`.`value`, `class_unit`.`rus_name1` AS `unit_name`
795                FROM `doc_base_values`
796                LEFT JOIN `doc_base_params` ON `doc_base_params`.`id`=`doc_base_values`.`param_id`
797                LEFT JOIN `class_unit` ON `doc_base_params`.`unit_id`=`class_unit`.`id`
798                WHERE `doc_base_values`.`id`='{$product_data['id']}' AND `doc_base_params`.`group_id`='$nxtg[0]' AND `doc_base_params`.`hidden`='0'");
799            while ($params = $param_res->fetch_row()) {
800                $sub[] = ['type'=>'item', 'name'=>$params[0], 'value'=>$params[1], 'unit_name'=>$params[2]];
801            }
802            $ret[] = ['type'=>'group', 'name'=>$nxtg[1], 'items'=>$sub];
803        }
804        return $ret;
805    }
806   
807    protected function getProductParamHTML($params) {
808        $ret = '';
809        foreach($params as $pt) {
810            if($pt['type']=='item') {
811                $ret .= "<tr><td class='field'>".html_out($pt['name']).":</td>"
812                        . "<td>".html_out($pt['value'])." ".html_out($pt['unit_name'])."</td></tr>";
813            }
814            else if($pt['type']=='group' && count($pt['items'])>0 ) {
815                $ret .= "<tr><th colspan='2'>" . html_out($pt['name']) . "</th></tr>";
816                $ret .= $this->getProductParamHTML($pt['items']);
817            }
818        }
819        return $ret;
820    }
821
822    /// Отобразить карточку товара
823    /// @param $product_id ID отображаемого товара/услуги
824    protected function ProductCard($product_id) {
825        global $tmpl, $CONFIG, $db;
826        $pref = \pref::getInstance();
827        $product_data = $this->getProductData($product_id);
828        if (!$product_data) {
829            $tmpl->addContent("<h1 id='page-title'>Информация о товаре</h1>");
830            throw new NotFoundException("К сожалению, товар не найден. Возможно, Вы пришли по неверной ссылке.");
831        }
832       
833        $this->setProductTitle($product_data);
834        $this->setProductMetaTags($product_data);
835        $product_name_html = html_out($product_data['group_printname'] . ' ' . $product_data['name']);
836        $tmpl->addContent("<h1 id='page-title'>$product_name_html</h1>");
837        $tmpl->addContent("<div class='breadcrumbs'>" . $this->GetVitPath($product_data['group']) . "</div>");
838        $appends = $img_mini = "";
839        if ($product_data['img_id']) {
840            $miniimg = new ImageProductor($product_data['img_id'], 'p', $product_data['img_type']);
841            $miniimg->SetY(220);
842            $miniimg->SetX(200);
843            $fullimg = new ImageProductor($product_data['img_id'], 'p', $product_data['img_type']);
844            $img = "<img src='" . $miniimg->GetURI() . "' alt='" . html_out($product_data['name']) . "' onload='$(this).fadeTo(500,1);' style='opacity: 1' id='midiphoto'>";
845            $res = $db->query("SELECT `doc_img`.`id` AS `img_id`, `doc_base_img`.`default`, `doc_img`.`name`, `doc_img`.`type` AS `img_type` FROM `doc_base_img`
846                    LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
847                    WHERE `doc_base_img`.`pos_id`='{$product_data['id']}'");
848
849            while ($img_data = $res->fetch_assoc()) {
850                $miniimg = new ImageProductor($img_data['img_id'], 'p', $img_data['img_type']);
851                $miniimg->SetX(40);
852                $miniimg->SetY(40);
853                $midiimg = new ImageProductor($img_data['img_id'], 'p', $img_data['img_type']);
854                $midiimg->SetX(200);
855                $midiimg->SetY(220);
856                $fullimg = new ImageProductor($img_data['img_id'], 'p', $img_data['img_type']);
857                $fullimg->SetY(800);
858                $origimg = new ImageProductor($img_data['img_id'], 'p', $img_data['img_type']);
859                if ($res->num_rows > 1) {
860                    $img_mini.="<a href='" . $midiimg->GetURI() . "' onclick=\"return setPhoto({$img_data['img_id']});\"><img src='" . $miniimg->GetURI() . "' alt='{$img_data['name']}'></a>";
861                }
862                $appends.="midiphoto.appendImage({$img_data['img_id']},'" . $midiimg->GetURI(1) . "', '" . $fullimg->GetURI(1) . "', '" . $origimg->GetURI(1) . "');\n";
863            }
864        }
865        else {
866            $img = "<img src='/skins/{$CONFIG['site']['skin']}/images/no_photo.png' alt='no photo'>";
867        }
868
869        $tmpl->addContent("<table class='product-card'>
870                <tr valign='top'><td rowspan='15' width='150'>
871                <div class='image'><div class='one load'>$img</div><div class='list'>$img_mini</div></div>
872                <script>
873                var midiphoto=tripleView('midiphoto')
874                $appends
875                function setPhoto(id)
876                {
877                        return midiphoto.setPhoto(id)
878                }
879                </script>");
880
881        $tmpl->addContent("<td class='field'>Наименование:</td><td>" . html_out($product_data['name']) . "</td></tr>");
882        if ($product_data['vc']) {
883            $tmpl->addContent("<tr><td class='field'>Код производителя:</td><td>" . html_out($product_data['vc']) . "</td></tr>");
884        }
885        if ($product_data['desc']) {
886            $wikiparser = new WikiParser();
887            $text = $wikiparser->parse($product_data['desc']);
888            $tmpl->addContent("<tr><td valign='top' class='field'>Описание:<td>$text");
889        }
890
891        if ($product_data['type_name']) {
892            $tmpl->addContent("<tr><td class='field'>Тип:<td>" . html_out($product_data['type_name']));
893        }
894
895        $cce = '';
896        if (\cfg::get('site', 'grey_price_days')) {
897            $cce_time = \cfg::get('site', 'grey_price_days') * 60 * 60 * 24;
898            if (strtotime($product_data['cost_date']) < $cce_time) {
899                $cce = ' style=\'color:#888\'';
900            }
901        }
902
903        $pc = $this->priceCalcInit();
904        $cena = $pc->getPosDefaultPriceValue($product_data['id']);
905        if ($cena <= 0) {
906            $cena = 'уточняйте';
907        }
908
909        if ($pc->getRetailPriceId() != $pc->getDefaultPriceID()) {
910            $ret_price = $pc->getPosRetailPriceValue($product_data['id']);
911            if ($ret_price <= 0) {
912                $ret_price = 'уточняйте';
913            }
914            $tmpl->addContent("<tr><td class='field'>Розничная цена:<td{$cce}>$ret_price</td></tr>");
915            $tmpl->addContent("<tr><td class='field'>Оптовая цена:<td{$cce}>$cena</td></tr>");
916        } else {
917            $tmpl->addContent("<tr><td class='field'>Цена:<td{$cce}>$cena</td></tr>");
918        }
919
920        if ($pc->getCurrentPriceId() != $pc->getDefaultPriceID()) {
921            $user_price = $pc->getPosUserPriceValue($product_data['id']);
922            if ($user_price <= 0) {
923                $user_price = 'уточняйте';
924            }
925            $tmpl->addContent("<tr><td class='field'>Цена для Вас:<td{$cce}>$user_price</td></tr>");
926        }
927
928        if ($product_data['mult'] > 1) {
929            $tmpl->addContent("<tr><td class='field'>В упаковке:<td>{$product_data['mult']} " . html_out($product_data['units_min'])."</td></tr>");
930        }
931
932        $tmpl->addContent("<tr><td class='field'>Единица измерения:<td>" . html_out($product_data['units']));
933
934        $nal = $this->GetCountInfo($product_data['cnt'], $product_data['transit']);
935
936        if ($nal) {
937            $tmpl->addContent("<tr><td class='field'>Наличие: <td><b>$nal</b> " . html_out($product_data['units_min'])."<br>");
938        } else {
939            $tmpl->addContent("<tr><td class='field'>Наличие:<td>Под заказ<br>");
940        }
941       
942        $params = $this->getProductParamsList($product_data);
943        $tmpl->addContent( $this->getProductParamHTML($params) );
944       
945        $att_res = $db->query("SELECT `doc_base_attachments`.`attachment_id`, `attachments`.`original_filename`, `attachments`.`description`
946                FROM `doc_base_attachments`
947                LEFT JOIN `attachments` ON `attachments`.`id`=`doc_base_attachments`.`attachment_id`
948                WHERE `doc_base_attachments`.`pos_id`='$product_id'");
949        if ($att_res->num_rows > 0) {
950            $tmpl->addContent("<tr><th colspan='3'>Прикреплённые файлы</th></tr>");
951            while ($anxt = $att_res->fetch_row()) {
952                if ($CONFIG['site']['rewrite_enable']) {
953                    $link = "/attachments/{$anxt[0]}/$anxt[1]";
954                } else {
955                    $link = "/attachments.php?att_id={$anxt[0]}";
956                }
957                $tmpl->addContent("<tr><td><a href='$link'>$anxt[1]</a></td><td>$anxt[2]</td></tr>");
958            }
959        }
960        if ($product_data['mult'] > 1) {
961            $k_info = "<br>должно быть кратно " . $product_data['mult'];
962        } else {
963            $k_info = '';
964        }
965
966        $buy_cnt = $this->getBuyCnt($product_data);
967
968        $tmpl->addContent("<tr><td colspan='3'>");
969        if ($product_data['eol']) {
970            $tmpl->addContent("<b>Товар снят с поставки!</b>");
971        }
972        if (!$product_data['eol'] || $product_data['cnt'] > 0) {
973            $tmpl->addContent("<form action='/vitrina.php'>
974                <input type='hidden' name='mode' value='korz_add'>
975                <input type='hidden' name='p' value='$product_id'>
976                <div>
977                Добавить
978                <input type='text' name='cnt' value='$buy_cnt' class='mini'> штук <button type='submit'>В корзину!</button>{$k_info}
979                </div>
980                </form>");
981        }
982        $tmpl->addContent("</td></tr></table>");
983
984        // Автогенерируемое описание
985        $str = $this->getProductAutoDescription($product_data);
986        $tmpl->addContent("<div class='description'>$str</div>");
987
988        // Аналоги
989        $a_list = $this->getProductAnalogList($product_id, $product_data['analog_group']);
990        if (count($a_list)>0) {
991            $tmpl->addContent("<div><h2>Аналоги</h2>");
992            foreach($a_list as $a_info) {
993                $tmpl->addContent($this->getProductMiniElement($a_info));
994            }
995            $tmpl->addContent("</div>");
996        }
997        $tmpl->addContent("<div class='clear'></div>");
998       
999        // Сопутствующие товары
1000        $linked = $this->getProductLinkedPos($product_id);
1001        if (count($linked)>0) {
1002            $tmpl->addContent("<div><h2>Сопутствующие товары</h2>");
1003            foreach($linked as $link_info) {
1004                $tmpl->addContent($this->getProductMiniElement($link_info));
1005            }
1006            $tmpl->addContent("</div>");
1007            $tmpl->addContent("<hr class='clear'>");
1008        }
1009
1010        $tmpl->addContent("<script type='text/javascript' charset='utf-8'>
1011            $(document).ready(function(){ $(\"a[rel^='prettyPhoto']\").prettyPhoto({theme:'dark_rounded'});});
1012            </script>");
1013    }
1014
1015    /// Заполнить keyword, description тэги для карточки товара
1016    /// @param $product_data Массив с информацией о товаре
1017    public function setProductMetaTags($product_data) {
1018        global $tmpl;
1019        $pref = \pref::getInstance();
1020        $base = abs(crc32($product_data['name'] . $product_data['group'] . $product_data['proizv'] . $product_data['vc'] . $product_data['desc']));
1021        if ($product_data['meta_keywords']) {
1022            $tmpl->setMetaKeywords(html_out($product_data['meta_keywords']));
1023        } else {
1024            $k1 = array('купить', 'цены', 'характеристики', 'фото', 'выбор', 'каталог', 'описания', 'отзывы', 'продажа', 'описание');
1025            $l = count($k1);
1026            $i1 = $base % $l;
1027            $base = floor($base / $l);
1028            $i2 = $base % $l;
1029            $base = floor($base / $l);
1030            $meta_key = $product_data['group_printname'] . ' ' . $product_data['name'] . ' ' . $k1[$i1] . ' ' . $k1[$i2];
1031            $tmpl->setMetaKeywords(html_out($meta_key));
1032        }
1033
1034        if ($product_data['meta_description']) {
1035            $tmpl->setMetaDescription(html_out($product_data['meta_description']));
1036        } else {
1037            $d = array();
1038            $d[0] = array($product_data['group_printname'] . ' ' . $product_data['name'] . ' ' . $product_data['proizv'] . ' - ');
1039            $d[1] = array('купить', 'заказать', 'продажа', 'приобрести');
1040            $d[2] = array(' в интернет-магазине ' . $pref->site_display_name . ' по ');
1041            $d[3] = array('доступной', 'отличной', 'хорошей', 'разумной', 'выгодной');
1042            $d[4] = array('цене.', 'стоимости.');
1043            $d[5] = array('Большой', 'Широкий', 'Огромный');
1044            $d[6] = array('выбор', 'каталог', 'ассортимент');
1045            $d[7] = array('товаров.', 'продукции.');
1046            $d[8] = array('Доставка', 'Экспресс-доставка', 'Доставка курьером', 'Почтовая доставка');
1047            $d[9] = array('по всей России.', 'в любой город России.', 'по РФ.', 'в любой регион России.');
1048            $str = '';
1049            foreach ($d as $id => $item) {
1050                $l = count($item);
1051                $i = $base % $l;
1052                $base = floor($base / $l);
1053                $str.=$item[$i] . ' ';
1054            }
1055            $tmpl->setMetaDescription(html_out($str));
1056        }
1057    }
1058   
1059    /// Заполнить title тэг для карточки товара
1060    /// @param $product_data Массив с информацией о товаре
1061    public function setProductTitle($product_data) {
1062        global $tmpl;
1063        if ($product_data['title_tag']) {
1064            $title = html_out($product_data['title_tag']);
1065        } else {
1066            $title = '';
1067            if($product_data['group_printname']) {
1068               $title .=  html_out($product_data['group_printname']) . ' ';
1069            }
1070            $title .= html_out($product_data['name']) . ', цены и характеристики, купить';
1071        }
1072        $tmpl->setTitle($title);
1073    }
1074
1075/// Получить автоматически генерируемое дополнение к описанию товара
1076/// @param $product_data Массив с информацией о товаре
1077public function getProductAutoDescription($product_data) {
1078        $d = array();
1079        $d[] = array('В нашем');
1080        $d[] = array('магазине', 'интернет-магазине', 'каталоге', 'прайс-листе');
1081        $d[] = array('Вы можете');
1082        $d[] = array('купить', 'заказать', 'приобрести');
1083        $d[] = array($product_data['group_printname'] . ' ' . $product_data['name'] . ' ' . $product_data['proizv'] . ' по ');
1084        $d[] = array('доступной', 'отличной', 'хорошей', 'разумной', 'выгодной');
1085        $d[] = array('цене за', 'стоимости за');
1086        $d[] = array('наличный расчёт.', 'безналичный расчёт.', 'webmoney.');
1087        $d[] = array('Так же можно');
1088        $d[] = array('заказать', 'запросить', 'осуществить');
1089        $d[] = array('доставку', 'экспресс-доставку', 'доставку транспортной компанией', 'почтовую доставку', 'доставку курьером');
1090        $d[] = array('этого товара', 'выбранной продукции');
1091        $d[] = array('по всей России.', 'в любой город России.', 'по РФ.', 'в любой регион России.');
1092        $str = '';
1093        $base = abs(crc32($product_data['name'] . $product_data['group'] . $product_data['proizv'] . $product_data['vc'] . $product_data['desc']));
1094        foreach ($d as $id => $item) {
1095                $l = count($item);
1096                $i = $base % $l;
1097                $base = floor($base / $l);
1098                $str.=$item[$i] . ' ';
1099        }
1100        return $str;
1101}
1102
1103    /// Получить HTML код товарного предложения стандартного размера
1104    public function getProductBaseElement($product_info) {
1105        if (\cfg::exist('site', 'grey_price_days')) {
1106            $cce_time = \cfg::get('site', 'grey_price_days') * 60 * 60 * 24;
1107            if (strtotime($product_info['cost_date']) < $cce_time) {
1108                $cce = ' style=\'color:#888\'';
1109            }
1110        }
1111        else {
1112            $cce = '';
1113        }
1114        $pc = $this->priceCalcInit();
1115        if ($product_info['img_id']) {
1116            $miniimg = new ImageProductor($product_info['img_id'], 'p', $product_info['img_type']);
1117            $miniimg->SetX(135);
1118            $miniimg->SetY(180);
1119            $img = "<img src='" . $miniimg->GetURI() . "' alt='" . html_out($product_info['name']) . "' width='13px' height='17px'>";
1120        } else {
1121            $img = "<img src='/skins/" . \cfg::get('site', 'skin') . "/images/no_photo_131.jpg' alt='no photo'>";
1122        }
1123        $nal = $this->GetCountInfo($product_info['count'], $product_info['transit']);
1124        $link = $this->GetProductLink($product_info['id'], $product_info['name']);
1125        $price = $pc->getPosDefaultPriceValue($product_info['id']);
1126        $price = number_format($price, 2, '.', ' ');
1127        if ($price <= 0) {
1128            $price = 'уточняйте';
1129        }
1130        $buy_cnt = $this->getBuyCnt($product_info);
1131
1132        $ret = "<div class='pitem'>
1133        <a href='$link'>$img</a>
1134        <a href='$link'>" . html_out($product_info['name']) . "</a><br>
1135        <b>Код:</b> " . html_out($product_info['vc']) . "<br>
1136        <b>Цена:</b> <span{$cce}>$price руб.</span> / {$product_info['units']}<br>
1137        <b>Производитель:</b> " . html_out($product_info['proizv']) . "<br>
1138        <b>Кол-во:</b> $nal<br>";
1139        if (!$product_info['eol'] || $product_info['count'] > 0) {
1140            $ret .="<a rel='nofollow' href='/vitrina.php?mode=korz_add&amp;p={$product_info['id']}&amp;cnt=$buy_cnt' onclick=\"return ShowPopupWin('/vitrina.php?mode=korz_add&amp;p={$product_info['id']}&amp;cnt=$buy_cnt','popwin');\" rel='nofollow'>В корзину!</a>";
1141        } else {
1142            $ret .="<b>Снят с поставки</b>";
1143        }
1144        $ret .= "</div>";
1145    }
1146
1147    /// Получить HTML код товарного предложения уменьшенного размера
1148    public function getProductMiniElement($product_info) {
1149        $cce = '';
1150        if (\cfg::exist('site', 'grey_price_days')) {
1151            $cce_time = \cfg::get('site', 'grey_price_days') * 60 * 60 * 24;
1152            if (strtotime($product_info['cost_date']) < $cce_time) {
1153                $cce = ' style=\'color:#888\'';
1154            }
1155        }
1156        $pc = $this->priceCalcInit();
1157        if ($product_info['img_id']) {
1158            $miniimg = new ImageProductor($product_info['img_id'], 'p', $product_info['img_type']);
1159            $miniimg->SetX(63);
1160            $miniimg->SetY(85);
1161            $img = "<img src='" . $miniimg->GetURI() . "' alt='" . html_out($product_info['name']) . "'>";
1162        } else {
1163            $img = "<img src='/skins/" . \cfg::get('site', 'skin') . "/images/no_photo.jpg' alt='no photo'>";
1164        }
1165        $nal = $this->GetCountInfo($product_info['count'], $product_info['transit']);
1166        $link = $this->GetProductLink($product_info['id'], $product_info['name']);
1167        $price = $pc->getPosDefaultPriceValue($product_info['id']);
1168        $buy_cnt = $this->getBuyCnt($product_info);
1169        $price = number_format($price, 2, '.', ' ');
1170        if ($price <= 0) {
1171            $price = 'уточняйте';
1172        }
1173
1174        $ret = "<div class='pitem_mini'>
1175        <a href='$link'>$img</a>
1176        <a href='$link'>" . html_out($product_info['name']) . "</a><br>
1177        <b>Код:</b> " . html_out($product_info['vc']) . "<br>
1178        <b>Цена:</b> <span{$cce}>$price руб.</span> / {$product_info['units']}<br>
1179        <b>Производитель:</b> " . html_out($product_info['proizv']) . "<br>
1180        <b>Кол-во:</b> $nal<br>";
1181        if(!$product_info['eol'] || $product_info['count']>0) {
1182            $ret .="<a rel='nofollow' href='/vitrina.php?mode=korz_add&amp;p={$product_info['id']}&amp;cnt=$buy_cnt' onclick=\"return ShowPopupWin('/vitrina.php?mode=korz_add&amp;p={$product_info['id']}&amp;cnt=$buy_cnt','popwin');\" rel='nofollow'>В корзину!</a>";
1183        }
1184        else {
1185            $ret .="<b>Снят с поставки</b>";
1186        }
1187        $ret .= "</div>";
1188        return $ret;
1189    }
1190   
1191    /// Получить массив с данными корзины
1192    protected function getBasket() {
1193        global $db;
1194        $basket = \Models\Basket::getInstance();
1195        if (!$basket->getCount()) { 
1196            return false;
1197        }
1198        $sum = $lock_pay = $lock_mult = 0;
1199        $pref = \pref::getInstance();
1200        $pc = $this->priceCalcInit();
1201        $basket_items = $basket->getItems();
1202        foreach ($basket_items as $item_id => $item) {
1203            settype($item['pos_id'], 'int');
1204            settype($item['cnt'], 'int');
1205            $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`vc`, `doc_base`.`name`, `doc_base`.`cost` AS `base_price`
1206                        , `doc_base`.`cost_date` AS `price_date`, `mult`, `bulkcnt`
1207                    , `doc_base_dop`.`reserve`
1208                    , `doc_img`.`id` AS `img_id`, `doc_img`.`type` AS `img_type`
1209                    , `class_unit`.`rus_name1` AS `unit_name`
1210                FROM `doc_base`
1211                LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
1212                LEFT JOIN `doc_base_img` ON `doc_base_img`.`pos_id`=`doc_base`.`id` AND `doc_base_img`.`default`='1'
1213                LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
1214                LEFT JOIN `class_unit` ON `class_unit`.`id`=`doc_base`.`unit`
1215                WHERE `doc_base`.`id`=" . intval($item['pos_id']));
1216            $line = $res->fetch_assoc();
1217            if(!$line) {
1218                $basket->removeItem($item['pos_id']);
1219                continue;
1220            }
1221            $item = array_merge($item, $line);
1222            $item['price'] = $pc->getPosAutoPriceValue($item['id'], $item['cnt']);
1223
1224            // При нулевой цене предупреждать *товар под заказ*
1225            if ($item['price'] <= 0) {
1226                $lock_pay = 1;
1227                $locked_line = 1;
1228            } else {
1229                $locked_line = 0;
1230            }
1231
1232            // Не давать оформить заказ при нарушении кратности
1233            if ($item['mult'] > 1) {
1234                if ($item['cnt'] % $item['mult']) {
1235                    $lock_mult = 1;
1236                    $locked_line = 1;
1237                }
1238            }
1239
1240            // Если параметр включен - при превышении кол-ва на складе(за вычетом резервов) тоже сообщать *товар под заказ*
1241            if (\cfg::get('site', 'vitrina_cntlock')) {
1242                if ($pref->getSitePref('site_store_id')) {
1243                    $store_id = round($pref->getSitePref('site_store_id'));
1244                    $res = $db->query("SELECT `doc_base_cnt`.`cnt` FROM `doc_base_cnt` WHERE `id`='{$item['id']}' AND `sklad`='$store_id'");
1245                } else {
1246                    $res = $db->query("SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `id`='{$item['id']}'");
1247                }
1248                if ($res->num_rows) {
1249                    $tmp = $res->fetch_row();
1250                    $item['store_cnt'] = $tmp[0] - $item['reserve'];
1251                } else {
1252                    $item['store_cnt'] = $item['reserve'] * (-1);
1253                }
1254
1255                if ($item['cnt'] > $item['store_cnt']) {
1256                    $lock_pay = 1;
1257                    $locked_line = 1;
1258                }
1259            }
1260
1261            // При *серой* цене информировать - *товар под заказ*
1262            $item['gray_price'] = false;
1263            if (\cfg::get('site', 'grey_price_days')) {
1264                $cce_time = \cfg::get('site', 'grey_price_days') * 60 * 60 * 24;
1265                if (strtotime($item['price_date']) < $cce_time) {
1266                    if (\cfg::get('site', 'vitrina_pricelock')) {
1267                        $lock_pay = 1;
1268                        $locked_line = 1;
1269                    }
1270                    $item['gray_price'] = true;
1271                }
1272            }
1273
1274            $item['sum'] = $item['price'] * $item['cnt'];
1275            $sum += $item['sum'];
1276            $item['sum'] = sprintf("%0.2f", $item['sum']);
1277            $locked_line = $locked_line ? 'color: #f00' : '';
1278            if ($item['price'] <= 0) {
1279                $item['price'] = 'уточняйте';
1280            }           
1281           
1282            $item['product_link'] = $this->GetProductLink($item['pos_id'], '');
1283            $item['locked_line'] = $locked_line;
1284            $basket_items[$item_id] = $item;
1285        }
1286        return array(
1287            'lock_pay' => $lock_pay,
1288            'lock_mult' => $lock_mult,
1289            'sum'   => $sum,
1290            'items' => $basket_items,
1291        );       
1292    }
1293
1294    /// Просмотр корзины
1295    protected function Basket() {
1296        global $tmpl;
1297        $s = '';
1298        $sum_p = $exist = $lock = $lock_mark = $mult_lock = 0;
1299        $tmpl->addBreadCrumb('Главная', '/');
1300        $tmpl->addBreadCrumb('Корзина', '');
1301        $basket = $this->getBasket();
1302        if(!$basket) {
1303            $tmpl->addContent("<h1 id='page-title'>Ваша корзина</h1>");
1304            $tmpl->msg("Ваша корзина пуста! Выберите, пожалуйста интересующие Вас товары!", "info");
1305            return;
1306        }
1307       
1308        $tmpl->addContent("
1309            <h1 id='page-title'>Ваша корзина</h1>
1310            В поле *коментарий* вы можете высказать пожелания по конкретному товару (не более 100 символов).<br>
1311            <script>
1312            function korz_clear() {
1313            $.ajax({
1314            url: '/vitrina.php?mode=korz_clear',
1315            beforeSend: function() { $('#korz_clear_url').html('<img src=\"/img/icon_load.gif\" alt=\"обработка..\">'); },
1316            success: function() { $('#korz_ajax').html('Корзина очищена'); }
1317            })
1318            }
1319
1320            function korz_item_clear(id) {
1321            $.ajax({
1322                    url: '/vitrina.php?mode=korz_del&p='+id,
1323                    async: false,
1324                    beforeSend: function() { $('#korz_item_clear_url_'+id).html('<img src=\"/img/icon_load.gif\" alt=\"обработка..\">'); },
1325                    success: function() { $('#korz_ajax_item_'+id).remove(); },
1326                    complete: function() {
1327                    sum = 0;
1328                    $('span.sum').each(function() {
1329                    var num = parseFloat($(this).text());
1330                    if (num) sum += num;
1331                    });
1332                    $('span.sums').html(sum.toFixed(2));
1333                    }
1334            })}
1335            </script>");
1336   
1337        if ($basket['lock_pay']) {
1338            $tmpl->msg("Обратите внимание, Ваша корзина содержит наименования, доступные только под заказ (выделены красным). "
1339                . "Вы не сможете оплатить заказ до его подтверждения оператором.", "info", "Предупреждение");
1340        }
1341        if ($basket['lock_mult']) {
1342            $tmpl->msg("Количество заказанного Вами товара меньше, чем количество товара в упаковке. Строки с ошибкой выделены красным. Вы не сможете оормить заказ, пока не исправите ошибку.", "err", "Предупреждение");
1343            $buy_disable = ' disabled';
1344        } else {
1345            $buy_disable = '';
1346        }
1347        $tmpl->addContent("<form action='' method='post'>
1348            <input type='hidden' name='mode' value='basket_submit'>
1349            <table width='100%' class='list'>
1350            <tr class='title'><th>N</th><th>&nbsp;</th><th>Наименование</th><th>Цена</th><th>Сумма</th><th>Количество</th><th>Коментарии</th></tr>");
1351        $i = 1;
1352        foreach ($basket['items'] as $item) {               
1353            $lock_mark = $item['locked_line'] ? "style='color: #f00'" : '';
1354            $gray_price = $item['gray_price'] ? "style='color: #888'" : ''; 
1355            if(is_numeric($item['price'])) {
1356                $price_p = number_format($item['price'], 2, '.', '&nbsp;'); 
1357            }   
1358            else {
1359                $price_p = $item['price'];
1360            }
1361            $sum_p = number_format($item['sum'], 2, '.', '&nbsp;');
1362            if ($item['img_id']) {
1363                $miniimg = new \ImageProductor($item['img_id'], 'p', $item['img_type']);
1364                $miniimg->SetX(24);
1365                $miniimg->SetY(32);
1366                $item['img_uri'] = $miniimg->GetURI();
1367                $img = "<img_src='{$item['img_uri']}' alt='" . html_out($item['name']) . "'>";
1368            } else {
1369                $item['img_uri'] = null;
1370                $img = '';
1371            }
1372            $img = isset($item['img_uri']) ? "<img_src='{$item['img_uri']}' alt='" . html_out($item['name']) . "'>" : '';
1373            $tmpl->addContent("<tr id='korz_ajax_item_{$item['pos_id']}'{$lock_mark}>
1374                <td class='right'>$i <span id='korz_item_clear_url_{$item['pos_id']}'>
1375                    <a href='/vitrina.php?mode=korz_del&p={$item['pos_id']}' onClick='korz_item_clear({$item['pos_id']}); return false;'>
1376                    <img src='/img/i_del.png' alt='Убрать'></a></span></td>
1377                <td>$img</td>
1378                <td><a href='/vitrina.php?mode=product&amp;p={$item['pos_id']}'>" . html_out($item['name']) . "</a></td>
1379                <td class='right'{$gray_price}>$price_p</td>
1380                <td class='right'><span class='sum'>$sum_p</span></td>
1381                <td><input type='number' name='cnt{$item['pos_id']}' value='{$item['cnt']}' class='mini'></td>
1382                <td><input type='text' name='comm{$item['pos_id']}' style='width: 90%' value='" . html_out($item['comment']) . "' maxlength='100'></td>
1383                </tr>");
1384            $i++;
1385        }
1386       
1387        $tmpl->addContent("<tr class='total'><td>&nbsp;</td><td colspan='2'>Итого:</td><td colspan='4'><span class='sums'>$sum_p</span> рублей</td></tr>
1388            </table>
1389            <br>
1390            <center><button name='button' value='recalc' type='submit'>Пересчитать</button>
1391            <button name='button' value='buy' type='submit'{$buy_disable}>Оформить заказ</button></center><br>
1392            <center><span id='korz_clear_url'><a href='/vitrina.php?mode=korz_clear' onClick='korz_clear(); return false;'><b>Очистить корзину!</b></a></span></center><br>
1393            </form>
1394            </center><br><br>");
1395    }
1396
1397/// Оформление доставки
1398protected function Delivery() {
1399        $this->basket_sum = 0;
1400        $basket = Models\Basket::getInstance();
1401       
1402        if($basket->getCount()) {
1403                $pc = $this->priceCalcInit();
1404                $basket_items = $basket->getItems();
1405                foreach($basket_items as $item) {
1406                        $this->basket_sum += $pc->getPosAutoPriceValue($item['pos_id'], $item['cnt']) * $item['cnt'];
1407                }
1408        }
1409       
1410        if(!isset($_REQUEST['delivery_type'])) {
1411                $this->DeliveryTypeForm();
1412        }
1413        else if(!@$_REQUEST['delivery_region']) {
1414                $_SESSION['basket']['delivery_type'] = round($_REQUEST['delivery_type']);
1415                if($_REQUEST['delivery_type']==0)       
1416                        $this->BuyMakeForm();
1417                else {
1418                        if(isset($_SESSION['uid'])) {
1419                                $up = getUserProfile($_SESSION['uid']);
1420                                $this->basket_address   = @$up['main']['real_address'];
1421                        }
1422                        else    $this->basket_address = '';
1423                        $this->DeliveryRegionForm();
1424                }
1425        }
1426        else {
1427                $_SESSION['basket']['delivery_region']  = request('delivery_region');
1428                $_SESSION['basket']['delivery_address'] = request('delivery_address');
1429                $_SESSION['basket']['delivery_date']    = request('delivery_date');
1430                $this->BuyMakeForm();
1431        }
1432}
1433
1434/// Форма *способ доставки*
1435protected function DeliveryTypeForm() {
1436        global $tmpl, $db;
1437        $tmpl->setContent("<h1>Способ доставки</h1>");
1438        $tmpl->addContent("<form action='' method='post'>
1439        <input type='hidden' name='mode' value='delivery'>
1440        <label><input type='radio' name='delivery_type' value='0'> Самовывоз</label><br><small>Вы сможете забрать товар с нашего склада</small><br><br>");
1441        $res = $db->query("SELECT `id`, `name`, `min_price`, `description` FROM `delivery_types`");
1442        while($nxt=$res->fetch_assoc()) {
1443                $disabled = $this->basket_sum < $nxt['min_price']?' disabled':'';
1444                $tmpl->addContent("<label><input type='radio' name='delivery_type' value='{$nxt['id']}'$disabled> {$nxt['name']}</label><br>Минимальная сумма заказа - {$nxt['min_price']} рублей.<br><small>{$nxt['description']}</small><br><br>");
1445        }
1446        $tmpl->addContent("<button type='submit'>Далее</button></form>");
1447}
1448
1449/// Форма *регион доставки*
1450protected function DeliveryRegionForm()
1451{
1452        global $tmpl, $db;
1453        $tmpl->setContent("<h1>Регион доставки</h1>");
1454        $tmpl->addContent("<form action='' method='post'>
1455        <input type='hidden' name='mode' value='delivery'>
1456        <input type='hidden' name='delivery_type' value='{$_REQUEST['delivery_type']}'>");
1457        $res = $db->query("SELECT `id`, `name`, `price`, `description` FROM `delivery_regions` WHERE `delivery_type`='{$_SESSION['basket']['delivery_type']}'");
1458        while($nxt = $res->fetch_assoc()) {
1459                $tmpl->addContent("<label><input type='radio' name='delivery_region' value='{$nxt['id']}'> {$nxt['name']} - {$nxt['price']} рублей.</label><br><small>{$nxt['description']}</small><br><br>");
1460        }
1461        $tmpl->addContent("
1462        Желаемые дата и время доставки:<br>
1463        <input type='text' name='delivery_date'><br>
1464        Адрес доставки:<br>
1465        <textarea name='delivery_address' rows='5' cols='80'>".html_out($this->basket_address)."</textarea><br>
1466        <button type='submit'>Далее</button></form>");
1467}
1468
1469
1470/// Оформление покупки
1471protected function Buy() {
1472        global $tmpl;
1473        $step = rcvint('step');
1474        $tmpl->setContent("<h1 id='page-title'>Оформление заказа</h1>");
1475        if((!@$_SESSION['uid'])&&($step!=1))
1476        {
1477                if($step==2) {
1478                        $_SESSION['last_page']="/vitrina.php?mode=buy";
1479                        header("Location: /login.php?mode=reg");
1480                }
1481                if($step==3) {
1482                        $_SESSION['last_page']="/vitrina.php?mode=buy";
1483                        header("Location: /login.php");
1484                }
1485                else {
1486                        $_SESSION['last_page']="/vitrina.php?mode=buy";
1487                        $this->BuyAuthForm();
1488                }
1489        }
1490        else    $this->Delivery();
1491}
1492// -------- Вспомогательные функции ------------------
1493/// Поэлементный список подгрупп
1494protected function GroupList_ItemStyle($group)
1495{
1496        global $tmpl, $db;
1497        settype($group,'int');
1498        $res=$db->query("SELECT `id`, `name` FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `vieworder`,`name`");
1499        $tmpl->addStyle(".vitem { width: 250px; float: left; font-size: 14px; } .vitem:before{content: '\\203A \\0020' ; } hr.clear{border: 0 none; margin: 0;}");
1500        while($nxt=$res->fetch_row()) {
1501                $tmpl->addContent("<div class='vitem'><a href='".$this->GetGroupLink($nxt[0])."'>$nxt[1]</a></div>");
1502        }
1503        $tmpl->addContent("<hr class='clear'>");
1504}
1505/// Список групп с изображениями
1506protected function GroupList_ImageStyle($group) {
1507        global $tmpl, $CONFIG, $db;
1508
1509        $res = $db->query("SELECT * FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `vieworder`,`name`");
1510        $tmpl->addStyle(".vitem { width: 360px; float: left; font-size: 14px; margin: 10px;} .vitem img {float: left; padding-right: 8px;} hr.clear{border: 0 none; margin: 0;}");
1511        while ($nxt = $res->fetch_row()) {
1512                $link = $this->GetGroupLink($nxt[0]);
1513                $tmpl->addContent("<div class='vitem'><a href='$link'>");
1514                if (file_exists("{$CONFIG['site']['var_data_fs']}/category/$nxt[0].jpg")) {
1515                    $miniimg = new ImageProductor($nxt[0], 'g', 'jpg');
1516                    $miniimg->SetX(128);
1517                    $miniimg->SetY(128);
1518                    $tmpl->addContent("<img src='" . $miniimg->GetURI() . "' alt='" . html_out($nxt[1]) . "'>");
1519                } else {
1520                    if (file_exists($CONFIG['site']['location'] . '/skins/' . $CONFIG['site']['skin'] . '/no_photo.png'))
1521                            $img_url = '/skins/' . $CONFIG['site']['skin'] . '/no_photo.png';
1522                    else        $img_url = '/img/no_photo.png';
1523                    $tmpl->addContent("<img src='$img_url' alt='Изображение не доступно'>");
1524                }
1525                $tmpl->addContent("</a><div><a href='$link'><b>" . html_out($nxt[1]) . "</b></a><br>");
1526                if ($nxt[2]) {
1527                        $desc = explode('.', $nxt[2], 2);
1528                        if ($desc[0])   $tmpl->addContent($desc[0]);
1529                        else            $tmpl->addContent($nxt[2]);
1530                }
1531                $tmpl->addContent("</div></div>");
1532        }
1533        $tmpl->addContent("<hr class='clear'>");
1534}
1535   
1536    /// Получить количество тоовара для заказа по умолчанию
1537    /// @param $pos_info    Информация о товаре
1538    /// @return Количество тоовара для заказа по умолчанию
1539    protected function getBuyCnt($pos_info) {
1540        if ($pos_info['bulkcnt'] > 1) {
1541            return $pos_info['bulkcnt'];
1542        } else if ($pos_info['mult'] > 1) {
1543            return $pos_info['mult'];
1544        } else {
1545            return 1;
1546        }
1547    }
1548
1549    /// Простая таблица товаров
1550    /// @param $res mysqli_result Список товарных предложений
1551    /// @param $lim Максимальное количество выводимых строк
1552    protected function TovList_SimpleTable($res, $lim) {
1553        global $tmpl;
1554        $cce_time = \cfg::get('site', 'grey_price_days') * 60 * 60 * 24; 
1555        $s_retail = $s_current = $i = 0;
1556        $pc = $this->priceCalcInit();
1557
1558        $tmpl->addContent("<table width='100%' class='list'><tr class='title'>");
1559        if (\cfg::get('site', 'vitrina_show_vc')) {
1560            $tmpl->addContent("<th>Код</th>");
1561        }
1562        $tmpl->addContent("<th>Наименование</th><th>Производитель</th><th>Наличие</th>");
1563
1564        if ($pc->getRetailPriceId() != $pc->getDefaultPriceID()) {
1565            $tmpl->addContent("<th>В розницу</th><th>Оптом</th>");
1566            $s_retail = 1;
1567        } else {
1568            $tmpl->addContent("<th>Цена</th>");
1569        }
1570
1571        if ($pc->getCurrentPriceId() != $pc->getDefaultPriceID()) {
1572            $tmpl->addContent("<th>Для Вас</th>");
1573            $s_current = 1;
1574        }
1575
1576        $tmpl->addContent("<th>Купить</th></tr>");
1577        $basket_img = "/skins/" . \cfg::get('site', 'skin') . "/basket16.png";
1578
1579        while ($line = $res->fetch_assoc()) {
1580            $nal = $this->GetCountInfo($line['count'], @$line['tranit']);
1581            $link = $this->GetProductLink($line['id'], $line['name']);
1582            $buy_cnt = $this->getBuyCnt($line);
1583            $price = $pc->getPosDefaultPriceValue($line['id']);
1584            if ($price <= 0) {
1585                $price = 'уточняйте';
1586            }
1587
1588            $cce = '';
1589            if (\cfg::exist('site', 'grey_price_days')) {
1590                if (strtotime($line['cost_date']) < $cce_time) {
1591                    $cce = ' style=\'color:#888\'';
1592                }
1593            }
1594
1595            $tmpl->addContent("<tr>");
1596            if (\cfg::get('site', 'vitrina_show_vc')) {
1597                $tmpl->addContent("<td>" . html_out($line['vc']) . "</td>");
1598            }
1599            $tmpl->addContent("<td><a href='$link'>" . html_out($line['name']) . "</a></td>
1600                <td>" . html_out($line['proizv']) . "</td><td>$nal</td>");
1601            if ($s_retail) {
1602                $ret_price = $pc->getPosRetailPriceValue($line['id']);
1603                if ($ret_price <= 0) {
1604                    $ret_price = 'уточняйте';
1605                }
1606                $tmpl->addContent("<td{$cce}>$ret_price</td><td{$cce}>$price</td>");
1607            } else {
1608                $tmpl->addContent("<td{$cce}>$price</td>");
1609            }
1610            if ($s_current) {
1611                $user_price = $pc->getPosUserPriceValue($line['id']);
1612                if ($user_price <= 0) {
1613                    $user_price = 'уточняйте';
1614                }
1615                $tmpl->addContent("<td{$cce}>$user_price</td>");
1616            }
1617            $tmpl->addContent("<td>");
1618            if(!$line['eol'] || $line['count']>0) {
1619                $tmpl->addContent("<a rel='nofollow' href='/vitrina.php?mode=korz_add&amp;p={$line['id']}&amp;cnt=$buy_cnt'"
1620                    . " onclick=\"return ShowPopupWin('/vitrina.php?mode=korz_add&amp;p={$line['id']}&amp;cnt=$buy_cnt','popwin');\""
1621                    . " rel='nofollow'><img src='$basket_img' alt='В корзину!'></a>");
1622            }
1623            else {
1624                $tmpl->addContent("<b>EOL</b>");
1625            }
1626            $tmpl->addContent("</td></tr>");
1627            $i++;
1628            if ($i >= $lim) {
1629                break;
1630            }
1631        }
1632        $tmpl->addContent("</table>");
1633    }
1634
1635    /// Список товаров в виде изображений
1636    /// @param $res mysqli_result Список товарных предложений
1637    /// @param $lim Максимальное количество выводимых строк
1638    protected function TovList_ImageList($res, $lim) {
1639        global $tmpl;
1640        $cc = $i = 0;
1641        $cce_time = \cfg::get('site', 'grey_price_days') * 60 * 60 * 24; 
1642        $pc = $this->priceCalcInit();
1643
1644        while ($line = $res->fetch_assoc()) {
1645            $nal = $this->GetCountInfo($line['count'], $line['transit']);
1646            $link = $this->GetProductLink($line['id'], $line['name']);
1647
1648            $price = $pc->getPosDefaultPriceValue($line['id']);
1649            if ($price <= 0) {
1650                $price = 'уточняйте';
1651            }
1652
1653            $cce = '';
1654            if (\cfg::exist('site', 'grey_price_days')) {
1655                if (strtotime($line['cost_date']) < $cce_time) {
1656                    $cce = ' style=\'color:#888\'';
1657                }
1658            }
1659
1660            if ($line['img_id']) {
1661                $miniimg = new ImageProductor($line['img_id'], 'p', $line['img_type']);
1662                $miniimg->SetX(135);
1663                $miniimg->SetY(180);
1664                $img = "<img src='" . $miniimg->GetURI() . "' alt='" . html_out($line['name']) . "'>";
1665            } else {
1666                if (file_exists(\cfg::get('site', 'location') . '/skins/' . \cfg::get('site', 'skin') . '/no_photo.png')) {
1667                    $img_url = '/skins/' . \cfg::get('site', 'skin') . '/no_photo.png';
1668                } else {
1669                    $img_url = '/img/no_photo.png';
1670                }
1671                $img = "<img src='$img_url' alt='no photo' alt='no photo'>";
1672            }
1673           
1674            $buy_cnt = $this->getBuyCnt($line);
1675
1676            $tmpl->addContent("<div class='pitem'>
1677                <a href='$link'>$img</a>
1678                <div class='info'>
1679                <a href='$link'>" . html_out($line['name']) . "</a><br>
1680                <b>Код:</b> " . html_out($line['vc']) . "<br>
1681                <b>Цена:</b> <span{$cce}>$price руб.</span> / {$line['units']}<br>
1682                <b>Производитель:</b> " . html_out($line['proizv']) . "<br>
1683                <b>Кол-во:</b> $nal<br>");
1684            if($line['eol']) {
1685                $tmpl->addContent("<b>Товар снят с поставки</b><br>");   
1686            }
1687            if(!$line['eol'] || $line['count']>0) {
1688                $tmpl->addContent("<a rel='nofollow' href='/vitrina.php?mode=korz_add&amp;p={$line['id']}&amp;cnt=$buy_cnt'"
1689                    . " onclick=\"return ShowPopupWin('/vitrina.php?mode=korz_add&amp;p={$line['id']}&amp;cnt=$buy_cnt','popwin');\" rel='nofollow'>В корзину!</a>");
1690            }
1691            $tmpl->addContent("</div></div>");
1692
1693            $i++;
1694            $cc = 1 - $cc;
1695            if ($i >= $lim) {
1696                break;
1697            }
1698        }
1699        $tmpl->addContent("<div class='clear'></div>");
1700    }
1701
1702    /// Подробная таблица товаров
1703    /// @param $res mysqli_result Список товарных предложений
1704    /// @param $lim Максимальное количество выводимых строк
1705    protected function TovList_ExTable($res, $lim) {
1706        global $tmpl;
1707        $cce_time = \cfg::get('site', 'grey_price_days') * 60 * 60 * 24; 
1708        $pc = $this->priceCalcInit();
1709
1710        $tmpl->addContent("<table width='100%' class='list'><tr class='title'>");
1711        if (\cfg::get('site','vitrina_show_vc')) {
1712            $tmpl->addContent("<th>Код</th>");
1713        }
1714        $tmpl->addContent("<th>Наименование</th><th>Производитель</th><th>Наличие</th><th>Цена</th><th>d, мм</th><th>D, мм</th><th>B, мм</th><th>m, кг</th><th>Купить</th></tr>");
1715        $basket_img = "/skins/" . \cfg::get('site', 'skin') . "/basket16.png";
1716
1717        while ($line = $res->fetch_assoc()) {
1718            $nal = $this->GetCountInfo($line['count'], $line['transit']);
1719            $link = $this->GetProductLink($line['id'], $line['name']);
1720            $buy_cnt = $this->getBuyCnt($line);
1721            $price = $pc->getPosDefaultPriceValue($line['id']);
1722            if ($price <= 0) {
1723                $price = 'уточняйте';
1724            }
1725            $cce = '';
1726
1727            if (\cfg::exist('site', 'grey_price_days')) {
1728                if (strtotime($line['cost_date']) < $cce_time) {
1729                    $cce = ' style=\'color:#888\'';
1730                }
1731            }           
1732
1733            $tmpl->addContent("<tr>");
1734            if (\cfg::get('site', 'vitrina_show_vc')) {
1735                $tmpl->addContent("<td>" . html_out($line['vc']) . "</td>");
1736            }
1737            $tmpl->addContent("<td><a href='$link'>" . html_out($line['name']) . "</a><td>" . html_out($line['proizv']) . "<td>$nal
1738                <td $cce>$price<td>{$line['d_int']}<td>{$line['d_ext']}<td>{$line['size']}<td>{$line['mass']}<td>");
1739            if(!$line['eol'] || $line['count']>0) {
1740                $tmpl->addContent("<a href='/vitrina.php?mode=korz_add&amp;p={$line['id']}&amp;cnt=$buy_cnt'"
1741                    . " onclick=\"return ShowPopupWin('/vitrina.php?mode=korz_add&amp;p={$line['id']}&amp;cnt=$buy_cnt','popwin');\""
1742                    . " rel='nofollow'><img src='$basket_img' alt='В корзину!'></a>");
1743            }
1744            else {
1745                $tmpl->addContent("<b>EOL</b>");
1746            }
1747        }
1748        $tmpl->addContent("</table>");
1749    }
1750
1751/// Форма аутентификации при покупке. Выдаётся, только если посетитель не вошёл на сайт
1752protected function BuyAuthForm() {
1753        global $tmpl;
1754        $tmpl->setTitle("Оформление зкакза");
1755        $tmpl->addContent("<p id='text'>Рекомендуем зарегистрироваться! Регистрация не сложная, и займёт пару минут.
1756        Кроме того, все зарегистрированные пользователи получают возможность приобретать товары по специальным ценам.</p>
1757        <form action='' method='post'>
1758        <input type='hidden' name='mode' value='buy'>
1759        <label><input type='radio' name='step' value='1'>Оформить заказ без регистрации</label><br>
1760        <label><input type='radio' name='step' value='2'>Зарегистрироваться как новый покупатель</label><br>
1761        <label><input type='radio' name='step' value='3'>Войти как уже зарегистрированный покупатель</label><br>");
1762        $oauth_login = new \Modules\Site\oauthLogin();
1763        $msg = "Если вы зарегистрированы на одном из этих сервисов - выберите его, и получите специальную цену";
1764        $tmpl->addContent( $oauth_login->getLoginForm($msg) );       
1765        $tmpl->addContent("
1766        <button type='submit'>Далее</button>
1767        </form>");
1768}
1769
1770    /// Заключительная форма оформления покупки
1771    protected function BuyMakeForm() {
1772        global $tmpl;
1773        if (@$_SESSION['uid']) {
1774            $up = getUserProfile($_SESSION['uid']);
1775            $str = 'Товар будет зарезервирован для Вас на 3 рабочих дня.';
1776            $email_field = '';
1777        } else {
1778            $up = getUserProfile(-1); // Пустой профиль
1779            $str = '<b>Для незарегистрированных пользователей товар на складе не резервируется.</b>';
1780            $email_field = "
1781                Необходимо заполнить телефон или e-mail<br><br>";
1782        }
1783
1784        if (isset($_REQUEST['cwarn'])) {
1785            $tmpl->msg("Необходимо заполнить e-mail или контактный телефон!", "err");
1786        }
1787       
1788        $rname = html_out(isset($up['main']['reg_phone'])?$up['main']['real_name']:'');
1789        $phone = html_out(isset($up['main']['reg_phone'])?$up['main']['reg_phone']:'');
1790        $email = html_out(isset($up['main']['reg_phone'])?$up['main']['reg_email']:'');
1791
1792        $tmpl->addContent("
1793        <h4>Для оформления заказа требуется следующая информация</h4>
1794        <form action='/vitrina.php' method='post'>
1795        <input type='hidden' name='mode' value='makebuy'>
1796        <div>
1797        Имя, Фамилия<br>
1798        <input type='text' name='rname' value='$rname' placeholder='Иван Иванов'><br>
1799        e-mail:<br>
1800        <input type='text' name='email' value='$email' placeholder='user@host.zone'><br>
1801        Мобильный телефон:<br>
1802        <input type='text' name='phone' value='$phone' maxlength='12' placeholder='+7XXXXXXXXXX' id='phone'><br>
1803        <br>
1804
1805        $email_field");
1806        $pay_def = \cfg::get('payments', 'default');
1807        if (is_array(\cfg::get('payments', 'types'))) {
1808            $tmpl->addContent("<br>Способ оплаты:<br>");
1809            foreach (\cfg::get('payments', 'types') as $type => $val) {
1810                if (!$val) {
1811                    continue;
1812                }
1813                if ($type == $pay_def) {
1814                    $checked = ' checked';
1815                } else {
1816                    $checked = '';
1817                }
1818                switch ($type) {
1819                    case 'cash': $s = "<label><input type='radio' name='pay_type' value='$type' id='soplat_nal'$checked>Наличный расчет.
1820                                <b>Только самовывоз</b>, расчет при отгрузке. $str</label><br>";
1821                        break;
1822                    case 'bank': $s = "<label><input type='radio' name='pay_type' value='$type'$checked>Безналичный банкосвкий перевод.
1823                                <b>Дольше</b> предыдущего - обработка заказа начнётся <b>только после поступления денег</b> на наш счёт (занимает 1-2 дня). После оформления заказа Вы сможете распечатать счёт для оплаты.</label><br>";
1824                        break;
1825                    case 'wmr': $s = "<label><input type='radio' name='pay_type' value='$type'$checked>Webmoney WMR.
1826                                                <b>Cамый быстрый</b> способ получить Ваш заказ. <b>Заказ поступит в обработку сразу</b> после оплаты.</b></label><br>";
1827                        break;
1828                    case 'card_o': $s = "<label><input type='radio' name='pay_type' value='$type'$checked>Платёжной картой
1829                                                <b>VISA, MasterCard</b> на сайте. Обработка заказа начнётся после подтверждения оплаты банком (обычно сразу после оплаты).</label><br>";
1830                        break;
1831                    case 'card_t': $s = "<label><input type='radio' name='pay_type' value='$type'$checked>Платёжной картой
1832                                                <b>VISA, MasterCard</b> при получении товара. С вами свяжутся и обсудят условия.</label><br>";
1833                        break;
1834                    case 'credit_brs': $s = "<label><input type='radio' name='pay_type' value='$type'$checked>Онлайн-кредит в банке &quot;Русский стандарт&quot; за 5 минут</label><br>";
1835                        break;
1836                    default: $s = '';
1837                }
1838                $tmpl->addContent($s);
1839            }
1840        }
1841
1842        $tmpl->addContent("
1843        Другая информация:<br>
1844        <textarea name='dop' rows='5' cols='80'>" . html_out(@$up['dop']['dop_info']) . "</textarea><br>
1845        <button type='submit'>Оформить заказ</button>
1846        </div>
1847        </form>");
1848    }
1849
1850/// Сделать покупку
1851    protected function MakeBuy() {
1852        global $tmpl, $CONFIG, $db;
1853        $pref = \pref::getInstance();
1854        $pay_type = request('pay_type');
1855        switch ($pay_type) {
1856            case 'bank':
1857            case 'cash':
1858            case 'card_o':
1859            case 'card_t':
1860            case 'credit_brs':
1861            case 'wmr': break;
1862            default: $pay_type = '';
1863        }
1864        $rname = request('rname');
1865        $delivery = intval($_SESSION['basket']['delivery_type']);
1866        $delivery_region = @$_SESSION['basket']['delivery_region'];
1867        $email = request('email');
1868        $comment = request('dop');
1869
1870        $rname_sql = $db->real_escape_string($rname);
1871        $adres_sql = $db->real_escape_string(@$_SESSION['basket']['delivery_address']);
1872        $delivery_date = $db->real_escape_string(@$_SESSION['basket']['delivery_date']);
1873        $email_sql = $db->real_escape_string($email);
1874        $comment_sql = $db->real_escape_string($comment);
1875        $agent = $pref->getSitePref('default_agent_id');
1876       
1877        $phone = request('phone');
1878        if ($phone) { // Пробуем выполнить нормализацию номера телефона
1879            $phone = normalizePhone($phone);
1880            if ($phone === false) {
1881                header("Location: /vitrina.php?mode=buyform&step=1&cwarn=1");
1882                return;
1883            }
1884        } else {
1885            $phone = '';
1886        }
1887
1888        if (@$_SESSION['uid']) {
1889            $db->updateA('users', $_SESSION['uid'], [
1890                'real_address'=>@$_SESSION['basket']['delivery_address'],
1891                'real_name'=>$rname,
1892            ]);           
1893            $res = $db->query("REPLACE `users_data` (`uid`, `param`, `value`) VALUES ('{$_SESSION['uid']}', 'dop_info', '$comment_sql') ");
1894            // Получить ID агента
1895            $res = $db->query("SELECT `name`, `reg_email`, `reg_date`, `reg_email_subscribe`, `real_name`, `reg_phone`, `real_address`, `agent_id` FROM `users` WHERE `id`='{$_SESSION['uid']}'");
1896            $user_data = $res->fetch_assoc();
1897            $agent = $user_data['agent_id'];
1898            settype($agent, 'int');
1899            if ($agent < 1) {
1900                $agent = $pref->getSitePref('default_agent_id');
1901            }
1902        }
1903        else if (!$phone && !$email) {
1904            header("Location: /vitrina.php?mode=buyform&step=1&cwarn=1");
1905            return;
1906        }
1907
1908        $basket = Models\Basket::getInstance();
1909
1910        if ($basket->getCount()) {
1911            $pc = $this->priceCalcInit();
1912            $basket_items = $basket->getItems();
1913
1914            $subtype = \cfg::get('site', 'vitrina_subtype', 'site');
1915           
1916            $tm = time();
1917            $altnum = GetNextAltNum(3, $subtype, 0, date('Y-m-d'), $pref->site_default_firm_id);
1918            $ip = getenv("REMOTE_ADDR");
1919            if ($pref->getSitePref("default_bank_id")) {
1920                $bank = $pref->getSitePref("default_bank_id");
1921            } else {
1922                $res = $db->query("SELECT `num` FROM `doc_kassa` WHERE `ids`='bank' AND `firm_id`='{$pref->site_default_firm_id}'");
1923                if ($res->num_rows < 1) {
1924                    throw new Exception("Не найден банк выбранной организации");
1925                }
1926                list($bank) = $res->fetch_row();
1927            }
1928
1929            if (isset($_SESSION['uid'])) {
1930                $uid = $_SESSION['uid'];
1931            } else {
1932                $uid = 0;
1933            }
1934           
1935            $doc_data = [
1936                'type' => 3,
1937                'agent' => $agent,
1938                'date' => $tm,
1939                'firm_id' => $pref->getSitePref("default_firm_id"),
1940                'sklad' => $pref->getSitePref("default_store_id"),
1941                'bank' => $bank,
1942                'user' => $uid,
1943                'nds' => 1,
1944                'altnum' => $altnum,
1945                'subtype' => $subtype,
1946                'comment' => $comment,
1947            ];
1948            $doc = $db->insertA('doc_list', $doc_data);
1949
1950            $res = $db->query("REPLACE INTO `doc_dopdata` (`doc`, `param`, `value`) VALUES ('$doc', 'ishop', '1'),  ('$doc', 'buyer_email', '$email_sql'), ('$doc', 'buyer_phone', '$phone'), ('$doc', 'buyer_rname', '$rname_sql'), ('$doc', 'buyer_ip', '$ip'), ('$doc', 'delivery', '$delivery'), ('$doc', 'delivery_date', '$delivery_date'), ('$doc', 'delivery_address', '$adres_sql'), ('$doc', 'delivery_region', '$delivery_region'), ('$doc', 'pay_type', '$pay_type')");
1951
1952            $order_items = $admin_items = $lock = '';
1953
1954            foreach ($basket_items as $item) {
1955                settype($item['pos_id'], 'int');
1956
1957                $price = $pc->getPosAutoPriceValue($item['pos_id'], $item['cnt']);
1958                $db->insertA('doc_list_pos', array(
1959                    'doc' => $doc,
1960                    'tovar' => $item['pos_id'],
1961                    'cnt' => $item['cnt'],
1962                    'cost' => $price,
1963                    'comm' => $item['comment']
1964                ));
1965
1966                $res = $db->query("SELECT `doc_base`.`id`, CONCAT(`doc_group`.`printname`, ' ' , `doc_base`.`name`) AS `pos_name`,
1967                        `doc_base`.`proizv` AS `vendor`, `doc_base`.`vc`, `doc_base`.`cost` AS `base_price`,
1968                        `class_unit`.`rus_name1` AS `unit_name`, `doc_base`.`cost_date`,
1969                        `doc_base_dop`.`reserve`
1970                    FROM `doc_base`
1971                    LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
1972                    LEFT JOIN `doc_group` ON `doc_group`.`id`=`doc_base`.`group`
1973                    LEFT JOIN `class_unit` ON `class_unit`.`id`=`doc_base`.`unit`
1974                    WHERE `doc_base`.`id`='{$item['pos_id']}'");
1975
1976                $pos_info = $res->fetch_assoc();
1977                $item_str = $pos_info['pos_name'] . '/' . $pos_info['vendor'];
1978                if ($pos_info['vc']) {
1979                    $item_str .= ' (' . $pos_info['vc'] . ')';
1980                }
1981                $item_str .= ' - ' . $item['cnt'] . ' ' . $pos_info['unit_name'] . ' - ' . $price . ' руб.';
1982                $order_items .= $item_str . "\n";
1983                $admin_items .= $item_str . " (базовая - {$pos_info['base_price']} руб.)\n";
1984
1985                if ($price <= 0) {
1986                    $lock = 1;
1987                    $lock_mark = 1;
1988                }
1989                $cnt_lock = \cfg::get('site', 'vitrina_cntlock') ;
1990                $price_lock = \cfg::get('site', 'vitrina_pricelock') ;
1991                if ( $cnt_lock || $price_lock) {
1992                    if ($cnt_lock) {
1993                        if ($pref->getSitePref('site_store_id')) {
1994                            $sklad_id = round($pref->getSitePref('site_store_id'));
1995                            $res = $db->query("SELECT `doc_base_cnt`.`cnt` FROM `doc_base_cnt` WHERE `id`='{$item['pos_id']}' AND `sklad`='$sklad_id'");
1996                        } else {
1997                            $res = $db->query("SELECT SUM(`doc_base_cnt`.`cnt`) FROM `doc_base_cnt` WHERE `id`='{$item['pos_id']}'");
1998                        }
1999                        if ($res->num_rows) {
2000                            $tmp = $res->fetch_row();
2001                            $sklad_cnt = $tmp[0] - $pos_info['reserve'];
2002                        } else {
2003                            $sklad_cnt = $pos_info['reserve'] * (-1);
2004                        }
2005
2006                        if ($item['cnt'] > $sklad_cnt) {
2007                            $lock = 1;
2008                            $lock_mark = 1;
2009                        }
2010                    }
2011                    if ($price_lock) {
2012                        if (strtotime($pos_info['cost_date']) < (time() - 60 * 60 * 24 * 30 * 6)) {
2013                            $lock = 1;
2014                            $lock_mark = 1;
2015                        }
2016                    }
2017                }
2018            }
2019            if ($_SESSION['basket']['delivery_type']) {
2020                $res = $db->query("SELECT `service_id` FROM `delivery_types` WHERE `id`='$delivery'");
2021                list($d_service_id) = $res->fetch_row();
2022                $res = $db->query("SELECT `price` FROM `delivery_regions` WHERE `id`='$delivery_region'");
2023                list($d_price) = $res->fetch_row();
2024                $res = $db->query("INSERT INTO `doc_list_pos` (`doc`,`tovar`,`cnt`,`cost`,`comm`) VALUES ('$doc','$d_service_id','1','$d_price','')");
2025                $res = $db->query("SELECT `doc_base`.`id`, CONCAT(`doc_group`.`printname`, ' ', `doc_base`.`name`) AS `pos_name`
2026                    FROM `doc_base`
2027                    LEFT JOIN `doc_group` ON `doc_group`.`id`=`doc_base`.`group`
2028                    LEFT JOIN `class_unit` ON `class_unit`.`id`=`doc_base`.`unit`
2029                    WHERE `doc_base`.`id`='$d_service_id'");
2030                $pos_info = $res->fetch_assoc();
2031                $order_items .= $pos_info['pos_name'] . " - $d_price руб.\n";
2032                $admin_items .= $pos_info['pos_name'] . " - $d_price руб.\n";
2033            }
2034            $zakaz_sum = DocSumUpdate($doc);
2035            $_SESSION['order_id'] = $doc;
2036
2037            $text = "На сайте {$pref->site_name} оформлен новый заказ.\n";
2038            $text.="Посмотреть можно по ссылке: http://{$pref->site_name}/doc.php?mode=body&doc=$doc\nIP отправителя: " . getenv("REMOTE_ADDR") . "\nSESSION ID:" . session_id();
2039            if (@$_SESSION['name']) {
2040                $text.="\nLogin отправителя: " . $_SESSION['name'];
2041            }
2042            $text.="----------------------------------\n" . $admin_items;
2043           
2044            if ($pref->getSitePref('jid')) {
2045                try {
2046                    require_once($CONFIG['location'] . '/common/XMPPHP/XMPP.php');
2047                    $xmppclient = new \XMPPHP\XMPP($CONFIG['xmpp']['host'], $CONFIG['xmpp']['port'], $CONFIG['xmpp']['login'], $CONFIG['xmpp']['pass'], 'MultiMag r' . MULTIMAG_REV);
2048                    $xmppclient->connect();
2049                    $xmppclient->processUntil('session_start');
2050                    $xmppclient->presence();
2051                    $xmppclient->message($pref->getSitePref('jid'), $text);
2052                    $xmppclient->disconnect();
2053                } catch (\XMPPHP\Exception $e) {
2054                    writeLogException($e);
2055                    $tmpl->errorMessage("Невозможно отправить сообщение XMPP!", "err");
2056                }
2057            }
2058            if ($pref->getSitePref('email')) {
2059                mailto($pref->getSitePref('email'), "Message from {$pref->site_name}", $text);
2060            }
2061
2062            if (@$_SESSION['uid']) {
2063                $user_msg = "Доброго времени суток, {$user_data['name']}!\nНа сайте {$pref->site_name} на Ваше имя оформлен заказ на сумму $zakaz_sum рублей\nЗаказано:\n";
2064                $email = $user_data['reg_email'];
2065            } else {
2066                $user_msg = "Доброго времени суток, $rname!\nКто-то (возможно, вы) при оформлении заказа на сайте {$pref->site_name}, указал Ваш адрес электронной почты.\nЕсли Вы не оформляли заказ, просто проигнорируйте это письмо.\n Номер заказа: $doc/$altnum\nЗаказ на сумму $zakaz_sum рублей\nЗаказано:\n";
2067            }
2068            $user_msg.="--------------------------------------\n$order_items\n--------------------------------------\n";
2069            $user_msg.="\n\n\nСообщение отправлено роботом. Не отвечайте на это письмо.";
2070
2071            if ($email) {
2072                mailto($email, "Message from {$pref->site_name}", $user_msg);
2073            }
2074
2075            $tmpl->setContent("<h1 id='page-title'>Заказ оформлен</h1>");
2076            if (!$lock) {
2077                switch ($pay_type) {
2078                    case 'bank':
2079                    case 'card_o':
2080                    case 'credit_brs':
2081                        $tmpl->addContent("<p>Заказ оформлен. Теперь вы можете оплатить его! <a href='/vitrina.php?mode=pay'>Перейти к оплате</a></p>");
2082                        break;
2083                    default:
2084                        $tmpl->msg("Ваш заказ оформлен! Номер заказа: $doc/$altnum. Запомните или запишите его. С вами свяжутся в ближайшее время для уточнения деталей!");
2085                }
2086            } else {
2087                $tmpl->msg("Ваш заказ оформлен! Номер заказа: $doc/$altnum. Запомните или запишите его. С вами свяжутся в ближайшее время для уточнения цены и наличия товара! Оплатить заказ будет возможно после его подтверждения оператором.");
2088            }
2089            //unset($_SESSION['basket']);
2090            $basket->clear();
2091            $basket->save();
2092        } else {
2093            $tmpl->msg("Ваша корзина пуста! Вы не можете оформить заказ! Быть может, Вы его уже оформили?", "err");
2094        }
2095    }
2096   
2097    /// Обработка процесса оплаты заказа
2098    protected function Payment() {
2099        global $tmpl, $CONFIG, $db;
2100        $order_id = isset($_SESSION['order_id'])?intval($_SESSION['order_id']):0;
2101        $uid = isset($_SESSION['uid'])?intval($_SESSION['uid']):0;
2102        $pref = \pref::getInstance();
2103        $res = $db->query("SELECT `doc_list`.`id` FROM `doc_list`
2104        WHERE `doc_list`.`p_doc`='$order_id' AND (`doc_list`.`type`='4' OR `doc_list`.`type`='6') AND `doc_list`.`mark_del`='0'");
2105        if ($res->num_rows) {
2106            $tmpl->msg("Этот заказ уже оплачен!");
2107        } else {
2108            $res = $db->query("SELECT `doc_list`.`id`, `dd_pt`.`value` AS `pay_type`, `doc_list`.`altnum` FROM `doc_list`
2109                LEFT JOIN `doc_dopdata` AS `dd_pt` ON `dd_pt`.`doc`=`doc_list`.`id` AND `dd_pt`.`param`='pay_type'
2110                WHERE `doc_list`.`id`='$order_id' AND `doc_list`.`type`='3'");
2111
2112            $order_info = $res->fetch_assoc();
2113            if ($order_info['pay_type'] == 'card_o') {
2114                $init_url = "{$CONFIG['gpb']['initial_url']}?lang=ru&merch_id={$CONFIG['gpb']['merch_id']}&back_url_s=http://{$pref->site_name}/gpb_pay_success.php&back_url_f=http://{$pref->site_name}/gpb_pay_failed.php&o.order_id=$order_id";
2115                header("Location: $init_url");
2116                exit();
2117            } else if ($order_info['pay_type'] == 'credit_brs') {
2118                $res = $db->query("SELECT `doc_list_pos`.`tovar`, CONCAT(`doc_group`.`printname`, ' ', `doc_base`.`name`) AS `name`, `doc_list_pos`.`cnt`, `doc_list_pos`.`cost`
2119                        FROM `doc_list_pos`
2120                        INNER JOIN `doc_base` ON `doc_base`.`id`=`doc_list_pos`.`tovar`
2121                        INNER JOIN `doc_group` ON `doc_group`.`id`=`doc_base`.`group`
2122                        WHERE `doc_list_pos`.`doc`=$order_id");
2123                $pos_line = '';
2124                $cnt = 0;
2125                while ($line = $res->fetch_assoc()) {
2126                    $cnt++;
2127                    $pos_line.="&TC_$cnt={$line['cnt']}&TPr_$cnt={$line['cost']}&TName_$cnt=" . urlencode($line['name']);
2128                }
2129                $url = "{$CONFIG['credit_brs']['address']}?idTpl={$CONFIG['credit_brs']['id_tpl']}&TTName={$pref->site_name}&Order=$order_id&TCount={$cnt}{$pos_line}";
2130                header("Location: $url");
2131                exit();
2132            } else if ($order_info['pay_type'] == 'bank') {
2133                if(!$uid) {
2134                    $tmpl->errorMessage("В настоящий момент, получить печатную форму счёта онлайн могут только зарегистрированные пользователи. Номер счёта: $order_id/{$order_info['altnum']}. Для получения печатной формы счёта обратитесь к оператору.");
2135                }
2136                else {
2137                    $tmpl->msg("Номер счёта: $order_id/{$order_info['altnum']}. Теперь Вам необходимо <a href='/user.php?mode=get_doc&doc=$order_id'>получить счёт</a>, и оплатить его. После оплаты счёта Ваш заказ поступит в обработку.");
2138                    $tmpl->addContent("<a href='/user.php?mode=get_doc&doc=$order_id'>Получить счёт</a>");
2139                }
2140            } else {
2141                throw new Exception("Данный тип оплаты ({$order_info['pay_type']}) не поддерживается!");
2142            }
2143        }
2144    }
2145
2146/// Отобразить панель страниц
2147protected function PageBar($group, $item_count, $per_page, $cur_page)
2148{
2149        global $tmpl;
2150        if($item_count>$per_page)
2151        {
2152                $pages_count=ceil($item_count/$per_page);
2153                if($cur_page<1)                 $cur_page=1;
2154                if($cur_page>$pages_count)      $cur_page=$pages_count;
2155                $tmpl->addContent("<div class='pagebar'>");
2156                if($cur_page>1)
2157                {
2158                        $i=$cur_page-1;
2159                        $tmpl->addContent(" <a href='".$this->GetGroupLink($group, $i)."'>&lt;&lt;</a> ");
2160                }       else    $tmpl->addContent(" &lt;&lt; ");
2161
2162                for($i=1;$i<$pages_count+1;$i++)
2163                {
2164                        if($i==$cur_page) $tmpl->addContent(" $i ");
2165                        else $tmpl->addContent(" <a href='".$this->GetGroupLink($group, $i)."'>$i</a> ");
2166                }
2167                if($cur_page<$pages_count)
2168                {
2169                        $i=$cur_page+1;
2170                        $tmpl->addContent(" <a href='".$this->GetGroupLink($group, $i)."'>&gt;&gt;</a> ");
2171                }       else    $tmpl->addContent(" &gt;&gt; ");
2172                $tmpl->addContent("</div>");
2173        }
2174}
2175
2176/// Возвращает html код *хлебных крошек* витрины
2177/// @param $group_id Текущая группа витрины
2178protected function GetVitPath($group_id)
2179{
2180        global $db;
2181        settype($group_id,'int');
2182        $res=$db->query("SELECT `id`, `name`, `pid` FROM `doc_group` WHERE `id`='$group_id'");
2183        $nxt=$res->fetch_row();
2184        if(!$nxt)       return "<a href='/vitrina.php'>Витрина</a>";
2185        return $this->GetVitPath($nxt[2])." / <a href='".$this->GetGroupLink($nxt[0])."'>$nxt[1]</a>";
2186}
2187/// Получить ссылку на группу с заданным ID
2188protected function GetGroupLink($group, $page=1, $alt_param='')
2189{
2190        global $CONFIG;
2191        if($CONFIG['site']['rewrite_enable'])   return "/vitrina/ig/$page/$group.html".($alt_param?"?$alt_param":'');
2192        else                                    return "/vitrina.php?mode=group&amp;g=$group".($page?"&amp;p=$page":'').($alt_param?"&amp;$alt_param":'');
2193}
2194
2195    /// Получить ссылку на товар с заданным ID
2196    protected function GetProductLink($product, $name, $alt_param = '') {
2197        if (\cfg::get('site', 'rewrite_enable')) {
2198            return "/vitrina/ip/$product.html" . ($alt_param ? "?$alt_param" : '');
2199        } else {
2200            return "/vitrina.php?mode=product&amp;p=$product" . ($alt_param ? "&amp;$alt_param" : '');
2201        }
2202    }
2203
2204/// Получить информации о количестве товара. Формат информации - в конфигурационном файле
2205protected function GetCountInfo($count, $tranzit)
2206{
2207        global $CONFIG;
2208        if(!isset($CONFIG['site']['vitrina_pcnt_limit']))       $CONFIG['site']['vitrina_pcnt_limit']   = array(1,10,100);
2209        if($CONFIG['site']['vitrina_pcnt']==1)
2210        {
2211                if($count<=0)
2212                {
2213                        if($tranzit) return 'в пути';
2214                        else    return 'уточняйте';
2215                }
2216                else if($count<=$CONFIG['site']['vitrina_pcnt_limit'][0]) return '*';
2217                else if($count<=$CONFIG['site']['vitrina_pcnt_limit'][1]) return '**';
2218                else if($count<=$CONFIG['site']['vitrina_pcnt_limit'][2]) return '***';
2219                else return '****';
2220        }
2221        else if($CONFIG['site']['vitrina_pcnt']==2)
2222        {
2223                if($count<=0)
2224                {
2225                        if($tranzit) return 'в пути';
2226                        else    return 'уточняйте';
2227                }
2228                else if($count<=$CONFIG['site']['vitrina_pcnt_limit'][0]) return 'мало';
2229                else if($count<=$CONFIG['site']['vitrina_pcnt_limit'][1]) return 'есть';
2230                else if($count<=$CONFIG['site']['vitrina_pcnt_limit'][2]) return 'много';
2231                else return 'оч.много';
2232        }
2233        else    return round($count).($tranzit?('('.$tranzit.')'):'');
2234}
2235
2236    protected function priceCalcInit() {
2237        $pc = PriceCalc::getInstance();       
2238        if ($this->is_pc_init) {
2239            return $pc;
2240        } else {
2241            $this->is_pc_init = 1;
2242        }
2243        $pref = \pref::getInstance();
2244        $pc->setFirmId($pref->site_default_firm_id);
2245        $basket = Models\Basket::getInstance();
2246        if (@$_SESSION['uid']) {
2247            $pc->setFromSiteFlag(1);
2248            $up = getUserProfile($_SESSION['uid']);
2249            $pc->setAgentId($up['main']['agent_id']);
2250            $pc->setUserId($_SESSION['uid']);
2251        }
2252
2253        if ($basket->getCount()) {
2254            $basket_items = $basket->getItems();
2255            $sum = 0;
2256            foreach ($basket_items as $item) {
2257                $sum += $pc->getPosDefaultPriceValue($item['pos_id']) * $item['cnt'];
2258            }
2259            $pc->setOrderSum($sum);
2260            $this->base_basket_sum = $sum;
2261        }
2262        return $pc;
2263    }
2264
2265}
2266
2267// if(($mode=='')&&($gr==''))
2268// {
2269//      $arr = explode( '/' , $_SERVER['REQUEST_URI'] );
2270//      if($arr[2]=='i')
2271//      {
2272//              $arr = explode( '.' , $arr[3] );
2273//              $pos=urldecode(urldecode($arr[0]));
2274//              $pos=explode(":",$pos,2);
2275//              $proizv=$pos[1];
2276//              $pos=$pos[0];
2277//              if($proizv) $proizv="AND `proizv` LIKE '$proizv'";
2278//              $res=mysql _query("SELECT `id` FROM `doc_base` WHERE `name`  LIKE '$pos' $proizv");
2279//              @$pos=mysql _result($res,0,0);
2280//              if($pos)
2281//              {
2282//                      $p=$pos;
2283//                      $mode='info';
2284//              }
2285//              else $tmpl->msg("Выбранное наименование не найдено! Попробуйте поискать по каталогу!","info");
2286//      }
2287// }
2288
2289try
2290{
2291    $tmpl->setTitle("Интернет - витрина");
2292
2293    if (file_exists($CONFIG['site']['location'] . '/skins/' . $CONFIG['site']['skin'] . '/vitrina.tpl.php')) {
2294        include_once($CONFIG['site']['location'] . '/skins/' . $CONFIG['site']['skin'] . '/vitrina.tpl.php');
2295    }
2296    if (!isset($vitrina)) {
2297        $vitrina = new Vitrina();
2298    }
2299
2300    if (!$vitrina->ProbeRecode()) {
2301        $mode = request('mode');
2302        $vitrina->ExecMode($mode);
2303    }
2304} catch(mysqli_sql_exception $e) {
2305    $tmpl->ajax=0;
2306    $id = writeLogException($e);
2307    $tmpl->errorMessage("Порядковый номер ошибки: $id<br>Сообщение об ошибке занесено в журнал", "Ошибка в базе данных");
2308} catch(Exception $e) {
2309    writeLogException($e);
2310    $tmpl->errorMessage($e->getMessage());
2311}
2312
2313$tmpl->write();
Note: See TracBrowser for help on using the repository browser.