20160310 GÜNCELLEME
Sonuç
Her zaman updateTheme()
toplama yoluyla veya koleksiyondan (DB aracılığıyla) ayarlanırsa ,appState->getMode() == AppState::MODE_PRODUCTION
Cevap
Soruya cevap vermek için theme.xml dosyasını yeniden Magento almanın yolu nedir cevap:
Uygulamanın durumunu ayarlama developer
kullanarak SetEnv MAGE_MODE developer
içinde .htaccess
(veya nginx eşdeğer) ve daha sonra yönetici alanına giriş (veya herhangi bir yönetici rotasını yenilemek) tetiğe Magento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.
Veritabanındaki tema tablosu,
\\Magento\Theme\Model\Theme\Plugin\Registration::updateThemeData()
\\...
$themeData->setParentId($parentTheme->getId());`.
\\...
Ayrıntılar için aşağıdaki analize bakın.
analiz
Vay canına Magento 2 kodu benim için gerçekten karmaşık görünüyor. Eğer bu fonksiyonu inceledik beforeDispatch()
Aramaların updateThemeData()
ama sadeceif ($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);
}
}
Muhtemelen bu koddan geçtiniz.
beforeDispatch()
yalnızca yönetici yollarıyla çağrılır, ön uç yollarda çağrılmaz. İşte bir iz:
#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))
Aslında bu nugget içeren beforeDispatch()
çağrıları görüyorum 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());
}
//...
Aslında (nihayet) bir yapılandırma XML yoluna başvuruyor gibi görünüyor, $themeData->getParentTheme()->getFullPath()
ancak bu işlev hala kullanıyor $themeData->getParentTheme()
. Oh mantık ' Koleksiyonda bir parentId (DB aracılığıyla) olan kayıtlı bir tema güncelleştiriyorsanız, o zaman yapılandırma üst bir yol aramak ve koleksiyonu güncelleştirmek olduğunu düşünüyorum .Belki de budur.
Aksi takdirde tema arayüzünde bildirilen nasıl Magento\Theme\Model\Theme::getParentTheme()
uygular konusunda tam bir kayıp var getParentId()
. Elbette sihir değil. Dediğin gibi ya koleksiyon yoluyla DB ya da temanın yapılandırma XML yolundan gelmesi gerekiyor (değişti ya da henüz tanımlanmadıysa) ama bir tanımı bulamıyorum getParentId()
. Belki her zaman updateTheme()
OR üzerinden koleksiyonundan (DB yoluyla) ayarlanırsa çok kötü appState->getMode() == AppState::MODE_PRODUCTION
.
updateThemeData()
Bazı günlük çıktıları ekleyerek içeriden bilgi toplamak için yararlı buldum :
//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());
}
//...
Hangi giriş yapacak /var/log/debug.log
. Uygulama durumu olarak ayarlandığında developer
, ana kimliğin değiştirilip değiştirilmediğine bakılmaksızın her yönetici sayfasında yenilendiğini her zaman görebilirsiniz theme.xml
. Uygulama durumu production
ile fonksiyon asla çalıştırılır, bu yüzden sonuçlandırıyorum:
Her zaman updateTheme()
koleksiyondan OR aracılığıyla (DB aracılığıyla) ayarlanır .appState->getMode() == AppState::MODE_PRODUCTION
Bence hepiniz developer
uygulama durumundasınız. default
uygulama durumu updateThemeData()
elbette çok tetikleyecektir . Daha fazla hata ayıklamada olan Luma'nın ana teması için tema tam yolunu kaydettim frontend/Magento/blank
. Başkent M
beni şaşırttı, belki de dikkat edilmesi gereken bir şey.