कस्टम इनपुट फ़ील्ड के साथ उत्पाद को "कार्ट में कैसे जोड़ें" और इसे डेटाबेस में सहेजें?


9

मैंने एक कस्टम मॉड्यूल बनाया था जिसमें मैं उत्पाद पृष्ठ पर ऐड टू कार्ट फॉर्म को ओवरराइड कर रहा हूं, और मैंने इसे catalog_product_view.xmlफ़ाइल के साथ सफलतापूर्वक किया । अब मैं उत्पाद पृष्ठ के सामने के दृश्य पर एक कस्टम इनपुट फ़ील्ड देख सकता हूं, लेकिन मुझे इस फ़ील्ड के मूल्य को Qty, मूल्य आदि के साथ डेटाबेस में पोस्ट करने और इसे फिर से ऑर्डर इतिहास में पुनः प्राप्त करने की आवश्यकता है।

मैंने थोड़ी देर खोज की और quote_item& sales_orderटेबल में नए कस्टम कॉलम बनाने में भी सफलता प्राप्त की । (मेरी जानकारी के अनुसार, कार्ट एंट्रीज में जोड़ें quote_itemऔर चेकआउट sales_orderटेबल पर जाने के बाद ऑर्डर करें । अगर मैं इसके बारे में गलत हूं, तो कृपया मुझे इसमें सुधार करें क्योंकि मैं अभी भी एक शिक्षार्थी हूं।)

मैंने बहुत कोशिश की और इसके लिए खोज की लेकिन एक प्रासंगिक समाधान नहीं मिला। मेरा विक्रेता का नाम Cloudways है और मॉड्यूल का नाम Mymodule है । नीचे मेरे मॉड्यूल के लिए फाइलें हैं:

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

कोई सुझाव कृपया?


इस मैगनेटो पर एक नज़र डालें 1 उदाहरण stackoverflow.com/questions/9412074/… ... आप एक पर्यवेक्षक github.com/magento/magento2/ ... का उपयोग करके इस जानकारी को संग्रहीत करने के लिए " extra_options " का उपयोग करने में सक्षम होना चाहिए। स्वचालित रूप से व्यवस्थापक, बिक्री आदेश ईमेल आदि में यह जानकारी दिखाएंगे
रेनॉन स्टीवर्ट

क्या कोई कारण है कि आप इसे पूरा करने के लिए कस्टम विकल्पों के साथ एक साधारण उत्पाद का उपयोग नहीं कर रहे हैं?
रेनॉन स्टीवर्ट

@RS मुझे इसे प्रोग्रामेटिक रूप से करने की आवश्यकता है क्योंकि हम इस कस्टम कार्ट को विभिन्न कस्टम विकल्पों के साथ आगे बढ़ाएंगे जो मुझे लगता है कि केवल कस्टम मॉड्यूल के साथ किया जा सकता है।
फय्याज खट्टक

क्या आप अपने कोड में (github) लिंक जोड़ सकते हैं, इसलिए मैं डाउनलोड कर सकता हूं और अतिरिक्त रूप से लागू करने का प्रयास कर सकता हूं
Renon Stewart

@RS हाँ यकीन है, कृपया मुझे कुछ मिनट दें।
फय्याज खट्टक

जवाबों:


14

इसे पूरा करने के लिए आप अपने कस्टम विकल्पों को प्रदर्शित करने के लिए ईमेल टेम्पलेट, व्यवस्थापक आदेश दृश्य, ग्राहक आदेश दृश्य (आदि) को संपादित करने की आवश्यकता नहीं है, ताकि आप Magento बिल्टिन "अतिरिक्त_पथ्य" कार्यक्षमता का उपयोग कर सकें।

गिथब: 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 - उद्धरण_आतेम से कॉपी करने का ऑप्शन ऑब्जर्वर का उपयोग करके ऑर्डर करें देखें Magento 2 फ़ील्डसेट। 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 - प्लगइन का उपयोग करके quot_item से order_item तक विकल्प कॉपी करना

/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 में किसी भी कार्यक्षमता के बारे में जानते हैं जो वास्तव में प्रति आइटम (उत्पाद प्रति नहीं) गुणों की अनुमति देता है? उदाहरण के लिए एक शर्ट पर एक कस्टम पाठ, लेकिन विभिन्न ग्रंथों के साथ एक ही शर्ट के कई होने पर। Magento अब कार्ट में उन उत्पादों को जोड़ती है और इस प्रकार मैं प्रति आइटम उन विशिष्ट सेटिंग्स को खो देता हूं।
जुर्गेन

@ नौसिफ, मैं एक ही मुद्दे का सामना कर रहा था, लेकिन अब यह हल हो गया। इस url को देखें - magento.stackexchange.com/questions/177133/…
किशोर हसे

@renon मैं इसका उपयोग करता हूं और मान मिनी-कार्ट, कार्ट और चेकआउट में दिखाई दे रहे हैं। मेरे पास ऐसा करने के लिए कॉन्फ़िगर करने योग्य उत्पाद है। मैंने दोनों बोली रूपांतरण विधियों की कोशिश की, लेकिन मूल्य मेल और व्यवस्थापक में आदेश अनुभाग में नहीं दिखा रहा है।
ऋषभ आरके राय

अगर किसी [invalidargumentexception] unable to unserialize value.को धारावाहिक के बजाय json_encode और json_decode का उपयोग करने की अनुमति मिल रही है और उसे
अमान्य

0

इस समस्या को हल करने के लिए: // समान विकल्प मानों के साथ नया कार्ट आइटम बनाएं, पिछले आइटम मात्रा के बजाय वेतन वृद्धि के बजाय एक नई लाइन आइटम जोड़ देगा

मैंने मैगेंटो \ _ \ _ \ "मॉडल \ उद्धरण \ मद में विधि प्रतिनिधित्व के लिए प्लगइन के बाद जोड़ा है। प्लगइन में मैं जाँच करता हूँ कि यह मेरी जरूरत है अतिरिक्त परम और अगर यह वापसी की आवश्यकता परिणाम (सच) है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.