Utworzyłem niestandardowy moduł, w którym zastępuję formularz dodawania do koszyka na stronie produktu i udało mi się to z catalog_product_view.xml
plikiem. Teraz widzę niestandardowe pole wejściowe w widoku z przodu strony produktu, ale muszę opublikować wartość tego pola w bazie danych z ilością, ceną itp. I pobrać je ponownie w historii zamówień.
Szukałem przez chwilę, a także odniosłem sukces w tworzeniu nowych niestandardowych kolumn w tabelach quote_item
i sales_order
. (Zgodnie z moimi informacjami, wpisy dodawane do koszyka idą do, quote_item
a zamówienia po kasie trafiają do sales_order
tabeli. Jeśli się mylę, proszę również mnie poprawić, ponieważ nadal jestem uczniem.)
Dużo próbowałem i szukałem, ale nie znalazłem odpowiedniego rozwiązania. Nazwa mojego dostawcy to Cloudways, a nazwa modułu to Mymodule . Poniżej znajdują się pliki do mojego modułu:
Cloudways / Mymodule / register.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; ?>
Oto zrzut ekranu z przodu:
Wszystko, czego potrzebuję, to opublikowanie wartości niestandardowego pola wejściowego i zapisanie go w bazie danych wraz z zamówieniem. Z góry dziękuję!
EDYCJA: ZMIENIŁEM ODPOWIEDNIE ZMIANY WEDŁUG ODPOWIEDZI RS I TUTAJ JEST PROBLEM, Z KTÓRYM SIĘ STAŁEM: (PS KORZYSTAM Z MAGENTO 2.0.9)
Sprawdziłem plik dziennika i oto, co znalazłem:
[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} [] []
Wszelkie sugestie proszę?
Odpowiedzi:
Aby to osiągnąć, możesz użyć wbudowanej funkcji „dodatkowe_opcje” magento, dzięki czemu nie musisz edytować szablonu wiadomości e-mail, widoku zamówienia administratora, widoku zamówienia klienta (itp.), Aby wyświetlić niestandardowe opcje.
Github: https://github.com/srenon/Cloudways_Mymodule
/app/code/Cloudways/Mymodule/etc/events.xml
Dodaj opcję do wyceny
/app/code/Cloudways/Mymodule/Observer/CheckoutCartProductAddAfterObserver.php
Metoda nr 1 - Kopiowanie opcji z quote_item do order_item przy użyciu Observer Patrz Magento 2 fieldset.xml; kopiuj pola z wyceny na zamówienie
/app/code/Cloudways/Mymodule/Observer/SalesModelServiceQuoteSubmitBeforeObserver.php
Metoda nr 2 - Kopiowanie opcji z quote_item do order_item za pomocą wtyczki
/app/code/Cloudways/Mymodule/etc/di.xml
/app/code/Cloudways/Mymodule/Plugin/QuoteItemToOrderItemPlugin.php
Base off of Magento1 - Wycena / zamówienie atrybutu pozycji produktu na podstawie danych wprowadzonych przez użytkownika
źródło
[invalidargumentexception] unable to unserialize value.
korzysta z json_encode i json_decode zamiast serializować iAby rozwiązać ten problem: // Utwórz nowy element koszyka o identycznych wartościach opcji doda nowy element zamówienia, zamiast zwiększać ilość poprzedniego elementu
Dodałem po wtyczce do metody RepresentProduct w Magento \ Quote \ Model \ Quote \ Item. We wtyczce sprawdzam, czy jest to mój potrzebny dodatkowy parametr i czy jest to potrzebny wynik (prawda).
źródło