Jump to content

[RESOLU]Blockspecials - Afficher plusieurs produits


Recommended Posts

Bonjour à tous,

 

Je souhaiterais modifier le module "blockspecial" qui permet d'afficher les produits en promotion de la boutique.

 

En effet, ce module n'affiche qu'un seul produit aléatoirement. Or, je souhaiterais en afficher plusieurs (3 ou 4).

 

J'ai trouvé plusieurs tuto qui indiquent la marche à suivre mais pour des versions antérieures à 1.5.3 de prestashop.

Ci-dessous les liens des tutos :

http://www.viem.fr/a...loc-promotions/

http://www.prestasho...loc-promotions/

http://www.prestasho...ieurs-produits/

 

Et justement, je travaille sur la version 1.5.3 et du coup, je n'arrive pas à adapter et/ou appliquer correctement les modifications à apporter au code.

 

Par conséquent, si quelqu'un avait l'amabilité d'apporter quelques éclairages, j'en serais vraiment ravie. Je ne recherche pas forcément la solution "clef en main" mais au moins quelques pistes qui me permettraient de me débrouiller.

 

Dans tous les cas, je continue mes essais et si je trouve quelque chose, je ne manquerai pas d'en faire profiter la communauté.

 

Merci.

Edited by Céline13240 (see edit history)
Link to comment
Share on other sites

Bonjour,

 

J'aurais préféré vous dire : "ça y est voici la solution", mais malheureusement non. J'y ai cru grâce à ce tuto trouvé sur le forum anglais qui proposait une solution en modifiant uniquement le template blockspecials ,

http://www.prestashop.com/forums/topic/117765-quick-tutorial-how-to-add-multiple-specials-to-specials-block/ mais cela ne fonctionne pas.

 

Néanmoins, cela m'a permis de mieux cerner le problème.

 

Le module blockspecial se réfère à la fonction getrandomspecial (de la classe "Product.php") pour afficher les produits en promotion dans le bloc. Mais cette fonction n'intègre pas de paramètres d'affichage du nombre de produits (à la différence de la fonction getnewproducts qui se situe juste au-dessus dans le fichier Product.php et qui est utilisée par le module blocknewproduct ou encore la fonction getproducts qui elle, est utilisée pour le module homefeatured).

 

Donc la solution serait d'intégrer des paramètres d'affichages dans la fonction getrandomspecial, et pour le moment je sèche un peu.

 

C'est pourquoi, je réitère : please, help!

 

Merci.

Link to comment
Share on other sites

Bonjour,

 

en cherchant un peu et bidouillant salement j'ai réussi a me dépatouiller (PS v 1.5.4) :

 

D'abord dans classes/Product.php (il faudrait prendre soin de l'overrider - ce que je n'ai pas fait)

Dans la fonction getRandomSpecial :

a la fin de la 1ere requête SQL ($sql) ligne 2129 , on fixe la limite d'affichage, chez moi 4 donc :

ORDER BY RAND() LIMIT 4';

et juste à la suite :

$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
					foreach ($result as $row){
						$r = Product::getProductProperties($id_lang, $row);
						$rows[] = $r;
					}
					return $rows;

Ensuite je commente tout le reste jusque la fin (c'est sale j'avais prévenu)

 

Dans blockspecials.tpl(depuis votre theme/modules/blockspecials.tpl) il suffit d'utiliser une boucle foreach de type :

{foreach from=$special item=specials name=products}

exemple :

{foreach from=$special item=specials name=products}
{$specials.name|escape:html:'UTF-8'}
{/foreach}

 

C'est loin d'être parfait et propre mais ca convient à ce que je voulais mettre en place.

 

Si ca peut aider :)

  • Like 1
Link to comment
Share on other sites

Bonjour Chourak,

 

Merci beaucoup pour ta réponse. C'est vraiment super d'avoir partagé ton astuce.

 

Chez moi, c'est pas encore ça, mes images ne s'affichent plus. Mais je n'ai plus cette éternelle page blanche, et grâce à ton aide, je vais enfin pouvoir avancer.

 

Merci.

Link to comment
Share on other sites

Avec la boucle foreach que j'ai donné

 

rappel :

 

{foreach from=$special item=specials name=products}
{/foreach}

 

J'ai le code suivant pour afficher mon image produit (réglée sur la taille home) :

 

<a href="{$specials.link}">
<img src="{$link->getImageLink($specials.link_rewrite, $specials.id_image, 'home_default')}" alt="{$specials.legend|escape:html:'UTF-8'}" height="{$homeSize.height}" width="{$homeSize.width}" title="{$specials.name|escape:html:'UTF-8'}" />
</a>

