$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']));
$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);
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);
$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);
$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']));
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; }