ম্যাজেন্টো 2 এ কোনও থিমের পিতামাতাকে আপডেট করার সঠিক উপায়


14

ম্যাজেন্টো 2 এ, আপনি কোনও থিমের theme.xmlফাইলে একটি পিতামাতার থিম নির্দিষ্ট করতে পারেন ।

<theme xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Config/etc/theme.xsd">
    <title>Theme Title</title>
    <parent>Package/base-theme</parent>
    <media>
        <preview_image>media/preview.jpg</preview_image>
    </media>
</theme>

ম্যাজেন্টো প্রথমবার কোনও থিম দেখে, এটি এই মানটি টেবিলের parent_idমধ্যে সেট করতে ব্যবহার করে theme। থিমের পিতা-মাতা যেখানে রয়েছেন এটিই সত্যের উত্স।

যাইহোক, সিস্টেমে কোনও থিম যুক্ত হওয়ার পরে আপনি যদি এই মানটি পরিবর্তন করার চেষ্টা করেন তবে ম্যাজেন্টো parent_idকলামটি আপডেট করতে ব্যর্থ হয়েছে এবং তাত্ক্ষণিক Magento\Theme\Model\Themeঅবজেক্টগুলিতে এখনও মূল পিতামাত থিম থাকবে। (আপনি ক্যাশে সাফ করলেও।)

আমি ম্যানুয়ালি parent_idমান পরিবর্তন করে এটি ঠিক করতে পারি - এটি হ্যাকের মতো মনে হয়। parent_idসাধারণত ম্যাগান্টোর মূল কোডে কোথায় সেট করা থাকে এবং কোন ব্যবহারকারীর ক্রিয়া এটিকে ট্রিগার করে? অর্থ্যাৎ "কি এই থিমটি পুনরায় লোড করুন" ম্যাগান্টোকে বলার উপায় আছে?


2
হ্যাঁ, আমি এটিও লক্ষ্য করেছি এবং থিমটি নিবন্ধিত হওয়ার পরে এটি পরিবর্তন করার একমাত্র উপায় হ'ল সরাসরি ডাটাবেস পরিবর্তন করা mod সম্ভবত একটি বাগ?
গ্যারেথ ডেইন

উত্তর:


2

20160310 এ আপডেট হয়েছে

উপসংহার

এটি যদি হয় তবে সর্বদা updateTheme()সংগ্রহের মাধ্যমে বা সংগ্রহের মাধ্যমে (ডিবি এর মাধ্যমে) সেট করা থাকেappState->getMode() == AppState::MODE_PRODUCTION

উত্তর

থিম.এক্সএমএল ফাইলটি পুনরায় লোড করার জন্য ম্যাজেন্টো পাওয়ার উপায় কী তা প্রশ্নের উত্তর দেওয়ার জন্য:

আবেদন স্থিতি সেট developerব্যবহার SetEnv MAGE_MODE developerমধ্যে .htaccess(অথবা nginx সমতুল্য) এবং তারপর অ্যাডমিন এলাকা লগ ইন (অথবা কোন অ্যাডমিন রুট রিফ্রেশ) ট্রিগার Magento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()

ডাটাবেসে থিম টেবিলের কারণে আপডেট হয়েছে