Link to comment
Share on other sites

  • 3 weeks later...

Comme j'ai eu des soucis de gestion des images j'ai un peu revu ma copie sur les modifications pour afficher plusieurs produits en promotion

Je vous colle la fonction entière getRandomSpecial (du fichier classes/Product.php) :

 

/**
* Get a random special
*
* @param integer $id_lang Language id
* @return array Special
*/
public static function getRandomSpecial($id_lang, $beginning = false, $ending = false, Context $context = null)
{
if (!$context)
$context = Context::getContext();

$front = true;
if (!in_array($context->controller->controller_type, array('front', 'modulefront')))
$front = false;

$current_date = date('Y-m-d H:i:s');
$product_reductions = Product::_getProductIdByDate((!$beginning ? $current_date : $beginning), (!$ending ? $current_date : $ending), $context, true);

if ($product_reductions)
{
$ids_product = ' AND (';
foreach ($product_reductions as $product_reduction)
$ids_product .= '( product_shop.`id_product` = '.(int)$product_reduction['id_product'].($product_reduction['id_product_attribute'] ? ' AND product_attribute_shop.`id_product_attribute`='.(int)$product_reduction['id_product_attribute'] :'').') OR';
$ids_product = rtrim($ids_product, 'OR').')';

$groups = FrontController::getCurrentCustomerGroups();
$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');

// Please keep 2 distinct queries because RAND() is an awful way to achieve this result
$sql = 'SELECT product_shop.id_product, MAX(product_attribute_shop.id_product_attribute) id_product_attribute
FROM `'._DB_PREFIX_.'product` p
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN  `'._DB_PREFIX_.'product_attribute` pa ON (product_shop.id_product = pa.id_product)
'.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.default_on = 1').'
WHERE product_shop.`active` = 1
'.(($ids_product) ? $ids_product : '').'
AND p.`id_product` IN (
SELECT cp.`id_product`
FROM `'._DB_PREFIX_.'category_group` cg
LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
WHERE cg.`id_group` '.$sql_groups.'
)
'.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
AND p.`id_category_default` != 199
GROUP BY product_shop.id_product
ORDER BY RAND() LIMIT 0,4'; // ICI ON LIMITE LE NOMBRE DE PRODUITS A AFFICHER(4 dans mon cas) et j'exclue aussi tous les produits de la categorie 199

$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);

foreach($result as $res){
if($res['id_product']){
$sql = 'SELECT p.*, product_shop.*, stock.`out_of_stock` out_of_stock, pl.`description`, pl.`description_short`,
pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`,
p.`ean13`, p.`upc`, MAX(image_shop.`id_image`) id_image, il.`legend`,
DATEDIFF(product_shop.`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
FROM `'._DB_PREFIX_.'product` p
LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (
p.`id_product` = pl.`id_product`
AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
)
'.Shop::addSqlAssociation('product', 'p').'
LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.
Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
'.Product::sqlStock('p', 0).'
WHERE p.id_product = '.(int)$res['id_product'].'
GROUP BY product_shop.id_product';

						$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);

						if($row){
							if ($res['id_product_attribute']){
								$row['id_product_attribute'] = $res['id_product_attribute'];
							}
							$spe[] = Product::getProductProperties($id_lang, $row);
						}
					  }
					}

					return $spe;
}
else
return false;
}

 

et dans \themes\VOTRE_THEME\modules\blockspecials\blockspecials.tpl on fait boucler nos produits de la manière suivante :

 

<div class="block_content">
{if $special}
 {foreach from=$special item=prd name=products}
<a href="{$prd.link}"><img src="{$link->getImageLink($prd.link_rewrite, $prd.id_image, 'home_default')}" alt="{$prd.name|escape:html:'UTF-8'}" height="{$homeSize.height}" width="{$homeSize.width}" title="{$prd.name|escape:html:'UTF-8'}" /></a>
etc...
 {/foreach}
{/if}
</div>

Link to comment
Share on other sites

  • 2 months later...

Bonjour à tous,

Je me permet de ressortir ce topic, car j'ai beau suivre les instructions, je n'arrive pas à obtenir plusieurs produits dans la case.

J'ai fait un copié collé de la première partie dans product.php

Je pense que ce qui bloque vient de blockspecial.tpl

 

En effet, si je colle juste le foreach, je n'obtiens que la photo de 3 produits (la banière "PROMOTION" disparait) et il y a marqué ect... a droit de chaque photo.

Je souhaiterai garder la présentation avec la photo, le prix rayé, et le petit logo -30% sur la photo

 

