rferrero Posted August 12, 2011 Share Posted August 12, 2011 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 More sharing options...
zuzunai Posted August 12, 2011 Share Posted August 12, 2011 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 More sharing options...
tamu secreto Posted August 12, 2011 Share Posted August 12, 2011 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 saludos!! Link to comment Share on other sites More sharing options...
rferrero Posted August 17, 2011 Author Share Posted August 17, 2011 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 More sharing options...
Recommended Posts