\\Magento\Theme\Model\Theme\Plugin\Registration::updateThemeData()
\\...
$themeData->setParentId($parentTheme->getId());`.
\\...

বিস্তারিত জানার জন্য নীচে বিশ্লেষণ দেখুন।

বিশ্লেষণ

বাহ ম্যাজেন্টো 2 কোডটি আমার কাছে সত্যিই জটিল বলে মনে হচ্ছে। আপনি এই ফাংশনটি অধ্যয়ন করেছেন beforeDispatch()যা updateThemeData()কেবল কল করেif ($this->appState->getMode() != AppState::MODE_PRODUCTION)

//namespace: namespace Magento\Theme\Model\Theme\Plugin;
//class: Registration
//file: app/code/Magento/Theme/Model/Theme/Plugin/Registration.php 

     /**
     * Add new theme from filesystem and update existing
     *
     * @param AbstractAction $subject
     * @param RequestInterface $request
     *
     * @return void
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function beforeDispatch(
        AbstractAction $subject,
        RequestInterface $request
    ) {
        try {
            if ($this->appState->getMode() != AppState::MODE_PRODUCTION) {
                $this->themeRegistration->register();
                $this->updateThemeData();
            }
        } catch (LocalizedException $e) {
            $this->logger->critical($e);
        }
    }

সম্ভবত আপনি এই কোড মাধ্যমে হয়েছে।

beforeDispatch()কেবল অ্যাডমিন রুটের মাধ্যমে বলা হয় এবং সামনের শেষের রুটে নয়। এখানে একটি ট্রেস দেওয়া হয়েছে:

#0 [internal function]: Magento\Theme\Model\Theme\Plugin\Registration->beforeDispatch(Object(Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor), Object(Magento\Framework\App\Request\Http))
#1 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(122): call_user_func_array(Array, Array)
#2 \magento2\var\generation\Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor.php(39): Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor->___callPlugins('dispatch', Array, Array)
#3 \magento2\lib\internal\Magento\Framework\App\FrontController.php(55): Magento\Backend\Controller\Adminhtml\Dashboard\Index\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#4 [internal function]: Magento\Framework\App\FrontController->dispatch(Object(Magento\Framework\App\Request\Http))
#5 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(74): call_user_func_array(Array, Array)
#6 \magento2\lib\internal\Magento\Framework\Interception\Chain\Chain.php(70): Magento\Framework\App\FrontController\Interceptor->___callParent('dispatch', Array)
#7 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(136): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'install')
#8 \magento2\lib\internal\Magento\Framework\Module\Plugin\DbStatusValidator.php(69): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
#9 [internal function]: Magento\Framework\Module\Plugin\DbStatusValidator->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
#10 \magento2\lib\internal\Magento\Framework\Interception\Interceptor.php(141): call_user_func_array(Array, Array)
#11 \magento2\var\generation\Magento\Framework\App\FrontController\Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, Array)
#12 \magento2\lib\internal\Magento\Framework\App\Http.php(115): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
#13 \magento2\lib\internal\Magento\Framework\App\Bootstrap.php(258): Magento\Framework\App\Http->launch()
#14 \magento2\index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))

আসলে আমি beforeDispatch()কলগুলি দেখতে পাই updateThemeData()যার মধ্যে এই ন্যাগেটটি রয়েছে:

//namespace: namespace Magento\Theme\Model\Theme\Plugin;
//class: Registration
//file: app/code/Magento/Theme/Model/Theme/Plugin/Registration.php 
//function: updateThemeData()

//...
            if ($themeData->getParentTheme()) {
                $parentTheme = $this->themeLoader->getThemeByFullPath(
                    $themeData->getParentTheme()->getFullPath()
                );
                $themeData->setParentId($parentTheme->getId());
            }
//...

যা আসলে (অবশেষে) একটি কনফিগার এক্সএমএল পাথ উল্লেখ করে $themeData->getParentTheme()->getFullPath()তবে এটি ফাংশনটি এখনও ব্যবহার করে $themeData->getParentTheme()। ওহ আমি মনে করি যুক্তিটি হ'ল আমি যদি সংগ্রহে একটি প্যারেন্টআইড থাকা কোনও নিবন্ধিত থিম আপডেট করে থাকি (ডিবি এর মাধ্যমে) তবে কনফিগারেশনে একটি প্যারেন্ট পথ সন্ধান করুন এবং সংগ্রহটি আপডেট করুনসুতরাং সম্ভবত এটি হয়।

অন্যথায় আমি থিম ইন্টারফেসে ঘোষিত Magento\Theme\Model\Theme::getParentTheme()কার্যকরকরণগুলি কীভাবে সম্পূর্ণ ক্ষতিগ্রস্থ হই getParentId()। অবশ্যই এটি যাদু নয়। আপনি যেমনটি বলেন যে এটি সংগ্রহের মাধ্যমে ডিবি থেকে আসা বা থিমের কনফিগারেশন এক্সএমএল পাথ (যদি এটি পরিবর্তিত হয় বা এখনও সংজ্ঞায়িত না হয়) থেকে আসা দরকার তবে আমি এর সংজ্ঞা পাই না getParentId()। হতে পারে এটি সর্বদা updateTheme()সংগ্রহের মাধ্যমে OR মাধ্যমে সেট করা থাকে (ডিবি এর মাধ্যমে) খুব খারাপ যদি আপনার হয় appState->getMode() == AppState::MODE_PRODUCTION

আমি updateThemeData()কিছু লগ আউটপুট যোগ করে ভিতরে থেকে তথ্য সংগ্রহ করতে দরকারী বলে মনে করেছি :

//namespace: namespace Magento\Theme\Model\Theme\Plugin;
//class: Registration
//file: app/code/Magento/Theme/Model/Theme/Plugin/Registration.php 
//function: updateThemeData()

//...
            if ($themeData->getParentTheme()) {
                $parentTheme = $this->themeLoader->getThemeByFullPath(
                    $themeData->getParentTheme()->getFullPath()
                );
            $this->logger->addDebug("Theme parent full path ".$themeData->getParentTheme()->getFullPath());
            $this->logger->addDebug("Theme parent new ID ".$parentTheme->getId());                    $themeData->setParentId($parentTheme->getId());
            }
//...

যা লগ হবে /var/log/debug.log। অ্যাপ্লিকেশনের স্থিতিতে সেট করে developerআমি দেখতে পাচ্ছি প্যারেন্ট আইডি সর্বদা প্রতিটি অ্যাডমিন পৃষ্ঠায় সেট করা থাকে তা তা রিফ্রেশ হয়েছে কিনা তা রিফ্রেশ করুন theme.xml। অ্যাপ্লিকেশন রাষ্ট্রের productionসাথে ফাংশনটি কখনও চালিত হয় না তাই আমি উপসংহারে পৌঁছেছি:

updateTheme()সংগ্রহের মাধ্যমে (ডিবি এর মাধ্যমে) এটি সর্বদা সেট করা থাকে তাই খুব খারাপ যদি আপনার হয়appState->getMode() == AppState::MODE_PRODUCTION

আমি মনে করি আপনি সম্ভবত developerঅ্যাপ স্টেটে আছেন। defaultঅ্যাপ স্টেট updateThemeData()অবশ্যই অবশ্যই ট্রিগার করবে । আরও ডিবাগিংয়ের মধ্যে আমি লুমার মূল থিমটির থিমটির পুরো পথটি লগইন করেছি frontend/Magento/blank। রাজধানী Mআমাকে অবাক করেছিল তাই সম্ভবত কিছু দেখার জন্য।


0

উপরেরটি আমার পক্ষে কাজ করে বলে মনে হয় নি, তাই আমি হ্যাক নিয়ে চলেছি।

আশা করি এটি কাউকে সাহায্য করবে।

using the command line

 mysql

 SHOW databases;

 use magento; (or whatever your DB's name is)

 SHOW tables

 SELECT * FROM theme; 

(Check the **parent_id** of theme in question, it should be the same number as **theme_id** of theme you want as the parent)

যদি তা না হয় তবে এটি পরিবর্তন করুন।

 UPDATE theme SET parent_id  = '[value]' WHERE theme_title = '[Theme name]';

then quit mysql;

 bin/magento setup:static-content:deploy 

অথবা

grunt clean:[theme] (For example:  grunt clean:blank)

grunt exec:[theme]

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