ম্যাজেন্টো 2: গ্রাহক বিভাগ / বিভাগ.xml কীভাবে কাজ করে?


49

আমি সম্প্রতি ম্যাজেন্টো 2 তে একটি নতুন ধারণা পেয়েছি যা আমি আকর্ষণীয় পেয়েছি: গ্রাহক বিভাগ

আপনার কারও কারও কাছে এই sections.xmlফাইলগুলির উপস্থিতি লক্ষ্য থাকতে পারে :

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2016 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="sales/guest/reorder">
        <section name="cart"/>
    </action>
    <action name="sales/order/reorder">
        <section name="cart"/>
    </action>
</config>

আমি যা বুঝতে পেরেছি সেগুলি থেকে action ফাইলগুলি নির্দিষ্ট ক্রিয়াকলাপটি বলা হলে কোন গ্রাহক বিভাগ আপডেট করা উচিত তা নির্দিষ্ট করে specify

আমি Magento/Checkout/etc/frontend/sections.xmlনিম্নলিখিত অংশটি সহ উদাহরণস্বরূপ লক্ষ্য করেছি :

<action name="checkout/cart/add">
    <section name="cart"/>
</action>

আপনি কার্টে কোনও পণ্য যুক্ত করার পরে কি মাইনিকার্ট আপডেটটি ট্রিগার করে?

etc/frontend/sections.xmlসেই বৈশিষ্ট্যটি পরীক্ষা করতে আমি নিম্নলিখিত ফাইলটি সহ একটি কাস্টম মডিউল তৈরি করার চেষ্টা করেছি :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="checkout/cart/index">
        <section name="cart"/>
    </action>
</config>

তবে আমি যখন কার্ট পৃষ্ঠায় পৌঁছলাম তখন আমার কার্ট বিভাগটি আপডেট করার চেষ্টা করার কথা বলে মনে হচ্ছে না (কনসোলে কোনও জিইটি অনুরোধ নেই)। দেখে মনে হচ্ছে এই পুরো বিভাগটির কার্যকারিতাটি কোনওভাবে Magento_Customerমডিউল দ্বারা পরিচালিত হয়েছে ।

  • ঠিক সেই বিভাগগুলি কি? আপনি কিভাবে একটি বিভাগ সংজ্ঞায়িত করবেন?
  • কীভাবে বিভাগ আপডেটগুলি ট্রিগার করা হয়?
  • (Ptionচ্ছিক) আমি যখন কার্টের পৃষ্ঠাতে পৌঁছাচ্ছি তখন আমি কীভাবে আমার পরীক্ষার কোডটি সংশোধন করতে পারি?

এটি কি নিয়ন্ত্রক এবং ক্রিয়ায় যেমন ট্রিটযুক্ত কোনও এক্সিকিউট পদ্ধতি দ্বারা বা অন্য কোনও উপায়ে উত্সাহিত হয়?
এলএম_ফিল্ডিং

1
@ এলএম_ফিল্ডিং দেখুন আমি সবেমাত্র একটি উত্তর পোস্ট করেছি: magento.stackexchange.com/a/142350/2380
রাফেল ডিজিটাল পিয়ানিজমে

উত্তর:


82

ঠিক সেই বিভাগগুলি কি?

একটি বিভাগ হ'ল গ্রাহক উপাত্তগুলিকে একসাথে গ্রুপ করা। প্রতিটি বিভাগ কী দ্বারা উপস্থাপিত হয় যা ডেটা এবং ডেটা নিজেই অ্যাক্সেস এবং পরিচালনা করতে ব্যবহৃত হয়। ম্যাজেন্টো এজেএক্সের অনুরোধে বিভাগগুলি /customer/section/load/লোড করে এবং কী এর অধীনে ব্রাউজারের স্থানীয় স্টোরেজে লোড হওয়া ডেটা ক্যাশে করে mage-cache-storage। কিছু বিভাগ পরিবর্তন হয়ে গেলে ম্যাগন্টো ট্র্যাক করে আপডেটেড বিভাগটি স্বয়ংক্রিয়ভাবে লোড করে।

আপনি কিভাবে একটি বিভাগ সংজ্ঞায়িত করবেন?

বিভাগে di.xmlএকটি নতুন বিভাগ যুক্ত করে ফাইলের মধ্যে সংজ্ঞায়িত একটি বিভাগ

