Jump to content

Kategori ürün sayfalarında stokta olmayan ürünleri QUERY nin sonununa nasıl alırız


Recommended Posts

Merhaba,

Kategorilerin listelemesinde, stokta olmayan ürünlerin SQL query nin sonunda olması için ne yapabiliriz. Stoğu 0 dan büyük olan ürünlere 1, stokta olmayan ürünlere 0 desek ve bunu ORDER BY satırına eklesek ihtiyacımı karşılar diye düşünüyorum.

Eklenecek SQL komutu şunun gibi birşey olmalı ORDER BY CASE WHEN ps_stock_available.quantity > 0 THEN 1 ELSE 0 END DESC

Ama nereye ekleyeceğimi daha bulamadım.

İstediğimi çok az daha açmak gerekirse bir kategori nin ürün listesinde 10 sayfa varsa. Stokta olan ürünler ilk sayfalarda, stokta olmayan ürünlerde en son sayfalarda olsun istiyorum.

Yardımcı olabilecek arkadaşlar yardım ederse çok sevinirim.

Denemek için MYSQL de yazdığım aşağıdaki QUERY çalıştırdığımda istediğim sonucu veriyor. Ama Prestashop a eklemek bu kadar kolay olur mu bilemiyorum.

SELECT pl.name, ps_stock_available.quantity, (CASE WHEN ps_stock_available.quantity > 0 THEN 1 ELSE 0 END) AS inStock
FROM ps_product_shop ps
LEFT JOIN ps_product_lang pl ON pl.id_product = ps.id_product
LEFT JOIN ps_stock_available ON ps_stock_available.id_product = ps.id_product
WHERE ps.id_shop=1 AND pl.id_shop=1 AND pl.id_shop=1 AND ps.id_category_default=14
ORDER BY CASE WHEN ps_stock_available.quantity > 0 THEN 1 ELSE 0 END DESC;

Link to comment
Share on other sites

Belki benim gibi başka biri de bu özelliği yapmak isterse sorunu nasıl çözdüğümü yazayım.

Prestashop 1.7.7.0 da

classes\Category.php (line 1048) de 

		...
		LEFT JOIN `' . _DB_PREFIX_ . 'stock_available` sa ON (p.`id_product` = sa.`id_product`) 
		...
		if ($random === true) {
            $sql .= ' ORDER BY (CASE WHEN sa.quantity > 0 THEN 1 ELSE 0 END) DESC, RAND() LIMIT ' . (int) $randomNumberProducts;
        } else {
            $sql .= ' ORDER BY (CASE WHEN sa.quantity > 0 THEN 1 ELSE 0 END) DESC, ' . (!empty($orderByPrefix) ? $orderByPrefix . '.' : '') . '`' . bqSQL($orderyBy) . '` ' . pSQL($orderWay) . '
            LIMIT ' . (((int) $p - 1) * (int) $n) . ',' . (int) $n;
        }

modules\ps_facetedsearch\src\Adapter\MYSQL.php line 129da

        if ($orderField) {
            $query .= ' ORDER BY (CASE WHEN quantity > 0 THEN 1 ELSE 0 END) DESC, ' . $orderField . ' ' . strtoupper($this->getOrderDirection());
        }

Category.php deki değişiklik ana sayfa ve ürün sayfalarının altında ki FEATURED PRODUCTS bölgelerinde işe yarıyor.

MySQL.php içindeki değişiklik ise kategori sayfalarında kullanılan FACETEDSEARCH listesinde işe yarıyor.

Bu iki değişiklikle STOK ta olan ürünler listelemelerde hep önde oluyor. Mesela listeyi isme göre sıralamak istediğiniz de önce stokta olan isimlerine alfabetik sıralıyor sonra stokta olmayan ürünleri alfabetik sıralıyor.   

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...