ชุดรูปแบบ - เริ่มจากศูนย์


30

อะไรคือสิ่งที่แนะนำวิธีการเริ่มต้นเว็บไซต์สร้างเต็มรูปแบบจากรอยขีดข่วน ? โดยทั่วไปงานสร้างของฉันเริ่มต้นจากหน้าโครงร่าง HTML5 ที่เยาะเย้ยอย่างเต็มที่และเราเชื่อมต่อการทำงานจากที่นั่น

แต่ส่วนหนึ่งของฉันรู้สึกว่าเวลาส่วนใหญ่ในช่วงท้ายของโครงการเรายุติการค้นหาทุกส่วนของฟังก์ชั่นการทำงานที่จำเป็นต้องเสียบปลั๊ก - โดยทั่วไปสิ่งต่าง ๆ เช่น Enterprise RMA, ส่วนลูกค้าบัญชีของฉัน ฯลฯ ฉันคิดว่า สิ่งนี้สามารถหลีกเลี่ยงได้โดยเริ่มต้นด้วยชุดรูปแบบ Magento ตั้งแต่วันที่ 1 มุมมองของฝ่ายตรงข้ามบอกว่าจะมีเวลาเท่ากันในการเขียน CSS และโครงสร้างการปรับเปลี่ยนจากค่าเริ่มต้น

คุณสร้างในธีม Core "blank"หรือไม่? มีธีม Enterprise รุ่นว่างเปล่านี้ไหม แนวปฏิบัติที่ดีที่สุดที่นี่คืออะไร

คำตอบ:


32

ดังนั้นสิ่งนี้จะทำให้เกิดความโกลาหลขั้นสูงสุดและต่อต้านธัญพืชของนักพัฒนา 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อย่างมีความสุข


1
พวกคุณไม่มีอะไรเลยถ้าไม่สร้างสรรค์อย่างไม่น่าเชื่อ
philwinkle

3
คำแนะนำการเขียนและการใช้งานที่ดีมาก ๆ
ColinM

ฉันชอบแนวทางของคุณในการขยายเลย์เอาต์ xml แทนที่จะคัดลอกไฟล์ที่มีอยู่หรือใช้ local.xml นั่นยอดเยี่ยมมาก! แทนที่จะคัดลอกไฟล์เทมเพลตทั้งหมดในขั้นต้นฉันชอบคำสั่ง "คัดลอกเทมเพลต" ของ Magicento ซึ่งสามารถใช้เพื่อคัดลอกเทมเพลตไปยังธีมอื่นได้อย่างง่ายดายโดยวางไว้ในโครงสร้างโฟลเดอร์ด้านขวา อีกวิธีหนึ่งเมื่อทำความสะอาดชุดรูปแบบ 3 ตอนท้ายคุณอาจต้องการตรวจสอบคำสั่ง "dev: theme: ซ้ำ" ของ n98-magerun.phar ซึ่งจะสร้างรายการไฟล์ที่ยังไม่ได้เปลี่ยน
จิม OHalloran

ฉันสงสัยว่ามีปลั๊กอินที่สำรองไว้default/defaultสำหรับการติดตั้ง CE หรือไม่ อาจไม่ใช่เรื่องยากที่จะแฮ็กข้อมูลที่ให้มาเพียงแค่อยากรู้อยากเห็น (การเคี้ยวสิ่งนี้: Magento Theme Fall-back / Hierarchy ในแง่ของธีมที่กำหนดเองและส่วนขยายของบุคคลที่สาม )
hakre

"...the same way that community is for you and local is for 3rd parties..."วิธี Magento สำหรับวิธีนี้จะเป็นวิธีอื่น ๆ ตามที่ระบุไว้ที่นี่: magentocommerce.com/wiki/2_-_magento_concepts_and_architecture/…
RichardBernards

7

สร้างชุดรูปแบบ bootstrap ว่างเปล่าสำหรับองค์กร นั่นหมายถึงการใช้enterprise/defaultธีมทำความสะอาด CSS ของมันและ "คลิกทุกสิ่ง" เพื่อยืนยันว่าคุณได้จัดการสไตล์ให้กับฟีเจอร์ อย่าลืมเกี่ยวกับผลิตภัณฑ์วูดูมุมมองตาราง

ข้อดีอย่างหนึ่งก็คือการมีโอกาสติดตั้งเวิร์กโฟลว์น้อย (หรืออื่น ๆ ) คิดเกี่ยวกับมัน - ในขณะที่ชุดรูปแบบเปล่าเป็นการเริ่มต้นที่ดีสำหรับชุดรูปแบบสีอ่อนมันเป็นงานที่ค่อนข้างน้อยที่จะเปลี่ยนเป็นชุดรูปแบบที่มืด / ดำ เหนือสิ่งอื่นใดคุณต้องรวมenterprise/defaultธีมมิฉะนั้นคุณจะต้องติดตั้ง EE ที่เสียตั้งแต่เริ่มต้น


คุณพูดถูกจริงๆ
philwinkle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.