প্রোডাক্ট স্টোরের সাথে 404 স্টোর স্যুইচ করুন স্কোপযুক্ত ইউআরএল কী দেখুন


13

URL Keyপণ্য পৃষ্ঠাতে ডিফল্টরূপে গ্লোবাল স্কোপড।

সম্পাদনা: ফ্লোরিনেলএর পরামর্শ অনুসারে সুযোগটি পরিবর্তন বৈশিষ্ট্যগুলি পরিবর্তন করা যেতে পারে। তবে এটি স্টোর ভিউ স্যুইচারের আচরণকে ভেঙে দেয়।

এটি নমুনা ডেটা এবং "URL এ স্টোর কোড যুক্ত করুন" সক্ষম করে 1.7.0.2 এ পরীক্ষা করা হয়েছে :

  1. একটি পণ্য সম্পাদনা করুন এবং একটি নির্দিষ্ট স্টোরভিউ (ফরাসি) এর জন্য আলাদা ইউআরএল সেট করুন
  2. রি-সূচক
  3. ইংরেজী স্টোর ভিউতে প্রোডাক্ট পৃষ্ঠা খুলুন
  4. ফরাসি এ স্যুইচ করুন: আপনার পৃষ্ঠা সংযুক্তকরণের পৃষ্ঠাটি থাকবে /French/
  5. ইংরাজীতে ফিরে যান -> 404 পৃষ্ঠার ত্রুটি (url স্টোর কোডটি মিস করে /default/

    স্টোর ভিউ / ল্যাঙ্গুয়েজ স্যুইচ দিয়ে কীভাবে এটি সঠিকভাবে কাজ করবেন?

বিবরণ:

  • ইংরাজির জন্য ইউআরএল: /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html
  • ফরাসি জন্য URL: /french/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

আমি যদি এই পৃষ্ঠায় ইংরেজি সাইটে আছি -> /default/sony-vaio-vgn-txn27n-b-11-1-notebook-pc.html

তারপরে আমি ফরাসি তে স্যুইচ করি:

আমি এই ইউআরএল পেয়েছি ( স্টোর কোডটি মিস হয়েছে ):
MAGEDOMAIN/sony-vaio-vgn-txn27n-b-11-1-notebook-pc-french.html

সুতরাং ম্যাজেন্টো ইউআরএলটি সঠিকভাবে পুনরায় লিখুন তবে কোনও কারণে স্টোর কোডটি মিস করুন

রেফারেন্স:

নিশ্চিত এই সঙ্গে সম্পর্কযুক্ত /core/model/store.phpএবং /core/model/url/rewrite.phpএবং বিশেষ করে সেই পদ্ধতি:

Mage_Core_Model_Url_Rewrite::rewrite
Mage_Core_Model_Store::getCurrentUrl

হালনাগাদ

আপনি যদি 1.9.1 এ থাকেন তবে বিনাই ফিক্স কাজ করবে না, আমি যুক্ত করা নতুন উত্তরটি যাচাই করুন


আপনি কোন ম্যাজেন্টো সংস্করণ ব্যবহার করছেন?
ফ্লোরিনেলচিস

Magento 1.7.0.2
Fra

টিম আমি বর্তমানে কিছু উত্তর পরীক্ষা করছি এবং তারা কাজ করছে তা নিশ্চিত হওয়ার পরে সেগুলি গ্রহণ করব।
ফ্রেব

উত্তর:


12

মডেলটির একটি বাগ Mage_Core_Model_Url_Rewrite_Request(ম্যাজেন্টো 1.8) এবং Mage_Core_Model_Url_Rewrite(পূর্ববর্তী সংস্করণগুলি) সমস্যা is

1.8-তে কোর কোডের বিভাগটি এর মতো দেখাচ্ছে:

    // Section from Mage_Core_Model_Url_Rewrite_Request::_rewriteDb()

    $fromStore = $this->_request->getQuery('___from_store');
    if (!$this->_rewrite->getId() && $fromStore) {
        $stores = $this->_app->getStores();
        if (!empty($stores[$fromStore])) {
            $store = $stores[$fromStore];
            $fromStoreId = $store->getId();
        } else {
            return false;
        }

বাগ: ক্যোয়ারী প্যারামিটারের মান হ'ল স্টোর কোড, (আমার ক্ষেত্রে de, enবা fr)। অ্যারে কি দ্বারা ফিরে app->getStores()হয় সাংখ্যিক দোকান ID- র। কেন if (!empty($stores[$fromStore])) {সর্বদা ব্যর্থ হয় ts

একবার এই বাগটি স্থির হয়ে গেলে, একই পদ্ধতিতে পরে আরও একটি বাগ স্পষ্ট হয়ে যায় (আমি কেবল 1.8 তে ভাবি):

$targetUrl = $this->_request->getBaseUrl() . '/' . $this->_rewrite->getRequestPath();

অনুরোধ অবজেক্টস বেজ url হ'ল ম্যাজেন্টো বেস_আরল, স্টোর কোড ছাড়াই$currentStore->getBaseUrl()পরিবর্তে সেখানে ব্যবহার করে সেই বাগটিও ঠিক করা হয়েছে।

এই দুটি সমস্যা ঠিক হয়ে গেলে ভাষা পরিবর্তনকারী খুব ভাল কাজ করে। এখানে ম্যাজেন্টো 1.8 (সিই) এর জন্য ঠিক এমনটি করা একটি এক্সটেনশান: https://github.com/Vinai/VinaiKopp_StoreUrlRewrites

ম্যাজেন্টো 1.7 এ সমস্যাটি কিছু আলাদা হতে পারে। আমি এখনও ভেবেছিলাম আমি এই উত্তরটি যুক্ত করব, কেবলমাত্র গুগল যদি এখানে অন্য কাউকে নিয়ে আসে যিনি 1.8 বা তার থেকেও নতুন চালাচ্ছেন।


আপনি কি মনে করেন যে আমি কার্যকর করেছি তা নিরাপদ?
ফ্রে

সত্যি কথা বলতে কি আমি ১.7-তে সমস্যাটির কারণ অনুসন্ধান করি নি। আচরণটি কী কারণে ঘটছে তা ঠিক না বুঝে একটি স্থিরকরণ কার্যকর করা সর্বদা ঝুঁকিপূর্ণ।
বিনাই

দুঃখিত 2 বছর পরে এই আলোচনাটি আবার খোলার পরে আমি আবার এই বাগে আছি ... ১.৯.১.২০১ the এ সমস্যাটি যদি হয় তবে এই শর্তটি রয়েছে - এটি -> _ পুনর্লিখন-> getId () ... মূলত দ্বিতীয় স্টোর দেখার জন্য ম্যাজেন্টো পরিচালনা করুন একটি পুনর্লিখন লোড করতে এবং তাই এটি পুনঃনির্দেশকে ট্রিগার করে না ... তবে এই পুনর্লিখনটিতে ভুল আইডি_পথ রয়েছে (প্রোডাক্ট আইডি +1) তাই এটি 404 লোড করে
ফ্রে

4

বাস্তবে আমি ম্যাজেন্টো 1.7.0.2 এ এই ইস্যুটির জন্য একটি প্রস্তাব পেয়েছি যদি আপনি ম্যাজেন্টো 1.8 চালাচ্ছেন তবে ভিনাইয়ের বিস্তারিত ব্যাখ্যাটির দিকে তাকান:

দেখে মনে হচ্ছে সমস্যার একটি অংশ অনুরোধ নিয়ামকের সাথে সম্পর্কিত Mage_Core_Controller_Request_Http

আপনি যদি 161 লাইনে দেখেন তবে এই শর্ত রয়েছে:

                elseif ($storeCode !== '') {
                    $this->setActionName('noRoute');
                }

এটিকে মন্তব্য করার সময় 404 ত্রুটিটি ঠিক হয়ে যায় যখন আমি কোনও বিভাগ / পণ্য পৃষ্ঠাগুলিতে কোনও আলাদা স্টোরে স্যুইচ করি।

তবে কিছু অজানা কারণে কিছুক্ষণের জন্য উত্তর কোডটিতে স্টোর কোডটি মিস করা হয়েছে তবে উভয় ইউআরএল এখনই কাজ করে বলে এটি আর সমস্যা সৃষ্টি করে না:

  • MAGEDOMAIN / সনি-Vaio-vgn-txn27n-B-11-1-নোটবুক পিসি-french.html
  • MAGEDOMAIN / সনি-Vaio-vgn-txn27n-B-11-1-নোটবুক-pc.html

এই শর্তটি সম্পর্কে মন্তব্য অন্য সমস্যার কারণ হতে পারে তা আমার কাছে পরিষ্কার নয়


আমি এটি আমার জন্যও কাজটি নিশ্চিত করতে পারি - যখনই কোনও পণ্য দেখার সময় যখনই অন্য কোনও ভাষাতে স্যুইচ করা হয় তখন আমি একটি 404 পেয়ে যাতাম This এটি এটি সংশোধন করে, এবং আপনি যেমন বলেছিলেন, ইউআরএল থেকে স্টোর কোড বাদ দিন যা অদ্ভুত। আমি ভাবতে পারি না এটি সেরা সমাধান হিসাবে এটির মূল নিয়ন্ত্রণকারীকে সম্পাদনা করা ভাল হতে পারে না, আমি ভাবছিলাম যে আপনি কি অন্য কোনও সমাধান খুঁজে পেয়ে শেষ করেছেন?
ওয়াফল

আপনার কোনও মূল ফাইল সম্পাদনা করার দরকার নেই, আপনি নিজের মডিউল তৈরি করতে পারেন এবং সেই শ্রেণি / পদ্ধতিটি পুনরায় লিখতে পারেন।
ফ্রেং

1
Mage_Core_Controller_Request_Httpমডিউলটিতে নতুন করে লেখা যায় না।
বেনমার্কগুলি

4

ম্যাজেন্টো 1.9.1 এর জন্য কিছু আপডেট তথ্য

বাগ @ বিনাই নির্দেশিত বাগটি অন্য কারনে কার্যকারিতাটি এখনও ভেঙে গেছে (কনফিগারযোগ্য পণ্যগুলির জন্য) এই সংস্করণে সমাধান হওয়া দেখায়

সমস্যাটি আসল সমস্যাটি সম্ভবত এখানেই রয়েছে Mage_Catalog_Model_Resource_Urlতবে আমার কাছে সময় নেই এবং আমি মূলটির এমন একটি সূক্ষ্ম অংশ স্পর্শ করতে চাই না।

একটি কাজের জন্য ব্যাখ্যা:

প্রবেশের স্থানটি সর্বদা এই শ্রেণি Mage_Core_Model_Url_Rewrite_Request এবং বিশেষত পদ্ধতিতে হয়_rewriteDb()

কীভাবে _rewriteDb()কাজ করে:

  1. প্রথমে এটি বর্তমান স্টোরের জন্য অনুরোধটি লোড করার চেষ্টা করুন

(139): $this->_rewrite->loadByRequestPath($requestCases);

  1. তবে যদি আমি এটি (আইডি নেই) খুঁজে না পাই এবং একটি ___from_storeপ্যারামিটার রয়েছে

(142): if (!$this->_rewrite->getId() && $fromStore) {

  1. এর জন্য একটি পুনর্লিখন লোড করার চেষ্টা করুন ___from_store:

(152): $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);

  1. এটি যদি এটি খুঁজে পায় তবে এটি id_pathবর্তমান স্টোরের জন্য একটি লোড করতে ব্যবহার করে:

(159): $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

Url_rewrite ডেটাতে সমস্যা রয়েছে এবং তাই সূচির কার্যকারিতা (কমপক্ষে কনফিগারযোগ্য পণ্যগুলির জন্য) সমস্ত কিছু ঠিক আছে বলে মনে হচ্ছে:

  • এমনকি যদি আমরা স্টোরটি স্যুইচ করে থাকি এবং নতুন স্টোরটিতে বিভিন্ন ইউআরএল থাকে তবে লাইন ১৩৯ এ পুনর্লিখনটি লোড হয়।

সমস্যাটি হ'ল এই পুনর্লিখনটি ভুলের id_pathদিকে ইঙ্গিত করে (কনফিগারযোগ্য পণ্য আইডির পরিবর্তে এটি এর সাধারণ পণ্য আইডির একটিতে নির্দেশ করছে)

এখন একটি !$this->_rewrite->getId()শর্ত হ'ল শর্তটি সরিয়ে ফেলতে হয় এবং তাই কোনও $fromstoreপ্যারামিটার থাকাকালীন ম্যাজেন্টো সর্বদা পুনর্নির্দেশের সন্ধান করার চেষ্টা করে

  • catalog_urlসূচকটি ঠিক করা এবং এটি তৈরি করা ভুল পুনরায় লেখাকে সরিয়ে ফেলা ভাল।

এখানে দ্রুত কাজের জন্য কোড ( Mage_Core_Model_Url_Rewrite_Requestআপনার নিজের দ্বারা একটি মডিউল তৈরি করতে হবে এবং পুনরায় লেখার শ্রেণি প্রয়োজন হবে ):

protected function _rewriteDb()
    {
        if (null === $this->_rewrite->getStoreId() || false === $this->_rewrite->getStoreId()) {
            $this->_rewrite->setStoreId($this->_app->getStore()->getId());
        }

        $requestCases = $this->_getRequestCases();
        $fromStore = $this->_request->getQuery('___from_store');

        if ($fromStore) {
            $stores = $this->_app->getStores(false, true);
            if (!empty($stores[$fromStore])) {
                /** @var $store Mage_Core_Model_Store */
                $store = $stores[$fromStore];
                $fromStoreId = $store->getId();
            } else {
                return parent::_rewriteDb();
            }

            $this->_rewrite->setStoreId($fromStoreId)->loadByRequestPath($requestCases);
            if (!$this->_rewrite->getId()) {
                return parent::_rewriteDb();
            }

            // Load rewrite by id_path
            $currentStore = $this->_app->getStore();
            $this->_rewrite->setStoreId($currentStore->getId())->loadByIdPath($this->_rewrite->getIdPath());

            $this->_setStoreCodeCookie($currentStore->getCode());

            $targetUrl = $currentStore->getBaseUrl() . $this->_rewrite->getRequestPath();
            $this->_sendRedirectHeaders($targetUrl, true);
        }

        if (!$this->_rewrite->getId()) {
            return parent::_rewriteDb();
        }

        $this->_request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
            $this->_rewrite->getRequestPath());
        $this->_processRedirectOptions();

        return true;
    }

3

URL কী একটি বৈশিষ্ট্য। আপনি এটি থেকে সম্পাদনা করতে পারেন: ক্যাটালগ -> বৈশিষ্ট্য -> বৈশিষ্ট্যগুলি পরিচালনা করুনUrl_key অনুসন্ধান করুন এবং এটিতে ক্লিক করুন। Url_key বৈশিষ্ট্য সম্পাদনা করুন

ব্যাপ্তি পরিবর্তন এবং সংরক্ষণ করুন।

প্রতিটি স্টোর ভিউতে এখন আপনার কাছে বিভিন্ন ইউআরএল কী থাকতে পারে।


আমি প্রশ্নটি আপডেট করেছি, আপনি উত্তরটি ভাল তবে এটি কাজ করছে না
ফ্রে

আপনি যখন স্টোরটি স্যুইচ করবেন তখন আপনার সেই পণ্যটির হোমপৃষ্ঠায় নয় store
ফ্লোরিনেলচিস

আপনি যে স্থানে অবতরণ করেছেন সেই স্থানটি যেখানেই আপনি শুরু করেছেন: আপনি যদি কোনও বিভাগের পৃষ্ঠায় থাকেন তবে আপনাকে একই ভাষায় ভিন্ন ভাষায় অবতরণ করতে হবে
ফ্রে

1

সুতরাং আপনি প্রতিটি স্টোর দেখার জন্য ইউআরএল পরিবর্তন করতে চান?

বর্তমানে, আপনি ফ্রেঞ্চ স্টোরের জন্য আপনার ইংলিশ স্টোর থেকে আলাদা হওয়ার জন্য স্কোর স্কোপে পণ্য URL টি সংশোধন করেছেন? এবং যখন আপনি দুজনের মধ্যে স্যুইচ করবেন, আপনি একটি 404 পাবেন This এটি প্রত্যাশিত আচরণ হবে।

ম্যাজেন্টো অন্য স্টোর দর্শনগুলির জন্য পৃথক ইউআরএল পুনর্লিখনগুলি সঞ্চয় করবে না। সুতরাং আপনি যখন /french/product1ফরাসি স্টোরটিতে হিট করবেন তখন URL টি টেবিলের সাথে মিলবে এবং এটি লোড হবে। তবে আপনি যখন এটি ইংরেজী স্টোরে হিট করবেন তখন কোনও মিল থাকবে না এবং এভাবে 404 হবে।

আপনার যা যা লাগবে তা হ'ল কেবল "URL এ স্টোর কোড যুক্ত করুন" - যা আপনার ইউআরএল কীগুলি একা ফেলে রাখবে, তবে আপনার স্টোর কোডের সাথে সম্পর্কিত সমস্ত ইউআরএল উপসর্গ করে। এটির পরে আপনার স্টোরের স্যুইচারটি কাজ করতে দেওয়া উচিত।


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