Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
 
0 / 0 / 0
Регистрация: 12.05.2020
Сообщений: 6
1
MySQL

Фильтрация по всему магазину

31.07.2020, 02:19. Просмотров 136. Ответов 0

Имеется такой код, который фильтрует товары только в выбранной категории:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
 
namespace app\controllers;
 
use app\models\Category;
use app\widgets\filter\Filter;
 
class CategoryController extends AppController {
 
    public function viewAction(){
        $alias = $this->route['alias'];
        $category = \R::findOne('category', 'alias = ?', [$alias]);
        if(!$category){
            throw new \Exception('Страница не найдена', 404);
        }
 
        $cat_model = new Category();
        $ids = $cat_model->getIds($category->id);
        $ids = !$ids ? $category->id : $ids . $category->id;
 
        $page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
        //$perpage = App::$app->getProperty('pagination');
 
        $sql_part = '';
        if(!empty($_GET['filter'])){
            /*
            SELECT `product`.*  FROM `product`  WHERE category_id IN (6) AND id IN
            (
            SELECT product_id FROM attribute_product WHERE attr_id IN (1,5) GROUP BY product_id HAVING COUNT(product_id) = 2
            )
            */
            $filter = Filter::getFilter();
            if($filter){
                $cnt = Filter::getCountGroups($filter);
                $sql_part = "AND id IN (SELECT product_id FROM attribute_product WHERE attr_id IN ($filter) GROUP BY product_id HAVING COUNT(product_id) = $cnt)";
            }
        }
 
        $total = \R::count('product', "type_cat IN ($ids) $sql_part");
        //$pagination = new Pagination($page, $perpage, $total);
       // $start = $pagination->getStart();
 
        $products = \R::find('product', "type_cat IN ($ids) $sql_part");
 
        if($this->isAjax()){
            $this->loadView('filter', compact('products', 'total'));
        }
 
        $this->setMeta($category->title, $category->description, $category->keywords);
        $this->set(compact('products',  'total'));
    }
 
}
Он обращается к
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
 
namespace app\widgets\filter;
 
use ishop\Cache;
 
class Filter{
 
    public $groups;
    public $attrs;
    public $tpl;
 
    public function __construct(){
        $this->tpl = __DIR__ . '/filter_tpl.php';
        $this->run();
    }
 
    protected function run(){
        $cache = Cache::instance();
        $this->groups = $cache->get('filter_group');
        if(!$this->groups){
            $this->groups = $this->getGroups();
            $cache->set('filter_group', $this->groups, 30);
        }
        $this->attrs = $cache->get('filter_attrs');
        if(!$this->attrs){
            $this->attrs = self::getAttrs();
            $cache->set('filter_attrs', $this->attrs, 30);
        }
        $filters = $this->getHtml();
        echo $filters;
    }
 
    protected function getHtml(){
        ob_start();
        $filter = self::getFilter();
        if(!empty($filter)){
            $filter = explode(',', $filter);
        }
        require $this->tpl;
        return ob_get_clean();
    }
 
    protected function getGroups(){
        return \R::getAssoc('SELECT id, title FROM attribute_group');
    }
 
    protected static function getAttrs(){
        $data = \R::getAssoc('SELECT * FROM attribute_value');
        $attrs = [];
        foreach($data as $k => $v){
            $attrs[$v['attr_group_id']][$k] = $v['value'];
        }
        return $attrs;
    }
 
    public static function getFilter(){
        $filter = null;
        if(!empty($_GET['filter'])){
            $filter = preg_replace("#[^\d,]+#", '', $_GET['filter']);
            $filter = trim($filter, ',');
        }
        return $filter;
    }
 
    public static function getCountGroups($filter){
        $filters = explode(',', $filter);
        $cache = Cache::instance();
        $attrs = $cache->get('filter_attrs');
        if(!$attrs){
            $attrs = self::getAttrs();
        }
        $data = [];
        foreach($attrs as $key => $item){
            foreach($item as $k => $v){
                if(in_array($k, $filters)){
                    $data[] = $key;
                    break;
                }
            }
        }
        return count($data);
    }
 
}
и
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
 
namespace app\models;
 
use ishop\App;
 
class Category extends AppModel {
 
    public $attributes = [
        'title' => '',
        'parent_id' => '',
        'keywords' => '',
        'description' => '',
        'alias' => '',
    ];
 
    public $rules = [
        'required' => [
            ['title'],
        ]
    ];
 
    public function getIds($id){
        $cats = App::$app->getProperty('cats');
        $ids = null;
        foreach($cats as $k => $v){
            if($v['parent_id'] == $id){
                $ids .= $k . ',';
                $ids .= $this->getIds($k);
            }
        }
        return $ids;
    }
 
}
Как я могу сделать так, чтобы фильтрация происходила по всем товарам сразу, а не только в выбранной категории? (Будет запилен другой скрипт) Что-то я сообразить не могу на не спавшую долго голову. Буду благодарен за помощь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.07.2020, 02:19
Ответы с готовыми решениями:

SQUID Фильтрация по всему URL
Добрый день. Прошу о помощи более опытных и знающих коллег по админскому ремеслу. Есть CentOS 7,...

Не удалось подключиться к магазину
Здравствуйте, не могу подключиться к магазину, вылетает ошибка, хотя интернет стабильный, через...

Советы по интернет-магазину.
Всем добрый...! Хотел проконсультировься у профессионалов, так как сам полный 0 в этой теме, по...

Привязать xlslx файл к магазину
Привет. Можно как-то привязать xlslx файл к магазину? Когда в магазине переходишь в оплату,...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.07.2020, 02:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Определение объема товарооборота по каждому магазину
Информация о продаже товаров подготовлена по следующему макету: номер магазина; номер секции;...

Интернет-магазину требуется программист Perl
Интернет-магазину занимающемуся продажами мебели требуется программист, для поддержки существующего...

Прошу помоч с вопросом по инет магазину!
Приветствую!! Сразу хочу написать уважаемым модераторам - это не спам )) Просто я не совсем...

Подключение базы данных к интернет-магазину
Браузер напрочь отказывается показывать мне сайт нормально и вместо этого показывает просто код с...

Создание интерфейса подобно интернет магазину
Прошу помочь с решением такой проблемы я хочу сделать так чтобы по нажатию на картинку появлялось...

По магазину известна выручка каждого дня месяца
По магазину известна выручка каждого дня месяца. Распечатать самые &quot;не благоприятные&quot; дни месяца...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.