<type name="Magento\Customer\CustomerData\SectionPoolInterface">
    <arguments>
        <argument name="sectionSourceMap" xsi:type="array">
            <item name="cart" xsi:type="string">Magento\Checkout\CustomerData\Cart</item>
            <item name="directory-data" xsi:type="string">Magento\Checkout\CustomerData\DirectoryData</item>
        </argument>
    </arguments>
</type>

সুতরাং এখানে দুটি নতুন বিভাগ নিবন্ধিত cartএবং directory-dataMagento\Checkout\CustomerData\Cartএবং Magento\Checkout\CustomerData\DirectoryDataপ্রয়োগ করে Magento\Customer\CustomerData\SectionSourceInterfaceএবং getSectionDataপদ্ধতির ফলাফল হিসাবে প্রকৃত ডেটা সরবরাহ করে ।

কীভাবে বিভাগ আপডেটগুলি ট্রিগার করা হয়?

Magento ধরে নেয় যে গ্রাহকের ব্যক্তিগত তথ্য একটি গ্রাহক কিছু রাষ্ট্র সংশোধনের অনুরোধ পাঠায় যখন পরিবর্তিত হয় ( POST, PUT, DELETE)। সার্ভারে লোড কমানোর জন্য, বিকাশকারীদের কোন ক্রিয়া (বা অনুরোধ) আপডেট করে কোন গ্রাহকের ডেটা বিভাগে তা আপডেট করে etc/section.xml

<action name="checkout/cart/add">
    <section name="cart"/>
</action>

ক্রিয়া নাম একটি ক্রিয়া কী প্যাটার্ন। যখন কোনও ব্যবহারকারী নির্দিষ্ট পদক্ষেপের সাথে মেলে এমন ক্রিয়াকলাপে মেগ্যান্টো সনাক্ত করবে যে সংশ্লিষ্ট বিভাগটি পুরানো এবং এটি আবার লোড হয়। যদি অ্যাকশনের নামটি থাকে *তার মানে এই যে প্রতিটি পোস্ট এবং পুট অনুরোধে বিভাগটি আপডেট করা হবে। যদি বিভাগ ট্যাগটি মিস হয় তবে সমস্ত বিভাগ আপডেট করা হবে।

সুতরাং ধারণাগতভাবে আপনি যখন কার্ট পৃষ্ঠা সমৃদ্ধ করবেন তখন মিনি কার্ট আপডেট করা ভুল। এই মুহুর্তে, মিনি কার্ট (বা কার্ট বিভাগ) ইতিমধ্যে আপডেট করা উচিত।

আপনি গ্রাহক ডেটা সম্পর্কে আরও তথ্য এখানে পেতে পারেন


অভ্যন্তরীণ বাস্তবায়ন

কখন এবং কীভাবে বিভাগগুলি আপডেট করা হয়েছে তা বোঝার জন্য আসুন বাস্তবায়নটি দেখুন। বোঝার মূল চাবিকাঠি ফাইল magento2ce/app/code/Magento/Customer/view/frontend/web/js/section-config.jsএবং magento2ce/app/code/Magento/Customer/view/frontend/web/js/customer-data.js

দুটি ঘটনার হ্যান্ডেলার জন্য নিবন্ধিত করছে গত এক শেষে ajaxCompleteএবং submit। এর অর্থ হ'ল যখন কোনও ফর্ম সার্ভারে পোস্ট করা হয় (POST বা PUT পদ্ধতি সহ), বা যখন জাভাস্ক্রিপ্ট কোনও AJAX, POSTবা PUTঅনুরোধ প্রেরণ করে , হ্যান্ডেলগুলি অনুরোধ করা হবে। উভয় হ্যান্ডলারের একই যুক্তি রয়েছে: Magento_Customer/js/section-configচেকের সাহায্যে কোনও বিভাগ আপডেট হওয়া উচিত বা না হওয়া উচিত। যদি কিছু বিভাগ আপডেট করা উচিত তবে customerData.invalidate(sections)তাকে বলা হয়। এবং পরে সমস্ত অবৈধ বিভাগ একটি সার্ভার থেকে লোড করা হয়।

সুতরাং কীভাবে Magento_Customer/js/section-configজানবেন যে কোন বিভাগটি সরানো উচিত এবং কোন পদক্ষেপে? উত্তরটি হ'ল Magento/Customer/view/frontend/templates/js/section-config.phtml:

<script type="text/x-magento-init">
<?php
     /* @noEscape */ echo $this->helper(\Magento\Framework\Json\Helper\Data::class)->jsonEncode([
    '*' => ['Magento_Customer/js/section-config' => [
        'sections' => $block->getSections(),
        'clientSideSections' => $block->getClientSideSections(),
        'baseUrls' => array_unique([
            $block->getUrl(null, ['_secure' => true]),
            $block->getUrl(null, ['_secure' => false]),
        ]),
    ]],
]);
?>
</script>

এইভাবে, একটি সার্ভার একটি ব্রাউজারে মার্জড বিভাগগুলির কনফিগারেশনটি পাস করে।

সুতরাং এই সমস্ত অনুমান করে, বিভাগটি কেবলমাত্র পোষ্ট বা পুট ফর্ম জমা দিয়ে বা এজেএক্স অনুরোধের মাধ্যমে আপডেট করা যেতে পারে

এছাড়াও, কেবল দুটি নোট রয়েছে:

  • এখানে বর্ণিত সমস্ত হ'ল অভ্যন্তরীণ বাস্তবায়ন এবং পরিবর্তিত হতে পারে, সুতরাং আপনি নিরাপদে কেবল বিভাগ.এক্সএমএল ব্যবহার করতে পারেন এবং নির্দিষ্ট পোষ্ট বা পুট বা ডিলেট নিষ্ক্রিয় ক্রিয়াকলাপগুলি ট্রিগার করা হলে বিভাগ আপডেটগুলি আশা করতে পারেন।
  • আপনি যদি নিশ্চিত হন তবে আপনাকে অবশ্যই কিছু বিভাগ আপডেট করার দরকার আছে আপনি সর্বদা এরকম কিছু করতে পারেন: require('Magento_Customer/js/customer-data').reload(['cart'], false)

এর জন্য দুর্দান্ত ধন্যবাদ for যেভাবেই আপনি বলতে পারবেন যে আমার প্রশ্নের কোডটি কেন আমি কার্টের পৃষ্ঠাতে পৌঁছালে মিনি কার্টটি রিফ্রেশ করে না?
রাফেল ডিজিটাল পিয়ানোজমে

1
@ রাফেলাতডিজিটালপিয়ানিজম, আমি আমার মন্তব্যে উত্তর দিয়ে আপডেট করেছি
ভোলডিমায়ার কুবলিটস্কি

আমি কার্ট পৃষ্ঠায় একটি কাস্টম এজাক্স কল করছি, আমার এই গ্রাহক লোড বিভাগ কলটি প্রয়োজন নেই। আমি কীভাবে এড়াতে পারি? magento.stackexchange.com/questions/156425/…
দেখেছি

5

আপনি ট্যাগে যে ক্রিয়াটি সংজ্ঞায়িত করেছেন তা পোষ্ট অনুরোধের মাধ্যমে উত্সাহিত করা উচিত। উদাহরণ:

এছাড়াও আপনি যদি সমস্ত বিভাগে গ্রাহকের ডেটা রিফ্রেশ করতে চান তবে কেবল ব্যবহার করুন (বিক্রেতার / ম্যাজেন্টো / মডিউল-গ্রাহক / ইত্যাদি / ফ্রন্টএন্ড / বিভাগগুলি দেখুন)

আপনি ফাইলটির শেষেও vendor/magento/module-customer/view/frontend/web/js/section-‌​config.js
কোডটি সন্ধান করতে পারেন :

document (দস্তাবেজ) .ও ('জমা', ফাংশন (ইভেন্ট) { 
    বিভিন্ন বিভাগ; 
    if (ইভেন্ট.target.method.match (/ post | put / i)) { 
        বিভাগসমূহ = বিভাগConfig.getAffectedSifications (ইভেন্ট.আরকেট.অ্যাকশন);
        যদি (বিভাগ) { 
            customerData.invalidate (বিভাগে); 
        } 
    } 
});

