Перейти к содержанию
Официальный форум поддержки Simpla

Рекомендуемые сообщения

Всем доброго дня!

Делаю на сайте вывод всех брендов на одной странице по инструкции https://forum.simplacms.ru/topic/815-отдельная-страница-всех-брендов/

Все прикрутил, работает. Но как сделать так чтобы на странице /brands показывались только те бренды в которых есть товары с кол-вом больше 0 (т.е. чтобы срабатывал фильтр in_stock)

 

Вот сама функция (подскажите пожалуйста что в ней надо исправить):

public function get_all_brands($filter = array())
    {

        $category_id_filter = '';
        $visible_filter = '';
        $in_stock_filter = '';

        if(isset($filter['in_stock']))
            $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));

        if(isset($filter['visible']))
            $visible_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ? ' , intval($filter['visible']));
        
        if(!empty($filter['category_id']))
            $category_id_filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id LEFT JOIN __products_categories pc ON p.id = pc.product_id WHERE pc.category_id in(?@) $visible_filter $in_stock_filter", (array)$filter['category_id']);

        // Выбираем все бренды
        $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
                                        FROM __brands b $category_id_filter $visible_filter
                                        ORDER BY b.name");
                                                 
        $this->db->query($query);

        return $this->db->results();
    }
 

Изменено пользователем esistema1
Ссылка на сообщение
Поделиться на другие сайты

В функции ничего менять не надо, надо просто ее вызвать с правильным фильтром

Примерно так

<?PHP
require_once('View.php');
class BrandsView extends View
{
    function fetch()
    {   
        // Выбираем товар из базы
        $this->design->assign('meta_title', 'Все производители');
        $this->design->assign('meta_keywords', 'Все производители');
        $this->design->assign('meta_description', 'Все производители');
 
        $brands = $this->brands->get_brands(array('in_stock'=>1,'visible'=>1));
        $this->design->assign('brands', $brands);
 
        return $this->design->fetch('brands.tpl');
    }
}

 

Ссылка на сообщение
Поделиться на другие сайты
5 минут назад, Kosjak76 сказал:

В функции ничего менять не надо, надо просто ее вызвать с правильным фильтром

Примерно так


<?PHP
require_once('View.php');
class BrandsView extends View
{
    function fetch()
    {   
        // Выбираем товар из базы
        $this->design->assign('meta_title', 'Все производители');
        $this->design->assign('meta_keywords', 'Все производители');
        $this->design->assign('meta_description', 'Все производители');
 
        $brands = $this->brands->get_brands(array('in_stock'=>1,'visible'=>1));
        $this->design->assign('brands', $brands);
 
        return $this->design->fetch('brands.tpl');
    }
}

 

Так все равно показываются все бренды...

Ссылка на сообщение
Поделиться на другие сайты

Да, там же нет категории

Тогда по-другому

public function get_all_brands($filter = array())
    {

        $category_id_filter = '';
        $visible_filter = '';
        $in_stock_filter = '';

        if(isset($filter['in_stock']))
            $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));

        if(isset($filter['visible']))
            $visible_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ? ' , intval($filter['visible']));

            $category_id_filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id $visible_filter $in_stock_filter", (array)$filter['category_id']);

        // Выбираем все бренды
        $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
                                        FROM __brands b $category_id_filter $visible_filter
                                        ORDER BY b.name");
                                                 
        $this->db->query($query);

        return $this->db->results();
    }

Это функция

$brands = $this->brands->get_all_brands(array('in_stock'=>1,'visible'=>1));

Это вызов

Ссылка на сообщение
Поделиться на другие сайты

Поменяйте вот этот кусок

$this->db->query($query);

        return $this->db->results();

На вот такой

$this->db->query($query);

print_r($query);

        return $this->db->results();

 

И посмотрите, что выведется, какой будет запрос

Ссылка на сообщение
Поделиться на другие сайты
37 минут назад, esistema1 сказал:

Все равно показывает все бренды...

Оно и будет всегда показывать именно ВСЕ бренды.

Вообще функция совсем негодящая.

1. запрос в функции так составлен, что в принципе ВСЕГДА будет давать ВСЕ бренды, хоть с фильтрами  'in_stock'=>1,'visible'=>1, хоть без них.

2. фильтр  'visible'=>1 тоже в принципе работать верно не будет, так как в запросе вообще не участвует поле p.visible.

3. В итоговый запрос зачем-то ДВАЖДЫ вставляется $visible_filter.  Недостаток мелкий, но говорит сам за себя...

Функцию надо переделывать почти полностью...

Ссылка на сообщение
Поделиться на другие сайты

Не увидел, что функцию исковеркали через жопу

public function get_all_brands($filter = array())
    {
        $visible_filter = '';
        $in_stock_filter = '';

        if(isset($filter['in_stock']))
            $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));

        if(isset($filter['visible']))
            $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible']));
        

            $filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id  WHERE 1 $visible_filter $in_stock_filter");

        // Выбираем все бренды
        $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
                                         FROM __brands b $filter ORDER BY b.name");
        $this->db->query($query);

        return $this->db->results();

    }

Вот так работать должно, но без фильтра по категориям

Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, Kosjak76 сказал:

Вот так работать должно, но без фильтра по категориям

Одно решение лучше другого ?

Так держать!

Ссылка на сообщение
Поделиться на другие сайты
11 часов назад, Kosjak76 сказал:

Не увидел, что функцию исковеркали через жопу

public function get_all_brands($filter = array())
    {
        $visible_filter = '';
        $in_stock_filter = '';

        if(isset($filter['in_stock']))
            $in_stock_filter = $this->db->placehold('AND (SELECT count(*)>0 FROM __variants pv WHERE pv.product_id=p.id AND pv.price>0 AND (pv.stock IS NULL OR pv.stock>0) LIMIT 1) = ?', intval($filter['in_stock']));

        if(isset($filter['visible']))
            $visible_filter = $this->db->placehold('AND p.visible=?', intval($filter['visible']));
        

            $filter = $this->db->placehold("LEFT JOIN __products p ON p.brand_id=b.id  WHERE 1 $visible_filter $in_stock_filter");

        // Выбираем все бренды
        $query = $this->db->placehold("SELECT DISTINCT b.id, b.name, b.url, b.meta_title, b.meta_keywords, b.meta_description, b.description, b.image
                                         FROM __brands b $filter ORDER BY b.name");
        $this->db->query($query);

        return $this->db->results();

    }

Вот так работать должно, но без фильтра по категориям

Вот так работает! Спасибо огромное!

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...