题
是什么 首选 开始的方法 完整的站点构建, , 从 刮?我的构建通常从完全模拟的HTML5线框页面开始,我们从那里插入功能。
但是,我一部分人认为,在项目的晚期中,大多数情况下,我们最终都会找到所有需要插入的功能领域 - 通常是企业RMA,客户我的帐户部分等。从第一天开始以洋红色主题开始,可以避免这种情况;相反的观点说将会有 相等的时间 从默认值中编写CSS和修改结构。
你在建立 核心“空白”主题?这个空白主题有企业版本吗?这里最好的实践是什么?
解决方案
因此,这将引起最终的骚动,并与每个Magento开发人员的谷物背道而驰 - 但是我们有一个可靠的主题过程 - 不使用local.xml (稍后再详细介绍)。
我们总是努力 base/default
(和 enterprise/default
对于EE)模板 - 但零CSS。即使所有设计都没有特别适合香草洋葱商店的结构布局 - 我们发现使用该商店是很好的做法 default
主题作为起点;我们可以根据需要在模板期间删除未使用的方法/循环/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
*/
当我们进行最终模板清理时,此标头稍后将实现目的。正如我们将进行递归 diff
在 base/default/template
目录和 sonassi/default/template
目录 - 然后删除任何尚未更改的内容。
这样,只保留了修改的文件,并且总包装已减少到最小更改的文件。
布局文件
我们使用自己的标准核心模块 sonassi.core
. 是的,我们总是将模块名称空间前缀带有唯一标识符 - 它阻止了其他公司选择相同名称的冲突(例如Fishpig/WordPress和Sonassi/WordPress)
Nolocal布局方法
<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.xml
, cms.xml
等等 - 但是只需要添加简短的布局XML即可操纵块(插入/克隆/删除)。
这 local.xml
方法论是您只需输入一个繁琐的不可管理的文件中的压倒性更改即可。
这 nolocal
方法论意味着您不要将所有更改放在单个文件中,而是将它们放在文件中,以其修改的适当文件名(例如。 catalog.xml
) - 简单地创建一个新文件 sonassi/default/layout/custom/catalog.xml
- 和 *仅修改.
同样,完成模板完成后,我们可以删除 sonassi/default/layout
除了 custom
目录。这样,就像使用模板一样,我们有一个基于基本模板的轻量级扩展模板。
样式表
我们将它们删除。我们不会打扰将它们复制到包装的CSS目录中。我们将在JS中复制,也就是 images
和 CSS
目录将从开始时为空。
如今我们使用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 Core团队所做的事情。因此,从来没有官方方法 (直到一个独角兽乘坐Magento-1文档);但这是 我们的 方法。
所以我什至伸展说不是 这 答案,这只是应对通常面临的挑战的众多方法之一。 尽管我想认为我们的方法是最好的。
内容愉快地来自 sonassi.com
其他提示
为企业构建空白的引导主题。这意味着要 enterprise/default
主题,清理其CSS,并“单击所有内容”以验证您处理了功能的样式。不要忘记产品网格视图Voodoo。
好处之一是,这为设置较少(或其他)工作流程提供了机会。考虑一下 - 虽然空白主题是浅色主题的一个不错的开始,但切换它以适应黑暗/黑色主题是一项工作。最重要的是,你 必须 合并 enterprise/default
主题,否则,您从一开始就安装了损坏的EE。