কাস্টম ইনপুট ক্ষেত্র সহ একটি পণ্য কীভাবে "কার্টে যুক্ত করুন" এবং এটি ডেটাবেসে সংরক্ষণ করবেন?


9

আমি একটি কাস্টম মডিউল তৈরি করেছিলাম যেখানে আমি পণ্যের পৃষ্ঠায় অ্যাড কার্ট ফর্মটিকে ওভাররাইড করছি এবং আমি এটি catalog_product_view.xmlফাইলের সাথে সফলভাবে করেছি । এখন আমি পণ্য পৃষ্ঠার সামনের দৃশ্যে একটি কাস্টম ইনপুট ক্ষেত্রটি দেখতে পাচ্ছি, তবে আমার এই ক্ষেত্রের মান কিউটি, মূল্য ইত্যাদির সাথে ডাটাবেসে পোস্ট করতে হবে এবং ক্রম ইতিহাসের সাথে এটি পুনরুদ্ধার করতে হবে।

আমি কিছুক্ষণ অনুসন্ধান করেছি quote_itemএবং sales_orderটেবিলে নতুন কাস্টম কলাম তৈরি করতে সাফল্যও পেয়েছি । (আমার তথ্য অনুসারে, কার্টের এন্ট্রিগুলিতে যোগ করুন এবং চেকআউটটি টেবিলে quote_itemযাওয়ার পরে অর্ডারগুলি দিন sales_orderI যদি আমি এটি সম্পর্কে ভুল হয়ে থাকি তবে দয়া করে আমাকে এটিকেও সংশোধন করুন, কারণ আমি এখনও একজন শিক্ষার্থী))

আমি অনেক চেষ্টা করেছিলাম এবং এর জন্য অনুসন্ধান করেছি কিন্তু কোনও প্রাসঙ্গিক সমাধান খুঁজে পাইনি। আমার বিক্রেতার নাম ক্লাউডওয়েস এবং মডিউলটির নাম মাইমডিউল । আমার মডিউলটির জন্য ফাইলগুলি নীচে:

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 / সেটআপ / 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 / দেখতে / ফ্রন্টএন্ড / লেআউট / 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 / দৃশ্য / ফ্রন্টএন্ড / টেমপ্লেট / ক্যাটালগ / পণ্য / দৃশ্য / 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; ?>

সামনের দৃশ্যের স্ক্রিনশটটি এখানে:

এখানে চিত্র বর্ণনা লিখুন

আমার যা দরকার তা হ'ল কাস্টম ইনপুট ক্ষেত্রের মান পোস্ট করা এবং অর্ডার সহ এটি ডাটাবেসে সংরক্ষণ করা। আগাম ধন্যবাদ!

সম্পাদনা করুন: আমি আরএসের উত্তর অনুসারে প্রতিক্রিয়াশীল পরিবর্তনগুলি তৈরি করেছি এবং আমার যে সমস্যাটি রয়েছে তা এখানে রয়েছে: (পিএস আমি ম্যাজেন্টো ২.০.৯ ব্যবহার করছি)

এখানে চিত্র বর্ণনা লিখুন

আমি লগ ফাইলটি যাচাই করেছিলাম এবং যা আমি পেয়েছি তা এখানে:

[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} [] []

কোন পরামর্শ দয়া করে?


এই Magento 1 উদাহরণস্বরূপ কটাক্ষপাত stackoverflow.com/questions/9412074/... ... আপনি "additional_options" ব্যবহার করতে একটি পর্যবেক্ষক ব্যবহার করে এই তথ্য সঞ্চয় করতে সক্ষম হওয়া উচিত github.com/magento/magento2/... ... additional_options ব্যবহার অ্যাডমিন, বিক্রয় অর্ডার ইমেল ইত্যাদিতে স্বয়ংক্রিয়ভাবে এই তথ্য দেখাবে
রেনন স্টুয়ার্ট

এটি সম্পাদন করার জন্য কাস্টম বিকল্পগুলির সাথে আপনি কোনও সাধারণ পণ্য ব্যবহার করছেন না এমন কোনও কারণ আছে কি?
রেনন স্টুয়ার্ট