J'ai donc essayer de placer la fonction FOREACH un peu partout, mais a aucun moment les photos n'apparaissent,

Si vous pouviez me donner un coup de pouce, je vous en serais reconnaissant ;)

Le site est www.promo-parquet.com

 

Au cas ou :

 

la fonction random spécial

 

* Get a random special

*

* @param integer $id_lang Language id

* @return array Special

*/

public static function getRandomSpecial($id_lang, $beginning = false, $ending = false, Context $context = null)

{

if (!$context)

$context = Context::getContext();

 

$front = true;

if (!in_array($context->controller->controller_type, array('front', 'modulefront')))

$front = false;

 

$current_date = date('Y-m-d H:i:s');

$product_reductions = Product::_getProductIdByDate((!$beginning ? $current_date : $beginning), (!$ending ? $current_date : $ending), $context, true);

 

if ($product_reductions)

{

$ids_product = ' AND (';

foreach ($product_reductions as $product_reduction)

$ids_product .= '( product_shop.`id_product` = '.(int)$product_reduction['id_product'].($product_reduction['id_product_attribute'] ? ' AND product_attribute_shop.`id_product_attribute`='.(int)$product_reduction['id_product_attribute'] :'').') OR';

$ids_product = rtrim($ids_product, 'OR').')';

 

$groups = FrontController::getCurrentCustomerGroups();

$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');

 

// Please keep 2 distinct queries because RAND() is an awful way to achieve this result

$sql = 'SELECT product_shop.id_product, MAX(product_attribute_shop.id_product_attribute) id_product_attribute

FROM `'._DB_PREFIX_.'product` p

'.Shop::addSqlAssociation('product', 'p').'

LEFT JOIN `'._DB_PREFIX_.'product_attribute` pa ON (product_shop.id_product = pa.id_product)

'.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.default_on = 1').'

WHERE product_shop.`active` = 1

'.(($ids_product) ? $ids_product : '').'

AND p.`id_product` IN (

SELECT cp.`id_product`

FROM `'._DB_PREFIX_.'category_group` cg

LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)

WHERE cg.`id_group` '.$sql_groups.'

)

'.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'

AND p.`id_category_default` != 199

GROUP BY product_shop.id_product

ORDER BY RAND() LIMIT 0,4'; // ICI ON LIMITE LE NOMBRE DE PRODUITS A AFFICHER(4 dans mon cas) et j'exclue aussi tous les produits de la categorie 199

 

$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);

 

foreach($result as $res){

if($res['id_product']){

$sql = 'SELECT p.*, product_shop.*, stock.`out_of_stock` out_of_stock, pl.`description`, pl.`description_short`,

pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`,

p.`ean13`, p.`upc`, MAX(image_shop.`id_image`) id_image, il.`legend`,

DATEDIFF(product_shop.`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

FROM `'._DB_PREFIX_.'product` p

LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (

p.`id_product` = pl.`id_product`

AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'

)

'.Shop::addSqlAssociation('product', 'p').'

LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.

Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'

LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')

'.Product::sqlStock('p', 0).'

WHERE p.id_product = '.(int)$res['id_product'].'

GROUP BY product_shop.id_product';

 

$row = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql);

 

if($row){

if ($res['id_product_attribute']){

$row['id_product_attribute'] = $res['id_product_attribute'];

}

$spe[] = Product::getProductProperties($id_lang, $row);

}

}

}

 

return $spe;

}

else

return false;

}

 

 

 

 

et le tpl :

 

{*

* 2007-2013 PrestaShop

*

* NOTICE OF LICENSE

*

* This source file is subject to the Academic Free License (AFL 3.0)

* that is bundled with this package in the file LICENSE.txt.

* It is also available through the world-wide-web at this URL:

* http://opensource.org/licenses/afl-3.0.php

* If you did not receive a copy of the license and are unable to

* obtain it through the world-wide-web, please send an email

* to [email protected] so we can send you a copy immediately.

*

* DISCLAIMER

*

* Do not edit or add to this file if you wish to upgrade PrestaShop to newer

* versions in the future. If you wish to customize PrestaShop for your

* needs please refer to http://www.prestashop.com for more information.

*

* @author PrestaShop SA <[email protected]>

* @copyright 2007-2013 PrestaShop SA

* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)

* International Registered Trademark & Property of PrestaShop SA

*}

 

<!-- MODULE Block specials -->

<div id="special_block_right" class="block products_block exclusive blockspecials">

 

<p class="title_block"><a href="{$link->getPageLink('prices-drop')}" title="{l s='Specials' mod='blockspecials'}">{l s='Specials' mod='blockspecials'}</a></p>

