php - sps decidir magento 2
Magento: cotiza/ordena el atributo de artículo de producto según la entrada del usuario (3)
Es posible agregar campos personalizados al elemento Presupuesto. Cómo agregar campos personalizados para artículos de línea de pedido en Magento para comenzar. He utilizado estas instrucciones recientemente para agregar campos personalizados a un ítem Magento Quote y el concepto está bien, pero hay algunas prácticas en ese artículo que no son geniales. Cosas que haría de manera diferente:
- Use una secuencia de comandos de configuración para agregar campos a la base de datos en lugar de hacerlo directamente.
- Utilice el objeto Request de Magento en lugar de acceder a $ _REQUEST directamente.
- Usa extensiones y reescribe en lugar de modificar el núcleo de Magento.
- Realice los cambios en config.xml desde una extensión en lugar de modificar el núcleo.
En general, es mejor evitar modificar el núcleo de Magento y aplicar sus personalizaciones a través de un módulo, ya que hace que las actualizaciones sean más fáciles / posibles en el futuro. Si no ha creado su propia extensión antes de moduleCreator puede ayudarlo a generar la plantilla necesaria.
Resumen
Quiero crear un atributo de producto que no se guarde en productos, o que se muestre en la página de edición del producto como atributos de productos comunes. En su lugar, quiero que se guarde para ordenar / presupuestar elementos y se muestre en pedidos, facturas y demás. También debe ser configurable por el cliente en la interfaz antes de agregar un producto al carrito.
Detalles
- Al igual que con las Opciones personalizadas , se debe agregar un elemento de formulario a la página del producto frontend.
- A diferencia de las Opciones personalizadas, este no es un atributo real del producto. No se debe mostrar en las páginas de productos de administrador ni en los conjuntos de atributos.
- El cliente debe proporcionar un valor válido. Necesito poder hacer la validación del lado del servidor.
- Quiero tener una plantilla .phtml generando su html. Actualmente puedo anular app / design / frontend / base / default / catalog / product / view / type / default.phtml con resultados satisfactorios (de diseño). Sin embargo, no sé cómo capturar, validar y, finalmente, guardar su valor.
- El valor de este elemento de formulario se debe guardar con el elemento de producto de presupuesto / pedido.
- Este valor debe mostrarse en todas las facturas, pedidos y correos electrónicos de ventas.
- Quiero controlar el resultado con una plantilla, o al menos poder devolver la cadena que se utiliza para mostrar el valor
Mis preguntas
- ¿Cómo puedo validar y eventualmente guardar el valor de una
<input>
en la página del producto de la interfaz al elemento de la cita cuando el producto se agrega al carro y más tarde en el proceso de compra al artículo del pedido? - ¿Cómo se muestra este valor en el pedido, la factura, los correos electrónicos de ventas y esas páginas?
- ¿Cómo puedo filtrar una colección de pedidos para obtener pedidos que tienen elementos con mi valor establecido en un valor específico?
Actualización 1
Descubrí que puedo ejecutar este código en un catalog/product
modelo de catalog/product
(y probablemente sales/quote_item
también) durante eventos como sales_quote_item_qty_set_after
$infoBuyRequest = $product->getCustomOption(''info_buyRequest'');
$buyRequest = new Varien_Object(unserialize($infoBuyRequest->getValue()));
$myData = $buyRequest->getMyData();
De esta forma, pude recuperar mis datos personalizados proporcionados por el cliente desde mi <input>
en la página del producto.
Sospecho que esta info_buyRequest
se guarda con los elementos de presupuesto y pedido. Si es así, esto solucionó parcialmente mis problemas 1 y 2. Sin embargo, todavía no sé dónde es adecuado ejecutar este código, y no sé cómo mostrarlo en las páginas de orden / cotización / informe del back-end. También creo que, dado que se almacena como un valor serializado en la base de datos, será más difícil obtener colecciones de artículos de orden / orden basados en mis datos personalizados.
Magento proporciona una capacidad para agregar opciones que no son atributos de productos o opciones personalizadas de productos. Se establecen en el producto y se entregan elementos con el código de opción additional_options
.
Hay dos pasos que debe seguir, cada uno puede manejarse a través de un observador de eventos. Si desea que las opciones adicionales se realicen a través del reordenamiento, también deberá observar un tercer evento.
Agregar opciones para citar un elemento
El primer paso es agregar el observador del evento para establecer las opciones adicionales en el producto cargado antes de que se agregue al carrito. Una opción es usar el evento catalog_product_load_after
.
<catalog_product_load_after>
<observers>
<extra_options>
<type>model</type>
<class>extra_options/observer</class>
<method>catalogProductLoadAfter</method>
</extra_options>
</observers>
</catalog_product_load_after>
En el caso del observador, puede agregar verificaciones adicionales; la página solicitada es, de hecho, una acción para agregar al carrito. El punto principal de este método de observación es agregar la selección de sus opciones especiales a la opción additional_options
en el modelo del producto.
public function catalogProductLoadAfter(Varien_Event_Observer $observer)
{
// set the additional options on the product
$action = Mage::app()->getFrontController()->getAction();
if ($action->getFullActionName() == ''checkout_cart_add'')
{
// assuming you are posting your custom form values in an array called extra_options...
if ($options = $action->getRequest()->getParam(''extra_options''))
{
$product = $observer->getProduct();
// add to the additional options array
$additionalOptions = array();
if ($additionalOption = $product->getCustomOption(''additional_options''))
{
$additionalOptions = (array) unserialize($additionalOption->getValue());
}
foreach ($options as $key => $value)
{
$additionalOptions[] = array(
''label'' => $key,
''value'' => $value,
);
}
// add the additional options array with the option code additional_options
$observer->getProduct()
->addCustomOption(''additional_options'', serialize($additionalOptions));
}
}
}
Las opciones adicionales se moverán del producto al artículo de cotización automáticamente. Con este observador en su lugar, sus opciones aparecerán en el carro y la revisión de pago.
Agregar opciones para pedir artículo
Para que persistan, se necesita un observador adicional (solo desde Magento 1.5).
<sales_convert_quote_item_to_order_item>
<observers>
<extra_options>
<type>model</type>
<class>extra_options/observer</class>
<method>salesConvertQuoteItemToOrderItem</method>
</extra_options>
</observers>
</sales_convert_quote_item_to_order_item>
Aquí movemos la opción del elemento de cotización al artículo de pedido.
public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
$quoteItem = $observer->getItem();
if ($additionalOptions = $quoteItem->getOptionByCode(''additional_options'')) {
$orderItem = $observer->getOrderItem();
$options = $orderItem->getProductOptions();
$options[''additional_options''] = unserialize($additionalOptions->getValue());
$orderItem->setProductOptions($options);
}
}
A partir de este punto, las opciones adicionales estarán visibles en el historial de pedidos del cliente en la interfaz y en los correos electrónicos de pedidos, así como en la vista de orden de la interfaz de administración, facturas, envíos, datos de crédito y archivos PDF.
Añadir soporte para reordenar
Para llevar las funciones al nuevo orden durante un pedido nuevo, debe tener cuidado de copiarlas. Aquí hay una posibilidad usando el evento checkout_cart_product_add_after
.
<checkout_cart_product_add_after>
<observers>
<extra_options>
<type>singleton</type>
<class>extra_options/observer</class>
<method>checkoutCartProductAddAfter</method>
</extra_options>
</observers>
</checkout_cart_product_add_after>
El análisis de las opciones adicionales y la construcción de la matriz de opciones adicionales se deben mover a una función separada para evitar la duplicación del código, pero para este ejemplo, dejaré la lógica requerida para cada método en su lugar para mayor claridad.
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
$action = Mage::app()->getFrontController()->getAction();
if ($action->getFullActionName() == ''sales_order_reorder'')
{
$item = $observer->getQuoteItem();
$buyInfo = $item->getBuyRequest();
if ($options = $buyInfo->getExtraOptions())
{
$additionalOptions = array();
if ($additionalOption = $item->getOptionByCode(''additional_options''))
{
$additionalOptions = (array) unserialize($additionalOption->getValue());
}
foreach ($options as $key => $value)
{
$additionalOptions[] = array(
''label'' => $key,
''value'' => $value,
);
}
$item->addOption(array(
''code'' => ''additional_options'',
''value'' => serialize($additionalOptions)
));
}
}
}
Traducción:
No existe un mecanismo para traducir estas etiquetas o valores de opción. Aquí hay algunas ideas que pueden ser útiles en ese sentido.
En un observador de evento quote_item_load_after, obtenga la matriz de opciones adicionales y configure $option[''print_value''] = $helper->__($option[''value'']);
. Si print_value
está establecido, Magento lo usará para renderizar la pantalla.
Lo mismo se puede hacer con los artículos de pedido.
No existe una print_label
, pero puede establecer un índice personalizado ( label_source
) y establecer la etiqueta sobre la marcha usando eso como fuente, por ejemplo $option[''label''] = $helper->__($option[''label_source'']);
.
Más allá de eso, probablemente tendrías que recurrir a modificar las plantillas (grep para getItemOptions()
), o anular las clases de bloque (grep additional_options
).
Mi solución en Magento 1.8
Establecer opción para citar elemento
$quoteItem = $cart->getQuote()->getItemById($itemId);
$quoteItem->addOption(array(''label'' => ''buymode'', ''code'' => ''buymode'', ''value'' => $data[''buymode'']));
$quoteItem->save();
Opción de acceso de QuoteItem
$quoteItem->getOptionByCode(''buymode'')->getValue();
Opción de transferencia a OrderItem
Registrarse para el evento sales_convert_quote_item_to_order_item
public function onConvertQuoteItemToOrderItem($observer) {
$orderItem = $observer->getOrderItem();
$quoteItem = $observer->getItem();
$options = $orderItem->getProductOptions();
$options[''buymode''] = $quoteItem->getOptionByCode(''buymode'')->getValue();
$orderItem->setProductOptions($options);
}
Opción de acceso desde OrderItem
$orderItem->getProductOptionByCode(''buymode'')