1
vitrina.php in web – MultiMag

source: web/vitrina.php @ 61a8e52

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

Фикс бага при котором не возможно после применения фильтра вернуть прежние значения из-за того что пропадает панель с фильтрами

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