1
vitrina.php in web – MultiMag

source: web/vitrina.php @ dea1a39

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