Jump to content

No Mostrar Atributos Si No Hay Stock


rferrero

Recommended Posts

Hola, estoy intentando no mostrar los atributos cuyo stock es 0 de un producto, para ello estoy editando el product.tpl de mi theme Como puedo sacar la cantidad de un atributo para añadir o no el atributo al combo?

 

Un saludo

 

{foreach from=$groups key=id_attribute_group item=group}

<p>

<label for="group_{$id_attribute_group|intval}">{$group.name|escape:'htmlall':'UTF-8'} :</label>

{assign var='groupName' value='group_'|cat:$id_attribute_group}

<select name="{$groupName}" id="group_{$id_attribute_group|intval}" onchange="javascript:findCombination();">

{foreach from=$group.attributes key=id_attribute item=group_attribute}

<option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if}>{$group_attribute|escape:'htmlall':'UTF-8'}</option>

{/foreach}

</select>

</p>

{/foreach}

Link to comment
Share on other sites

Yo he tenido que hacer lo mismo, lo que he hecho es una funcion en classes/product.php que me haga una llamada a la base de datos y me devuelva los que tienen stock:

 

public function getCombinationsStock(){

$cons = '

SELECT al.`name`, al.`id_attribute` as id

FROM `'._DB_PREFIX_.'product_attribute` pa

LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pa.`id_product_attribute` = pac.`id_product_attribute`)

LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (pac.`id_attribute` = al.`id_attribute`)

 

WHERE pa.`id_product` = '.(int)($this->id).' AND

pa.`quantity` > 0 AND

al.`id_lang` = 3 ';

 

 

$result = Db::getInstance()->ExecuteS($cons);

 

return $result;

}

 

despues lo que haces es llamarlo con un assign en el tpl:

 

{assign var="combinationsStock" value=$product->getCombinationsStock()}

 

y despues lo recorres sustituyendo:

 

{foreach from=$group.attributes key=id_attribute item=group_attribute}

<option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if} title="{$group_attribute|escape:'htmlall':'UTF-8'}">{$group_attribute|escape:'htmlall':'UTF-8'}</option>

{/foreach}

 

POR:

(Si quieres la tipica opcion inicial de elige talla)

{if $combinationsStock|@count > 0} <option value="Selecciona una talla" selected="selected">ELIGE TALLA</option>

{else} <option value="No hay tallas" selected="selected">SIN STOCK</option>

{/if}

 

{foreach $combinationsStock as $tal}

<option value="{$tal['id']}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $tal['id']) || $group.default == $tal['id']} {/if} title="{$tal['name']}">{$tal['name']}</option>

{/foreach}

 

Con esto a mi me va bien, ten en cuenta que si tienes varios atributos ya la cosa se complica (tallas y colores por ejemplo).

 

Te lo he retocado, (yo tengo otros nombres y otras busquedas), quizas haya puesto mal algun nombre (tipico del copy paste) revisalo si no te funciona y si no ves nada me comentas.

 

Espero haberte ayudado.

 

Att. Artur.

Link to comment
Share on other sites

pues yo probaria haciendo esto:

 

mira que antes de :

 

{foreach from=$groups key=id_attribute_group item=group}

 

tiene que estar :

 

{if isset($groups)}

 

pues cambia :

{if isset($groups)}

 

por esto :

{if isset($groups) AND $product->quantity  > 0}

 

truco truco :P

 

 

saludos!!

Link to comment
Share on other sites

Gracias funcionó tu idea :-)

 

Yo he tenido que hacer lo mismo, lo que he hecho es una funcion en classes/product.php que me haga una llamada a la base de datos y me devuelva los que tienen stock:

 

public function getCombinationsStock(){

$cons = '

SELECT al.`name`, al.`id_attribute` as id

FROM `'._DB_PREFIX_.'product_attribute` pa

LEFT JOIN `'._DB_PREFIX_.'product_attribute_combination` pac ON (pa.`id_product_attribute` = pac.`id_product_attribute`)

LEFT JOIN `'._DB_PREFIX_.'attribute_lang` al ON (pac.`id_attribute` = al.`id_attribute`)

 

WHERE pa.`id_product` = '.(int)($this->id).' AND

pa.`quantity` > 0 AND

al.`id_lang` = 3 ';

 

 

$result = Db::getInstance()->ExecuteS($cons);

 

return $result;

}

 

despues lo que haces es llamarlo con un assign en el tpl:

 

{assign var="combinationsStock" value=$product->getCombinationsStock()}

 

y despues lo recorres sustituyendo:

 

{foreach from=$group.attributes key=id_attribute item=group_attribute}

<option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if} title="{$group_attribute|escape:'htmlall':'UTF-8'}">{$group_attribute|escape:'htmlall':'UTF-8'}</option>

{/foreach}

 

POR:

(Si quieres la tipica opcion inicial de elige talla)

{if $combinationsStock|@count > 0} <option value="Selecciona una talla" selected="selected">ELIGE TALLA</option>

{else} <option value="No hay tallas" selected="selected">SIN STOCK</option>

{/if}

 

{foreach $combinationsStock as $tal}

<option value="{$tal['id']}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $tal['id']) || $group.default == $tal['id']} {/if} title="{$tal['name']}">{$tal['name']}</option>

{/foreach}

 

Con esto a mi me va bien, ten en cuenta que si tienes varios atributos ya la cosa se complica (tallas y colores por ejemplo).

 

Te lo he retocado, (yo tengo otros nombres y otras busquedas), quizas haya puesto mal algun nombre (tipico del copy paste) revisalo si no te funciona y si no ves nada me comentas.

 

Espero haberte ayudado.

 

Att. Artur.

Link to comment
Share on other sites

Guest
This topic is now closed to further replies.
×
×
  • Create New...