1
vitrina.php in web – MultiMag

source: web/vitrina.php @ 5f22008

Last change on this file since 5f22008 was 5f22008, checked in by GitHub <noreply@…>, 3 years ago

Merge pull request #7 from magnatiwe/fix_products_with_photo_filter

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

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