主题-从头开始


30

什么是首选开头的方法完整的网站建设,从从头开始?我的构建通常从完全模拟的HTML5线框页面开始,然后从那里插入功能。

但是,我的一部分感觉是,在项目的后期大部分时间里,我们最终都会找到需要插入的所有功能区域-通常是诸如Enterprise RMA,Customer My Account部分之类的东西。我认为从第一天开始就使用Magento主题可以避免这种情况;相反的观点认为,编写CSS和修改默认结构的时间相等

您是否建立在核心“空白”主题的基础上?是否有此空白主题的企业版?最佳做法是什么?

Answers:


32

因此,这将导致最终的轩然大波,并且与每个Magento开发人员背道而驰 -但是我们有一个可靠的主题化过程- 不使用local.xml(稍后会详细介绍)。

我们始终会处理base/default(并enterprise/default针对EE)模板-但将CSS归零。尽管并非所有设计都特别适合于香草Magento商店的结构布局-我们发现以default主题为起点是一种很好的做法。我们可以在模板制作过程中根据需要删除未使用的method / loops / html等。

启动主题时

对于EE

我们首先安装此扩展,以便获得一定程度的主题回退-当我们稍后删除复制的主题文件时。

包装

我们首先从创建包开始,然后复制整个base/default主题。因此,例如(假设这是我们自己的网站,我们将其称为包sonassi

cd ./app/design/frontend
mkdir sonassi
cp -par base/default sonassi/default
mkdir sonassi/default/layout/custom

模板

最终目标是我们不必保留复制和粘贴需要修改的每个文件,只需在主题中编辑文件即可。

但是,每次编辑文件时,我们都会删除Magento Commerce标头-并添加适当的标头/标识符以将文件标记为自定义模板,通常类似于...

/*
* @category    Template
* @package     sonassi_default
* @copyright   Copyright (c) 2013 Sonassi
*/

稍后我们进行最终模板清理时,此标头将用作一个目的。正如我们将做一个递归diffbase/default/template目录和sonassi/default/template目录-然后删除任何没有被改变。

这样,仅保留已修改的文件,并且整个程序包已减少到最少的已更改文件。

布局文件

我们使用自己的标准核心模块sonassi.core是的,我们始终为模块名称空间添加唯一的标识符-在其他公司选择相同名称(例如fishpig / wordpress和sonassi / wordpress)时,它会阻止冲突


非本地布局方法

<core>
  <rewrite>
    <layout>Sonassi_Core_Model_Core_Layout</layout>
    <layout_update>Sonassi_Core_Model_Core_Layout_Update</layout_update>
  </rewrite>
</core> 

然后,添加功能的两个魔术类不再需要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;
    }
}

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;
    }

}

上面的两个类将功能添加到Magento中,以便您可以扩展-但不会覆盖布局XML文件。布局XML的可扩展性对我们很重要,因为它允许我们仍维持相同的文件分割catalog.xmlcms.xml等等-但只需要添加布局XML的短边部操纵块(插入/克隆/删除)。

local.xml方法是,你只要输入您的覆盖转变为一个笨重难以管理的文件。

nolocal方法论意味着,您不必将所有更改都放在一个文件中,而是将它们放在要修改的文件名适当的文件中(例如catalog.xml,通过简单地创建一个新文件)sonassi/default/layout/custom/catalog.xml,而仅使用修改的文件

同样,一旦完成模板的制作,我们就可以删除目录sonassi/default/layout以外的内容custom。同样,通过这种方式,就像模板一样,我们有一个轻量级的扩展模板-基于基本模板。

样式表

我们将它们全部删除。我们不必费心将它们复制到包的CSS目录中。我们将在JS复制,这是它- imagesCSS目录会从一开始就空了。

如今,随着我们使用SASS,我们将为scss预处理的CSS 提供另一个目录(),并输出到主要样式/打印CSS文件。

清理模板

因此,正如我们提到的,模板主题完成后,您现在可以清理它-删除未修改的文件并将其减少到最低限度。

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/"

那为什么不local.xml呢?

它不适合您 -适用于第三方,community适用于您和local适用于第三方的方式。它是故障转移的最后手段,是覆盖的最终目的地。

以这种方式构造XML使其与Magento最初配置目录和文件结构的方式保持一致。另外,为了开发的连续性,这更有意义,更容易消化,并且不会增加明显的开销。

Magento是一个奇怪的产品,社区已经根据常识并模仿了Magento核心团队的工作发明了自己的最佳实践。因此,从来没有一种正式的方式(直到独角兽加入了Magento-1文档);但这是我们的方式。

所以,我甚至会夸张地说,这不是答案,它只是许多方法来解决一个共同面临的挑战之一。尽管我想我们的方法是最好的。

内容愉快地来自sonassi.com


1
你们即使不是非常有创造力,也算什么。
philwinkle

3
非常好的文章和全面的建议。
ColinM

我喜欢您扩展布局xml的方法,而不仅仅是在现有文件中复制或使用local.xml的方法,这太棒了!我不喜欢最初使用所有模板文件进行复制,而是喜欢Magicento的“复制模板”命令,该命令可用于将模板轻松复制到另一个主题,并将其放置在正确的文件夹结构中。另外,在最后清理the3主题时,您可能需要检出n98-magerun.phar的“ dev:theme:duplicates”命令,该命令将生成未更改文件的列表。
Jim OHalloran

我想知道是否有一个可以回退到default/defaultCE安装的插件。也许很难用给定的来源来破解,只是好奇(对此进行了考虑(根据自定义主题和第三方扩展,Magento主题后备/层次结构))
hakre 2014年

"...the same way that community is for you and local is for 3rd parties..."Magento的方式与此相反,如此处所述:magentocommerce.com/wiki/2
RichardBernards 2014年

7

为企业构建一个空白的引导主题。这意味着获取enterprise/default主题,清理其CSS,并“单击所有内容”以确认您已经处理了样式的样式。不要忘了产品网格视图伏都教。

好处之一是,这使您有机会设置LESS(或其他)工作流程。考虑一下-空白主题是浅色主题的一个不错的开始,但将其切换为适应深色/黑色主题还需要一些工作。最重要的是,您必须合并enterprise/default主题,否则从一开始您的EE安装就会失败。


您绝对正确
philwinkle
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.