<div class="block_content">

{if $special}

<ul class="products clearfix">

{foreach from=$special item=prd name=products}

<li class="product_image">

<a href="{$special.link}"><img src="{$link->getImageLink($special.link_rewrite, $special.id_image, 'medium_default')}" alt="{$special.legend|escape:html:'UTF-8'}" height="{$mediumSize.height}" width="{$mediumSize.width}" title="{$special.name|escape:html:'UTF-8'}" /></a>

</li>

<li>

{if !$PS_CATALOG_MODE}

{if $special.specific_prices}

{assign var='specific_prices' value=$special.specific_prices}

{if $specific_prices.reduction_type == 'percentage' && ($specific_prices.from == $specific_prices.to OR ($smarty.now|date_format:'%Y-%m-%d %H:%M:%S' <= $specific_prices.to && $smarty.now|date_format:'%Y-%m-%d %H:%M:%S' >= $specific_prices.from))}

<span class="reduction"><span>-{$specific_prices.reduction*100|floatval}%</span></span>

{/if}

{/if}

{/if}

 

<p class="s_title_block"><a href="{$special.link}" title="{$special.name|escape:html:'UTF-8'}">{$special.name|escape:html:'UTF-8'}</a></p>

{if !$PS_CATALOG_MODE}

<span class="price-discount">{if !$priceDisplay}{displayWtPrice p=$special.price_without_reduction}{else}{displayWtPrice p=$priceWithoutReduction_tax_excl}{/if}</span>

<span class="price">{if !$priceDisplay}{displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc}{/if}</span>

{/if}

</li>

</ul>

{/foreach}

<p>

<a href="{$link->getPageLink('prices-drop')}" title="{l s='All specials' mod='blockspecials'}">» {l s='All specials' mod='blockspecials'}</a>

</p>

{else}

<p>{l s='No specials at this time' mod='blockspecials'}</p>

{/if}

</div>

</div>

<!-- /MODULE Block specials -->

Link to comment
Share on other sites

  • 4 weeks later...

Bonjour à tous,

 

J'ai effectué la nouvelle mise à jour pour passer de la version 1.5.3.1 à la version 1.5.5.0 en local sur wamp. Or, depuis j'ai une page blanche en guise de page d'accueil.

 

Je me suis aperçue que les modifications apportées au module "promotions" pour qu'il affiche plusieurs produits est à l'origine du problème. (Ceci est également valable pour la version 1.5.4.1)

 

Je voulais donc savoir si quelqu'un rencontre le même problème que moi et a réussi à le résoudre.

 

Merci d'avance.

Link to comment
Share on other sites

Bonjour promo-parquet,

 

Vous avez copiez à l'identique la fonction random special. Je pense qu'il serait préférable d'y apporter les modifications suivantes :

 

Remplacer

AND p.`id_category_default` != 199

par

AND (pa.id_product_attribute IS NULL OR product_attribute_shop.default_on = 1)

et

ORDER BY RAND() LIMIT 0,4'; // ICI ON LIMITE LE NOMBRE DE PRODUITS A AFFICHER(4 dans mon cas) et j'exclue aussi tous les produits de la categorie 199

par

ORDER BY RAND() LIMIT 0,4'; 

