Jadi ini akan menyebabkan kegemparan besar dan bertentangan dengan keinginan setiap pengembang Magento - tetapi kami memiliki proses yang solid untuk bertema - yang tidak menggunakan local.xml (lebih lanjut tentang itu nanti).
Kami selalu bekerja di luar template base/default
(dan enterprise/default
untuk EE) - tetapi nol CSS. Meskipun semua desain tidak terlalu cocok dengan tata letak struktural toko vanilla Magento - kami menemukan praktik yang baik untuk menggunakan default
tema sebagai titik awal; kita dapat menghapus metode / loop / html dll yang tidak digunakan sebagaimana diperlukan selama templating.
Saat memulai tema
Untuk EE
Kami memasang ekstensi ini terlebih dahulu, sehingga kami mendapatkan tingkat fallback tema - ketika nanti kami menghapus file tema yang kami salin.
Paket
Kami pertama-tama mulai dengan membuat paket dan menyalin di seluruh base/default
tema; jadi misalnya (katakan itu adalah situs web kami sendiri, kami akan memanggil paket sonassi
)
cd ./app/design/frontend
mkdir sonassi
cp -par base/default sonassi/default
mkdir sonassi/default/layout/custom
Templat
Tujuan utamanya adalah kita tidak harus terus menyalin dan menempel setiap file yang kita modifikasi kapan pun kita perlu, kita cukup mengedit file dalam tema.
Tetapi setiap kali kami mengedit file, kami menghapus header Magento Commerce - dan menambahkan header / pengenal yang sesuai untuk menandai file sebagai templat khusus, biasanya sesuatu seperti ...
/*
* @category Template
* @package sonassi_default
* @copyright Copyright (c) 2013 Sonassi
*/
Header ini melayani tujuan nanti ketika kami melakukan pembersihan template akhir. Karena kita akan melakukan rekursif diff
pada base/default/template
direktori dan sonassi/default/template
direktori - maka hapus semua yang belum diubah.
Dengan cara ini, hanya file yang diubah yang tersisa dan paket keseluruhan telah dikurangi menjadi file yang diubah minimum.
File tata letak
Kami menggunakan modul inti standar kami sendiri sonassi.core
. Ya, kami selalu mengawali namespace modul dengan pengidentifikasi unik - menghentikan konflik di mana perusahaan lain telah memilih nama yang sama (mis. Fishpig / wordpress dan sonassi / wordpress)
Metodologi tata letak nolocal
<core>
<rewrite>
<layout>Sonassi_Core_Model_Core_Layout</layout>
<layout_update>Sonassi_Core_Model_Core_Layout_Update</layout_update>
</rewrite>
</core>
Kemudian dua kelas ajaib yang menambahkan fungsi tidak perlu local.xml
lagi,
class Sonassi_Core_Model_Core_Layout
extends Mage_Core_Model_Layout
{
/**
* Loyout xml generation
*
* @return Mage_Core_Model_Layout
*/
public function generateXml()
{
$xml = $this->getUpdate()->asSimplexml();
$removeInstructions = $xml->xpath("//remove");
if (is_array($removeInstructions)) {
foreach ($removeInstructions as $infoNode) {
$attributes = $infoNode->attributes();
$blockName = (string)$attributes->name;
if ($blockName) {
$unremoveNodes = $xml->xpath("//unremove[@name='".$blockName."']");
if (is_array($unremoveNodes) && count($unremoveNodes) > 0) {
continue;
}
$ignoreNodes = $xml->xpath("//block[@name='".$blockName."']");
if (!is_array($ignoreNodes)) {
continue;
}
$ignoreReferences = $xml->xpath("//reference[@name='".$blockName."']");
if (is_array($ignoreReferences)) {
$ignoreNodes = array_merge($ignoreNodes, $ignoreReferences);
}
foreach ($ignoreNodes as $block) {
if ($block->getAttribute('ignore') !== null) {
continue;
}
$acl = (string)$attributes->acl;
if ($acl && Mage::getSingleton('admin/session')->isAllowed($acl)) {
continue;
}
if (!isset($block->attributes()->ignore)) {
$block->addAttribute('ignore', true);
}
}
}
}
}
$this->setXml($xml);
return $this;
}
}
dan
class Sonassi_Core_Model_Core_Layout_Update
extends Mage_Core_Model_Layout_Update
{
public function getFileLayoutUpdatesXml($area, $package, $theme, $storeId = null)
{
if (null === $storeId) {
$storeId = Mage::app()->getStore()->getId();
}
/* @var $design Mage_Core_Model_Design_Package */
$design = Mage::getSingleton('core/design_package');
$layoutXml = null;
$elementClass = $this->getElementClass();
$updatesRoot = Mage::app()->getConfig()->getNode($area.'/layout/updates');
Mage::dispatchEvent('core_layout_update_updates_get_after', array('updates' => $updatesRoot));
$updateFiles = array();
foreach ($updatesRoot->children() as $updateNode) {
if ($updateNode->file) {
$module = $updateNode->getAttribute('module');
if ($module && Mage::getStoreConfigFlag('advanced/modules_disable_output/' . $module, $storeId)) {
continue;
}
$updateFiles[] = (string)$updateNode->file;
// custom theme XML contents
$updateFiles[] = 'custom/'.(string)$updateNode->file;
// custom theme XML override
$updateFiles[] = 'local/'.(string)$updateNode->file;
}
}
// custom local layout updates file - load always last
$updateFiles[] = 'local.xml';
$layoutStr = '';
foreach ($updateFiles as $file) {
$filename = $design->getLayoutFilename($file, array(
'_area' => $area,
'_package' => $package,
'_theme' => $theme
));
if (!is_readable($filename)) {
continue;
}
$fileStr = file_get_contents($filename);
$fileStr = str_replace($this->_subst['from'], $this->_subst['to'], $fileStr);
$fileXml = simplexml_load_string($fileStr, $elementClass);
if (!$fileXml instanceof SimpleXMLElement) {
continue;
}
$layoutStr .= $fileXml->innerXml();
}
$layoutXml = simplexml_load_string('<layouts>'.$layoutStr.'</layouts>', $elementClass);
return $layoutXml;
}
}
Dua kelas di atas menambahkan fungsionalitas ke Magento sehingga Anda dapat memperluas - tetapi tidak menimpa file XML tata letak. Perpanjangan tata letak XML penting bagi kami, karena memungkinkan kami untuk tetap mempertahankan pemisahan file yang sama catalog.xml
, cms.xml
dll. - tetapi hanya perlu menambahkan porsi pendek tata letak XML untuk memanipulasi blok (masukkan / klon / hapus).
The local.xml
metodologi adalah bahwa Anda hanya memasukkan perubahan override Anda ke dalam satu file diatur rumit.
The nolocal
metodologi berarti bahwa daripada menempatkan semua perubahan dalam satu file, Anda menempatkan mereka dalam sebuah file dengan nama file yang sesuai bahwa itu memodifikasi (misalnya. catalog.xml
) - dengan hanya membuat file baru sonassi/default/layout/custom/catalog.xml
- dengan * hanya modifikasi .
Sekali lagi, setelah kita selesai membuat templat, kita bisa menghapus konten sonassi/default/layout
dengan pengecualian custom
direktori. Dengan cara ini lagi, seperti dengan templat, kami memiliki templat yang diperluas ringan - berdasarkan dari templat dasar.
Lembar gaya
Kami menghapusnya, semuanya. Kami tidak repot-repot menyalinnya ke direktori CSS paket kami. Kami akan menyalin di JS dan hanya itu - images
dan CSS
direktori akan kosong dari awal.
Karena kami menggunakan SASS saat ini, kami akan memiliki direktori lain ( scss
) untuk CSS yang sudah diproses - dan menghasilkan gaya utama / mencetak file CSS.
Membersihkan templat
Jadi seperti yang kami sebutkan, setelah tema templat selesai, Anda sekarang dapat membersihkannya - untuk menghapus file yang tidak dimodifikasi dan menguranginya ke minimum.
cd ./app/design/frontend
PREFIX="cleantheme_"
THEME="sonassi/default"
diff -BPqr "base/default/template" "$THEME/template" | \
awk '{print $4}' | \
while read FILE; do
DIR=$(dirname "$FILE")
[ -d "$PREFIX$DIR" ] || mkdir -p "$PREFIX$DIR"
[ -f "$PREFIX$FILE" ] || cp -pa "$FILE" "$PREFIX$FILE"
done
cp -par "$THEME/layout" "$PREFIX$THEME/"
Jadi mengapa tidak local.xml
?
Ini bukan untuk Anda - untuk pihak ke-3, dengan cara yang community
sama untuk Anda dan local
untuk pihak ke-3. Ini adalah kegagalan, pilihan terakhir, tujuan akhir untuk penggantian.
Penataan XML dengan cara ini membuatnya tetap sejalan dengan cara Magento awalnya mengkonfigurasi direktori dan struktur file. Plus, untuk kelangsungan pengembangan - itu hanya lebih masuk akal, jauh lebih mudah dicerna dan tidak menambah overhead yang terlihat.
Magento adalah produk aneh, masyarakat telah menemukan praktik terbaiknya sendiri berdasarkan akal sehat dan meniru apa yang dilakukan tim inti Magento. Jadi tidak pernah ada cara resmi (tidak sampai unicorn naik dengan dokumentasi Magento-1) ; tapi ini jalan kita .
Jadi aku bahkan peregangan untuk mengatakan ini bukan yang jawabannya, hanya salah satu dari banyak cara untuk mengatasi tantangan yang biasa dihadapi. Meskipun saya ingin berpikir metode kami adalah yang terbaik.
Konten dengan senang hati bersumber dari sonassi.com