Jump to content

Recommended Posts

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

Делаю на сайте вывод всех брендов на одной странице по инструкции 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();
    }
 

Edited by esistema1
Link to post
Share on other sites

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

Примерно так

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

 

Link to post
Share on other sites
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');
    }
}

 

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

Link to post
Share on other sites

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

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

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));

Это вызов

Link to post
Share on other sites

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

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

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

На вот такой

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

print_r($query);

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

 

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

Link to post
Share on other sites
37 минут назад, esistema1 сказал:

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

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

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

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

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

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

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

Link to post
Share on other sites

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

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();

    }

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

Link to post
Share on other sites
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();

    }

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

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

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...