(N'oubliez pas de modifier le 4 par le nombre de produits que vous souhaitez afficher.)

 

Ensuite pour le template, vous n'avez pas modifier le nom de la variable $special par le nouveau nom donné par Chourak soit $prd.

 

Autrement dit, vous devez remplacer tous les $special par $prd.

 

Observez le code de Chourak :

<div class="block_content">
{if $special}
	 {foreach from=$special item=prd name=products}
<a href="{$prd.link}"><img src="{$link->getImageLink($prd.link_rewrite, $prd.id_image, 'home_default')}" alt="{$prd.name|escape:html:'UTF-8'}" height="{$homeSize.height}" width="{$homeSize.width}" title="{$prd.name|escape:html:'UTF-8'}" /></a>
etc...
	 {/foreach}
{/if}
</div>

J'espère que cela pourra vous aider.

Link to comment
Share on other sites

  • 9 months later...
  • 4 weeks later...

Bonjour,

 

J'ai adapté le code pour la version 1.6.0.6 :

 

/override/classes/Product.php : 

<?php

class Product extends ProductCore
{
	/**
	* Get a random special
	*
	* @param integer $id_lang Language id
	* @return array Special
	*/
	public static function getRandomSpecial($id_lang, $beginning = false, $ending = false, Context $context = null, $nb_items = 1)
	{
		if((int) $nb_items > 4)
			$nb_items = 4;
		elseif((int) $nb_items <= 0)
			$nb_items = 1;
			
 		if (!$context)
			$context = Context::getContext();

		$front = true;
		if (!in_array($context->controller->controller_type, array('front', 'modulefront')))
			$front = false;

		$current_date = date('Y-m-d H:i:s');
		$product_reductions = Product::_getProductIdByDate((!$beginning ? $current_date : $beginning), (!$ending ? $current_date : $ending), $context, true);

		if ($product_reductions)
		{
			$ids_product = ' AND (';
			foreach ($product_reductions as $product_reduction)
				$ids_product .= '( product_shop.`id_product` = '.(int)$product_reduction['id_product'].($product_reduction['id_product_attribute'] ? ' AND product_attribute_shop.`id_product_attribute`='.(int)$product_reduction['id_product_attribute'] :'').') OR';
			$ids_product = rtrim($ids_product, 'OR').')';

			$groups = FrontController::getCurrentCustomerGroups();
			$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');

			// Please keep 2 distinct queries because RAND() is an awful way to achieve this result
			$sql = 'SELECT product_shop.id_product, MAX(product_attribute_shop.id_product_attribute) id_product_attribute
					FROM `'._DB_PREFIX_.'product` p
					'.Shop::addSqlAssociation('product', 'p').'
					LEFT JOIN  `'._DB_PREFIX_.'product_attribute` pa ON (product_shop.id_product = pa.id_product)
					'.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.default_on = 1').'
					WHERE product_shop.`active` = 1
						'.(($ids_product) ? $ids_product : '').'
						AND p.`id_product` IN (
							SELECT cp.`id_product`
							FROM `'._DB_PREFIX_.'category_group` cg
							LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
							WHERE cg.`id_group` '.$sql_groups.'
						)
					'.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
					GROUP BY product_shop.id_product
					ORDER BY RAND()
					LIMIT 0, '.$nb_items;

			$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
			
			$results = array();
			foreach($result as $item)
			{				
				if($item['id_product'])
				{
					$results[$item['id_product']] = $item['id_product_attribute'];
				}
			}

			if(count($results)==0)
				return false;
			
			$sql = 'SELECT p.*, product_shop.*, stock.`out_of_stock` out_of_stock, pl.`description`, pl.`description_short`,
						pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`,
						p.`ean13`, p.`upc`, MAX(image_shop.`id_image`) id_image, il.`legend`,
						DATEDIFF(product_shop.`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
					FROM `'._DB_PREFIX_.'product` p
					LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (
						p.`id_product` = pl.`id_product`
						AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
					)
					'.Shop::addSqlAssociation('product', 'p').'
					LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.
					Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
					LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
					'.Product::sqlStock('p', 0).'
					WHERE p.id_product IN  ('. implode(',', array_keys($results)).')
					GROUP BY product_shop.id_product';

			$rows = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);

			if (!$rows)
				return false;

			$products = array();
			foreach($rows as $key=>$value)
			{
				if ($results[$value['id_product']])				
					$rows[$key]['id_product_attribute'] = $results[$value['id_product']];					
				
				$products[$key] = Product::getProductProperties($id_lang, $value);
			}

			return $products;
		}
		else
			return false;
	}
}

modules/blockspecials/blockspecials.php : BlockSpecials::hookRightColumn

	public function hookRightColumn($params)
	{
		if (Configuration::get('PS_CATALOG_MODE'))
			return;
		
		// We need to create multiple caches because the products are sorted randomly
		$random = date('Ymd').'|'.round(rand(1, max(Configuration::get('BLOCKSPECIALS_NB_CACHES'), 1)));

		if (!Configuration::get('BLOCKSPECIALS_NB_CACHES') || !$this->isCached('blockspecials.tpl', $this->getCacheId('blockspecials|'.$random)))
		{
			if (!($special = Product::getRandomSpecial((int)$params['cookie']->id_lang, false, false, null, 4)) && !Configuration::get('PS_BLOCK_SPECIALS_DISPLAY'))
				return;
				
			foreach($special as $key => $value)
			{		
				$special[$key]['priceWithoutReduction_tax_excl'] = Tools::ps_round($value['price_without_reduction'], 2);
			}
				
			$this->smarty->assign(array(
				'specials' => $special,
				//'priceWithoutReduction_tax_excl' => Tools::ps_round($special['price_without_reduction'], 2),
				'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')),
			));
		}

		return $this->display(__FILE__, 'blockspecials.tpl', (Configuration::get('BLOCKSPECIALS_NB_CACHES') ? $this->getCacheId('blockspecials|'.$random) : null));
	}

