Pregunta

¿Cómo cambio el cuadro de entrada de texto de cantidad a un menú desplegable en productos configurables?

Tengo este código en my /catalog/product/view/addtocart.phtml

 <label for="qty"><?php echo $this->__('Quantity') ?></label>
    <select class="input-text qty" name="qty" id="qty">

      <?php $i = 1 ?>
      <?php do { ?>
        <option value="<?php echo $i?>">
          <?php echo $i?>
          <?php $i++ ?>
        </option>
        <?php } while ($i <= (int)Mage::getModel('cataloginventory/stock_item')->loadByProduct($_product)->getQty()) ?></select>
    </div>
    <?php endif; ?>

Esto funciona bien para los productos simples, que muestran 1 a muchos artículos que tengo en stock. Pero en productos configurables, solo muestra '1' en el menú desplegable. (probablemente porque el producto configurable en sí no tiene inventario)

Yo vi esta página de stackexchange, pero no he podido adaptarlo a lo que quiero.

Editar: aquí hay un caso de uso -

Digamos que tengo botas disponibles en cuatro tamaños.

Botas:
Tamaño 6 - 3 pares
Tamaño 7 - 2 pares
Tamaño 8 - 1 par
Tamaño 9 - 4 pares

Cuando selecciono "Tamaño 6", me gustaría que el menú desplegable de la cantidad sea 1-3. Si selecciono el tamaño 9, debe subir a 4.

¿Fue útil?

Solución

Lo primero es lo primero:

  • En la actualidad, su código actual está requeriendo la base de datos para la información de inventario sobre cada iteración del bucle. No llames Mage::getModel en un bucle ... alguna vez
  • Con eso en mente, probablemente tampoco quiera pedirle a Magento que obtenga un modelo dentro del archivo de plantilla. Por lo tanto, probablemente desee agregar algún método a su bloque para obtener la cantidad máxima disponible en la base de datos y luego dejar de crear <option>s Cuando alcanzas ese límite.

Suponiendo que lo anterior es cierto Debe crear un módulo personalizado con un bloque personalizado. El archivo de plantilla que está editando actualmente debe modificarse para leer como tal:

<?php echo $this->getChildHtml('quantityoptionsdropdown');?>

Luego, en su diseño, XML (posiblemente local.xml) tendrá que definir ese bloque de alias:

<catalog_product_view>
    <block type="yourcompany/options" template="yourcompany/options.phtml" name="quantityoptionsdropdown" as="quantityoptionsdropdown"/>
</catalog_product_view>

Observe que usamos yourcompany/options Allí, que debe asignarse a las opciones de clase de bloque de su módulo personalizado con nombre. Entonces, la ruta de clase completa (al menos para este ejemplo) sería algo así como YourCompany_YourModule_Block_Options.

Así que así es como se vería tu clase de bloque:

App/Code/local/YourCompany/YourModule/Block/Options.php

class YourCompany_YourModule_Block_Options extends Mage_Core_Block_Abstract
{
    public function getStockMaximumQty()
    {
        $product = $this->getProduct();

        return $this->getProduct()->getStockItem()->getQty();
    }

    public function getProduct()
    {
        if(!$this->product){
            $this->product = Mage::registry('current_product');
        }
        return $this->product;
    }
}

Ahora, su archivo de plantilla:

App/Design/Frontend/Base/Default/Template/YourCompany/Options.phtml

<?php if($this->getStockMaximumQty()>0): ?>
    <? $i = 0; ?>
    <select name="quantity" id="qty">
        <?php while($i<=$this->getStockMaximumQty():?>
        <option value="<?php echo $i; ?>"><?php echo $i++; ?></option>
        <?php endwhile; ?>
    </select>
<?php else: ?>
    <?php echo $this->__('This product is currently out of stock.'); ?>
<?php endif; ?>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top