Tema - sıfırdan başlayarak


30

Nedir tercih bir başlangıç yöntemi Tam site yapı dan, sıfırdan ? Yapımlarım tipik olarak tamamen takılan HTML5 tel kafes sayfalarından başlar ve işlevselliği oradan bağlarız.

Ancak, bir parçam bir projenin son aşamalarında çoğu zaman takılı olması gereken tüm işlevsellik alanlarını bulduğumuzu düşünüyor - tipik olarak Kurumsal RMA, Müşteri Hesabım bölümü vb. bu, 1. günden itibaren bir Magento temasıyla başlayarak önlenebilir; Muhalif görüş, CSS yazma ve yapıyı varsayılandan değiştirme konusunda eşit zamanın olacağını söylemektedir .

Eğer üzerine inşa Do Çekirdek "boş" teması ? Bu boş temanın bir Enterprise sürümü var mı? Buradaki en iyi uygulama nedir?

Yanıtlar:


32

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/defaultEE 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 - defaulttemayı 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/defaulttemaya 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 diffve base/default/templatedizinde ö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.xmlvb - ama sadece bloklar (insert / klonu / kaldır) işlemek için düzen XML kısa bölümlerini eklemeniz gerekir.

local.xmlMetodoloji 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/layoutharicinde 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 - imagesve CSSdizin baştan boş olacak.

Bugünlerde SASS'yi kullandığımız scssiç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 communitysize göre ve local3. 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ı


1
Sizler inanılmaz yaratıcı değilseniz, hiçbir şey değilsiniz.
philwinkle

3
Çok güzel yazma ve her yerinde sağlam tavsiyeler.
ColinM

Varolan dosyaları kopyalamak veya local.xml kullanmak yerine, xml mizanpajını genişletme yaklaşımınızı beğendim, bu harika! Başlangıçta tüm şablon dosyalarını kopyalamak yerine, Magicento'nun bir şablonu başka bir temaya kolayca kopyalayıp doğru klasör yapısına yerleştirmek için kullanılabilecek "Şablonu Kopyala" komutunu seviyorum. Alternatif olarak, sonunda 3 temasını temizlerken, n98-magerun.phar'ın "dev: theme: duplicates" komutunu, değişmemiş bir dosya listesi oluşturacak şekilde kontrol etmek isteyebilirsiniz.
Jim OHalloran

default/defaultCE kurulumları için geri dönüşe bir eklenti olup olmadığını merak ediyorum . Belki verilen kaynaklarla uğraşmak o kadar da zor değil, sadece merak ettim (bunu çiğnemek: Magento Teması Özel tema ve üçüncü taraf uzantıları
ışığında Geri Dönme

"...the same way that community is for you and local is for 3rd parties..."Magento yolu bunun burada belirtildiği gibi başka bir yol olması içindir: magentocommerce.com/wiki/2_-_magento_concepts_and_architecture/…
RichardBernards

7

Enterprise için boş bir bootstrap teması oluşturun. Bu, enterprise/defaulttemayı almak, CSS'sini temizlemek ve özellikleri şekillendirmeyi doğruladığınızı doğrulamak için "her şeyi tıklatmak" anlamına gelir . Ürün ızgarası görünümü voodoo'yu unutma.

Avantajlarından biri, bunun bir LESS (veya diğer) iş akışı kurma fırsatı vermesidir. Bir düşünün - boş tema açık renkli temalar için güzel bir başlangıç ​​olsa da, onu koyu / siyah temaya uyarlamak için biraz çalışma. Her şeyden önce, GEREKİR dahil enterprise/default, aksi takdirde bir kırık EE baştan yüklemek zorunda, tema.


Kesinlikle haklısın
Philwinkle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.