@ আরএস আমাকে প্রোগ্রামক্রমে এটি করা দরকার কারণ আমরা এই কাস্টম কার্টকে বিভিন্ন কাস্টম বিকল্প দিয়ে আরও প্রসারিত করব যা আমি মনে করি কেবল কাস্টম মডিউল দিয়েই করা যেতে পারে।
ফায়াজ খট্টক

আপনি কি আপনার কোডটিতে একটি (গিথুব) লিঙ্ক যুক্ত করতে পারেন, তাই আমি ডাউনলোড করে অতিরিক্ত_পশন বাস্তবায়নের চেষ্টা করতে পারি
রেনন স্টুয়ার্ট

@ আরএস হ্যাঁ নিশ্চিত, দয়া করে আমাকে কয়েক মিনিট দিন।
ফায়াজ খট্টক

উত্তর:


14

এটি সম্পাদন করার জন্য আপনি ম্যাজেন্টো অন্তর্নির্মিত "অতিরিক্ত_পশন" কার্যকারিতা ব্যবহার করতে পারেন যাতে আপনার কাস্টম বিকল্পগুলি প্রদর্শনের জন্য আপনাকে ইমেল টেমপ্লেট, অ্যাডমিন অর্ডার ভিউ, গ্রাহক অর্ডার ভিউ (ইত্যাদি) সম্পাদনা করতে হবে না।

গিথুব: https://github.com/srenon/Cloudways_Mymodule

/app/code/Cloudways/Mymodule/etc/events.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="checkout_cart_product_add_after">
        <observer name="cloudways_mymodule_checkout_cart_product_add_after" instance="Cloudways\Mymodule\Observer\CheckoutCartProductAddAfterObserver" />
    </event>
    <event name="sales_model_service_quote_submit_before">
        <observer name="cloudways_mymodule_sales_model_service_quote_submit_before" instance="Cloudways\Mymodule\Observer\SalesModelServiceQuoteSubmitBeforeObserver" />
    </event>
</config>

উদ্ধৃতিতে বিকল্প যোগ করুন

/app/code/Cloudways/Mymodule/Observer/CheckoutCartProductAddAfterObserver.php

<?php

namespace Cloudways\Mymodule\Observer;

use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\App\RequestInterface;

class CheckoutCartProductAddAfterObserver implements ObserverInterface
{

    protected $_request;

    /**
     * @param RequestInterface $request
     */
    public function __construct(RequestInterface $request){
            $this->_request = $request;
    }

    /**
     * @param EventObserver $observer
     * @return void
     */
    public function execute(EventObserver $observer)
    {
        /* @var \Magento\Quote\Model\Quote\Item $item */
        $item = $observer->getQuoteItem();

        $additionalOptions = array();

        if ($additionalOption = $item->getOptionByCode('additional_options')){
            $additionalOptions = (array) unserialize($additionalOption->getValue());
        }

        $post = $this->_request->getParam('cloudways');

        if(is_array($post)){
            foreach($post as $key => $value){
                if($key == '' || $value == ''){
                    continue;
                }

                $additionalOptions[] = [
                    'label' => $key,
                    'value' => $value
                ];
            }
        }

        if(count($additionalOptions) > 0){
            $item->addOption(array(
                'code' => 'additional_options',
                'value' => serialize($additionalOptions)
            ));
        }


        /* To Do */

        // Edit Cart - May need to remove option and readd them
        // Pre-fill remarks on product edit pages


        /* Issues */

        // Create new cart item with identical option values will add a new line item, instead of increment previous item qty

    }
}

পদ্ধতি # 1 - quote_item থেকে অপশন অনুলিপি অবজারভার ব্যবহার order_item করতে দেখুন Magento 2 fieldset.xml; অর্ডার থেকে উদ্ধৃতি ক্ষেত্রগুলি অনুলিপি করুন

/app/code/Cloudways/Mymodule/Observer/SalesModelServiceQuoteSubmitBeforeObserver.php

