Пример #1
0
$res = Catalog::cache('filters.php filter list', function ($md) {
    $conf = infra_config();
    $ans = array();
    $params = Catalog::getParams($md['group']);
    $poss = Catalog::getPoss($md['group']);
    //Поиск
    $count = sizeof($poss);
    //Позиций в группе
    $res = Catalog::search($md);
    $poss = $res['list'];
    $search = sizeof($poss);
    //Позиций найдено
    //ПОСЧИТАЛИ FILTER со всеми md
    foreach ($params as $k => $prop) {
        if ($prop['more']) {
            foreach ($poss as &$pos) {
                if (!Xlsx::isSpecified($pos['more'][$prop['posid']])) {
                    continue;
                }
                $r = false;
                if ($prop['separator']) {
                    $arval = explode($prop['separator'], $pos[$prop['posid']]);
                } else {
                    $arval = array($pos[$prop['posid']]);
                }
                foreach ($arval as $value) {
                    $idi = infra_forFS($value);
                    $id = mb_strtolower($idi);
                    if (!Xlsx::isSpecified($id)) {
                        continue;
                    }
                    $r = true;
                    $params[$k]['option'][$id]['search']++;
                }
                if ($r) {
                    $params[$k]['search']++;
                }
            }
        } else {
            foreach ($poss as &$pos) {
                if (!Xlsx::isSpecified($pos[$prop['posid']])) {
                    continue;
                }
                $r = false;
                if ($prop['separator']) {
                    $arval = explode($prop['separator'], $pos[$prop['posid']]);
                    $arname = explode($prop['separator'], $pos[$prop['posname']]);
                } else {
                    $arval = array($pos[$prop['posid']]);
                    $arname = array($pos[$prop['posname']]);
                }
                foreach ($arval as $i => $value) {
                    $idi = infra_forFS($value);
                    $id = mb_strtolower($idi);
                    if (!Xlsx::isSpecified($id)) {
                        continue;
                    }
                    $r = true;
                    $params[$k]['option'][$id]['search']++;
                }
                if ($r) {
                    $params[$k]['search']++;
                }
                //Позиций с этим параметром
            }
        }
        $params[$k]['nosearch'] = sizeof($poss) - $params[$k]['search'];
    }
    //ПОСЧИТАЛИ FILTER как если бы не было выбрано в этой группе md
    foreach ($params as $k => $prop) {
        if ($prop['more']) {
            $mymd = $md;
            $mymd['more'] = array_diff_key($md['more'], array_flip(array($prop['mdid'])));
            $res = Catalog::search($mymd);
            $poss = $res['list'];
            foreach ($poss as &$pos) {
                if (preg_match("/[:]/", $pos['more'][$prop['posid']])) {
                    continue;
                }
                if (!Xlsx::isSpecified($pos['more'][$prop['posid']])) {
                    continue;
                }
                $r = false;
                if ($prop['separator']) {
                    $arval = explode($prop['separator'], $pos['more'][$prop['posid']]);
                } else {
                    $arval = array($pos['more'][$prop['posid']]);
                }
                foreach ($arval as $value) {
                    $idi = infra_forFS($value);
                    $id = mb_strtolower($idi);
                    if (!Xlsx::isSpecified($id)) {
                        continue;
                    }
                    $r = true;
                    $params[$k]['option'][$id]['filter']++;
                }
                if ($r) {
                    $params[$k]['filter']++;
                }
            }
        } else {
            $mymd = array_diff_key($md, array_flip(array($prop['mdid'])));
            $res = Catalog::search($mymd);
            $poss = $res['list'];
            foreach ($poss as &$pos) {
                if (preg_match("/[:]/", $pos[$prop['posid']])) {
                    continue;
                }
                if (!Xlsx::isSpecified($pos[$prop['posid']])) {
                    continue;
                }
                $r = false;
                if ($prop['separator']) {
                    $arval = explode($prop['separator'], $pos[$prop['posid']]);
                } else {
                    $arval = array($pos[$prop['posid']]);
                }
                foreach ($arval as $i => $value) {
                    $idi = infra_forFS($value);
                    $id = mb_strtolower($idi);
                    if (!Xlsx::isSpecified($id)) {
                        continue;
                    }
                    $r = true;
                    $params[$k]['option'][$id]['filter']++;
                }
                if ($r) {
                    $params[$k]['filter']++;
                }
                //Позиций с этим параметром
            }
        }
        //У скольки позиций в выборке у которых этот параметр не указан
        $params[$k]['nofilter'] = sizeof($poss) - $params[$k]['filter'];
        //
    }
    /*
    	$params промежуточный массив со всеми возможными занчениями каждого параметра
    	каждое значение характеризуется
    	count - сколько всего в группе позиций с указанным параметром
    	search - сколько всего найдено с md
    	filter - сколько найдено если данный параметр не указана в md
    */
    //ДОБАВИЛИ option values
    foreach ($params as $k => $v) {
        if ($v['more']) {
            $right = array('more', $v['mdid']);
            $add = 'more.';
        } else {
            $right = array($v['mdid']);
            $add = '';
        }
        $showhard = infra_seq_get($md, $right);
        $opt = Catalog::option($params[$k]['option'], $count, $search, $showhard);
        if (!$opt) {
            unset($params[$k]);
        } else {
            $params[$k]['option'] = $opt;
        }
    }
    $ans['params'] = $params;
    //$ans['params']=$params;
    $ans['search'] = $search;
    //Позиций найдено
    $ans['count'] = $count;
    //Позиций в группе
    $ans['template'] = array();
    foreach ($params as $param) {
        $block = array();
        if ($param['more']) {
            $right = array('more', $param['mdid']);
            $add = 'more.';
        } else {
            $right = array($param['mdid']);
            $add = '';
        }
        $mymd = infra_seq_get($md, $right);
        if (!$mymd) {
            $mymd = array();
        }
        $paramid = infra_seq_short(array(Catalog::urlencode($param['mdid'])));
        $block['checked'] = !!$mymd['yes'];
        if ($block['checked']) {
            $block['add'] = $add . $paramid . '.yes:';
        } else {
            $block['add'] = $add . $paramid . '.yes:1';
        }
        $block['title'] = $param['title'];
        $block['type'] = $param['option']['type'];
        $block['filter'] = $param['filter'];
        $block['search'] = $param['search'];
        $block['count'] = $param['count'];
        $block['row'] = array();
        if ($param['option']['nocount']) {
            $row = array('title' => 'Не указано', 'filter' => $param['nofilter']);
            $row['checked'] = !!$mymd['no'];
            if ($row['checked']) {
                $row['add'] = $add . $paramid . '.no:';
            } else {
                $row['add'] = $add . $paramid . '.no:1';
            }
            $block['row'][] = $row;
        }
        if ($block['type'] == 'string') {
            foreach ($param['option']['values'] as $value) {
                $row = array('title' => $value['title'], 'filter' => $value['filter']);
                $row['checked'] = !!$mymd[$value['id']];
                $valueid = infra_seq_short(array(Catalog::urlencode($value['id'])));
                if ($row['checked']) {
                    $row['add'] = $add . $paramid . '.' . $valueid . ':';
                } else {
                    $row['add'] = $add . $paramid . '.' . $valueid . ':1';
                }
                $block['row'][] = $row;
            }
        }
        if ($conf['catalog']['filteroneitem'] || sizeof($block['row']) > 1) {
            $ans['template'][] = $block;
        }
    }
    return $ans;
}, $args, isset($_GET['re']));
Пример #2
0
$ans = Catalog::cache('search.php', function ($md, $page) use($ans) {
    //1
    $ans['is'] = '';
    //group producer search Что было найдено по запросу val (Отдельный файл is:change)
    $ans['descr'] = '';
    //абзац текста в начале страницы';
    $ans['text'] = '';
    //большая статья снизу всего
    $ans['name'] = '';
    //заголовок длинный и человеческий
    $ans['breadcrumbs'] = array();
    //Путь где я нахожусь
    //$ans['val']=$val;//Заголовок страницы
    //$ans['title']=$val;//Что именно было найдено название для FS
    $ans['filters'] = array();
    //Данные для формирования интерфейса фильтрации, опции и тп
    $ans['groups'] = array();
    $ans['producers'] = array();
    $ans['numbers'] = array();
    //Данные для построения интерфейса постраничной разбивки
    $ans['list'] = array();
    //Массив позиций
    Catalog::search($md, $ans);
    $conf = infra_config();
    //BREADCRUMBS TITLE
    if (!$md['group'] && $md['producer'] && sizeof($md['producer']) == 1) {
        //ПРОИЗВОДИТЕЛЬ
        if ($md['producer']) {
            foreach ($md['producer'] as $producer => $v) {
                break;
            }
        } else {
            $producer = false;
        }
        //is!, descr!, text!, name!, breadcrumbs!
        $ans['is'] = 'producer';
        $name = Catalog::getProducer($producer);
        $ans['name'] = $name;
        $ans['title'] = $name;
        $conf = infra_config();
        $ans['breadcrumbs'][] = array('title' => $conf['catalog']['title'], 'add' => 'producer:');
        $menu = infra_loadJSON('*catalog/menu.json');
        $ans['breadcrumbs'][] = array('href' => 'producers', 'title' => $menu['producers']['title']);
        $ans['breadcrumbs'][] = array('add' => 'producer::producer.' . $name . ':1', 'title' => $name);
    } else {
        if (!$md['group'] && $md['search']) {
            $ans['is'] = 'search';
            $ans['name'] = $md['search'];
            $ans['title'] = infra_forFs($md['search']);
            $conf = infra_config();
            $ans['breadcrumbs'][] = array('title' => $conf['catalog']['title'], 'add' => 'search:');
            $menu = infra_loadJSON('*catalog/menu.json');
            $ans['breadcrumbs'][] = array('href' => 'find', 'title' => $menu['find']['title']);
            $ans['breadcrumbs'][] = array('title' => $ans['name']);
        } else {
            //is!, descr!, text!, name!, breadcrumbs!, title
            if ($md['group']) {
                foreach ($md['group'] as $group => $v) {
                    break;
                }
            } else {
                $group = false;
            }
            $group = Catalog::getGroup($group);
            $ans['is'] = 'group';
            $ans['breadcrumbs'][] = array('href' => '', 'title' => $conf['catalog']['title'], 'add' => 'group:');
            array_map(function ($p) use(&$ans) {
                $group = Catalog::getGroup($p);
                $ans['breadcrumbs'][] = array('href' => '', 'title' => $group['name'], 'add' => 'group::group.' . $p . ':1');
            }, $group['path']);
            if (sizeof($ans['breadcrumbs']) == 1) {
                array_unshift($ans['breadcrumbs'], array('main' => true, "title" => "Главная", "nomark" => true));
            }
            $ans['name'] = $group['name'];
            //имя группы длинное
            $ans['descr'] = @$group['descr']['Описание группы'];
            $ans['title'] = $group['title'];
        }
    }
    Catalog::sort($ans['list'], $md);
    //Numbers
    $pages = ceil(sizeof($ans['list']) / $md['count']);
    if ($pages < $page) {
        $page = $pages;
    }
    $ans['numbers'] = Catalog::numbers($page, $pages, 11);
    $ans['list'] = array_slice($ans['list'], ($page - 1) * $md['count'], $md['count']);
    //Text
    $ans['text'] = infra_loadTEXT('*files/get.php?' . $conf['catalog']['dir'] . 'articals/' . $ans['title']);
    //Изменение текста не отражается как изменение каталога, должно быть вне кэша
    foreach ($ans['list'] as $k => $pos) {
        $pos = Catalog::getPos($pos);
        unset($pos['texts']);
        unset($pos['files']);
        $ans['list'][$k] = $pos;
    }
    return $ans;
}, $args, $re);
Пример #3
0
use itlife\files\Xlsx;
infra_cache_no();
$orig_val = infra_toutf(strip_tags($_GET['val']));
$orig_art = infra_toutf(strip_tags($_GET['art']));
$val = infra_strtolower($orig_val);
$art = infra_strtolower($orig_art);
$args = array($val, $art);
$ans = array();
$pos = Catalog::cache('position', function ($val, $art) {
    $data = Catalog::init();
    // список всей продукции
    return Xlsx::runPoss($data, function (&$pos, $i, &$group) use(&$val, &$art) {
        if (mb_strtolower($pos['producer']) !== $val) {
            return;
        }
        if (mb_strtolower($pos['article']) !== $art) {
            return;
        }
        return $pos;
    });
}, $args, isset($_GET['re']));
if (isset($_GET['seo'])) {
    if (!$pos) {
        return infra_err($ans, 'Position not found');
    }
    $link = $_GET['seo'];
    $link = $link . '/' . $pos['producer'] . '/' . $pos['article'];
    $ans['external'] = '*catalog/seo.json';
    $ans['canonical'] = infra_view_getPath() . '?' . $link;
    return infra_ans($ans);
Пример #4
0
$fd = Catalog::initMark($ans);
if (isset($_GET['lim'])) {
    $lim = $_GET['lim'];
} else {
    $lim = '0,20';
}
$p = explode(',', $lim);
if (sizeof($p) != 2) {
    return infra_err($ans, 'Is wrong paramter lim');
}
$start = (int) $p[0];
$count = (int) $p[1];
$args = array($start, $count);
$list = Catalog::cache('producers.php', function ($start, $count) {
    $ans = array();
    $conf = infra_config();
    $data = Catalog::init();
    $prods = array();
    Xlsx::runPoss($data, function (&$pos) use(&$prods) {
        @$prods[$pos['Производитель']]++;
    });
    arsort($prods, SORT_NUMERIC);
    $prods = array_slice($prods, $start, $count);
    return $prods;
}, $args, isset($_GET['re']));
$ans['menu'] = infra_loadJSON('*catalog/menu.json');
$ans['list'] = $list;
$conf = infra_config();
$ans['breadcrumbs'][] = array('href' => '', 'title' => $conf['catalog']['title'], 'add' => 'group');
$ans['breadcrumbs'][] = array('href' => 'producers', 'title' => 'Производители');
return infra_ret($ans);
Пример #5
0
$res = Catalog::cache('filters.php filter list', function ($md) {
    $conf = infra_config();
    $poss = Catalog::getPoss($md['group']);
    $ans = array();
    $params = array();
    //параметры
    //ПОСЧИТАЛИ COUNT
    $count = sizeof($poss);
    //количество позиций
    $main = array('Производитель' => array('posid' => 'producer', 'posname' => 'Производитель', 'mdid' => 'producer'), 'Цена' => array('posid' => 'Цена', 'posname' => 'Цена', 'mdid' => 'cost'));
    $main = array_merge($main, $conf['catalog']['filters']);
    // Заголовок блока => array('id'=>'Имя свойства в md', 'name'=>'Имя свойства в pos')
    foreach ($poss as &$pos) {
        if ($pos['more']) {
            foreach ($pos['more'] as $k => $val) {
                if (preg_match("/[:]/", $val)) {
                    continue;
                }
                if (preg_match("/[:]/", $k)) {
                    continue;
                }
                if (!Xlsx::isSpecified($val)) {
                    continue;
                }
                if (!isset($params[$k])) {
                    $params[$k] = array('posname' => $k, 'posid' => $k, 'mdid' => $k, 'title' => $k, 'more' => true, 'option' => array(), 'count' => 0, 'filter' => 0, 'search' => 0);
                }
                if (!isset($params[$k]['option'][$val])) {
                    $params[$k]['option'][$val] = array('id' => $val, 'title' => $val, 'count' => 0, 'filter' => 0, 'search' => 0);
                }
                $params[$k]['option'][$val]['count']++;
            }
        }
        foreach ($main as $k => $prop) {
            $val = $pos[$prop['posid']];
            if (preg_match("/[:]/", $val)) {
                continue;
            }
            if (!Xlsx::isSpecified($val)) {
                continue;
            }
            if (!isset($params[$k])) {
                $params[$k] = array('posname' => $prop['posname'], 'posid' => $prop['posid'], 'mdid' => $prop['mdid'], 'title' => $k, 'option' => array(), 'count' => 0, 'filter' => 0, 'search' => 0);
            }
            if (!isset($params[$k]['option'][$val])) {
                $params[$k]['option'][$val] = array('id' => $val, 'title' => $pos[$prop['posname']], 'count' => 0, 'filter' => 0, 'search' => 0);
            }
            $params[$k]['option'][$val]['count']++;
            $params[$k]['count']++;
        }
    }
    $res = Catalog::search($md);
    $poss = $res['list'];
    $search = sizeof($poss);
    //ПОСЧИТАЛИ NOW
    foreach ($params as $k => $v) {
        if ($v['more']) {
            foreach ($poss as &$pos) {
                if (!Xlsx::isSpecified($pos['more'][$v['posid']])) {
                    continue;
                }
                $params[$k]['option'][$pos['more'][$v['posid']]]['search']++;
                $params[$k]['search']++;
            }
        } else {
            foreach ($poss as &$pos) {
                if (!Xlsx::isSpecified($pos[$v['posid']])) {
                    continue;
                }
                $params[$k]['option'][$pos[$v['posid']]]['search']++;
                $params[$k]['search']++;
            }
        }
        $params[$k]['nosearch'] = sizeof($poss) - $params[$k]['search'];
    }
    //ПОСЧИТАЛИ FILTER
    foreach ($params as $k => $v) {
        if ($v['more']) {
            $mymd = $md;
            $mymd['more'] = array_diff_key($md['more'], array_flip(array($v['mdid'])));
            $res = Catalog::search($mymd);
            $poss = $res['list'];
            foreach ($poss as &$pos) {
                if (preg_match("/[:]/", $pos['more'][$v['posid']])) {
                    continue;
                }
                if (!Xlsx::isSpecified($pos['more'][$v['posid']])) {
                    continue;
                }
                $params[$k]['option'][$pos['more'][$v['posid']]]['filter']++;
                $params[$k]['filter']++;
            }
        } else {
            $mymd = array_diff_key($md, array_flip(array($v['mdid'])));
            $res = Catalog::search($mymd);
            $poss = $res['list'];
            foreach ($poss as &$pos) {
                if (preg_match("/[:]/", $pos[$v['posid']])) {
                    continue;
                }
                if (!Xlsx::isSpecified($pos[$v['posid']])) {
                    continue;
                }
                $params[$k]['option'][$pos[$v['posid']]]['filter']++;
                $params[$k]['filter']++;
            }
        }
        $params[$k]['nofilter'] = sizeof($poss) - $params[$k]['filter'];
    }
    //ДОБАВИЛИ option values
    foreach ($params as $k => $v) {
        if ($v['more']) {
            $right = array('more', $v['mdid']);
            $add = 'more.';
        } else {
            $right = array($v['mdid']);
            $add = '';
        }
        $showhard = infra_seq_get($md, $right);
        $opt = Catalog::option($params[$k]['option'], $count, $search, $showhard);
        if (!$opt) {
            unset($params[$k]);
        } else {
            $params[$k]['option'] = $opt;
        }
    }
    usort($params, function ($p1, $p2) {
        if ($p1['count'] > $p2['count']) {
            return -1;
        }
        if ($p1['count'] < $p2['count']) {
            return 1;
        }
        return 0;
    });
    $ans['params'] = $params;
    $ans['count'] = $search;
    $ans['template'] = array();
    foreach ($params as $param) {
        $block = array();
        if ($param['more']) {
            $right = array('more', $param['mdid']);
            $add = 'more.';
        } else {
            $right = array($param['mdid']);
            $add = '';
        }
        $mymd = infra_seq_get($md, $right);
        if (!$mymd) {
            $mymd = array();
        }
        $paramid = infra_seq_short(array(Catalog::urlencode($param['mdid'])));
        $block['checked'] = !!$mymd['yes'];
        //if($param['option']['yesall']==$count&&sizeof($param['option']['values'])<2){
        //    continue;
        //}
        if ($block['checked']) {
            $block['add'] = $add . $paramid . '.yes:';
        } else {
            $block['add'] = $add . $paramid . '.yes:1';
        }
        $block['title'] = $param['title'];
        $block['type'] = $param['option']['type'];
        $block['count'] = $param['filter'];
        $block['row'] = array();
        if ($param['option']['noall']) {
            $row = array('title' => 'Не указано', 'count' => $param['nofilter']);
            $row['checked'] = !!$mymd['no'];
            if ($row['checked']) {
                $row['add'] = $add . $paramid . '.no:';
            } else {
                $row['add'] = $add . $paramid . '.no:1';
            }
            $block['row'][] = $row;
        }
        if ($block['type'] == 'string') {
            foreach ($param['option']['values'] as $value) {
                $row = array('title' => $value['title'], 'count' => $value['filter']);
                $row['checked'] = !!$mymd[$value['id']];
                $valueid = infra_seq_short(array(Catalog::urlencode($value['id'])));
                if ($row['checked']) {
                    $row['add'] = $add . $paramid . '.' . $valueid . ':';
                } else {
                    $row['add'] = $add . $paramid . '.' . $valueid . ':1';
                }
                $block['row'][] = $row;
            }
        }
        $ans['template'][] = $block;
    }
    return $ans;
}, $args, isset($_GET['re']));
Пример #6
0
 public static function search($md, &$ans = array())
 {
     $args = array(Catalog::nocache($md));
     $res = Catalog::cache('search.php filter list', function ($md) {
         $conf = infra_config();
         $ans['list'] = Catalog::getPoss($md['group']);
         //ЭТАП filters list
         $ans['filters'] = Catalog::filtering($ans['list'], $md);
         foreach ($md['group'] as $now => $one) {
             break;
         }
         $ans['childs'] = Catalog::getGroups($ans['list'], $now);
         $ans['count'] = sizeof($ans['list']);
         return $ans;
     }, $args, isset($_GET['re']));
     $ans = array_merge($ans, $res);
     return $ans;
 }