আপনি ফাইল বিক্রেতা / ম্যাজেন্টো / মডিউল-গ্রাহক / ভিউ / ফ্রন্টএন্ড / ওয়েব / জেএস / বিভাগ-config.js ফাইলের শেষেও দেখতে পারেন কোডটি Find (নথি) .on ('জমা দিন', ফাংশন (ইভেন্ট) {var বিভাগসমূহ; যদি (ইভেন্ট.target.method.match (/ পোস্ট | পুট / i)) {বিভাগগুলি = বিভাগকনফিগ.জিটএফেক্টেডসেকশনস (ইভেন্ট.আরটেট.অ্যাকশন); যদি (বিভাগ) {গ্রাহক ডেটা.ইনকিডেট (বিভাগ);}}}) ;
lemk0

3

এটি করার একটি হ্যাকি উপায়:

আমার অ্যাকশন শ্রেণিতে আমি যে কার্টটি পুনর্নির্দেশ করি:

$this->_checkoutSession->setMinicartNeedsRefresh(true);

তারপরে আমি আমার কার্ট পৃষ্ঠায় নিম্নলিখিতগুলি যুক্ত করেছি:

<?php if ($this->isRefreshRequired()): ?>
    <script type="text/javascript">
        require( [ 'jquery' ], function ($)
        {
            $.ajax({
                url: '<?php echo $this->getRefreshUrl(); ?>',
                type: 'POST'
            });
        });
    </script>
<?php endif; ?>

তারপরে আমার ব্লকে আছে:

public function isRefreshRequired()
{
    if ($this->_checkoutSession->getMinicartNeedsRefresh()) {
        $this->_checkoutSession->setMinicartNeedsRefresh(false);
        return true;
    } else {
        return false;
    }
}

/**
 * Get the refresh URL
 * @return string
 */
public function getRefreshUrl()
{
    return $this->getUrl('module/cart/refresh');
}

এবং আমার Refresh.phpঅ্যাকশন ক্লাসটি এর মতো দেখাচ্ছে:

<?php

namespace Vendor\Module\Controller\Cart;

use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;

class Refresh extends Action
{

    /**
     * Dummy action class called via AJAX to trigger the section update
     */
    public function execute()
    {
        return $this->getResponse()->representJson(
            $this->_objectManager->get('Magento\Framework\Json\Helper\Data')->jsonEncode(['success'=>true])
        );
    }
}

রাফেল, আমার বিভাগগুলি। এক্সএমএল এমনকি আমি যখন ফাইলটিতে ইউআরএলে একটি পোস্টের অনুরোধ প্রেরণ করছি তখন কার্ট আপডেট করার চেষ্টা করছে না ... কোনও ধারণা?
এলএম_ফিল্ডিং

@ এলএম_ফিল্ডিং হ্যাঁ আমারও একই লোক ছিল, আমার উত্তরটি পড়ুন
রাফেল ডিজিটাল পিয়ানোজমে

সুতরাং এটি কাজ পেতে, আমরা এই লিখতে হবে? ডিফল্ট আচরণটি কি ভেঙে গেছে বা আমি ভুল বোঝাবুঝি করছি?
এলএম_ফিল্ডিং

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

এটি অবশ্যই আমার জন্য আপেক্ষিক url ব্যবহার করছিল - এটি বিভাগ আপডেটটি ট্রিগার করে না।
এলএম_ফিল্ডিং

0

আমি প্রশ্নের লেখক হিসাবে একই সমস্যার সম্মুখীন হয়েছি। ডকুমেন্টেশন এবং কোর কোডে কয়েক ঘন্টা গবেষণা এবং ড্যাগিংয়ের পরে, আমি হঠাৎ সমাধান পেয়েছি। আমার ক্ষেত্রে আমি ... / ইত্যাদি / সম্মুখভাগ / বিভাগ.xML ফাইল পেয়েছি

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
    <action name="roadsignconf/index/addtocart">
        <section name="cart"/>
    </action>
</config>

এবং এটি কাজ করতে চান না। এই বিষয়ে এবং এই সমস্যাটির পড়ার পর https://github.com/magento/magento2/issues/3287 আমি তাই বিভ্রান্ত করা হয়েছিল যে পরীক্ষা শুরু করে দিল। আমার জন্য স্ল্যাশ যোগ করতে সহায়তা করে:

 <?xml version="1.0"?>
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Customer:etc/sections.xsd">
        <action name="/roadsignconf/index/addtocart/">
            <section name="cart"/>
        </action>
    </config>

আশা করি এটি সমাধান অনুসন্ধানের জন্য কাউকে কম সময় ব্যয় করতে সহায়তা করবে।

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