themes/votre_theme/modules/blockspecials/blockspecials.tpl (à adapter en fonction de votre fichier ) :

<!-- MODULE Block specials -->
    <section id="specials" class="block products_block column_box">
	<h4><span>{l s='Specials' mod='blockspecials'}</span><i class="column_icon_toggle icon-plus-sign"></i></h4>
	<div class="block_content toggle_content">
{if $specials}
		<ul>
		{foreach from=$specials item=special}
			<li class="shop_box  clearfix">
				<a class="products_block_img" href="{$special.link}"><img src="{$link->getImageLink($special.link_rewrite, $special.id_image, 'small_default')}" alt="{$special.legend|escape:html:'UTF-8'}" title="{$special.name|escape:html:'UTF-8'}" /></a>
				<div>
				<h5><a class="product_link" href="{$special.link}" title="{$special.name|escape:html:'UTF-8'}">{$special.name|escape:html:'UTF-8'|truncate:35:'...'}</a></h5>
				<p class="product_desc">{$special.description_short|strip_tags|escape:html:'UTF-8'|truncate:60:'...'}</p>                
            	<span class="price">{if !$priceDisplay}{displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc}{/if}</span>
            	{if !$PS_CATALOG_MODE}
					{if $special.specific_prices}
						{assign var='specific_prices' value=$special.specific_prices}
						{if $specific_prices.reduction_type == 'percentage' && ($specific_prices.from == $specific_prices.to OR ($smarty.now|date_format:'%Y-%m-%d %H:%M:%S' <= $specific_prices.to && $smarty.now|date_format:'%Y-%m-%d %H:%M:%S' >= $specific_prices.from))}
							<span class="reduction price">(-{$specific_prices.reduction*100|floatval}%)</span>
						{/if}
					{/if}
				{/if}

				<span class="price-discount price">{if !$priceDisplay}{displayWtPrice p=$special.price_without_reduction}{else}{displayWtPrice p=$special.priceWithoutReduction_tax_excl}{/if}</span>
				</div>
			</li>
		{/foreach}
		</ul>
		<a class="button_large" href="{$link->getPageLink('prices-drop')}" title="{l s='All specials' mod='blockspecials'}">{l s='All specials' mod='blockspecials'}</a>
{else}
		<p>{l s='No product specials are available at this time.' mod='blockspecials'}</p>
{/if}
	</div>
</section>
<!-- /MODULE Block specials -->
Link to comment
Share on other sites

  • 2 weeks later...

Pour clore ce topic, je vais poster les portions de code qui ont été modifiées.

 

/themes/votretheme/module/blockspecials.tpl :

<!-- MODULE Block specials -->
    <section id="specials special_block_right" class="block products_block column_box">
	<h4><span>{l s='Specials' mod='blockspecials'}</span></h4>
	<div class="block_content toggle_content">
{if $specials}
		<ul class="block_content products-block">
		{foreach from=$specials item=special}
			<li class="clearfix">
				<a class="products_block_img content_img clearfix" href="{$special.link}">
				<img class="replace-2x img-responsive" src="{$link->getImageLink($special.link_rewrite, $special.id_image, 'small_default')}" alt="{$special.legend|escape:html:'UTF-8'}" title="{$special.name|escape:html:'UTF-8'}" /></a>


				<div class="product-content">
				<h5>
					<a class="product-name" href="{$special.link}" title="{$special.name|escape:html:'UTF-8'}">{$special.name|escape:html:'UTF-8'|truncate:35:'...'}</a></h5>
				<p class="product-description">{$special.description_short|strip_tags:'UTF-8'|truncate:75:'...'}</p>  
				{if !$PS_CATALOG_MODE}
					<span class="special-price">
                                {if !$priceDisplay}
                                    {displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc}
                                {/if}
                            </span>
                             {if $special.specific_prices}
                                {assign var='specific_prices' value=$special.specific_prices}
                                {if $specific_prices.reduction_type == 'percentage' && ($specific_prices.from == $specific_prices.to OR ($smarty.now|date_format:'%Y-%m-%d %H:%M:%S' <= $specific_prices.to && $smarty.now|date_format:'%Y-%m-%d %H:%M:%S' >= $specific_prices.from))}
                                    <span class="price-percent-reduction">-{$specific_prices.reduction*100|floatval}%</span>
                                {/if}
                            {/if}
                             <span class="old-price">
                                {if !$priceDisplay}
                                    {displayWtPrice p=$special.price_without_reduction}{else}{displayWtPrice p=$priceWithoutReduction_tax_excl}
                                {/if}
                            </span>
				{/if}
				</div>
			</li>
		{/foreach}
		</ul>
		<div class="lnk">
		<a class="btn btn-default button button-small" href="{$link->getPageLink('prices-drop')}" title="{l s='All specials' mod='blockspecials'}"><span>{l s='All specials' mod='blockspecials'}<i class="icon-chevron-right right"></i></span></a>
		 </div>
{else}
		<p>{l s='No product specials are available at this time.' mod='blockspecials'}</p>
{/if}
	</div>
