Como: Crear un tipo de producto bundle personalizado en Magento 2
Cuando el bundle nativo se acerca, pero no es exactamente lo que necesitas
En esta página
En un proyecto reciente el producto bundle nativo era casi lo que necesitábamos, pero no del todo. En lugar de pelearme con el modelo del bundle a base de plugins por todas partes, decidí crear un tipo de producto personalizado que herede de él y solo cambie las partes que me importaban.
Resultó ser más sencillo de lo que esperaba, y mantuvo la personalización contenida en un solo lugar. Estas son las tres cosas que tuve que resolver.
app/code/Vendor/Module. Si necesitas saber cómo crear un nuevo módulo, te recomiendo que le eches un vistazo a Cómo crear un nuevo módulo para Magento 2.1. Declarar el tipo de producto personalizado
Cada tipo de producto en Magento se declara en etc/product_types.xml. Heredamos el modelo del bundle nativo para
obtener todo su comportamiento gratis y solo sobreescribimos lo que necesitamos.
<?xml version="1.0"?>
<!-- app/code/Vendor/Module/etc/product_types.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type name="custom_bundle"
label="Custom Bundle Product"
modelInstance="Vendor\Module\Model\Product\Type\CustomBundle"
composite="true"
indexPriority="60"
sortOrder="60">
<priceModel instance="Magento\Bundle\Model\Product\Price"/>
<indexerModel instance="Magento\Bundle\Model\ResourceModel\Indexer\Price"/>
<customAttributes>
<attribute name="refundable" value="true"/>
</customAttributes>
</type>
</config>El atributo importante aquí es composite="true", eso es lo que le dice a Magento que el producto está compuesto de
otros productos, exactamente como el bundle nativo.
2. El modelo del Type
Ahora el modelo referenciado en modelInstance. Como extendemos el tipo bundle nativo, solo implementamos el método
que cambia nuestro comportamiento y dejamos que el padre haga el resto.
<?php
/** app/code/Vendor/Module/Model/Product/Type/CustomBundle.php */
namespace Vendor\Module\Model\Product\Type;
use Magento\Bundle\Model\Product\Type as BundleType;
class CustomBundle extends BundleType
{
const TYPE_CODE = 'custom_bundle';
/**
* Ejemplo de override: cambiar cómo se prepara el sku.
*/
public function getSku($product)
{
return parent::getSku($product) . '-custom';
}
}3. Por qué el producto no aparecía en el frontend
Esta es la parte que me tuvo rascándome la cabeza un buen rato. Después de crear el tipo, el producto simplemente no aparecía en la tienda. La razón es que un tipo de producto nuevo no se agrega automáticamente a la lista de tipos visibles.
Tienes que registrarlo para que el catálogo sepa que puede listarse y agregarse al carrito:
<?xml version="1.0"?>
<!-- app/code/Vendor/Module/etc/di.xml -->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Catalog\Model\Product\Type">
<arguments>
<argument name="composableTypes" xsi:type="array">
<item name="custom_bundle" xsi:type="string">custom_bundle</item>
</argument>
</arguments>
</type>
</config>Después de un bin/magento setup:upgrade y un flush de caché, el producto por fin se comportó como un ciudadano de
primera clase en el catálogo.
Espero que esto ayude.
Si tienes alguna pregunta o conoces una mejor manera de lograr esto, siéntete libre de compartir en los comentarios a continuación.