J'avais créé un module personnalisé dans lequel je remplace le formulaire d' ajout au panier sur la page du produit, et je l'ai fait avec succès avec le catalog_product_view.xml
fichier. Maintenant, je peux voir un champ de saisie personnalisé sur la vue de face de la page du produit, mais je dois publier la valeur de ce champ dans la base de données avec la quantité, le prix, etc. et le récupérer à nouveau dans l'historique des commandes.
J'ai cherché un moment et j'ai également réussi à créer de nouvelles colonnes personnalisées dans les quote_item
& sales_order
tables. (Selon mes informations, les entrées d'ajout au panier vont à quote_item
et les commandes après le paiement vont à la sales_order
table. Si je me trompe, corrigez-moi également car je suis toujours un apprenant.)
J'ai beaucoup essayé et cherché, mais je n'ai pas trouvé de solution pertinente. Le nom de mon fournisseur est Cloudways et le nom du module est Mymodule . Voici les fichiers de mon module:
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; ?>
Voici la capture d'écran de la vue de face:
Tout ce dont j'ai besoin est de publier la valeur du champ de saisie personnalisé et de l'enregistrer dans la base de données avec la commande. Merci d'avance!
EDIT: J'AI FAIT DES CHANGEMENTS RESPECTIFS SELON LA RÉPONSE DE RS ET VOICI LE PROBLÈME QUE JE FAIS: (PS J'UTILISE MAGENTO 2.0.9)
J'ai vérifié le fichier journal et voici ce que j'ai trouvé:
[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} [] []
Des suggestions s'il vous plait?
Réponses:
Pour ce faire, vous pouvez utiliser la fonctionnalité "additional_options" intégrée à magento afin que vous n'ayez pas à modifier le modèle d'e-mail, la vue de commande administrateur, la vue de commande client (etc.) pour afficher vos options personnalisées.
Github: https://github.com/srenon/Cloudways_Mymodule
/app/code/Cloudways/Mymodule/etc/events.xml
Ajouter une option au devis
/app/code/Cloudways/Mymodule/Observer/CheckoutCartProductAddAfterObserver.php
Méthode # 1 - Option de copie de quote_item vers order_item en utilisant Observer See Magento 2 fieldset.xml; copier les champs du devis à la commande
/app/code/Cloudways/Mymodule/Observer/SalesModelServiceQuoteSubmitBeforeObserver.php
Méthode n ° 2 - Option de copie de quote_item vers order_item à l'aide du plugin
/app/code/Cloudways/Mymodule/etc/di.xml
/app/code/Cloudways/Mymodule/Plugin/QuoteItemToOrderItemPlugin.php
Base hors de Magento1 - Attribut de devis / commande d'article de produit basé sur l'entrée de l'utilisateur
la source
[invalidargumentexception] unable to unserialize value.
utilise json_encode et json_decode au lieu de sérialiser etPour résoudre ce problème: // Créer un nouvel article de panier avec des valeurs d'option identiques ajoutera un nouvel article, au lieu d'incrémenter la quantité de l'article précédent
J'ai ajouté un plugin pour la méthode representProduct dans Magento \ Quote \ Model \ Quote \ Item. Dans le plugin, je vérifie si c'est mon paramètre supplémentaire nécessaire et s'il est renvoyé, le résultat est nécessaire (vrai).
la source