2013-04-09 85 views
0

我想從產品列表中排除標記爲「僅限在線」的產品。prestashop從產品列表中排除產品

的產品list.tpl的開頭是:

<ul id="product_list" class="categorie_product clear"> 
    {foreach from=$products item=product name=products} 
     <li class="ajax_block_product ........etc........> 

把這個:

<li {if $product.online_only}style="display:none"{/if}> 

從列表中刪除產品,但他們仍然佔用空間在列表中。所以我在想唯一的辦法就是排除那些只能從foreach本身上網的產品,但是在如何做到這一點上有點失落。

回答

0

編輯:啊,是的,我忘了分頁。 看起來你必須將這些產品從MySQL的查詢中排除出去。

轉到classes/category.php並找到函數getProducts。

查找if ($getTotal)以及與此替換最後一行: '.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '').' AND p.online_only = 0'); 這將返回NOT(只有在線)產品的數量,因此分頁將正常工作。

正下方你會看到變量$ sql。 用這個替換最後一行: '.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '').' AND p.online_only = 0'; 這樣只有NOT(僅在線)產品被提取。

它應該工作。現在您不需要我前面提到的{continue},因爲只有那些不是(僅限在線)的產品纔會從數據庫中獲取。

讓我知道,如果這對你有用。

+0

謝謝你,這下就那部分的伎倆,但問題依然存在,雖然非在線的產品不出現在頁面的代碼了。 – user2263007 2013-04-10 13:29:42

+0

所以事實證明,問題實際上是在分頁,它仍然得到所有類別的產品,因此產品列表仍然認爲有更多的產品 - >例如,實際16中的5個現在正在顯示,但是頁面沒有充滿來自下一個「頁面」的產品,因此它將顯示每頁需要的16個頁面 – user2263007 2013-04-10 13:33:35

+0

上面編輯的答案。 – 2013-04-10 16:52:44

0

是的,這正是我所做的,但沒有效果。在其整個部分來自category.php:

 if ($getTotal) 
    { 
     $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow(' 
     SELECT COUNT(cp.`id_product`) AS total 
     FROM `'._DB_PREFIX_.'product` p 
     LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON p.`id_product` = cp.`id_product` 
     WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').' 
     '.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '').' AND p.online_only = 0'); 
     return isset($result) ? $result['total'] : 0; 
    } 

    $sql = ' 
    SELECT p.*, pa.`id_product_attribute`, pl.`description`, pl.`description_short`, pl.`available_now`, pl.`available_later`, pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, i.`id_image`, il.`legend`, m.`name` AS manufacturer_name, tl.`name` AS tax_name, t.`rate`, cl.`name` AS category_default, DATEDIFF(p.`date_add`, DATE_SUB(NOW(), INTERVAL '.(Validate::isUnsignedInt(Configuration::get('PS_NB_DAYS_NEW_PRODUCT')) ? Configuration::get('PS_NB_DAYS_NEW_PRODUCT') : 20).' DAY)) > 0 AS new, 
     (p.`price` * IF(t.`rate`,((100 + (t.`rate`))/100),1)) AS orderprice 
    FROM `'._DB_PREFIX_.'category_product` cp 
    LEFT JOIN `'._DB_PREFIX_.'product` p ON p.`id_product` = cp.`id_product` 
    LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (p.`id_product` = pa.`id_product` AND default_on = 1) 
    LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (p.`id_category_default` = cl.`id_category` AND cl.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product` AND i.`cover` = 1) 
    LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'tax_rule` tr ON (p.`id_tax_rules_group` = tr.`id_tax_rules_group` 
               AND tr.`id_country` = '.(int)Country::getDefaultCountryId().' 
               AND tr.`id_state` = 0) 
    LEFT JOIN `'._DB_PREFIX_.'tax` t ON (t.`id_tax` = tr.`id_tax`) 
    LEFT JOIN `'._DB_PREFIX_.'tax_lang` tl ON (t.`id_tax` = tl.`id_tax` AND tl.`id_lang` = '.(int)($id_lang).') 
    LEFT JOIN `'._DB_PREFIX_.'manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer` 
    WHERE cp.`id_category` = '.(int)($this->id).($active ? ' AND p.`active` = 1' : '').' 
    '.($id_supplier ? 'AND p.id_supplier = '.(int)$id_supplier : '').' AND p.online_only = 0'; 
+0

右,所以我測試的另一個安裝和它的工作,什麼也工作是 WHERE p.online_only = 0 第二對$ SQL部分最後一行。 任何情況我一定在我的系統上的某個文件中弄到了一些東西,所以感謝(工作)輸入:) – user2263007 2013-04-15 19:25:41

+0

太棒了!在$ result和$ sql中添加「WHERE p.online_only = 0」正是我上面提到的。如果您發現我的答案有幫助,請考慮選擇它:) – 2013-04-19 15:15:39