ดังนั้นสิ่งนี้จะทำให้เกิดความโกลาหลขั้นสูงสุดและต่อต้านธัญพืชของนักพัฒนา Magento ทุกคน - แต่เรามีกระบวนการที่แข็งแกร่งสำหรับชุดรูปแบบ - ที่ไม่ใช้ local.xml (เพิ่มเติมในภายหลัง)
เรามักจะทำงานกับเทมเพลตbase/default
(และenterprise/default
สำหรับ EE) เสมอ - แต่จะไม่ใช้ CSS แม้ว่าการออกแบบทั้งหมดไม่ได้ให้ยืมตัวเองกับโครงสร้างของร้านวานิลลามาเจนโต แต่เราพบว่ามันเป็นแนวปฏิบัติที่ดีที่จะใช้default
ธีมเป็นจุดเริ่มต้น เราสามารถลบเมธอด / loops / html ที่ไม่ได้ใช้ออกเท่าที่จำเป็นในระหว่าง templating
เมื่อเริ่มธีม
สำหรับ 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 ทำ ดังนั้นไม่เคยมีวิธีที่เป็นทางการ(ไม่ใช่จนกว่าจะมียูนิคอร์นขี่ด้วยเอกสารวีโอไอพี -1) ; แต่นี่คือวิธีของเรา
ดังนั้นฉันยังต้องการยืดไปพูดแบบนี้ไม่ได้เป็นคำตอบเพียงหนึ่งในหลายวิธีที่จะรับมือกับความท้าทายที่ต้องเผชิญทั่วไป แม้ว่าฉันจะคิดว่าวิธีการของเราดีที่สุด
เนื้อหามาจากsonassi.comอย่างมีความสุข