Skip to content

Commit

Permalink
фильтрация не только дочерних, но и тегованных tagSaver
Browse files Browse the repository at this point in the history
  • Loading branch information
webber12 committed Dec 18, 2017
1 parent 9473ccb commit 84b1cc9
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 8 deletions.
58 changes: 58 additions & 0 deletions assets/snippets/eFilter/eFilter.class.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,12 +65,16 @@ class eFilter {
//тип фильтра для DocLister. По умолчанию - tvd
public $dl_filter_type;

//id tv, с помощью которого товары привязываются к категориям с помощью плагина tagSaver
public $tv_category_tag = 0;

public function __construct($modx, $params)
{
$this->modx = $modx;
$this->params = $params;
$this->param_tv_id = $this->params['param_tv_id'];
$this->param_tv_id_simple = $this->params['param_tv_id_simple'];
$this->tv_category_tag = isset($this->params['tv_category_tag']) && (int)$this->params['tv_category_tag'] > 0 ? (int)$this->params['tv_category_tag'] : 0;
$this->param_tv_name = $this->getParamTvName();
$this->param_tv_name_simple = $this->getParamTvName($this->param_tv_id_simple);
$this->product_templates_id = $this->params['product_templates_id'];
Expand Down Expand Up @@ -889,4 +893,58 @@ public function getListFromJson($json = '', $field = 'id', $separator = ',')
return $out;
}

//возвращает список всех дочерних товаров категории плюс товаров, прикрепленных к категории тегом tagSaver через tv с id=$tv_id
public function getCategoryAllProducts($id, $tv_id)
{
if (!$tv_id) return array();
//сначала ищем все товары, вложенные в данную категорию на глубину до 6
$p = array(
'parents' => $id,
'depth' => '6',
'JSONformat' => 'new',
'api' => 'id',
'selectFields' => 'c.id',
'makeUrl' => '0',
'debug' => '2',
'addWhereList' => 'template IN (' . $this->product_templates_id . ')'
);
$json = $this->modx->runSnippet("DocLister", $p);
$children = array();
if ($json && !empty($json)) {
$arr = json_decode($json, TRUE);
if (!empty($arr) && isset($arr['rows'])) {
$tmp2 = array();
foreach ($arr['rows'] as $v) {
$children[$v['id']] = '1';
}
}
}
//затем берем id всех товаров, привязанных к этой категории через tv category id=$tv_id
$sql = "SELECT a.*, b.* FROM " . $this->modx->getFullTableName("tags") . " a, " . $this->modx->getFullTableName("site_content_tags") . " b WHERE b.tv_id = " . $tv_id . " AND a.id = b.tag_id AND a.name='" . $id . "'";
$q = $this->modx->db->query($sql);
$tmp_docs = array();
while ($row = $this->modx->db->getRow($q)) {
$children[$row['doc_id']] = '1';
}

//а также - товары, прикрепленные ко всем дочерним "категориям" относительно текущей категории (через tv "категория")
$childs = $this->modx->getChildIds($id);
if (!empty($childs)) {
$q1 = $this->modx->db->query("SELECT id FROM " . $this->modx->getFullTableName("site_content") . " WHERE id IN (" . implode(',', array_values($childs)) . ") AND deleted=0 AND published=1 AND isfolder=1");
$tmp_parents = array();
while($row = $this->modx->db->getRow($q1)) {
$tmp_parents[] = $row['id'];
}
if (!empty($tmp_parents)) {
$sql = "SELECT a.*, b.* FROM " . $this->modx->getFullTableName("tags") . " a, " . $this->modx->getFullTableName("site_content_tags") . " b WHERE b.tv_id = " . $tv_id . " AND a.id = b.tag_id AND a.name IN (" . implode(",", $tmp_parents) . ")";
$q = $this->modx->db->query($sql);
$tmp_docs = array();
while ($row = $this->modx->db->getRow($q)) {
$children[$row['doc_id']] = '1';
}
}
}
return $children;
}

}
8 changes: 7 additions & 1 deletion assets/snippets/eFilter/snippet.eFilter.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,14 @@
//он используется для поиска подходящих id ресурсов как без фильтров (категория, вложенность, опубликованность, удаленность и т.п.)
//так и с использованием фильтра
//на выходе получаем список id подходящих ресурсов через запятую
$DLparams = array('parents' => $eFltr->docid, /*'tpl' => '@CODE [+id+],', */'depth' => '3', 'addWhereList' => ((isset($eFltr->params['addWhereList']) && !empty($eFltr->params['addWhereList'])) ? $eFltr->params['addWhereList'] . ' AND ' : '') . 'c.template IN(' . $eFltr->params['product_templates_id'] . ')', 'makeUrl' => '0');
$DLparams = array('parents' => $eFltr->docid, 'depth' => '3', 'addWhereList' => ((isset($eFltr->params['addWhereList']) && !empty($eFltr->params['addWhereList'])) ? $eFltr->params['addWhereList'] . ' AND ' : '') . 'c.template IN(' . $eFltr->params['product_templates_id'] . ')', 'makeUrl' => '0');
$DLparamsAPI = array('JSONformat' => 'new', 'api' => 'id', 'selectFields' => 'c.id');
$allProducts = $eFltr->getCategoryAllProducts($eFltr->docid, $eFltr->tv_category_tag);
if (!empty($allProducts)) {
unset($DLparams['parents']);
unset($DLparams['depth']);
$DLparams['documents'] = implode(',', array_keys($allProducts));
}
$DLparamsAll = array_merge($DLparams, $DLparamsAPI);
//это список всех id товаров данной категории, дальше будем вычленять ненужные :)
$_ = $eFltr->modx->runSnippet("DocLister", $DLparamsAll);
Expand Down
14 changes: 7 additions & 7 deletions install/assets/modules/module.eLists.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
* manage product params lists
*
* @author webber ([email protected])
* @category module
* @version 0.1
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL)
* @internal @guid eFilters
* @internal @properties &param_tv_id=ID TV параметров товара;string; &param_tv_id_simple=ID TV параметров товара (простой фильтр);string; &product_templates_id=ID шаблонов товара;string; &param_cat_id=ID категории параметров;string; &exclude_tvs_from_list=Не включать ТВ в параметры при выводе;string; &tovarChunkName=Имя чанка вывода товара;string; &pattern_folder=Папка паттернов;string;assets/images/pattern/
* @internal @modx_category Filters
* @category module
* @version 0.1
* @license http://www.gnu.org/copyleft/gpl.html GNU Public License (GPL)
* @internal @guid eFilters
* @internal @properties &param_tv_id=ID TV параметров товара;string; &param_tv_id_simple=ID TV параметров товара (простой фильтр);string; &product_templates_id=ID шаблонов товара;string; &param_cat_id=ID категории параметров;string; &exclude_tvs_from_list=Не включать ТВ в параметры при выводе;string; &tovarChunkName=Имя чанка вывода товара;string; &pattern_folder=Папка паттернов;string;assets/images/pattern/; &tv_category_tag=ID TV, используемого для связки товар-категории через tagSaver;string;
* @internal @modx_category Filters
* @internal @installset base, sample
*/

Expand All @@ -32,4 +32,4 @@ tovarParams

*/

require_once MODX_BASE_PATH."assets/modules/eLists/module.eLists.php";
require_once MODX_BASE_PATH . "assets/modules/eLists/module.eLists.php";

0 comments on commit 84b1cc9

Please sign in to comment.