Ich habe ein benutzerdefiniertes Modul erstellt, in dem ich das Formular zum Hinzufügen zum Warenkorb auf der Produktseite überschreibe , und ich habe es erfolgreich mit der catalog_product_view.xml
Datei ausgeführt. Jetzt kann ich ein benutzerdefiniertes Eingabefeld in der Vorderansicht der Produktseite sehen, aber ich muss den Wert dieses Felds in der Datenbank mit Menge, Preis usw. veröffentlichen und im Bestellverlauf erneut abrufen.
Ich habe eine Weile gesucht und auch erfolgreich neue benutzerdefinierte Spalten in quote_item
& sales_order
Tabellen erstellt. (Gemäß meinen Informationen gehen Sie zu den Warenkorbeinträgen quote_item
und Bestellungen nach dem Auschecken gehen zur sales_order
Tabelle. Wenn ich mich irre, korrigieren Sie mich bitte auch darin, da ich noch ein Lernender bin.)
Ich habe viel versucht und danach gesucht, aber keine relevante Lösung gefunden. Mein Herstellername ist Cloudways und der Modulname ist Mymodule . Unten sind die Dateien für mein Modul:
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; ?>
Hier ist der Screenshot der Vorderansicht:
Ich muss lediglich den Wert des benutzerdefinierten Eingabefelds veröffentlichen und zusammen mit der Bestellung in der Datenbank speichern. Danke im Voraus!
EDIT: Ich habe entsprechende Änderungen gemäß der Antwort von RS vorgenommen und hier ist das Problem, mit dem ich konfrontiert bin: (PS Ich verwende MAGENTO 2.0.9)
Ich habe die Protokolldatei überprüft und Folgendes gefunden:
[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} [] []
Irgendwelche Vorschläge bitte?
Antworten:
Um dies zu erreichen, können Sie die in Magento integrierte Funktion "Zusätzliche_Optionen" verwenden, sodass Sie nicht die E-Mail-Vorlage, die Ansicht der Administratorbestellung, die Ansicht der Kundenbestellung (usw.) bearbeiten müssen, um Ihre benutzerdefinierten Optionen anzuzeigen.
Github: https://github.com/srenon/Cloudways_Mymodule
/app/code/Cloudways/Mymodule/etc/events.xml
Option zum Angebot hinzufügen
/app/code/Cloudways/Mymodule/Observer/CheckoutCartProductAddAfterObserver.php
Methode 1 - Kopieren der Option von quote_item nach order_item mithilfe von Observer Siehe Magento 2 fieldset.xml; Kopieren Sie die Felder vom Angebot in die Bestellung
/app/code/Cloudways/Mymodule/Observer/SalesModelServiceQuoteSubmitBeforeObserver.php
Methode 2 - Kopieren der Option von quote_item nach order_item mithilfe des Plugins
/app/code/Cloudways/Mymodule/etc/di.xml
/app/code/Cloudways/Mymodule/Plugin/QuoteItemToOrderItemPlugin.php
Basis von Magento1 - Produktartikelattribut für Angebot / Bestellung basierend auf Benutzereingaben
quelle
[invalidargumentexception] unable to unserialize value.
json_encode und json_decode anstelle von serialize und unserialize verwendetSo beheben Sie dieses Problem: // Wenn Sie eine neue Warenkorbposition mit identischen Optionswerten erstellen, wird eine neue Werbebuchung hinzugefügt, anstatt die vorherige Artikelmenge zu erhöhen
Ich habe nach dem Plugin für die Methode RepresentProduct in Magento \ Quote \ Model \ Quote \ Item hinzugefügt. Im Plugin überprüfe ich, ob es mein benötigter zusätzlicher Parameter ist und ob es das benötigte Ergebnis (true) zurückgibt.
quelle