<?php

namespace Cloudways\Mymodule\Observer;

use Magento\Framework\Event\Observer as EventObserver;
use Magento\Framework\Event\ObserverInterface;


class SalesModelServiceQuoteSubmitBeforeObserver implements ObserverInterface
{

    private $quoteItems = [];

    private $quote = null;
    private $order = null;

    /**
     * Add order information into GA block to render on checkout success pages
     *
     * @param EventObserver $observer
     * @return void
     */
    public function execute(EventObserver $observer)
    {

        $this->quote = $observer->getQuote();
        $this->order = $observer->getOrder();

        // can not find an equivalent event for sales_convert_quote_item_to_order_item


        /* @var  \Magento\Sales\Model\Order\Item $orderItem */
        foreach($this->order->getItems() as $orderItem){
            if(!$orderItem->getParentItemId() && $orderItem->getProductType() == \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE){

                if($quoteItem = $this->getQuoteItemById($orderItem->getQuoteItemId())){
                    if ($additionalOptionsQuote = $quoteItem->getOptionByCode('additional_options')) {

                        //To do
                        // - check to make sure element are not added twice
                        // - $additionalOptionsQuote - may not be an array
                        if($additionalOptionsOrder = $orderItem->getProductOptionByCode('additional_options')){
                            $additionalOptions = array_merge($additionalOptionsQuote, $additionalOptionsOrder);
                        }
                        else{
                            $additionalOptions = $additionalOptionsQuote;
                        }


                        if(count($additionalOptions) > 0){
                            $options = $orderItem->getProductOptions();
                            $options['additional_options'] = unserialize($additionalOptions->getValue());
                            $orderItem->setProductOptions($options);
                        }

                    }
                }
            }
        }

    }


    private function getQuoteItemById($id){
        if(empty($this->quoteItems)){
            /* @var  \Magento\Quote\Model\Quote\Item $item */
            foreach($this->quote->getItems() as $item){

                //filter out config/bundle etc product
                if(!$item->getParentItemId() && $item->getProductType() == \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE){
                    $this->quoteItems[$item->getId()] = $item;
                }
            }
        }


        if(array_key_exists($id, $this->quoteItems)){
            return $this->quoteItems[$id];
        }

        return null;
    }
}

পদ্ধতি # 2 - উদ্ধৃতি_ইটিমে থেকে প্লাগইন ব্যবহার করে অর্ডার_াইটেমে অপশনটি অনুলিপি করা হচ্ছে

/app/code/Cloudways/Mymodule/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Quote\Model\Quote\Item\ToOrderItem">
        <plugin name="cloudways_mymodule\_Sales_Quote_Item_ToOrderItem" type="Cloudways\Mymodule\Plugin\QuoteItemToOrderItemPlugin" />
    </type>
</config>

/app/code/Cloudways/Mymodule/Plugin/QuoteItemToOrderItemPlugin.php

<?php

namespace Cloudways\Mymodule\Plugin;

class QuoteItemToOrderItemPlugin
{

    public function aroundConvert(\Magento\Quote\Model\Quote\Item\ToOrderItem $subject, callable $proceed, $quoteItem, $data)
    {

        // get order item
        $orderItem = $proceed($quoteItem, $data);


        if(!$orderItem->getParentItemId() && $orderItem->getProductType() == \Magento\Catalog\Model\Product\Type::TYPE_SIMPLE){
            if ($additionalOptionsQuote = $quoteItem->getOptionByCode('additional_options')) {
                //To do
                // - check to make sure element are not added twice
                // - $additionalOptionsQuote - may not be an array
                if($additionalOptionsOrder = $orderItem->getProductOptionByCode('additional_options')){
                    $additionalOptions = array_merge($additionalOptionsQuote, $additionalOptionsOrder);
                }
                else{
                    $additionalOptions = $additionalOptionsQuote;
                }
                if(count($additionalOptions) > 0){
                    $options = $orderItem->getProductOptions();
                    $options['additional_options'] = unserialize($additionalOptions->getValue());
                    $orderItem->setProductOptions($options);
                }
            }
        }

        return $orderItem;
    }
}