</section>
<!-- /MODULE Block specials -->

/classes/product.php

/**
	* Get a random special
	*
	* @param integer $id_lang Language id
	* @return array Special
	*/
	public static function getRandomSpecial($id_lang, $beginning = false, $ending = false, Context $context = null, $nb_items = 1)
	{
		if((int) $nb_items > 4)
			$nb_items = 4;
		elseif((int) $nb_items <= 0)
			$nb_items = 1;
			
 		if (!$context)
			$context = Context::getContext();

		$front = true;
		if (!in_array($context->controller->controller_type, array('front', 'modulefront')))
			$front = false;

		$current_date = date('Y-m-d H:i:s');
		$product_reductions = Product::_getProductIdByDate((!$beginning ? $current_date : $beginning), (!$ending ? $current_date : $ending), $context, true);

		if ($product_reductions)
		{
			$ids_product = ' AND (';
			foreach ($product_reductions as $product_reduction)
				$ids_product .= '( product_shop.`id_product` = '.(int)$product_reduction['id_product'].($product_reduction['id_product_attribute'] ? ' AND product_attribute_shop.`id_product_attribute`='.(int)$product_reduction['id_product_attribute'] :'').') OR';
			$ids_product = rtrim($ids_product, 'OR').')';

			$groups = FrontController::getCurrentCustomerGroups();
			$sql_groups = (count($groups) ? 'IN ('.implode(',', $groups).')' : '= 1');

			// Please keep 2 distinct queries because RAND() is an awful way to achieve this result
			$sql = 'SELECT product_shop.id_product, MAX(product_attribute_shop.id_product_attribute) id_product_attribute
					FROM `'._DB_PREFIX_.'product` p
					'.Shop::addSqlAssociation('product', 'p').'
					LEFT JOIN  `'._DB_PREFIX_.'product_attribute` pa ON (product_shop.id_product = pa.id_product)
					'.Shop::addSqlAssociation('product_attribute', 'pa', false, 'product_attribute_shop.default_on = 1').'
					WHERE product_shop.`active` = 1
						'.(($ids_product) ? $ids_product : '').'
						AND p.`id_product` IN (
							SELECT cp.`id_product`
							FROM `'._DB_PREFIX_.'category_group` cg
							LEFT JOIN `'._DB_PREFIX_.'category_product` cp ON (cp.`id_category` = cg.`id_category`)
							WHERE cg.`id_group` '.$sql_groups.'
						)
					'.($front ? ' AND product_shop.`visibility` IN ("both", "catalog")' : '').'
					GROUP BY product_shop.id_product
					ORDER BY RAND()
					LIMIT 0, '.$nb_items;

			$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);
			
			$results = array();
			foreach($result as $item)
			{				
				if($item['id_product'])
				{
					$results[$item['id_product']] = $item['id_product_attribute'];
				}
			}

			if(count($results)==0)
				return false;
			
			$sql = 'SELECT p.*, product_shop.*, stock.`out_of_stock` out_of_stock, pl.`description`, pl.`description_short`,
						pl.`link_rewrite`, pl.`meta_description`, pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`,
						p.`ean13`, p.`upc`, MAX(image_shop.`id_image`) id_image, il.`legend`,
						DATEDIFF(product_shop.`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
					FROM `'._DB_PREFIX_.'product` p
					LEFT JOIN `'._DB_PREFIX_.'product_lang` pl ON (
						p.`id_product` = pl.`id_product`
						AND pl.`id_lang` = '.(int)$id_lang.Shop::addSqlRestrictionOnLang('pl').'
					)
					'.Shop::addSqlAssociation('product', 'p').'
					LEFT JOIN `'._DB_PREFIX_.'image` i ON (i.`id_product` = p.`id_product`)'.
					Shop::addSqlAssociation('image', 'i', false, 'image_shop.cover=1').'
					LEFT JOIN `'._DB_PREFIX_.'image_lang` il ON (i.`id_image` = il.`id_image` AND il.`id_lang` = '.(int)$id_lang.')
					'.Product::sqlStock('p', 0).'
					WHERE p.id_product IN  ('. implode(',', array_keys($results)).')
					GROUP BY product_shop.id_product';

			$rows = Db::getInstance(_PS_USE_SQL_SLAVE_)->executeS($sql);

			if (!$rows)
				return false;

			$products = array();
			foreach($rows as $key=>$value)
			{
				if ($results[$value['id_product']])				
					$rows[$key]['id_product_attribute'] = $results[$value['id_product']];					
				
				$products[$key] = Product::getProductProperties($id_lang, $value);
			}

			return $products;
		}
		else
			return false;
	}

