Böylece bu, büyük bir kargaşaya neden olacak ve her Magento geliştiricisinin tanesine karşı çıkacaktır - ancak temalar için sağlam bir işlemimiz var - bu , local.xml kullanmaz (daha fazlası için).
Her zaman base/default
(ve enterprise/default
EE için) şablonunu kullanırız - ancak CSS'yi sıfır. Tüm tasarımlar özellikle kendilerini bir vanilya Magento mağazasının yapısal düzenine ödünç vermese de - default
temayı başlangıç noktası olarak kullanmak iyi bir uygulama bulur ; Kullanılmayan yöntemleri / döngüler / html vs.'yi şablonlama sırasında gerektiği gibi kaldırabiliriz.
Bir temayı başlatırken
EE için
Öncelikle bu uzantıyı yükleriz, böylece daha sonra kopyaladığımız tema dosyalarını kaldırdığımızda bir tema geri dönüş düzeyi elde ederiz.
Paket
İlk önce paketi oluşturarak ve tüm base/default
temaya kopyalayarak başlarız ; örneğin (kendi web sitemiz olduğunu söyleyin, paketi çağırırız sonassi
)
cd ./app/design/frontend
mkdir sonassi
cp -par base/default sonassi/default
mkdir sonassi/default/layout/custom
Şablon
Nihai hedefimiz, gerektiğinde değiştirdiğimiz her dosyayı kopyalayıp yapıştırmak zorunda kalmamamız, sadece temayı değiştirmemiz.
Ancak dosyayı her düzenlediğimizde, Magento Commerce başlıklarını çıkarırız - ve dosyayı özel bir şablon olarak işaretlemek için uygun bir başlık / tanımlayıcı ekleriz, genellikle ...
/*
* @category Template
* @package sonassi_default
* @copyright Copyright (c) 2013 Sonassi
*/
Bu başlık daha sonra son şablon temizliğini yaptığımızda bir amaca hizmet eder. Dizinde diff
ve base/default/template
dizinde özyinelemeli yapacağımız gibi sonassi/default/template
- sonra değiştirilmemiş bir şeyi silin.
Bu şekilde, yalnızca değiştirilen dosyalar kalır ve toplam paket minimum değiştirilen dosyalara indirgenir.
Düzen dosyaları
Kendimize ait standart bir çekirdek modül kullanıyoruz sonassi.core
. Evet, modül ad alanını her zaman benzersiz bir tanımlayıcıyla ön ekleriz - diğer şirketlerin aynı adı seçtikleri çatışmaları durdurur (ör. Fishpig / wordpress ve sonassi / wordpress)
Nolokal yerleşim metodolojisi
<core>
<rewrite>
<layout>Sonassi_Core_Model_Core_Layout</layout>
<layout_update>Sonassi_Core_Model_Core_Layout_Update</layout_update>
</rewrite>
</core>
Daha sonra bir daha asla ihtiyaç duymayacak şekilde işlevsellik katan iki sihirli sınıf local.xml
,
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;
}
}
ve
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;
}
}
Yukarıdaki iki sınıf, işlevselliği Magento'ya ekler, böylece genişletebilirsiniz - ancak düzen XML dosyasının üzerine yazmaz. Düzen XML Genişletilebilirlik bizi hala aynı dosya ayırma korumak olanak sağladığından, bizim için önemli olan catalog.xml
, cms.xml
vb - ama sadece bloklar (insert / klonu / kaldır) işlemek için düzen XML kısa bölümlerini eklemeniz gerekir.
local.xml
Metodoloji sadece tek hantal yönetilemez dosya halinde ağır basan değişiklikleri girmek olmasıdır.
nolocal
(. Örn o değiştirerek olduğunu ziyade tek bir dosyada tüm değişiklikleri koyarak yerine, uygun dosya adıyla bir dosyaya koyun metodoloji araçları catalog.xml
) - basitçe yeni bir dosya oluşturarak sonassi/default/layout/custom/catalog.xml
- * ile sadece modifikasyonlar .
Yine, şablonu hazırladığımızda, dizinin sonassi/default/layout
haricinde içeriğini kaldırabiliriz custom
. Bu şekilde, şablonda olduğu gibi, temel şablonlardan yola çıkarak hafif bir genişletilmiş şablonumuz var.
Stil sayfaları
Hepsini siliyoruz, hepsini. Bunları paketimizin CSS dizinine kopyalamaktan rahatsız olmayız. JS'ye kopyalayacağız ve hepsi bu kadar - images
ve CSS
dizin baştan boş olacak.
Bugünlerde SASS'yi kullandığımız scss
için, önceden işlenmiş CSS için başka bir dizine ( ) sahip olacağız - ve ana stillere / CSS dosyalarına yazdırın.
Şablonu temizleme
Bahsettiğimiz gibi, şablon teması tamamlandığında, artık temizleyebilirsiniz - değiştirilmemiş dosyaları kaldırmak ve en aza indirgemek için.
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/"
Peki neden hayır local.xml
?
Onun senin için değil - onun 3 parti, aynı yol için community
size göre ve local
3. kişilere yöneliktir. Onun bir başarısızlık, son çare, geçersiz kılmalar için son hedef.
XML'in bu şekilde yapılandırılması, Magento'nun dizin ve dosya yapısını başlangıçta yapılandırma şekliyle aynı hizada tutar. Ayrıca, gelişimin sürekliliği için - sadece daha mantıklı, sindirimi çok daha kolay ve göze çarpan ek yükü eklemiyor.
Magento garip bir üründür, topluluk sağduyulu ve Magento çekirdek ekibinin ne yaptığını taklit ederek kendi en iyi uygulamalarını icat etti. Yani hiçbir zaman resmi bir yol yok (tek boynuzlu at, Magento-1 belgelerine yetişene kadar) ; ama bu bizim yolumuz.
Bu yüzden , bunun cevap olmadığını , sıkça karşılaşılan bir mücadelenin üstesinden gelmenin birçok yolundan sadece biri olduğunu söyleyerek bile gerginim . Her ne kadar bizim yöntemimizin en iyisi olduğunu düşünmek isterim.
İçerik mutlu bir şekilde sonassi.com kaynaklı