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
আমাকে অবাক করেছিল তাই সম্ভবত কিছু দেখার জন্য।