1
Changeset 982 – MultiMag

Changeset 982


Ignore:
Timestamp:
Sep 10, 2018, 1:10:19 AM (2 months ago)
Author:
blacklight
Message:
  • Добавлена настройка порядка расположения групп в каталоге
Location:
trunk
Files:
1 deleted
34 edited

Legend:

Unmodified
Added
Removed
  • trunk/common/core.common.php

    r976 r982  
    1818//
    1919
    20 define("MULTIMAG_REV", "972");
     20define("MULTIMAG_REV", "982");
    2121define("MULTIMAG_VERSION", "0.2.".MULTIMAG_REV);
    2222
  • trunk/common/pricewriter/csv.php

    r963 r982  
    8383    /// param $group id номенклатурной группы
    8484    function write($group = 0) {
    85         $res = $this->db->query("SELECT `id`, `name`, `printname` FROM `doc_group` WHERE `pid`='$group' AND `hidelevel`='0' ORDER BY `id`");
     85        $res = $this->db->query("SELECT `id`, `name`, `printname` FROM `doc_group` WHERE `pid`='$group' AND `hidelevel`='0' ORDER BY `vieworder`,`name`");
    8686        while ($nxt = $res->fetch_row()) {
    8787            if ($nxt[0] == 0) {
  • trunk/common/pricewriter/html.php

    r969 r982  
    9797            $level = 3;
    9898        }
    99         $res = $this->db->query("SELECT `id`, `name`, `printname` FROM `doc_group` WHERE `pid`='$group' AND `hidelevel`='0' ORDER BY `id`");
     99        $res = $this->db->query("SELECT `id`, `name`, `printname` FROM `doc_group` WHERE `pid`='$group' AND `hidelevel`='0' ORDER BY `vieworder`,`name`");
    100100        while ($nxt = $res->fetch_row()) {
    101101            if ($nxt[0] == 0) {
  • trunk/common/pricewriter/xls.php

    r969 r982  
    225225            $level = 2;
    226226        }
    227         $res = $this->db->query("SELECT `id`, `name`, `printname` FROM `doc_group` WHERE `pid`='$group' AND `hidelevel`='0' ORDER BY `id`");
     227        $res = $this->db->query("SELECT `id`, `name`, `printname` FROM `doc_group` WHERE `pid`='$group' AND `hidelevel`='0' ORDER BY `vieworder`,`name`");
    228228        while ($nxt = $res->fetch_row()) {
    229229            if ($nxt[0] == 0) {
  • trunk/web/doc_service.php

    r972 r982  
    120120        ID первого объекта:<br><input type='text' name='tov1'><br>
    121121        ID второго объекта:<br><input type='text' name='tov2'><br>
    122         Группа для перемещения:<br><select name='gr'>");
    123         $res = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `name`");
    124         while ($nxt = $res->fetch_row())
    125             $tmpl->addContent("<option value='$nxt[0]'>" . html_out($nxt[1]) . " (id:$nxt[0])</option>");
    126         $tmpl->addContent("</select><br><br>
     122        Группа для перемещения:<br>");
     123        $tmpl->addText( selectGroupPos('gr', 0, false, '', '', \cfg::get('store', 'leaf_only', false)) );
     124        $tmpl->addContent("<br><br>
    127125        <button>Выполнить запрошенную операцию</button>
    128126        </fieldset></form>");
  • trunk/web/docs.php

    r963 r982  
    11<?php
     2
    23//      MultiMag v0.2 - Complex sales system
    34//
     
    2425SafeLoadTemplate($CONFIG['site']['inner_skin']);
    2526
    26 try
    27 {
    28         switch (request('l')) {
    29                 case 'agent':
    30                         $sprav = new doc_s_Agent();
    31                         break;
    32                 case 'dov':
    33                         $sprav = new doc_s_Agent_dov();
    34                         break;
    35                 case 'inf':
    36                         $sprav = new doc_s_Inform();
    37                         break;
    38                 case 'pran':
    39                         $sprav = new doc_s_Price_an();
    40                         break;
    41                 default:$sprav = new doc_s_Sklad();
    42         }
    43         switch(request('mode'))
    44         {
    45                 case '':
    46                         $sprav->View();
    47                         break;
    48                 case 'srv':
    49                         $sprav->Service();
    50                         break;
    51                 case 'edit':
    52                         $sprav->Edit();
    53                         break;
    54                 case 'esave':
    55                         $sprav->ESave();
    56                         break;
    57                 case 'search':
    58                         $sprav->Search();
    59                         break;
    60                 default:throw new Exception('Неверный параметр');
    61         }
    62 }
    63  catch (AccessException $e) {
     27try {
     28    switch (request('l')) {
     29        case 'agent':
     30            $sprav = new doc_s_Agent();
     31            break;
     32        case 'dov':
     33            $sprav = new doc_s_Agent_dov();
     34            break;
     35        case 'inf':
     36            $sprav = new doc_s_Inform();
     37            break;
     38        case 'pran':
     39            $sprav = new doc_s_Price_an();
     40            break;
     41        default:
     42            $sprav = new doc_s_Sklad();
     43    }
     44    switch (request('mode')) {
     45        case '':
     46            $sprav->View();
     47            break;
     48        case 'srv':
     49            $sprav->Service();
     50            break;
     51        case 'edit':
     52            $sprav->Edit();
     53            break;
     54        case 'esave':
     55            $sprav->ESave();
     56            break;
     57        case 'search':
     58            $sprav->Search();
     59            break;
     60        default:
     61            throw new Exception('Неверный параметр');
     62    }
     63} catch (AccessException $e) {
    6464    $tmpl->ajax = 0;
    6565    $tmpl->errorMessage('Не достаточно привилегий: ' . $e->getMessage(), "Нет доступа");
    66 }
    67 catch(mysqli_sql_exception $e) {
    68     $tmpl->ajax = 0;   
    69     switch($e->getCode()) {
     66} catch (mysqli_sql_exception $e) {
     67    $tmpl->ajax = 0;
     68    switch ($e->getCode()) {
    7069        case 1062:
    71             $tmpl->errorMessage("Неверно заполнены поля: не соблюдена уникальность!<br>".$e->getMessage(), "Ошибка в базе данных");
     70            $tmpl->errorMessage("Неверно заполнены поля: не соблюдена уникальность!<br>" . $e->getMessage(), "Ошибка в базе данных");
    7271            break;
    7372        default:
    7473            $id = writeLogException($e);
    7574            $tmpl->errorMessage("Порядковый номер ошибки: $id<br>Сообщение об ошибке занесено в журнал", "Ошибка в базе данных");
    76     }   
    77 }
    78 catch (Exception $e) {
     75    }
     76} catch (Exception $e) {
    7977    $db->rollback();
    8078    $tmpl->setContent('');
  • trunk/web/fpdf/fpdf_mysql.php

    r932 r982  
    198198    function draw_groups_tree($pid, $query, $prop) {
    199199        global $db;
    200         $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$pid' AND `hidelevel`='0' ORDER BY `id`");
     200        $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$pid' AND `hidelevel`='0' ORDER BY `vieworder`,`name`");
    201201        while ($nxt = $res->fetch_row()) {
    202202            if ($nxt[0] == 0) {
  • trunk/web/get_yml.php

    r963 r982  
    6060        <categories>\n";
    6161
    62         $res=$db->query("SELECT `id`, `name`, `pid` FROM `doc_group` WHERE `hidelevel`='0' AND `no_export_yml`='0' ORDER BY `id`");
     62        $res=$db->query("SELECT `id`, `name`, `pid` FROM `doc_group` WHERE `hidelevel`='0' AND `no_export_yml`='0' ORDER BY `vieworder`,`name`");
    6363        while($nxt=$res->fetch_row())
    6464        {
  • trunk/web/include/basegsreport.php

    r963 r982  
    2525        $ret = '';
    2626        settype($level, 'int');
    27         $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' ORDER BY `name`");
     27        $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' ORDER BY `vieworder`,`name`");
    2828        $i = 0;
    2929        $r = $cbroot = '';
  • trunk/web/include/doc.core.php

    r964 r982  
    625625    global $db;
    626626    // Нет смысла в проверке входных параметров, т.к. функция вызывается только из selectGroupPos
    627     $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$group_id' ORDER BY `id`");
     627    $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$group_id' ORDER BY `vieworder`,`name`");
    628628    $ret = '';
    629629    while ($line = $res->fetch_row()) {
  • trunk/web/include/doc.poseditor.php

    r963 r982  
    5555        settype($pid, 'int');
    5656        $data = array();
    57         $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$pid' ORDER BY `id`");
     57        $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$pid' ORDER BY `vieworder`,`name`");
    5858        while ($nxt = $res->fetch_row()) {
    5959            if ($nxt[0] == 0)
  • trunk/web/include/doc.s.price_an.php

    r963 r982  
    251251                $ret = '';
    252252                settype($level, 'int');
    253                 $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' ORDER BY `id`");
     253                $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' ORDER BY `vieworder`,`name`");
    254254                $i=0;
    255255                $r='';
     
    391391        }
    392392       
    393         function DrawSkladTable($res, $s = '', $limit = 1000000) {
     393        function DrawSkladTable($res, $s = '', $limit = 1000, $opts = []) {
    394394                global $tmpl, $CONFIG;
    395395                $i = $c = 0;
  • trunk/web/include/doc.s.sklad.php

    r963 r982  
    385385            $form_data['likvid'] = '';
    386386        }
    387 //            foreach ($this->pos_vars as $value) {
    388 //                $pos_info[$value] = '';
    389 //            }
    390387
    391388        $image_html = '';       
     
    615612        }
    616613    }
     614   
     615    /// Сформировать форму редактирования изображений и файлов
     616    protected function showImagesEditForm($pos) {
     617        global $tmpl, $db;
     618        $max_fs = \webcore::getMaxUploadFileSize();
     619        $max_fs_size = \webcore::toStrDataSizeInaccurate($max_fs);
     620
     621        $res = $db->query("SELECT `doc_base_img`.`img_id`, `doc_img`.`type`
     622            FROM `doc_base_img`
     623            LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
     624            WHERE `doc_base_img`.`pos_id`='$pos'");
     625        $checked = ($res->num_rows == 0) ? 'checked' : '';
     626        $tmpl->addContent("
     627            <table>
     628            <tr><th width='50%'>Изображения</th><th width='50%'>Прикреплённые файлы</th></tr>
     629            <tr><td valign='top'>
     630            <form action='' method='post' enctype='multipart/form-data'>
     631            <input type='hidden' name='mode' value='esave'>
     632            <input type='hidden' name='l' value='sklad'>
     633            <input type='hidden' name='pos' value='$pos'>
     634            <input type='hidden' name='param' value='i'>
     635            <table class='list' width='100%'>
     636            <tr><th width='10%'>По умолч.</th><th>Файл</th><th>Имя изображения</th></tr>
     637            <tr><td><input type='radio' name='def_img' value='1' $checked></td>
     638            <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile1' type='file'></td>
     639            <td><input type='text' name='photoname_1' value=''></td>
     640            </tr>
     641            <tr><td><input type='radio' name='def_img' value='2'></td>
     642            <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile2' type='file'></td>
     643            <td><input type='text' name='photoname_2' value=''></td>
     644            </tr>
     645            <tr><td><input type='radio' name='def_img' value='3'></td>
     646            <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile3' type='file'></td>
     647            <td><input type='text' name='photoname_3' value=''></td>
     648            </tr>
     649            <tr><td><input type='radio' name='def_img' value='4'></td>
     650            <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile4' type='file'></td>
     651            <td><input type='text' name='photoname_4' value=''></td>
     652            </tr>
     653            <tr><td><input type='radio' name='def_img' value='5'></td>
     654            <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile5' type='file'></td>
     655            <td><input type='text' name='photoname_5' value=''></td>
     656            </tr>
     657            <tr><td colspan='3' align='center'>
     658            <button type='submit'>Сохранить</button>
     659            </table>
     660            <b>Форматы</b>: Не более $max_fs_size суммарно, разрешение от 150*150 до 10000*10000, форматы JPG, PNG, допустим, но не рекомендуется GIF<br>
     661            <b>Примечание</b>: Если написать имя картинки, которая уже есть в базе, то она и будет установлена вне зависимости от того, передан файл или нет.
     662            </form><h2>Ассоциированные с товаром картинки</h2>");
     663        while ($nxt = $res->fetch_row()) {
     664            $miniimg = new ImageProductor($nxt[0], 'p', $nxt[1]);
     665            $miniimg->SetX(175);
     666            $img = "<img src='" . $miniimg->GetURI() . "' width='175'>";
     667            $tmpl->addContent("$img<br><a href='?mode=esave&amp;l=sklad&amp;param=i_d&amp;pos=$pos&amp;img=$nxt[0]'>Убрать ассоциацию</a><br><br>");
     668        }
     669        $tmpl->addContent("</td><td valign='top'>
     670            <form action='' method='post' enctype='multipart/form-data'>
     671            <input type='hidden' name='mode' value='esave'>
     672            <input type='hidden' name='l' value='sklad'>
     673            <input type='hidden' name='pos' value='$pos'>
     674            <input type='hidden' name='param' value='i_a'>
     675            <table cellpadding='0' class='list'>
     676            <tr><td>Прикрепляемый файл:
     677            <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile' type='file'><br><small>Не более $max_fs_size</small>
     678            <tr><td>Описание файла (до 128 символов):
     679            <td><input type='text' name='comment' value='Инструкция для $pos'><br>
     680            <small>Если написать описание файла, которое уже есть в базе, то соответствующий файл и будет установлен, вне зависимости от того, передан он или нет.</small>
     681            <tr><td colspan='2' align='center'>
     682            <input type='submit' value='Сохранить'>
     683            </table>
     684            <table class='list' width='100%'>
     685            <tr><th colspan='4'>Прикреплённые файлы</th></tr>");
     686        $res = $db->query("SELECT `doc_base_attachments`.`attachment_id`, `attachments`.`original_filename`, `attachments`.`description`
     687            FROM `doc_base_attachments`
     688            LEFT JOIN `attachments` ON `attachments`.`id`=`doc_base_attachments`.`attachment_id`
     689            WHERE `doc_base_attachments`.`pos_id`='$pos'");
     690        while ($nxt = $res->fetch_row()) {
     691            if (\cfg::get('site', 'rewrite_enable')) {
     692                $link = "/attachments/{$nxt[0]}/$nxt[1]";
     693            } else {
     694                $link = "/attachments.php?att_id={$nxt[0]}";
     695            }
     696            $tmpl->addContent("<tr><td>$nxt[0]</td><td><a href='$link'>" . html_out($nxt[1]) . "</a></td></td><td>" . html_out($nxt[2]) . "</td><td><a href='?mode=esave&amp;l=sklad&amp;param=i_ad&amp;pos=$pos&amp;att=$nxt[0]' title='Убрать ассоциацию'><img src='/img/i_del.png' alt='Убрать ассоциацию'></a></td></tr>");
     697        }
     698        $tmpl->addContent("</table></td></tr></table>");
     699    }
     700   
     701    protected function showPricesEditForm($pos) {
     702        global $tmpl, $db;
     703        $cres = $db->query("SELECT `cost` AS `base_price`, `group`, `bulkcnt` FROM `doc_base` WHERE `doc_base`.`id`='$pos'");
     704        if (!$cres->num_rows)
     705            throw new Exception("Позиция не найдена");
     706        $pos_info = $cres->fetch_assoc();
     707
     708        //list($base_cost) = $cres->fetch_row();
     709
     710        $cost_types = array('pp' => 'Процент', 'abs' => 'Абсолютная наценка', 'fix' => 'Фиксированная цена');
     711        $direct = array((-1) => 'Вниз', 0 => 'K ближайшему', 1 => 'Вверх');
     712        $res = $db->query("SELECT `doc_cost`.`id`, `doc_base_cost`.`id`, `doc_cost`.`name`, `doc_cost`.`type`, `doc_cost`.`value`, `doc_base_cost`.`type`, `doc_base_cost`.`value`, `doc_base_cost`.`accuracy`, `doc_base_cost`.`direction`, `doc_cost`.`accuracy`, `doc_cost`.`direction`
     713            FROM `doc_cost`
     714            LEFT JOIN `doc_base_cost` ON `doc_cost`.`id`=`doc_base_cost`.`cost_id` AND `doc_base_cost`.`pos_id`='$pos'");
     715        $tmpl->addContent("
     716            <form action='docs.php' method='post'>
     717            <input type='hidden' name='mode' value='esave'>
     718            <input type='hidden' name='l' value='sklad'>
     719            <input type='hidden' name='pos' value='$pos'>
     720            <input type='hidden' name='param' value='c'>
     721            <table cellpadding='0' width='50%' class='list'>
     722            <tr><th>Цена</th><th>Тип</th><th>Значение</th><th>Точность</th><th>Округление</th><th>Результат</th></tr>
     723            <tr><td><b>Базовая</b><td>Базовая цена<td>{$pos_info['base_price']} руб.<td>-<td>-<td>{$pos_info['base_price']} руб.");
     724        $pc = PriceCalc::getInstance();
     725        while ($cn = $res->fetch_row()) {
     726            $sig = ($cn[4] > 0) ? '+' : '';
     727            switch($cn[3]) {
     728                case 'pp':
     729                    $def_val = "({$sig}$cn[4] %)";
     730                    break;
     731                case 'abs':
     732                    $def_val = "({$sig}$cn[4] руб.)";
     733                    break;
     734                case 'fix':
     735                    $def_val = "(= $cn[4] руб.)";
     736                    break;
     737                default :
     738                    $def_val = "({$sig}$cn[4] XX)";
     739            }
     740
     741            $checked = $cn[1] ? 'checked' : '';
     742            if (!$cn[1]) {
     743                $cn[5] = $cn[3];
     744                $cn[6] = $cn[4];
     745                $cn[7] = $cn[9];
     746                $cn[8] = $cn[10];
     747            }
     748
     749            $tmpl->addContent("<tr><td><label><input type='checkbox' name='ch$cn[0]' value='1' $checked>" . html_out($cn[2]) . " $def_val</label>
     750                            <td><select name='cost_type$cn[0]'>");
     751            foreach ($cost_types as $id => $type) {
     752                $sel = ($id == $cn[5]) ? ' selected' : '';
     753                $tmpl->addContent("<option value='$id'$sel>$type</option>");
     754            }
     755
     756            $tmpl->addContent("</select>
     757                            <td><input type='text' name='val$cn[0]' value='$cn[6]'>
     758                            <td><select name='accur$cn[0]'>");
     759            for ($i = -3; $i < 3; $i++) {
     760                $a = sprintf("%0.2f", pow(10, $i * (-1)));
     761                $sel = $cn[7] == $i ? 'selected' : '';
     762                $tmpl->addContent("<option value='$i' $sel>$a</option>");
     763            }
     764            $tmpl->addContent("</select>
     765                            <td><select name='direct$cn[0]'>");
     766            for ($i = (-1); $i < 2; $i++) {
     767                $sel = $cn[8] == $i ? 'selected' : '';
     768                $tmpl->addContent("<option value='$i' $sel>{$direct[$i]}</option>");
     769            }
     770            $result = $pc->getPosSelectedPriceValue($pos, $cn[0], $pos_info);
     771            $tmpl->addContent("</select><td>$result руб.");
     772        }
     773        $tmpl->addContent("</table><button>Сохранить цены</button></form>");
     774    }
     775   
     776    protected function showLinkedPosEditForm($pos) {
     777        global $tmpl, $db;
     778        $peopt = request('peopt');
     779        require_once("include/doc.sklad.link.php");
     780        $poseditor = new LinkPosList($pos);
     781        $poseditor->SetEditable(1);
     782        if ($peopt == '') {
     783            $tmpl->addContent($poseditor->Show());
     784        } else {
     785            $tmpl->ajax = 1;
     786            if ($peopt == 'jget') {
     787                $str = $poseditor->GetAllContent();
     788                $tmpl->setContent($str);
     789            }
     790            // Получение данных наименования
     791            else if ($peopt == 'jgpi') {
     792                $pos = rcvint('pos');
     793                $tmpl->setContent($poseditor->GetPosInfo($pos));
     794            }
     795            // Json вариант добавления позиции
     796            else if ($peopt == 'jadd') {
     797                \acl::accessGuard('directory.goods', \acl::UPDATE);
     798                $pe_pos = rcvint('pe_pos');
     799                $tmpl->setContent($poseditor->AddPos($pe_pos));
     800            }
     801            // Json вариант удаления строки
     802            else if ($peopt == 'jdel') {
     803                \acl::accessGuard('directory.goods', \acl::UPDATE);
     804                $line_id = rcvint('line_id');
     805                $tmpl->setContent($poseditor->Removeline($line_id));
     806            }
     807            // Json вариант обновления
     808            else if ($peopt == 'jup') {
     809                \acl::accessGuard('directory.goods', \acl::UPDATE);
     810                $line_id = rcvint('line_id');
     811                $value = request('value');
     812                $type = request('type');
     813                $tmpl->setContent($poseditor->UpdateLine($line_id, $type, $value));
     814            }
     815            // Получение номенклатуры выбранной группы
     816            else if ($peopt == 'jsklad') {
     817                $group_id = rcvint('group_id');
     818                $str = "{ response: 'sklad_list', group: '$group_id',  content: [" . $poseditor->GetSkladList($group_id) . "] }";
     819                $tmpl->setContent($str);
     820            }
     821            // Поиск по подстроке по складу
     822            else if ($peopt == 'jsklads') {
     823                $s = request('s');
     824                $str = "{ response: 'sklad_list', content: [" . $poseditor->SearchSkladList($s) . "] }";
     825                $tmpl->setContent($str);
     826            }
     827            // Получение списка групп
     828            else if ($peopt == 'jgetgroups') {
     829                $doc_content = $poseditor->getGroupList();
     830                $tmpl->setContent($doc_content);
     831            } else
     832                throw new \NotFoundException();
     833        }
     834    }
     835   
     836    protected function showAnalogEditForm($pos) {
     837        global $tmpl, $db;
     838        $pos_info = $db->selectRow('doc_base', $pos);
     839        $analog_group = $pos_info['analog_group'];
     840        $tmpl->addContent("<form action='' method='post'>
     841            <input type='hidden' name='mode' value='esave'>
     842            <input type='hidden' name='l' value='sklad'>
     843            <input type='hidden' name='pos' value='$pos'>
     844            <input type='hidden' name='param' value='n'>
     845            Имя группы аналогов:<br>
     846            <input type='text' name='analog_group' value='$analog_group'>
     847            <button type='submit'>Записать</button>
     848            </form>
     849            <h3>Аналоги в группе</h3>
     850            <table class='list'>
     851            <tr><th>id</th><th>Код</th><th>Название</th><th>Производитель</th><th>Цена</th><th>Остаток</th>");
     852        if (\cfg::get('poseditor', 'rto')) {
     853            $tmpl->addContent("<th>Резерв</th><th>Под заказ</th><th>В пути</th>");
     854        }
     855        $tmpl->addContent("</tr>");
     856
     857        $base_link = '/docs.php?mode=srv';
     858        $analog_group_sql = $db->real_escape_string($analog_group);
     859        $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`vc`, `doc_base`.`name`, `doc_base`.`proizv` AS `vendor`, `cost` AS `price`, (
     860                SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id`
     861            ) AS `cnt`,
     862            `doc_base_dop`.`reserve`, `doc_base_dop`.`transit`, `doc_base_dop`.`offer`
     863            FROM `doc_base`
     864            LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
     865            WHERE `analog_group`='$analog_group_sql' AND `analog_group`!=''");
     866        while ($line = $res->fetch_assoc()) {
     867            $link = $base_link . '&amp;pos=' . $line['id'];
     868            $rto = '';
     869            if (\cfg::get('poseditor', 'rto')) {
     870                $clink = $link . '&amp;l=inf';
     871                if ($line['reserve']) {
     872                    $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=rezerv'); return false;\" href='#'>{$line['reserve']}</a></td>";
     873                } else {
     874                    $rto .= "<td></td>";
     875                }
     876                if ($line['offer']) {
     877                    $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=p_zak'); return false;\" href='#'>{$line['offer']}</a></td>";
     878                } else {
     879                    $rto .= "<td></td>";
     880                }
     881                if ($line['transit']) {
     882                    $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=vputi'); return false;\" href='#'>{$line['transit']}</a></td>";
     883                } else {
     884                    $rto .= "<td></td>";
     885                }
     886            }
     887            if ($line['cnt'] != 0) {
     888                $line['cnt'] = "<a href='#' onclick=\"ShowPopupWin('$link&amp;opt=ost'); return false;\" title='Отобразить все остатки'>{$line['cnt']}</a>";
     889            } else {
     890                $line['cnt'] = '';
     891            }
     892            $tmpl->addContent("<tr>
     893                <td><a href='{$link}&amp;opt=ep'>{$line['id']}</a></td>
     894                <td>{$line['vc']}</td><td>{$line['name']}</td><td>{$line['vendor']}</td>
     895                <td align='right'>{$line['price']}</td><td align='right'>{$line['cnt']}</td>$rto
     896                </tr>");
     897        }
     898        $tmpl->addContent("</table>");
     899    }
     900
     901    protected function showNomenclatureGroupsEditForm($group_id) {
     902        global $tmpl, $db;
     903        \acl::accessGuard('directory.goods.groups', \acl::VIEW);
     904        $max_fs = \webcore::getMaxUploadFileSize();
     905        $max_fs_size = \webcore::toStrDataSizeInaccurate($max_fs);
     906
     907        $res = $db->query("SELECT * FROM `doc_group` WHERE `id`='$group_id'");
     908        if ($res->num_rows)
     909            $group_info = $res->fetch_assoc();
     910        else {
     911            $group_info = array();
     912            foreach ($this->group_vars as $value) {
     913                $group_info[$value] = '';
     914            }
     915        }
     916        $tmpl->addContent("<h1>Описание группы</h1>
     917            <script type=\"text/javascript\">
     918            function rmLine(t) {
     919                var line=t.parentNode.parentNode
     920                line.parentNode.removeChild(line)
     921            }
     922
     923            function addLine() {
     924                var fgtab=document.getElementById('fg_table').tBodies[0]
     925                var sel=document.getElementById('fg_select')
     926                var newrow=fgtab.insertRow(fgtab.rows.length)
     927                var lineid=sel.value
     928                var checked=(document.getElementById('fg_check').checked)?'checked':''
     929                var ctext = sel.selectedIndex !== -1 ? sel.options[sel.selectedIndex].text : ''
     930
     931                newrow.innerHTML=\"<td><input type='hidden' name='fn[\"+lineid+\"]' value='1'>\"+
     932                \"<input type='checkbox' name='fc[\"+lineid+\"]' value='1' \"+checked+\"></td><td>\"+ctext+\"</td><td>\"+
     933                \"<img src='/img/i_del.png' alt='' onclick='return rmLine(this)'></td>\"
     934            }
     935
     936            </script>
     937            <form action='docs.php' method='post' enctype='multipart/form-data'>
     938            <input type='hidden' name='mode' value='esave'>
     939            <input type='hidden' name='l' value='sklad'>
     940            <input type='hidden' name='g' value='$group_id'>
     941            <input type='hidden' name='param' value='g'>
     942            <table cellpadding='0' width='50%' class='list'>
     943            <tr><td>Наименование группы $group_id:</td>
     944            <td><input type='text' name='name' value='" . html_out($group_info['name']) . "'></td></tr>
     945            <tr><td>Находится в группе:</td>
     946            <td>" . selectGroupPos('pid', $group_info['pid'], true));
     947
     948        if (file_exists(\cfg::get('site', 'var_data_fs')."/category/$group_id.jpg")) {
     949            $img = "<br><img src='".\cfg::get('site', 'var_data_fs')."/category/$group_id.jpg'><br><a href='/docs.php?l=sklad&amp;mode=esave&amp;g=$group_id&amp;param=gid'>Удалить изображение</a>";
     950        }
     951        else {
     952            $img = '';
     953        }
     954
     955        $hid_check = $group_info['hidelevel'] ? 'checked' : '';
     956        $yml_check = $group_info['no_export_yml'] ? 'checked' : '';
     957
     958        $tmpl->addContent("</td></tr>
     959            <tr><td>Скрытие:</td>
     960            <td><label><input type='checkbox' name='hid' value='3' $hid_check>Не отображать на витрине и в прайсах</label><br>
     961            <label><input type='checkbox' name='no_export_yml' value='3' $yml_check>Не экспортировать в YML</label></td></tr>
     962            <tr><td>Печатное название:</td>
     963            <td><input type='text' name='pname' value='" . html_out($group_info['printname']) . "'></td></tr>
     964            <tr><td>Порядковый номер отображения:</td>
     965            <td><input type='text' name='vieworder' value='" . html_out($group_info['vieworder']) . "'></td></tr>
     966            <tr><td>Тэг title группы на витрине:</td>
     967            <td><input type='text' name='title_tag' value='" . html_out($group_info['title_tag']) . "' maxlength='128'></td></tr>
     968            <tr><td>Мета-тэг keywords группы на витрине:</td>
     969            <td><input type='text' name='meta_keywords' value='" . html_out($group_info['meta_keywords']) . "' maxlength='128'></td></tr>
     970            <tr><td>Мета-тэг description группы на витрине:</td>
     971            <td><input type='text' name='meta_description' value='" . html_out($group_info['meta_description']) . "' maxlength='256'></td></tr>
     972
     973            <tr><td>Изображение (jpg, до $max_fs_size, от 100*100):</td>
     974            <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile' type='file'>$img</td></tr>
     975            <tr><td>Описание:</td>
     976            <td><textarea name='desc'>" . html_out($group_info['desc']) . "</textarea></td></tr>
     977            <tr><td>Статические дополнительные свойства товаров группы<br><br>
     978            Добавить из набора:<select name='collection'>
     979            <option value='0'>--не выбран--</option>");
     980        $rgroups = $db->query("SELECT `id`, `name` FROM `doc_base_pcollections_list` ORDER BY `name`");
     981        while ($col = $rgroups->fetch_row()) {
     982            $tmpl->addContent("<option value='$col[0]'>" . html_out($col[1]) . "</option>");
     983        }
     984        $tmpl->addContent("</select></td>
     985            <td>
     986            <table width='100%' id='fg_table' class='list'>
     987            <thead>
     988            <tr><th><img src='/img/i_filter.png' alt='Отображать в фильтрах'></th><th>Название параметра</th><th>&nbsp;</th></tr>
     989            </thead>
     990            <tfoot>
     991            <tr><td><input type='checkbox' id='fg_check'><td>
     992            <select name='pp' id='fg_select'>
     993            <option value='0' selected>--не выбрано--</option>");
     994        $res_group = $db->query("SELECT `id`, `name` FROM `doc_base_gparams` ORDER BY `name`");
     995        while ($groupp = $res_group->fetch_row()) {
     996            $tmpl->addContent("<option value='-1' disabled>" . html_out($groupp[1]) . "</option>");
     997            $res = $db->query("SELECT `id`, `name` FROM `doc_base_params` WHERE `group_id`='$groupp[0]' ORDER BY `name`");
     998            while ($param = $res->fetch_row()) {
     999                $tmpl->addContent("<option value='$param[0]'>- " . html_out($param[1]) . "</option>");
     1000            }
     1001        }
     1002        $tmpl->addContent("</select>
     1003            </td><td><img src='/img/i_add.png' alt='' onclick='return addLine()'></td></tr>
     1004            </td></tr></tfoot>
     1005            <tbody>");
     1006
     1007        $r = $db->query("SELECT `doc_base_params`.`id`, `doc_base_params`.`name`, `doc_group_params`.`show_in_filter` FROM `doc_base_params`
     1008            LEFT JOIN `doc_group_params` ON `doc_group_params`.`param_id`=`doc_base_params`.`id`
     1009            WHERE  `doc_group_params`.`group_id`='$group_id'
     1010            ORDER BY `doc_base_params`.`id`");
     1011        while ($p = $r->fetch_row()) {
     1012            $checked = $p[2] ? 'checked' : '';
     1013            $tmpl->addContent("<tr><td><input type='hidden' name='fn[$p[0]]' value='1'>
     1014                <input type='checkbox' name='fc[$p[0]]' value='1' $checked></td><td>" . html_out($p[1]) . "</td>
     1015                <td><img src='/img/i_del.png' alt='' onclick='return rmLine(this)'></td></tr>");
     1016        }
     1017
     1018        $tmpl->addContent("</tbody></table>
     1019            <tr class='lin1'><td colspan='2' align='center'>
     1020            <button type='submit'>Сохранить</button>
     1021            </table></form>");
     1022
     1023        if ($group_id) {
     1024            $cost_types = array('pp' => 'Процент', 'abs' => 'Абсолютная наценка', 'fix' => 'Фиксированная цена');
     1025            $direct = array((-1) => 'Вниз', 0 => 'K ближайшему', 1 => 'Вверх');
     1026            $res = $db->query("SELECT `doc_cost`.`id`, `doc_group_cost`.`id`, `doc_cost`.`name`, `doc_cost`.`type`, `doc_cost`.`value`, `doc_group_cost`.`type`, `doc_group_cost`.`value`, `doc_group_cost`.`accuracy`, `doc_group_cost`.`direction`, `doc_cost`.`accuracy`, `doc_cost`.`direction`
     1027                FROM `doc_cost`
     1028                LEFT JOIN `doc_group_cost` ON `doc_cost`.`id`=`doc_group_cost`.`cost_id` AND `doc_group_cost`.`group_id`='$group_id'");
     1029            $tmpl->addContent("<h1>Задание цен</h1>
     1030                <form action='docs.php' method='post'>
     1031                <input type='hidden' name='mode' value='esave'>
     1032                <input type='hidden' name='l' value='sklad'>
     1033                <input type='hidden' name='g' value='$group_id'>
     1034                <input type='hidden' name='param' value='gc'>
     1035                <table cellpadding='0' width='50%' class='list'>
     1036                <tr><th>Цена</th><th>Тип</th><th>Значение</th><th>Точность</th><th>Округление</th></tr>");
     1037            while ($cn = $res->fetch_row()) {
     1038                $sig = ($cn[4] > 0) ? '+' : '';
     1039                if ($cn[3] == 'pp') {
     1040                    $def_val = "({$sig}$cn[4] %)";
     1041                } else if ($cn[3] == 'abs') {
     1042                    $def_val = "({$sig}$cn[4] руб.)";
     1043                } else if ($cn[3] == 'fix') {
     1044                    $def_val = "(= $cn[4] руб.)";
     1045                } else {
     1046                    $def_val = "({$sig}$cn[4] XX)";
     1047                }
     1048
     1049                $checked = $cn[1] ? 'checked' : '';
     1050
     1051                $tmpl->addContent("<tr><td><label><input type='checkbox' name='ch$cn[0]' value='1' $checked>" . html_out($cn[2]) . " $def_val</label></td>
     1052                                    <td><select name='cost_type$cn[0]'>");
     1053                foreach ($cost_types as $id => $type) {
     1054                    $sel = ($id == $cn[5]) ? ' selected' : '';
     1055                    $tmpl->addContent("<option value='$id'$sel>$type</option>");
     1056                }
     1057                if (!$cn[1]) {
     1058                    $cn[5] = $cn[3];
     1059                    $cn[6] = $cn[4];
     1060                    $cn[7] = $cn[9];
     1061                    $cn[8] = $cn[10];
     1062                }
     1063                $tmpl->addContent("</select></td>
     1064                                    <td><input type='text' name='val$cn[0]' value='$cn[6]'></td>
     1065                                    <td><select name='accur$cn[0]'>");
     1066                for ($i = -3; $i < 3; $i++) {
     1067                    $a = sprintf("%0.2f", pow(10, $i * (-1)));
     1068                    $sel = $cn[7] == $i ? 'selected' : '';
     1069                    $tmpl->addContent("<option value='$i' $sel>$a</option>");
     1070                }
     1071                $tmpl->addContent("</select>
     1072                                    <td><select name='direct$cn[0]'>");
     1073                for ($i = (-1); $i < 2; $i++) {
     1074                    $sel = $cn[8] == $i ? 'selected' : '';
     1075                    $tmpl->addContent("<option value='$i' $sel>{$direct[$i]}</option>");
     1076                }
     1077                $tmpl->addContent("</select>");
     1078            }
     1079            $tmpl->addContent("</table><button>Сохранить цены</button></form>");
     1080        }
     1081    }
    6171082
    6181083
     
    6321097            $this->PosMenu($pos, $param);
    6331098        }
    634 
     1099       
     1100        // Карточка номенклатуры
    6351101        if ($param == '' || $param == 'v') {
    6361102            $this->showMainForm($pos, $group);
     
    6481114            $this->showPartsForm($pos);
    6491115        }
     1116        // Настройки анализатора прайсов
    6501117        elseif ($param == 'a') {
    651             //require_once("include/doc.sklad.kompl.php");
    6521118            $pran = new doc_s_Price_an();
    6531119            $tmpl->addContent( $pran->getRegExpEditForm($pos));
     
    6551121        // Изображения
    6561122        else if ($param == 'i') {
    657             $max_fs = \webcore::getMaxUploadFileSize();
    658             $max_fs_size = \webcore::toStrDataSizeInaccurate($max_fs);
    659 
    660             $res = $db->query("SELECT `doc_base_img`.`img_id`, `doc_img`.`type`
    661                 FROM `doc_base_img`
    662                 LEFT JOIN `doc_img` ON `doc_img`.`id`=`doc_base_img`.`img_id`
    663                 WHERE `doc_base_img`.`pos_id`='$pos'");
    664             $checked = ($res->num_rows == 0) ? 'checked' : '';
    665             $tmpl->addContent("
    666                 <table>
    667                 <tr><th width='50%'>Изображения</th><th width='50%'>Прикреплённые файлы</th></tr>
    668                 <tr><td valign='top'>
    669                 <form action='' method='post' enctype='multipart/form-data'>
    670                 <input type='hidden' name='mode' value='esave'>
    671                 <input type='hidden' name='l' value='sklad'>
    672                 <input type='hidden' name='pos' value='$pos'>
    673                 <input type='hidden' name='param' value='i'>
    674                 <table class='list' width='100%'>
    675                 <tr><th width='10%'>По умолч.</th><th>Файл</th><th>Имя изображения</th></tr>
    676                 <tr><td><input type='radio' name='def_img' value='1' $checked></td>
    677                 <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile1' type='file'></td>
    678                 <td><input type='text' name='photoname_1' value=''></td>
    679                 </tr>
    680                 <tr><td><input type='radio' name='def_img' value='2'></td>
    681                 <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile2' type='file'></td>
    682                 <td><input type='text' name='photoname_2' value=''></td>
    683                 </tr>
    684                 <tr><td><input type='radio' name='def_img' value='3'></td>
    685                 <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile3' type='file'></td>
    686                 <td><input type='text' name='photoname_3' value=''></td>
    687                 </tr>
    688                 <tr><td><input type='radio' name='def_img' value='4'></td>
    689                 <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile4' type='file'></td>
    690                 <td><input type='text' name='photoname_4' value=''></td>
    691                 </tr>
    692                 <tr><td><input type='radio' name='def_img' value='5'></td>
    693                 <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile5' type='file'></td>
    694                 <td><input type='text' name='photoname_5' value=''></td>
    695                 </tr>
    696                 <tr><td colspan='3' align='center'>
    697                 <button type='submit'>Сохранить</button>
    698                 </table>
    699                 <b>Форматы</b>: Не более $max_fs_size суммарно, разрешение от 150*150 до 10000*10000, форматы JPG, PNG, допустим, но не рекомендуется GIF<br>
    700                 <b>Примечание</b>: Если написать имя картинки, которая уже есть в базе, то она и будет установлена вне зависимости от того, передан файл или нет.
    701                 </form><h2>Ассоциированные с товаром картинки</h2>");
    702             while ($nxt = $res->fetch_row()) {
    703                 $miniimg = new ImageProductor($nxt[0], 'p', $nxt[1]);
    704                 $miniimg->SetX(175);
    705                 $img = "<img src='" . $miniimg->GetURI() . "' width='175'>";
    706                 $tmpl->addContent("$img<br><a href='?mode=esave&amp;l=sklad&amp;param=i_d&amp;pos=$pos&amp;img=$nxt[0]'>Убрать ассоциацию</a><br><br>");
    707             }
    708             $tmpl->addContent("</td><td valign='top'>
    709                 <form action='' method='post' enctype='multipart/form-data'>
    710                 <input type='hidden' name='mode' value='esave'>
    711                 <input type='hidden' name='l' value='sklad'>
    712                 <input type='hidden' name='pos' value='$pos'>
    713                 <input type='hidden' name='param' value='i_a'>
    714                 <table cellpadding='0' class='list'>
    715                 <tr><td>Прикрепляемый файл:
    716                 <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile' type='file'><br><small>Не более $max_fs_size</small>
    717                 <tr><td>Описание файла (до 128 символов):
    718                 <td><input type='text' name='comment' value='Инструкция для $pos'><br>
    719                 <small>Если написать описание файла, которое уже есть в базе, то соответствующий файл и будет установлен, вне зависимости от того, передан он или нет.</small>
    720                 <tr><td colspan='2' align='center'>
    721                 <input type='submit' value='Сохранить'>
    722                 </table>
    723                 <table class='list' width='100%'>
    724                 <tr><th colspan='4'>Прикреплённые файлы</th></tr>");
    725             $res = $db->query("SELECT `doc_base_attachments`.`attachment_id`, `attachments`.`original_filename`, `attachments`.`description`
    726                 FROM `doc_base_attachments`
    727                 LEFT JOIN `attachments` ON `attachments`.`id`=`doc_base_attachments`.`attachment_id`
    728                 WHERE `doc_base_attachments`.`pos_id`='$pos'");
    729             while ($nxt = $res->fetch_row()) {
    730                 if ($CONFIG['site']['rewrite_enable']) {
    731                     $link = "/attachments/{$nxt[0]}/$nxt[1]";
    732                 } else {
    733                     $link = "/attachments.php?att_id={$nxt[0]}";
    734                 }
    735                 $tmpl->addContent("<tr><td>$nxt[0]</td><td><a href='$link'>" . html_out($nxt[1]) . "</a></td></td><td>" . html_out($nxt[2]) . "</td><td><a href='?mode=esave&amp;l=sklad&amp;param=i_ad&amp;pos=$pos&amp;att=$nxt[0]' title='Убрать ассоциацию'><img src='/img/i_del.png' alt='Убрать ассоциацию'></a></td></tr>");
    736             }
    737             $tmpl->addContent("</table></td></tr></table>");
     1123            $this->showImagesEditForm($pos);
    7381124        }
    7391125        // Цены
    7401126        else if ($param == 'c') {
    741             $cres = $db->query("SELECT `cost` AS `base_price`, `group`, `bulkcnt` FROM `doc_base` WHERE `doc_base`.`id`='$pos'");
    742             if (!$cres->num_rows)
    743                 throw new Exception("Позиция не найдена");
    744             $pos_info = $cres->fetch_assoc();
    745 
    746             //list($base_cost) = $cres->fetch_row();
    747 
    748             $cost_types = array('pp' => 'Процент', 'abs' => 'Абсолютная наценка', 'fix' => 'Фиксированная цена');
    749             $direct = array((-1) => 'Вниз', 0 => 'K ближайшему', 1 => 'Вверх');
    750             $res = $db->query("SELECT `doc_cost`.`id`, `doc_base_cost`.`id`, `doc_cost`.`name`, `doc_cost`.`type`, `doc_cost`.`value`, `doc_base_cost`.`type`, `doc_base_cost`.`value`, `doc_base_cost`.`accuracy`, `doc_base_cost`.`direction`, `doc_cost`.`accuracy`, `doc_cost`.`direction`
    751                 FROM `doc_cost`
    752                 LEFT JOIN `doc_base_cost` ON `doc_cost`.`id`=`doc_base_cost`.`cost_id` AND `doc_base_cost`.`pos_id`='$pos'");
    753             $tmpl->addContent("
    754                 <form action='docs.php' method='post'>
    755                 <input type='hidden' name='mode' value='esave'>
    756                 <input type='hidden' name='l' value='sklad'>
    757                 <input type='hidden' name='pos' value='$pos'>
    758                 <input type='hidden' name='param' value='c'>
    759                 <table cellpadding='0' width='50%' class='list'>
    760                 <tr><th>Цена</th><th>Тип</th><th>Значение</th><th>Точность</th><th>Округление</th><th>Результат</th></tr>
    761                 <tr><td><b>Базовая</b><td>Базовая цена<td>{$pos_info['base_price']} руб.<td>-<td>-<td>{$pos_info['base_price']} руб.");
    762             $pc = PriceCalc::getInstance();
    763             while ($cn = $res->fetch_row()) {
    764                 $sig = ($cn[4] > 0) ? '+' : '';
    765                 switch($cn[3]) {
    766                     case 'pp':
    767                         $def_val = "({$sig}$cn[4] %)";
    768                         break;
    769                     case 'abs':
    770                         $def_val = "({$sig}$cn[4] руб.)";
    771                         break;
    772                     case 'fix':
    773                         $def_val = "(= $cn[4] руб.)";
    774                         break;
    775                     default :
    776                         $def_val = "({$sig}$cn[4] XX)";
    777                 }
    778 
    779                 $checked = $cn[1] ? 'checked' : '';
    780                 if (!$cn[1]) {
    781                     $cn[5] = $cn[3];
    782                     $cn[6] = $cn[4];
    783                     $cn[7] = $cn[9];
    784                     $cn[8] = $cn[10];
    785                 }
    786 
    787                 $tmpl->addContent("<tr><td><label><input type='checkbox' name='ch$cn[0]' value='1' $checked>" . html_out($cn[2]) . " $def_val</label>
    788                                 <td><select name='cost_type$cn[0]'>");
    789                 foreach ($cost_types as $id => $type) {
    790                     $sel = ($id == $cn[5]) ? ' selected' : '';
    791                     $tmpl->addContent("<option value='$id'$sel>$type</option>");
    792                 }
    793 
    794                 $tmpl->addContent("</select>
    795                                 <td><input type='text' name='val$cn[0]' value='$cn[6]'>
    796                                 <td><select name='accur$cn[0]'>");
    797                 for ($i = -3; $i < 3; $i++) {
    798                     $a = sprintf("%0.2f", pow(10, $i * (-1)));
    799                     $sel = $cn[7] == $i ? 'selected' : '';
    800                     $tmpl->addContent("<option value='$i' $sel>$a</option>");
    801                 }
    802                 $tmpl->addContent("</select>
    803                                 <td><select name='direct$cn[0]'>");
    804                 for ($i = (-1); $i < 2; $i++) {
    805                     $sel = $cn[8] == $i ? 'selected' : '';
    806                     $tmpl->addContent("<option value='$i' $sel>{$direct[$i]}</option>");
    807                 }
    808                 $result = $pc->getPosSelectedPriceValue($pos, $cn[0], $pos_info);
    809                 $tmpl->addContent("</select><td>$result руб.");
    810             }
    811             $tmpl->addContent("</table>
    812                         <button>Сохранить цены</button></form>");
     1127            $this->showPricesEditForm($pos);
    8131128        }
    8141129        // Связанные товары
    8151130        else if ($param == 'l') {
    816             $peopt = request('peopt');
    817             require_once("include/doc.sklad.link.php");
    818             $poseditor = new LinkPosList($pos);
    819             $poseditor->SetEditable(1);
    820             if ($peopt == '') {
    821                 $tmpl->addContent($poseditor->Show());
    822             } else {
    823                 $tmpl->ajax = 1;
    824                 if ($peopt == 'jget') {
    825                     $str = $poseditor->GetAllContent();
    826                     $tmpl->setContent($str);
    827                 }
    828                 // Получение данных наименования
    829                 else if ($peopt == 'jgpi') {
    830                     $pos = rcvint('pos');
    831                     $tmpl->setContent($poseditor->GetPosInfo($pos));
    832                 }
    833                 // Json вариант добавления позиции
    834                 else if ($peopt == 'jadd') {
    835                     \acl::accessGuard('directory.goods', \acl::UPDATE);
    836                     $pe_pos = rcvint('pe_pos');
    837                     $tmpl->setContent($poseditor->AddPos($pe_pos));
    838                 }
    839                 // Json вариант удаления строки
    840                 else if ($peopt == 'jdel') {
    841                     \acl::accessGuard('directory.goods', \acl::UPDATE);
    842                     $line_id = rcvint('line_id');
    843                     $tmpl->setContent($poseditor->Removeline($line_id));
    844                 }
    845                 // Json вариант обновления
    846                 else if ($peopt == 'jup') {
    847                     \acl::accessGuard('directory.goods', \acl::UPDATE);
    848                     $line_id = rcvint('line_id');
    849                     $value = request('value');
    850                     $type = request('type');
    851                     $tmpl->setContent($poseditor->UpdateLine($line_id, $type, $value));
    852                 }
    853                 // Получение номенклатуры выбранной группы
    854                 else if ($peopt == 'jsklad') {
    855                     $group_id = rcvint('group_id');
    856                     $str = "{ response: 'sklad_list', group: '$group_id',  content: [" . $poseditor->GetSkladList($group_id) . "] }";
    857                     $tmpl->setContent($str);
    858                 }
    859                 // Поиск по подстроке по складу
    860                 else if ($peopt == 'jsklads') {
    861                     $s = request('s');
    862                     $str = "{ response: 'sklad_list', content: [" . $poseditor->SearchSkladList($s) . "] }";
    863                     $tmpl->setContent($str);
    864                 }
    865                 // Получение списка групп
    866                 else if ($peopt == 'jgetgroups') {
    867                     $doc_content = $poseditor->getGroupList();
    868                     $tmpl->setContent($doc_content);
    869                 } else
    870                     throw new NotFoundException();
    871             }
     1131            $this->showLinkedPosEditForm($pos);
    8721132        }
    8731133        // Аналоги
    8741134        else if ($param == 'n') {
    875             $pos_info = $db->selectRow('doc_base', $pos);
    876 
    877             $analog_group = $pos_info['analog_group'];
    878             $tmpl->addContent("<form action='' method='post'>
    879                 <input type='hidden' name='mode' value='esave'>
    880                 <input type='hidden' name='l' value='sklad'>
    881                 <input type='hidden' name='pos' value='$pos'>
    882                 <input type='hidden' name='param' value='n'>
    883                 Имя группы аналогов:<br>
    884                 <input type='text' name='analog_group' value='$analog_group'>
    885                 <button type='submit'>Записать</button>
    886                 </form>
    887                 <h3>Аналоги в группе</h3>
    888                 <table class='list'>
    889                 <tr><th>id</th><th>Код</th><th>Название</th><th>Производитель</th><th>Цена</th><th>Остаток</th>");
    890             if (@$CONFIG['poseditor']['rto']) {
    891                 $tmpl->addContent("<th>Резерв</th><th>Под заказ</th><th>В пути</th>");
    892             }
    893             $tmpl->addContent("</tr>");
    894 
    895             $base_link = '/docs.php?mode=srv';
    896             $analog_group_sql = $db->real_escape_string($analog_group);
    897             $res = $db->query("SELECT `doc_base`.`id`, `doc_base`.`vc`, `doc_base`.`name`, `doc_base`.`proizv` AS `vendor`, `cost` AS `price`, (
    898                     SELECT SUM(`cnt`) FROM `doc_base_cnt` WHERE `doc_base_cnt`.`id`=`doc_base`.`id`
    899                 ) AS `cnt`,
    900                 `doc_base_dop`.`reserve`, `doc_base_dop`.`transit`, `doc_base_dop`.`offer`
    901                 FROM `doc_base`
    902                 LEFT JOIN `doc_base_dop` ON `doc_base_dop`.`id`=`doc_base`.`id`
    903                 WHERE `analog_group`='$analog_group_sql' AND `analog_group`!=''");
    904             while ($line = $res->fetch_assoc()) {
    905                 $link = $base_link . '&amp;pos=' . $line['id'];
    906                 $rto = '';
    907                 if (@$CONFIG['poseditor']['rto']) {
    908                     $clink = $link . '&amp;l=inf';
    909                     if ($line['reserve']) {
    910                         $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=rezerv'); return false;\" href='#'>{$line['reserve']}</a></td>";
    911                     } else {
    912                         $rto .= "<td></td>";
    913                     }
    914                     if ($line['offer']) {
    915                         $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=p_zak'); return false;\" href='#'>{$line['offer']}</a></td>";
    916                     } else {
    917                         $rto .= "<td></td>";
    918                     }
    919                     if ($line['transit']) {
    920                         $rto .= "<td align='right'><a onclick=\"ShowPopupWin('{$clink}&amp;opt=vputi'); return false;\" href='#'>{$line['transit']}</a></td>";
    921                     } else {
    922                         $rto .= "<td></td>";
    923                     }
    924                 }
    925                 if ($line['cnt'] != 0) {
    926                     $line['cnt'] = "<a href='#' onclick=\"ShowPopupWin('$link&amp;opt=ost'); return false;\" title='Отобразить все остатки'>{$line['cnt']}</a>";
    927                 } else {
    928                     $line['cnt'] = '';
    929                 }
    930                 $tmpl->addContent("<tr>
    931                     <td><a href='{$link}&amp;opt=ep'>{$line['id']}</a></td>
    932                     <td>{$line['vc']}</td><td>{$line['name']}</td><td>{$line['vendor']}</td>
    933                     <td align='right'>{$line['price']}</td><td align='right'>{$line['cnt']}</td>$rto
    934                     </tr>");
    935             }
    936 
    937             $tmpl->addContent("</table>");
     1135            $this->showAnalogEditForm($pos);
    9381136        }
    9391137        // История изменений
     
    9471145        // Правка описания группы
    9481146        else if ($param == 'g') {
    949             \acl::accessGuard('directory.goods.groups', \acl::VIEW);
    950             $max_fs = \webcore::getMaxUploadFileSize();
    951             $max_fs_size = \webcore::toStrDataSizeInaccurate($max_fs);
    952 
    953             $res = $db->query("SELECT * FROM `doc_group` WHERE `id`='$group'");
    954             if ($res->num_rows)
    955                 $group_info = $res->fetch_assoc();
    956             else {
    957                 $group_info = array();
    958                 foreach ($this->group_vars as $value)
    959                     $group_info[$value] = '';
    960             }
    961             $tmpl->addContent("<h1>Описание группы</h1>
    962                 <script type=\"text/javascript\">
    963                 function rmLine(t)
    964                 {
    965                         var line=t.parentNode.parentNode
    966                         line.parentNode.removeChild(line)
    967                 }
    968 
    969                 function addLine()
    970                 {
    971                         var fgtab=document.getElementById('fg_table').tBodies[0]
    972                         var sel=document.getElementById('fg_select')
    973                         var newrow=fgtab.insertRow(fgtab.rows.length)
    974                         var lineid=sel.value
    975                         var checked=(document.getElementById('fg_check').checked)?'checked':''
    976 
    977                         var ctext = sel.selectedIndex !== -1 ? sel.options[sel.selectedIndex].text : ''
    978 
    979                         newrow.innerHTML=\"<td><input type='hidden' name='fn[\"+lineid+\"]' value='1'>\"+
    980                         \"<input type='checkbox' name='fc[\"+lineid+\"]' value='1' \"+checked+\"></td><td>\"+ctext+\"</td><td>\"+
    981                         \"<img src='/img/i_del.png' alt='' onclick='return rmLine(this)'></td>\"
    982                 }
    983 
    984                 </script>
    985                 <form action='docs.php' method='post' enctype='multipart/form-data'>
    986                 <input type='hidden' name='mode' value='esave'>
    987                 <input type='hidden' name='l' value='sklad'>
    988                 <input type='hidden' name='g' value='$group'>
    989                 <input type='hidden' name='param' value='g'>
    990                 <table cellpadding='0' width='50%' class='list'>
    991                 <tr><td>Наименование группы $group:</td>
    992                 <td><input type='text' name='name' value='" . html_out($group_info['name']) . "'></td></tr>
    993                 <tr><td>Находится в группе:</td>
    994                 <td>" . selectGroupPos('pid', $group_info['pid'], true));
    995 
    996             if (file_exists("{$CONFIG['site']['var_data_fs']}/category/$group.jpg"))
    997                 $img = "<br><img src='{$CONFIG['site']['var_data_web']}/category/$group.jpg'><br><a href='/docs.php?l=sklad&amp;mode=esave&amp;g=$group&amp;param=gid'>Удалить изображение</a>";
    998             else
    999                 $img = '';
    1000 
    1001             $hid_check = $group_info['hidelevel'] ? 'checked' : '';
    1002             $yml_check = $group_info['no_export_yml'] ? 'checked' : '';
    1003 
    1004             $tmpl->addContent("</td></tr>
    1005                 <tr><td>Скрытие:</td>
    1006                 <td><label><input type='checkbox' name='hid' value='3' $hid_check>Не отображать на витрине и в прайсах</label><br>
    1007                 <label><input type='checkbox' name='no_export_yml' value='3' $yml_check>Не экспортировать в YML</label></td></tr>
    1008                 <tr><td>Печатное название:</td>
    1009                 <td><input type='text' name='pname' value='" . html_out($group_info['printname']) . "'></td></tr>
    1010                 <tr><td>Тэг title группы на витрине:</td>
    1011                 <td><input type='text' name='title_tag' value='" . html_out($group_info['title_tag']) . "' maxlength='128'></td></tr>
    1012                 <tr><td>Мета-тэг keywords группы на витрине:</td>
    1013                 <td><input type='text' name='meta_keywords' value='" . html_out($group_info['meta_keywords']) . "' maxlength='128'></td></tr>
    1014                 <tr><td>Мета-тэг description группы на витрине:</td>
    1015                 <td><input type='text' name='meta_description' value='" . html_out($group_info['meta_description']) . "' maxlength='256'></td></tr>
    1016 
    1017                 <tr><td>Изображение (jpg, до $max_fs_size, от 100*100):</td>
    1018                 <td><input type='hidden' name='MAX_FILE_SIZE' value='$max_fs'><input name='userfile' type='file'>$img</td></tr>
    1019                 <tr><td>Описание:</td>
    1020                 <td><textarea name='desc'>" . html_out($group_info['desc']) . "</textarea></td></tr>
    1021                 <tr><td>Статические дополнительные свойства товаров группы<br><br>
    1022                 Добавить из набора:<select name='collection'>
    1023                 <option value='0'>--не выбран--</option>");
    1024             $rgroups = $db->query("SELECT `id`, `name` FROM `doc_base_pcollections_list` ORDER BY `name`");
    1025             while ($col = $res->fetch_row()) {
    1026                 $tmpl->addContent("<option value='$col[0]'>" . html_out($col[1]) . "</option>");
    1027             }
    1028             $tmpl->addContent("</select></td>
    1029                 <td>
    1030                 <table width='100%' id='fg_table' class='list'>
    1031                 <thead>
    1032                 <tr><th><img src='/img/i_filter.png' alt='Отображать в фильтрах'></th><th>Название параметра</th><th>&nbsp;</th></tr>
    1033                 </thead>
    1034                 <tfoot>
    1035                 <tr><td><input type='checkbox' id='fg_check'><td>
    1036                 <select name='pp' id='fg_select'>
    1037                 <option value='0' selected>--не выбрано--</option>");
    1038             $res_group = $db->query("SELECT `id`, `name` FROM `doc_base_gparams` ORDER BY `name`");
    1039             while ($groupp = $res_group->fetch_row()) {
    1040                 $tmpl->addContent("<option value='-1' disabled>" . html_out($groupp[1]) . "</option>");
    1041                 $res = $db->query("SELECT `id`, `name` FROM `doc_base_params` WHERE `group_id`='$groupp[0]' ORDER BY `name`");
    1042                 while ($param = $res->fetch_row()) {
    1043                     $tmpl->addContent("<option value='$param[0]'>- " . html_out($param[1]) . "</option>");
    1044                 }
    1045             }
    1046             $tmpl->addContent("</select>
    1047                 </td><td><img src='/img/i_add.png' alt='' onclick='return addLine()'></td></tr>
    1048                 </td></tr></tfoot>
    1049                 <tbody>");
    1050 
    1051             $r = $db->query("SELECT `doc_base_params`.`id`, `doc_base_params`.`name`, `doc_group_params`.`show_in_filter` FROM `doc_base_params`
    1052                 LEFT JOIN `doc_group_params` ON `doc_group_params`.`param_id`=`doc_base_params`.`id`
    1053                 WHERE  `doc_group_params`.`group_id`='$group'
    1054                 ORDER BY `doc_base_params`.`id`");
    1055             while ($p = $r->fetch_row()) {
    1056                 $checked = $p[2] ? 'checked' : '';
    1057                 $tmpl->addContent("<tr><td><input type='hidden' name='fn[$p[0]]' value='1'>
    1058                                 <input type='checkbox' name='fc[$p[0]]' value='1' $checked></td><td>" . html_out($p[1]) . "</td>
    1059                                 <td><img src='/img/i_del.png' alt='' onclick='return rmLine(this)'></td></tr>");
    1060             }
    1061 
    1062             $tmpl->addContent("</tbody></table>
    1063                         <tr class='lin1'><td colspan='2' align='center'>
    1064                         <button type='submit'>Сохранить</button>
    1065                         </table></form>");
    1066 
    1067             if ($group) {
    1068                 $cost_types = array('pp' => 'Процент', 'abs' => 'Абсолютная наценка', 'fix' => 'Фиксированная цена');
    1069                 $direct = array((-1) => 'Вниз', 0 => 'K ближайшему', 1 => 'Вверх');
    1070                 $res = $db->query("SELECT `doc_cost`.`id`, `doc_group_cost`.`id`, `doc_cost`.`name`, `doc_cost`.`type`, `doc_cost`.`value`, `doc_group_cost`.`type`, `doc_group_cost`.`value`, `doc_group_cost`.`accuracy`, `doc_group_cost`.`direction`, `doc_cost`.`accuracy`, `doc_cost`.`direction`
    1071                                 FROM `doc_cost`
    1072                                 LEFT JOIN `doc_group_cost` ON `doc_cost`.`id`=`doc_group_cost`.`cost_id` AND `doc_group_cost`.`group_id`='$group'");
    1073                 $tmpl->addContent("<h1>Задание цен</h1>
    1074                                 <form action='docs.php' method='post'>
    1075                                 <input type='hidden' name='mode' value='esave'>
    1076                                 <input type='hidden' name='l' value='sklad'>
    1077                                 <input type='hidden' name='g' value='$group'>
    1078                                 <input type='hidden' name='param' value='gc'>
    1079                                 <table cellpadding='0' width='50%' class='list'>
    1080                                 <tr><th>Цена</th><th>Тип</th><th>Значение</th><th>Точность</th><th>Округление</th></tr>");
    1081                 while ($cn = $res->fetch_row()) {
    1082                     $sig = ($cn[4] > 0) ? '+' : '';
    1083                     if ($cn[3] == 'pp')
    1084                         $def_val = "({$sig}$cn[4] %)";
    1085                     else if ($cn[3] == 'abs')
    1086                         $def_val = "({$sig}$cn[4] руб.)";
    1087                     else if ($cn[3] == 'fix')
    1088                         $def_val = "(= $cn[4] руб.)";
    1089                     else
    1090                         $def_val = "({$sig}$cn[4] XX)";
    1091 
    1092                     $checked = $cn[1] ? 'checked' : '';
    1093 
    1094                     $tmpl->addContent("<tr><td><label><input type='checkbox' name='ch$cn[0]' value='1' $checked>" . html_out($cn[2]) . " $def_val</label></td>
    1095                                         <td><select name='cost_type$cn[0]'>");
    1096                     foreach ($cost_types as $id => $type) {
    1097                         $sel = ($id == $cn[5]) ? ' selected' : '';
    1098                         $tmpl->addContent("<option value='$id'$sel>$type</option>");
    1099                     }
    1100                     if (!$cn[1]) {
    1101                         $cn[5] = $cn[3];
    1102                         $cn[6] = $cn[4];
    1103                         $cn[7] = $cn[9];
    1104                         $cn[8] = $cn[10];
    1105                     }
    1106                     $tmpl->addContent("</select></td>
    1107                                         <td><input type='text' name='val$cn[0]' value='$cn[6]'></td>
    1108                                         <td><select name='accur$cn[0]'>");
    1109                     for ($i = -3; $i < 3; $i++) {
    1110                         $a = sprintf("%0.2f", pow(10, $i * (-1)));
    1111                         $sel = $cn[7] == $i ? 'selected' : '';
    1112                         $tmpl->addContent("<option value='$i' $sel>$a</option>");
    1113                     }
    1114                     $tmpl->addContent("</select>
    1115                                         <td><select name='direct$cn[0]'>");
    1116                     for ($i = (-1); $i < 2; $i++) {
    1117                         $sel = $cn[8] == $i ? 'selected' : '';
    1118                         $tmpl->addContent("<option value='$i' $sel>{$direct[$i]}</option>");
    1119                     }
    1120                     $tmpl->addContent("</select>");
    1121                 }
    1122                 $tmpl->addContent("</table>
    1123                                 <button>Сохранить цены</button></form>");
    1124             }
    1125         }
    1126         // Импорт из яндекс маркета
    1127         else if ($param == 'y') {
    1128             if (!request('a')) {
    1129                 $res = $db->query("SELECT `doc_base_params`.`id`, `doc_base_values`.`value` FROM `doc_base_params`
    1130                                 LEFT JOIN `doc_base_values` ON `doc_base_values`.`param_id`=`doc_base_params`.`id` AND `doc_base_values`.`id`='$pos'
    1131                                 WHERE `doc_base_params`.`codename`='ym_url'");
    1132 
    1133                 $tmpl->addContent("
    1134                                 <form method='post' action='/docs.php'>
    1135                                 <input type='hidden' name='l' value='sklad'>
    1136                                 <input type='hidden' name='mode' value='srv'>
    1137                                 <input type='hidden' name='opt' value='ep'>
    1138                                 <input type='hidden' name='param' value='y'>
    1139                                 <input type='hidden' name='pos' value='$pos'>
    1140                                 <input type='hidden' name='a' value='parse'>
    1141                                 Введите url нужного предложения Яндекс-маркета:<br>
    1142                                 <input type='text' name='url' value=''>
    1143                                 <button>Получить данные</button>
    1144                                 </form>");
    1145                 if ($res->num_rows) {
    1146                     $nxt = $res->fetch_row();
    1147                     $tmpl->addContent("<a href='http://market.yandex.ru/model-spec.xml?modelid=" . html_out($nxt[1]) . "'>Посмотреть на яндекс-маркете</a>");
    1148                 }
    1149             } else {
    1150                 $url = request('url');
    1151                 $keywords = null;   // Чтобы подсветка не ругалась
    1152                 preg_match("/[?]*modelid=([\d]{1,9})[?]*+/", $url, $keywords);
    1153                 $ym_id = $keywords[1];
    1154                 settype($ym_id, 'int');
    1155                 $url = "http://market.yandex.ru/model-spec.xml?modelid=" . $ym_id;
    1156                 $ch = curl_init();
    1157                 curl_setopt($ch, CURLOPT_URL, $url);
    1158                 curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    1159                 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    1160                 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    1161                 curl_setopt($ch, CURLOPT_TIMEOUT, 4);
    1162                 $result = curl_exec($ch);
    1163                 if (curl_errno($ch))
    1164                     throw new Exception(curl_error($ch));
    1165                 curl_close($ch);
    1166 
    1167                 $dom = new domDocument();
    1168                 $dom->loadHTML($result);
    1169                 $dom->preserveWhiteSpace = false;
    1170 
    1171                 $f = 0;
    1172                 $tables = $dom->getElementsByTagName('table');
    1173                 foreach ($tables as $table) {
    1174                     if ($table->getAttribute('class') == 'b-properties') {
    1175                         $f = 1;
    1176                         break;
    1177                     }
    1178                 }
    1179 
    1180                 function getSelectParams($id, $name) {
    1181                     global $db;
    1182                     $ret = "<select name='sel[$id]'><option value='-1' selected>--не выбрано--</option>";
    1183                     $selected = $db->real_escape_string($name);
    1184                     $res = $db->query("SELECT CONCAT(`doc_base_gparams`.`name`,' - ',`doc_base_params`.`name`), `doc_base_params`.`ym_assign`
    1185                                     FROM `doc_base_params`
    1186                                     INNER JOIN `doc_base_gparams` ON `doc_base_gparams`.`id`=`doc_base_params`.`group_id`
    1187                                     WHERE `doc_base_params`.`ym_assign`='$selected'");
    1188                     if ($res->num_rows) {
    1189                         $nxt = $res->fetch_row();
    1190                         return $nxt[0];
    1191                     }
    1192                     $res_group = $db->query("SELECT `id`, `name` FROM `doc_base_gparams` ORDER BY `name`");
    1193                     while ($group = $res_group->fetch_row()) {
    1194                         $ret.="<option value='-1' disabled>" . html_out($group[1]) . "</option>";
    1195                         $res = $db->query("SELECT `id`, `param`, `ym_assign`"
    1196                             . " FROM `doc_base_params`"
    1197                             . " WHERE `group_id`='$group[0]'"
    1198                             . " ORDER BY `name`");
    1199                         while ($param = $res->fetch_row()) {
    1200                             $warn = $param[2] ? '(!)' : '';
    1201                             $ret.="<option value='$param[0]'>- " . html_out($param[1]) . " $warn</option>";
    1202                         }
    1203                     }
    1204                     $ret.="</select>";
    1205                     return $ret;
    1206                 }
    1207 
    1208                 if ($f) {
    1209                     $values = array();
    1210 
    1211                     mb_internal_encoding('UTF-8');
    1212                     $rows = $table->getElementsByTagName('tr');
    1213                     $prefix = $param = '';
    1214                     foreach ($rows as $row) {
    1215                         for ($item = $row->firstChild; $item != null; $item = $item->nextSibling) {
    1216                             $class = $item->getAttribute('class');
    1217                             if (strpos($class, 'b-properties__title') !== false)
    1218                                 $prefix = $item->nodeValue;
    1219                             else if (strpos($class, 'b-properties__label') !== false)
    1220                                 $param = $item->nodeValue;
    1221                             else if (strpos($class, 'b-properties__value') !== false)
    1222                                 $values["$prefix:$param"] = $item->nodeValue;
    1223                         }
    1224                     }
    1225                     $tmpl->addContent("
    1226                                         <form method='post' action='/docs.php'>
    1227                                         <input type='hidden' name='l' value='sklad'>
    1228                                         <input type='hidden' name='mode' value='esave'>
    1229                                         <input type='hidden' name='param' value='y'>
    1230                                         <input type='hidden' name='pos' value='$pos'>
    1231                                         <input type='hidden' name='ym_id' value='$ym_id'>
    1232                                         <table class='list'>
    1233                                         <tr><th>Параметр Яндекс Маркета</th><th>Ассоциированный параметр</th><th>Значение из Яндекс Маркета</th></tr>");
    1234                     $i = 0;
    1235                     foreach ($values as $param => $value) {
    1236                         $tmpl->addContent("<tr><td><input type='checkbox' name='ch[$i]' value='" . html_out($param) . "' checked>" . html_out($param) . "</td><td>" . getSelectParams($i, $param) . "</td><td><input type='text' name='val[$i]' value='" . html_out($value) . "' style='width: 400px'></td></tr>");
    1237                         $i++;
    1238                     }
    1239                     $tmpl->addContent("</table>
    1240                                         <label><input type='checkbox' name='id_save' value='1' checked>Сохранить новый ID</label><br>
    1241                                         <label><input type='checkbox' name='auto' value='1' checked>Автоматически ассоциировать одноимённые параметры</label><br>
    1242                                         <label><input type='checkbox' name='create' value='1'>Создать и ассоциировать отсутствующие (не рекомендуется, т.к. это может нарушить авторские права)</label><br>
    1243                                         <label><input type='checkbox' name='to_collection' value='1'>Добавить создаваемые параметры в категорию</label><br>
    1244                                         <select name='collection'>
    1245                                         <option value='0'>--не выбран--</option>");
    1246                     $rgroups = $db->query("SELECT `id`, `name` FROM `doc_base_pcollections_list` ORDER BY `name`");
    1247                     while ($col = $rgroups->fetch_row()) {
    1248                         $tmpl->addContent("<option value='$col[0]'>" . html_out($col[1]) . "</option>");
    1249                     }
    1250                     $tmpl->addContent("</select>
    1251                                         <button>Записать</button>
    1252                                         </form>");
    1253                 }
    1254             }
    1255         } else {
     1147            $this->showNomenclatureGroupsEditForm($group);
     1148        }
     1149        else {
    12561150            throw new \NotFoundException("Неизвестная закладка");
    12571151        }
     
    13601254        if ($param == '' || $param == 'v') {
    13611255            $this->saveProduct($pos);
    1362         } else if ($param == 'd') {
     1256        }
     1257        else if ($param == 'd') {
    13631258            $analog = request('analog');
    13641259            $d_int = request('d_int', 0);
     
    16561551            $name = request('name');
    16571552            $desc = request('desc');
     1553            $vieworder = rcvint('vieworder');
    16581554            $pid = rcvint('pid');
    16591555            $hid = rcvint('hid');
     
    16801576                \acl::accessGuard('directory.goods.groups', \acl::UPDATE);
    16811577                $res = $db->query("UPDATE `doc_group` SET `name`='$name_sql', `desc`='$desc_sql', `pid`='$pid', `hidelevel`='$hid',
    1682                     `printname`='$pname_sql', `no_export_yml`='$no_export_yml', `title_tag`='$title_tag_sql',
     1578                    `vieworder`='$vieworder', `printname`='$pname_sql', `no_export_yml`='$no_export_yml', `title_tag`='$title_tag_sql',
    16831579                    `meta_keywords`='$meta_keywords_sql', `meta_description`='$meta_description_sql' WHERE `id` = '$group'");
    16841580            } else {
    16851581                \acl::accessGuard('directory.goods.groups', \acl::CREATE);
    1686                 $res = $db->query("INSERT INTO `doc_group` (`name`, `desc`, `pid`, `hidelevel`, `printname`, `no_export_yml`, `title_tag`,
     1582                $res = $db->query("INSERT INTO `doc_group` (`name`, `desc`, `pid`, `hidelevel`, `vieworder`, `printname`, `no_export_yml`, `title_tag`,
    16871583                        `meta_keywords`, `meta_description`)
    1688                     VALUES ('$name_sql', '$desc_sql', '$pid', '$hid', '$pname_sql', '$no_export_yml', '$title_tag_sql', '$meta_keywords_sql',
     1584                    VALUES ('$name_sql', '$desc_sql', '$pid', '$hid', '$vieworder', '$pname_sql', '$no_export_yml', '$title_tag_sql', '$meta_keywords_sql',
    16891585                        '$meta_description_sql' )");
    16901586            }
     
    17841680            $db->commit();
    17851681        }
    1786         else if ($param == 'y') {
    1787             $url = request('url');
    1788             $checkboxes = request('ch');
    1789             $ym_id = rcvint('ym_id');
    1790             $id_save = request('id_save');
    1791             $auto = request('auto');
    1792             $create = request('create');
    1793             $collection = rcvint('collection');
    1794             $to_collection = request('to_collection');
    1795 
    1796             if ($id_save) {
    1797                 $res = $db->query("SELECT `doc_base_params`.`id`, `doc_base_values`.`value` FROM `doc_base_params`
    1798                         LEFT JOIN `doc_base_values` ON `doc_base_values`.`param_id`=`doc_base_params`.`id` AND `doc_base_values`.`id`='$pos'
    1799                         WHERE `doc_base_params`.`param`='ym_url'");
    1800                 if (!$res->num_rows) {
    1801                     $db->query("INSERT INTO `doc_base_params` (`name`, `codename`, `type`, `hidden`)"
    1802                         . " VALUES ('URL Я.Маркет', 'ym_url', 'double', 1)");
    1803                     $nxt = array(0 => $db->insert_id, 1 => 0);
    1804                 } else
    1805                     $nxt = $res->fetch_row();
    1806                 if ($ym_id != $nxt[1]) {
    1807                     $db->query("REPLACE `doc_base_values` (`id`, `param_id`, `value`) VALUES ('$pos', '$nxt[0]', '$ym_id')");
    1808                     doc_log("UPDATE pos", "ym_url: ($nxt[1] => $ym_id)", 'pos', $pos);
    1809                 }
    1810             }
    1811             if (!is_array($checkboxes))
    1812                 throw new Exception('Не передан набор данных');
    1813             $log_add = '';
    1814             foreach ($checkboxes as $id => $param) {
    1815                 $param_sql = $db->real_escape_string($param);
    1816                 $res = $db->query("SELECT `doc_base_params`.`id` FROM `doc_base_params` WHERE `doc_base_params`.`ym_assign`='$param_sql'");
    1817                 if ($res->num_rows)
    1818                     list($int_param) = $res->fetch_row();
    1819                 else {
    1820                     $int_param = $_POST['sel'][$id];
    1821                     settype($int_param, 'int');
    1822                     if ($int_param < 1 && $auto) {
    1823                         $res = $db->query("SELECT `doc_base_params`.`id`, CONCAT(`doc_base_gparams`.`name`,':',`doc_base_params`.`name`) AS `pname`
    1824                                 FROM `doc_base_params`
    1825                                 INNER JOIN `doc_base_gparams` ON `doc_base_gparams`.`id`=`doc_base_params`.`group_id`
    1826                                 WHERE CONCAT(`doc_base_gparams`.`name`,':',`doc_base_params`.`name`)='$param_sql'");
    1827                         if ($res->num_rows)
    1828                             list($int_param) = $res->fetch_row();
    1829                     }
    1830                     if ($int_param < 1 && $create) {
    1831                         list($gname, $pname) = mb_split(":", $param, 2);
    1832                         $gname_sql = $db->real_escape_string($gname);
    1833                         $pname_sql = $db->real_escape_string($pname);
    1834                         $gres = $db->query("SELECT `id`, `name` FROM `doc_base_gparams` WHERE `name` = '$gname_sql'");
    1835                         if ($gres->num_rows)
    1836                             list($g_id) = $gres->fetch_row();
    1837                         else {
    1838                             $db->query("INSERT INTO `doc_base_gparams` (`name`) VALUES ('$gname_sql')");
    1839                             $g_id = $db->insert_id;
    1840                         }
    1841                         $res = $db->query("SELECT `id`, `param` FROM `doc_base_params` WHERE `group_id`='$g_id' AND `name`='$pname_sql'");
    1842                         if (!$res->num_rows) {
    1843                             $db->query("INSERT INTO `doc_base_params` (`name`, `type`, `group_id`, `ym_assign`) VALUES ('$pname_sql', 'text', '$g_id', '$param_sql')");
    1844                             $int_param = $db->insert_id;
    1845                             $db->query("INSERT INTO `doc_base_pcollections_set` (`collection_id`, `param_id`) VALUES ('$collection', '$int_param')");
    1846                         }
    1847                     }
    1848                     if ($int_param < 1) {
    1849                         continue;
    1850                     }
    1851                     $db->query("UPDATE `doc_base_params` SET `ym_assign`='$param_sql' WHERE `id`='$int_param'");
    1852                 }
    1853                 if ($int_param < 1) {
    1854                     continue;
    1855                 }
    1856                 $val = $db->real_escape_string($_POST['val'][$id]);
    1857                 $db->query("REPLACE `doc_base_values` (`id`, `param_id`, `value`) VALUES ('$pos', '$int_param', '$val')");
    1858                 $log_add .= ", $int_param:(=> $val)";
    1859             }
    1860             $tmpl->msg("Данные сохранены!", "ok");
    1861             if ($log_add) {
    1862                 doc_log("UPDATE", "$log_add", 'pos', $pos);
    1863             }
    1864         } else if ($param == 'p') {
     1682        else if ($param == 'p') {
    18651683            \acl::accessGuard('directory.goods.approve', \acl::VIEW);
    18661684            $tab = request('tab');
     
    18801698        global $db;
    18811699        $ret = '';
    1882         $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' ORDER BY `id`");
     1700        $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' ORDER BY `vieworder`, `id`");
    18831701        $i = 0;
    18841702        $r = '';
     
    26322450        }
    26332451        $list['a']  = ['name' => 'Анализатор'];
    2634         $list['h']  = ['name' => 'История'];
    2635         $list['y']  = ['name' => 'Импорт Я.Маркет'];       
     2452        $list['h']  = ['name' => 'История'];   
    26362453       
    26372454        $tmpl->addTabsWidget($list, $param, "/docs.php?l=sklad&amp;mode=srv&amp;opt=ep&amp;pos=$pos", 'param');
  • trunk/web/include/reports/china.php

    r963 r982  
    192192        $gs = rcvint('gs');
    193193        $g = request('g', array());
    194         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`=$pgroup_id ORDER BY `id`");
     194        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`=$pgroup_id ORDER BY `vieworder`,`name`");
    195195        while ($group_line = $res_group->fetch_assoc()) { 
    196196            if($gs) {
  • trunk/web/include/reports/costs.php

    r963 r982  
    9090        $pc = PriceCalc::getInstance();
    9191        $pc->SetFirmId($firm_id);
    92         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     92        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    9393        while ($group_line = $res_group->fetch_assoc()) {
    9494            if ($gs && !in_array($group_line['id'], $g)) {
  • trunk/web/include/reports/goods_approve.php

    r963 r982  
    9494       
    9595        /// и подгруппы
    96         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`=$group_id ORDER BY `id`");
     96        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`=$group_id ORDER BY `vieworder`,`name`");
    9797        while ($group_line = $res_group->fetch_assoc()) {
    9898            if ($vars['group_filter'] && is_array($vars['group_list'])) {
  • trunk/web/include/reports/groupstore.php

    r963 r982  
    119119
    120120        $sum = $zeroflag = $bsum = $summass = 0;
    121         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     121        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    122122        while ($group_line = $res_group->fetch_assoc()) {
    123123            if ($gs && !in_array($group_line['id'], $g)) {
  • trunk/web/include/reports/images.php

    r963 r982  
    201201        global $db;
    202202        settype($pgroup_id, 'int');
    203         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`=$pgroup_id ORDER BY `id`");
     203        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`=$pgroup_id ORDER BY `vieworder`,`name`");
    204204        while ($group_line = $res_group->fetch_assoc()) { 
    205205            if($this->gs) {
  • trunk/web/include/reports/liquidity.php

    r963 r982  
    155155        $all_size = array_sum($col_sizes);
    156156
    157         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     157        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    158158        while ($group_line = $res_group->fetch_assoc()) {
    159159            if ($gs && is_array($g)) {
  • trunk/web/include/reports/ostatkinadatu.php

    r979 r982  
    128128        }
    129129       
    130         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     130        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    131131        while ($group_line = $res_group->fetch_assoc()) {
    132132            if ($this->group_filter && !in_array($group_line['id'], $this->group_filter)) {
  • trunk/web/include/reports/pos_komplekt.php

    r963 r982  
    7272        $cnt = 0;
    7373        $col_cnt = count($headers);
    74         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     74        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    7575        while ($group_line = $res_group->fetch_assoc()) {
    7676            $this->tableAltStyle();
  • trunk/web/include/reports/pos_nosells.php

    r963 r982  
    111111        $cnt = 0;
    112112        $col_cnt = count($headers);
    113         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     113        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    114114        while ($group_line = $res_group->fetch_assoc()) {
    115115            if ($gs && !in_array($group_line['id'], $g)) {
  • trunk/web/include/reports/pricetags.php

    r963 r982  
    219219        global $db;
    220220        $ret = '';
    221         $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' AND `hidelevel`='0' ORDER BY `name`");
     221        $res = $db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' AND `hidelevel`='0' ORDER BY `vieworder`,`name`");
    222222        $i = 0;
    223223        $r = '';
     
    487487        $pc = PriceCalc::getInstance();
    488488        $pc->SetFirmId($firm_id);
    489         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     489        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    490490        while ($group_line = $res_group->fetch_assoc()) {
    491491            if ($gs && is_array($g)) {
  • trunk/web/include/reports/profitability.php

    r963 r982  
    262262        }
    263263        else if ($sel_type == 'group') {
    264             $res_group = $db->query("SELECT `id`, `name`, `pos_type` FROM `doc_group` ORDER BY `id`");
     264            $res_group = $db->query("SELECT `id`, `name`, `pos_type` FROM `doc_group` ORDER BY `vieworder`,`name`");
    265265            while ($group_line = $res_group->fetch_assoc()) {
    266266                if (!in_array($group_line['id'], $g))
  • trunk/web/include/reports/reserve.php

    r963 r982  
    4444        global $db;
    4545        settype($pgroup_id, 'int');
    46         $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$pgroup_id' ORDER BY `id`");
     46        $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `pid`='$pgroup_id' ORDER BY `vieworder`,`name`");
    4747        while ($group_line = $res->fetch_assoc()) {
    4848            if (is_array($group_list)) {
  • trunk/web/include/reports/sales.php

    r963 r982  
    608608            }
    609609        } else if ($sel_type == 'group') {
    610             $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     610            $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    611611            while ($group_line = $res_group->fetch_assoc()) {
    612612                if (is_array($g)) {
  • trunk/web/include/reports/sales_ext.php

    r963 r982  
    540540            }
    541541        } else if ($sel_type == 'group') {
    542             $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     542            $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    543543            while ($group_line = $res_group->fetch_assoc()) {
    544544                if (is_array($g)) {
  • trunk/web/include/reports/sk_coeff.php

    r963 r982  
    123123        $psc_id = $this->getPcsId();
    124124
    125         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     125        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    126126        while ($group_line = $res_group->fetch_assoc()) {
    127127            if ($gs && is_array($g)) {
  • trunk/web/include/reports/store.php

    r963 r982  
    245245
    246246        $bsum = $summass = 0;
    247         $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `id`");
     247        $res_group = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    248248        while ($group_line = $res_group->fetch_assoc()) {
    249249            if ($gs && is_array($g)) {
  • trunk/web/include/sitemap.inc.php

    r963 r982  
    4646        global $CONFIG, $db;
    4747        $ret = '';
    48         $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `id`");
     48        $res = $db->query("SELECT `id`, `name` FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `vieworder`,`name`");
    4949        if ($res->num_rows) {
    5050            $this->startGroup();
  • trunk/web/include/sync/dataexport.php

    r971 r982  
    383383        $res = $this->db->query("SELECT `id`, `pid` AS `parent_id`, `name`, `printname`, `desc` AS `comment`, `hidelevel` AS `hidden`"
    384384            . ", `no_export_yml`, `meta_description`, `meta_keywords`, `title_tag`"
    385             . " FROM `doc_group` ORDER BY `id`");
     385            . " FROM `doc_group` ORDER BY `vieworder`,`name`");
    386386        while($line = $res->fetch_assoc()) {           
    387387            $price_res = $this->db->query("SELECT `cost_id` AS `price_id`, `type`, `value`, `accuracy`, `direction`
  • trunk/web/price.php

    r963 r982  
    2525        global $db;
    2626        $ret='';
    27         $res=$db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' AND `hidelevel`='0' ORDER BY `name`");
     27        $res=$db->query("SELECT `id`, `name`, `desc` FROM `doc_group` WHERE `pid`='$level' AND `hidelevel`='0' ORDER BY `vieworder`,`name`");
    2828        $i=0;
    2929        $r='';
  • trunk/web/priceload.php

    r963 r982  
    5454        $res = $db->query("SELECT `doc_group`.`id`, `doc_group`.`name`, `firm_info_group`.`id` FROM `doc_group`
    5555        LEFT JOIN `firm_info_group`     ON `firm_info_group`.`firm_id`='$firm' AND `firm_info_group`.`group_id`=`doc_group`.`id`
    56         WHERE `doc_group`.`pid`='$level' ORDER BY `doc_group`.`name`");
     56        WHERE `doc_group`.`pid`='$level' ORDER BY `doc_group`.`vieworder`,`doc_group`.`id`");
    5757        $i = 0;
    5858        $r = '';
     
    584584                Группа:<br>
    585585                <select name='group'>");
    586                 $res = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `name`");
     586                $res = $db->query("SELECT `id`, `name` FROM `doc_group` ORDER BY `vieworder`,`name`");
    587587                if (!$nxt[3])
    588588                        $tmpl->addContent("<option style='background-color: #8f8;' selected disabled value='0'>--- не выбрана ---</option>");
  • trunk/web/vitrina.php

    r963 r982  
    14931493        global $tmpl, $db;
    14941494        settype($group,'int');
    1495         $res=$db->query("SELECT `id`, `name` FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `id`");
     1495        $res=$db->query("SELECT `id`, `name` FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `vieworder`,`name`");
    14961496        $tmpl->addStyle(".vitem { width: 250px; float: left; font-size: 14px; } .vitem:before{content: '\\203A \\0020' ; } hr.clear{border: 0 none; margin: 0;}");
    14971497        while($nxt=$res->fetch_row()) {
     
    15041504        global $tmpl, $CONFIG, $db;
    15051505
    1506         $res = $db->query("SELECT * FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `id`");
     1506        $res = $db->query("SELECT * FROM `doc_group` WHERE `hidelevel`='0' AND `pid`='$group' ORDER BY `vieworder`,`name`");
    15071507        $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;}");
    15081508        while ($nxt = $res->fetch_row()) {
Note: See TracChangeset for help on using the changeset viewer.