/modules/blockspecials/blockspecials.php

public function hookRightColumn($params)
	{
		if (Configuration::get('PS_CATALOG_MODE'))
			return;
		
		// We need to create multiple caches because the products are sorted randomly
		$random = date('Ymd').'|'.round(rand(1, max(Configuration::get('BLOCKSPECIALS_NB_CACHES'), 1)));

		if (!Configuration::get('BLOCKSPECIALS_NB_CACHES') || !$this->isCached('blockspecials.tpl', $this->getCacheId('blockspecials|'.$random)))
		{
			if (!($special = Product::getRandomSpecial((int)$params['cookie']->id_lang, false, false, null, 2)) && !Configuration::get('PS_BLOCK_SPECIALS_DISPLAY'))
				return;
				
			foreach($special as $key => $value)
			{		
				$special[$key]['priceWithoutReduction_tax_excl'] = Tools::ps_round($value['price_without_reduction'], 2);
			}
				
			$this->smarty->assign(array(
				'specials' => $special,
				//'priceWithoutReduction_tax_excl' => Tools::ps_round($special['price_without_reduction'], 2),
				'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')),
			));
		}

		return $this->display(__FILE__, 'blockspecials.tpl', (Configuration::get('BLOCKSPECIALS_NB_CACHES') ? $this->getCacheId('blockspecials|'.$random) : null));
	}

Voilà, en espérant que ça aidera ceux qui veulent faire pareil :)

Link to comment
Share on other sites

Le seul soucis c'est les petits réglages à faire dans le .tpl. Si vous n'avez pas l'habitude de modifier les fichiers .tpl cette modif risque de vous prendre beaucoup de temps. 

 

Perso j'ai un affichage correct mais avec des différences de design (qui ne viennent pas de mon css) que je n'arrive pas à régler.  :angry:

post-49658-0-53241700-1406291463_thumb.jpg

Link to comment
Share on other sites

  • 1 year later...

Bonjour,

 

Comme vous pouvez le voir, ce topic date d'il y a un an et demi.

A cette date, ce n'était pas aussi simple, sinon je n'aurais pas eu besoin de poster ici. 

 

Merci d'éviter de déterrer des sujets aussi vieux et marqués comme résolus.

 

Bonne journée

Link to comment
Share on other sites

  • 4 months later...

Bonjour,

 

Je n'arrive pas a afficher le prix en utilisant votre code.

 

si je colle par exemple ce code  :

<span class="price">{if !$priceDisplay}{displayWtPrice p=$special.price}{else}{displayWtPrice p=$special.price_tax_exc}{/if}</span>

Dans mon tpl :

<!-- MODULE Block specials -->
<div id="specials" class="block products_block">
	<h4><a href="{$link->getPageLink('prices-drop')}" title="{l s='En promotion actuellement' mod='blockspecials'}">{l s='Specials' mod='blockspecials'}</a></h4>
	<div class="block_content">
		<ul>
		{if $special} {foreach from=$special item=prd name=products}
		<li class="ajax_block_product">
		<a href="{$prd.link}"><img src="{$link->getImageLink($prd.link_rewrite, $prd.id_image, 'home_default')}" alt="{$prd.name|escape:html:'UTF-8'}" height="{$homeSize.height}" width="{$homeSize.width}" title="{$prd.name|escape:html:'UTF-8'}" /></a>
		<h5><a class="product_link" href="{$special.link}" title="{$prd.name|escape:html:'UTF-8'}">{$prd.name|escape:html:'UTF-8'}</a></h5>
		<p style="text-align: center;float:left;width:100%;">
			<a class="button" href="{$special.link}" title="{l s='Je commande' mod='blockspecials'}"><span>{l s='Je commande' mod='blockspecials'}</span></a>
		</p>
		</li>
	 {/foreach}{/if}
		</ul>
	</div>
</div>	

Le span du prix est vide ?

 

Merci pour le partage j'y suis presque :-)

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...