শপিং কার্ট এবং প্রশাসনের অর্ডার ভিউ পৃষ্ঠা

Magento1 এর ভিত্তি বন্ধ - ব্যবহারকারীর ইনপুটের উপর ভিত্তি করে কোট / অর্ডার পণ্য আইটেম বৈশিষ্ট্য


@ রেনন আমি সাধারণ পণ্যটির জন্য উপরের কার্যকারিতাটি চেষ্টা করেছি এবং এটি দুর্দান্ত কার্যকর হয়েছে, ধন্যবাদ! তবে কনফিগারযোগ্য পণ্যটির জন্য আমার একই প্রয়োজন তবে আমি কার্ট পৃষ্ঠায় নিম্নলিখিত ত্রুটি পেয়েছি "নির্বাচিত বিকল্প (গুলি) বা তাদের সংমিশ্রণ বর্তমানে উপলভ্য নয়।" আমি জানি কেন এই সমস্যাটি উত্থাপিত হয়েছে, তবে কীভাবে এটি কাটিয়ে উঠার কোনও উপায় আছে, মানে নির্দিষ্ট বিকল্পগুলি ফিল্টার আউট করব?
নওসিফ

সবেমাত্র এটি ব্যবহার করা হয়েছে এবং এটি কবজির মতো কাজ করে। ধন্যবাদ! আপনি কি ম্যাজেন্টোতে এমন কোনও কার্যকারিতা সম্পর্কে অবগত আছেন যা সত্যিই প্রতি আইটেমের জন্য বৈশিষ্ট্য দেয় (পণ্য প্রতি নয়)? উদাহরণস্বরূপ একটি শার্টে একটি কাস্টম পাঠ্য, তবে একই সাথে বিভিন্ন পাঠ্য সহ একই শার্টের একাধিক থাকা। ম্যাজেন্টো এখন কার্টের মধ্যে সেই পণ্যগুলিকে একত্রিত করে এবং এইভাবে আমি প্রতি আইটেমগুলিতে সেইগুলি সুনির্দিষ্ট সেটিংস হারাতে চাই।
জুরগেন

@ নওসিফ, আমিও একই সমস্যার মুখোমুখি হয়েছি, তবে এখন তা সমাধান হয়েছে। এই ইউআরএলটি দেখুন - magento.stackexchange.com/questions/177133/…
কিশোর

@ রেনন আমি এটি ব্যবহার করি এবং মানগুলি মিনি-কার্ট, কার্ট এবং চেকআউটে প্রদর্শিত হয়। এটি করার জন্য আমার কাছে কনফিগারযোগ্য পণ্য রয়েছে। আমি উভয়ই উদ্ধৃতি রূপান্তর পদ্ধতিতে চেষ্টা করেছি, তবে প্রশাসকগুলিতে ক্রম মেল এবং অর্ডার বিভাগে মানগুলি প্রদর্শিত হচ্ছে না।
habষভ আর কে রাই

যদি কেউ [invalidargumentexception] unable to unserialize value.সিরিয়ালাইজ এবং আনসিরিয়ালাইজ করার পরিবর্তে json_encode এবং json_decode ব্যবহার করে থাকে
Ebin Manuval

0

এই সমস্যাটি সমাধান করতে: // পূর্ববর্তী আইটেমের পরিমাণ বাড়ানোর পরিবর্তে অভিন্ন বিকল্পের মানগুলির সাথে নতুন কার্ট আইটেমটি একটি নতুন লাইন আইটেম যুক্ত করবে

আমি ম্যাজেন্টো \ উক্তি \ মডেল \ উক্তি tem আইটেমের উত্পাদন প্রতিনিধিত্বের জন্য প্লাগইন পরে যুক্ত করেছি। প্লাগ ইন আমি এটি আমার অতিরিক্ত অতিরিক্ত পরম প্রয়োজন এবং যদি এটির প্রয়োজন হয় ফলাফল (সত্য)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.