Creé un módulo personalizado en el que anulo el formulario de agregar al carrito en la página del producto, y lo hice con éxito con el catalog_product_view.xml
archivo. Ahora puedo ver un campo de entrada personalizado en la vista frontal de la página del producto, pero necesito publicar el valor de este campo en la base de datos con Cantidad, precio, etc. y recuperarlo nuevamente en el historial de pedidos.
Busqué un tiempo y también tuve éxito en la creación de nuevas columnas personalizadas en quote_item
& sales_order
tablas. (Según mi información, agregue a las entradas del carrito ir a quote_item
y los pedidos después de que el pago salga a la sales_order
mesa. Si estoy equivocado al respecto, corríjame también en esto ya que todavía estoy aprendiendo).
Intenté mucho y lo busqué, pero no encontré una solución relevante. El nombre de mi proveedor es Cloudways y el nombre del módulo es Mymodule . Debajo están los archivos para mi módulo:
Cloudways / Mymodule / Registration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);
Cloudways / Mymodule / etc / module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Cloudways_Mymodule" setup_version="1.0.1"></module>
</config>
Cloudways / Mymodule / Setup / UpgradeSchema.php
<?php
namespace Cloudways\Mymodule\Setup;
use Magento\Framework\Setup\UpgradeSchemaInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\Setup\ModuleContextInterface;
class UpgradeSchema implements UpgradeSchemaInterface
{
public function upgrade(SchemaSetupInterface $setup, ModuleContextInterface $context)
{
if (version_compare($context->getVersion(), '1.0.1') < 0) {
$installer = $setup;
$installer->startSetup();
$connection = $installer->getConnection();
//cart table
$connection->addColumn(
$installer->getTable('quote_item'),
'remarks',
[
'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'length' => 255,
'comment' =>'Remarks'
]
);
//Order address table
$connection->addColumn(
$installer->getTable('sales_order'),
'remarks',
[
'type' => \Magento\Framework\DB\Ddl\Table::TYPE_TEXT,
'length' => 255,
'comment' =>'Remarks'
]
);
$installer->endSetup(); }
}
}
Cloudways / Mymodule / view / frontend / layout / catalog_product_view.xml
<?xml version="1.0"?>
<page layout="1column" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product.info.addtocart">
<action method="setTemplate">
<argument name="template" xsi:type="string">Cloudways_Mymodule::catalog/product/view/addtocart.phtml</argument>
</action>
</referenceBlock>
<referenceBlock name="product.info.addtocart.additional">
<action method="setTemplate">
<argument name="template" xsi:type="string">Cloudways_Mymodule::catalog/product/view/addtocart.phtml</argument>
</action>
</referenceBlock>
</body>
</page>
Cloudways / Mymodule / view / frontend / templates / catalog / product / view / addtocart.phtml
<?php
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
// @codingStandardsIgnoreFile
/** @var $block \Magento\Catalog\Block\Product\View */
?>
<?php $_product = $block->getProduct(); ?>
<?php $buttonTitle = __('Add to Cart'); ?>
<?php if ($_product->isSaleable()): ?>
<div class="box-tocart">
<div class="fieldset">
<?php if ($block->shouldRenderQuantity()): ?>
<div class="field qty">
<label class="label" for="qty"><span><?php /* @escapeNotVerified */ echo __('Qty') ?></span></label>
<div class="control">
<input type="number"
name="qty"
id="qty"
maxlength="12"
value="<?php /* @escapeNotVerified */ echo $block->getProductDefaultQty() * 1 ?>"
title="<?php /* @escapeNotVerified */ echo __('Qty') ?>" class="input-text qty"
data-validate="<?php echo $block->escapeHtml(json_encode($block->getQuantityValidators())) ?>"
/>
</div>
</div>
<!-- Custom Input Field -->
<div>
<input
type="text"
name="remarks"
id="remarks"
maxlength="255"
placeholder="Remarks"
/>
</div>
<!-- Custom Input Field -->
<br>
<?php endif; ?>
<div class="actions">
<button type="submit"
title="<?php /* @escapeNotVerified */ echo $buttonTitle ?>"
class="action primary tocart"
id="product-addtocart-button">
<span><?php /* @escapeNotVerified */ echo $buttonTitle ?></span>
</button>
<?php echo $block->getChildHtml('', true) ?>
</div>
</div>
</div>
<?php endif; ?>
<?php if ($block->isRedirectToCartEnabled()) : ?>
<script type="text/x-magento-init">
{
"#product_addtocart_form": {
"Magento_Catalog/product/view/validation": {
"radioCheckboxClosest": ".nested"
}
}
}
</script>
<?php else : ?>
<script>
require([
'jquery',
'mage/mage',
'Magento_Catalog/product/view/validation',
'Magento_Catalog/js/catalog-add-to-cart'
], function ($) {
'use strict';
$('#product_addtocart_form').mage('validation', {
radioCheckboxClosest: '.nested',
submitHandler: function (form) {
var widget = $(form).catalogAddToCart({
bindSubmit: false
});
widget.catalogAddToCart('submitForm', $(form));
return false;
}
});
});
</script>
<?php endif; ?>
Aquí está la captura de pantalla de la vista frontal:
Todo lo que necesito es publicar el valor del campo de entrada personalizado y guardarlo en la base de datos junto con el pedido. ¡Gracias por adelantado!
EDITAR: HICE CAMBIOS RESPECTIVOS DE ACUERDO CON LA RESPUESTA DE RS Y AQUÍ ESTÁ EL PROBLEMA QUE ESTOY ENFRENTANDO: (PD: ESTOY UTILIZANDO MAGENTO 2.0.9)
Revisé el archivo de registro y esto es lo que he encontrado:
[2016-08-26 07:29:38] main.CRITICAL: exception 'Exception' with message 'Report ID: webapi-57bfefe2d8272; Message: Warning: Invalid argument supplied for foreach() in /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/app/code/Cloudways/Mymodule/Observer/SalesModelServiceQuoteSubmitBeforeObserver.php on line 67' in /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/vendor/magento/framework/Webapi/ErrorProcessor.php:194
Stack trace:
#0 /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/vendor/magento/framework/Webapi/ErrorProcessor.php(139): Magento\Framework\Webapi\ErrorProcessor->_critical(Object(Exception))
#1 /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/vendor/magento/module-webapi/Controller/Rest.php(163): Magento\Framework\Webapi\ErrorProcessor->maskException(Object(Exception))
#2 /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/var/generation/Magento/Webapi/Controller/Rest/Interceptor.php(24): Magento\Webapi\Controller\Rest->dispatch(Object(Magento\Framework\App\Request\Http))
#3 /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/vendor/magento/framework/App/Http.php(115): Magento\Webapi\Controller\Rest\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#4 /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/vendor/magento/framework/App/Bootstrap.php(258): Magento\Framework\App\Http->launch()
#5 /home/41209-54048.cloudwaysapps.com/yyzmyegjdk/public_html/index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
#6 {main} [] []
¿Alguna sugerencia por favor?
Respuestas:
Para lograr esto, puede usar la funcionalidad integrada "opciones adicionales" de magento para que no tenga que editar la plantilla de correo electrónico, la vista de pedidos de administrador, la vista de pedidos de clientes (etc.) para mostrar sus opciones personalizadas.
Github: https://github.com/srenon/Cloudways_Mymodule
/app/code/Cloudways/Mymodule/etc/events.xml
Agregar opción a la cotización
/app/code/Cloudways/Mymodule/Observer/CheckoutCartProductAddAfterObserver.php
Método # 1 - Opción de copia de quote_item a order_item usando Observer Vea Magento 2 fieldset.xml; copiar campos de presupuesto a pedido
/app/code/Cloudways/Mymodule/Observer/SalesModelServiceQuoteSubmitBeforeObserver.php
Método # 2 - Opción de copia de quote_item a order_item usando Plugin
/app/code/Cloudways/Mymodule/etc/di.xml
/app/code/Cloudways/Mymodule/Plugin/QuoteItemToOrderItemPlugin.php
Base fuera de Magento1: atributo de artículo de pedido / presupuesto basado en la entrada del usuario
fuente
[invalidargumentexception] unable to unserialize value.
usa json_encode y json_decode en lugar de serializar y deserializarPara resolver este problema: // Crear un nuevo artículo de carrito con valores de opción idénticos agregará un nuevo artículo de línea, en lugar de incrementar la cantidad de artículos anteriores
He agregado después del complemento para el método representProduct en Magento \ Quote \ Model \ Quote \ Item. En el complemento, compruebo si es mi parámetro adicional necesario y, si se devuelve, el resultado necesario (verdadero).
fuente