Di Magento 2, Anda dapat menentukan tema induk di theme.xml
file tema .
<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>
Pertama kali Magento melihat sebuah tema, ia menggunakan nilai ini untuk mengatur parent_id
dalam theme
tabel. Ini adalah sumber kebenaran di mana orangtua tema berada.
Namun, jika Anda mencoba untuk mengubah nilai ini setelah tema ditambahkan ke sistem , Magento gagal memperbaruiparent_id
kolom, dan Magento\Theme\Model\Theme
objek instantiated masih akan memiliki tema induk asli. (Bahkan jika Anda menghapus cache.)
Saya dapat memperbaikinya dengan mengubah parent_id
nilai secara manual - yang tampaknya seperti peretasan. Di mana parent_id
biasanya diatur dalam kode inti Magento, dan tindakan pengguna apa yang memicu ini? yaitu apakah ada cara untuk memberi tahu Magento "tolong muat ulang tema ini"
sumber
Jawaban:
DIPERBARUI DI 20160310
Kesimpulan
Itu selalu diatur baik melalui
updateTheme()
atau dari koleksi (via DB) jika AndaappState->getMode() == AppState::MODE_PRODUCTION
Menjawab
Untuk menjawab pertanyaan Apa cara agar Magento memuat ulang file theme.xml jawabannya adalah:
Tetapkan status aplikasi untuk
developer
menggunakanSetEnv MAGE_MODE developer
dalam.htaccess
(atau setara nginx) dan kemudian masuk ke area admin (atau segarkan rute admin apa saja) untuk memicuMagento\Theme\Model\Theme\Plugin\Registration::beforeDispatch()
.Tabel tema dalam database diperbarui karena
Lihat analisis di bawah untuk detailnya.
Analisis
Wow kode Magento 2 sepertinya sangat rumit bagi saya. Sudahkah Anda mempelajari fungsi ini
beforeDispatch()
yang memanggilupdateThemeData()
tetapi hanyaif ($this->appState->getMode() != AppState::MODE_PRODUCTION)
Mungkin Anda telah melewati kode ini.
beforeDispatch()
dipanggil hanya melalui rute admin dan bukan pada rute front-end. Berikut ini adalah jejaknya:Sebenarnya saya melihat
beforeDispatch()
panggilanupdateThemeData()
yang berisi nugget ini:Yang tampaknya sebenarnya (akhirnya) merujuk ke path XML config
$themeData->getParentTheme()->getFullPath()
tetapi fungsi itu masih menggunakan$themeData->getParentTheme()
. Oh, saya pikir logikanya adalah ' Jika saya memperbarui tema terdaftar yang memiliki parentId dalam koleksi (melalui DB) kemudian mencari jalur induk di konfigurasi dan memperbarui koleksi '.Jadi mungkin ini dia.Kalau tidak, saya benar-benar bingung bagaimanaMagento\Theme\Model\Theme::getParentTheme()
mengimplementasikangetParentId()
yang dinyatakan dalam antarmuka tema. Tentunya itu bukan sihir. Seperti yang Anda katakan itu harus berasal dari DB melalui koleksi atau dari jalur XML konfigurasi tema (jika itu berubah atau belum didefinisikan) tetapi saya tidak dapat menemukan definisigetParentId()
. Mungkin itu selalu diatur melaluiupdateTheme()
ATAU dari koleksi (via DB) jadi terlalu buruk jika AndaappState->getMode() == AppState::MODE_PRODUCTION
.Saya merasa bermanfaat untuk mendapatkan informasi dari dalam
updateThemeData()
dengan menambahkan beberapa keluaran log:Yang akan masuk
/var/log/debug.log
. Dengan status aplikasi diatur kedeveloper
Saya dapat melihat ID induk selalu diset pada setiap halaman admin menyegarkan apakah itu diubahtheme.xml
atau tidak. Dengan status aplikasiproduction
, fungsi tidak pernah berjalan jadi saya menyimpulkan:Itu selalu diatur melalui
updateTheme()
ATAU dari koleksi (via DB) jadi terlalu buruk jika AndaappState->getMode() == AppState::MODE_PRODUCTION
Saya pikir Anda semua mungkin dalam
developer
keadaan aplikasi.default
keadaan aplikasi akan memicuupdateThemeData()
juga tentu saja. Dalam debugging lebih lanjut saya login path tema lengkap untuk tema induk Luma yangfrontend/Magento/blank
. IbukotaM
mengejutkan saya jadi mungkin sesuatu yang harus diwaspadai.sumber
Tampaknya hal di atas tidak berhasil bagi saya, jadi saya melakukan peretasan.
Semoga ini bisa membantu seseorang.
jika tidak, ubahlah.
atau
sumber