থিমিং - স্ক্র্যাচ থেকে শুরু


30

স্ক্র্যাচ থেকে পুরো সাইট বিল্ড শুরু করার পছন্দের পদ্ধতিটি কী ? আমার বিল্ডগুলি সাধারণত সম্পূর্ণরূপে উপহাস করা এইচটিএমএল 5 ওয়্যারফ্রেম পৃষ্ঠা থেকে শুরু হয় এবং আমরা সেখান থেকে কার্যকারিতাটি প্লাগ ইন করি।

তবে, আমার বেশিরভাগ অংশ মনে করে যে কোনও প্রকল্পের শেষ পর্যায়ে বেশিরভাগ সময় আমরা কার্যকারিতার সমস্ত ক্ষেত্রগুলি সন্ধান করি যা প্লাগ করতে হবে - সাধারণত এন্টারপ্রাইজ আরএমএ, গ্রাহক আমার অ্যাকাউন্ট বিভাগ ইত্যাদি I প্রথম দিন থেকে ম্যাজেন্টো থিম দিয়ে শুরু করে এড়ানো যেতে পারে; বিপরীত দৃষ্টিভঙ্গি বলছে যে সিএসএস লেখার এবং ডিফল্ট থেকে কাঠামোগত পরিবর্তন করার জন্য সমান পরিমাণ সময় থাকবে

আপনি কি কোর "ফাঁকা" থিমটি তৈরি করেন ? এই ফাঁকা থিমটির কোনও এন্টারপ্রাইজ সংস্করণ আছে? এখানে সেরা অনুশীলন কি?

উত্তর:


32

সুতরাং এটি চূড়ান্ত কোলাহল সৃষ্টি করবে এবং প্রতিটি ম্যাজেন্টো বিকাশকারীদের শস্যের বিরুদ্ধে যাবে - তবে আমরা তাদের উত্তোলনের জন্য একটি কঠিন প্রক্রিয়া পেয়েছি - যা লোকাল.এক্সএমএল ব্যবহার করে না ( এরপরে আরও) more

আমরা সর্বদা base/default(এবং enterprise/defaultইই এর জন্য) টেমপ্লেটটি সরিয়ে রাখি - তবে সিএসএসের শূন্য। যদিও সমস্ত নকশাগুলি বিশেষত ভ্যানিলা ম্যাজেন্টো স্টোরের কাঠামোগত বিন্যাসে নিজেকে ঘৃণা করে না - defaultথিমটিকে একটি প্রাথমিক পয়েন্ট হিসাবে ব্যবহার করা আমাদের ভাল অনুশীলন বলে মনে হয় ; আমরা টেম্পলেট করার সময় অপরিহার্য পদ্ধতি / লুপ / ​​এইচটিএমএল ইত্যাদি অপসারণ করতে পারি।

কোনও থিম শুরু করার সময়

EE এর জন্য

আমরা প্রথমে এই এক্সটেনশনটি ইনস্টল করি , যাতে আমরা থিম ফ্যালব্যাকের একটি স্তর পেতে পারি - আমরা পরে যখন অনুলিপি করা থিম ফাইলগুলি সরিয়ে ফেলি।

প্যাকেজ

আমরা প্রথমে প্যাকেজ তৈরি করে পুরো base/defaultথিমটিতে অনুলিপি করে শুরু করি ; সুতরাং উদাহরণস্বরূপ (বলুন এটি আমাদের নিজস্ব ওয়েবসাইট ছিল, আমরা প্যাকেজটি কল করব sonassi)

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

টেম্পলেট

চূড়ান্ত লক্ষ্যটি হ'ল আমাদের যখনই দরকার আমাদের প্রতিটি ফাইলের অনুলিপি এবং আটকানো চলবে না, আমরা কেবল থিমটিতে ফাইলটি সম্পাদনা করি।

তবে প্রতিবার ফাইলটি সম্পাদনা করার সময় আমরা ম্যাজেন্টো কমার্স শিরোলেখগুলি সরিয়ে ফেলি - এবং ফাইলটিকে কাস্টম টেম্পলেট হিসাবে চিহ্নিত করতে একটি উপযুক্ত শিরোনাম / সনাক্তকারী যুক্ত করি, সাধারণত এমন কিছু ...

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

আমরা যখন চূড়ান্ত টেম্পলেটটি ক্লিন-আপ করি তখন এই শিরোনামটি একটি উদ্দেশ্য পরিবেশন করে। আমরা একটি recursive কি করতে হবে হিসাবে diffউপর base/default/templateডিরেক্টরি ও sonassi/default/templateকরে delete কিছু পরিবর্তন করা হয় নি - ডিরেক্টরি।

এইভাবে, কেবলমাত্র পরিবর্তিত ফাইলগুলি রয়ে গেছে এবং সামগ্রিক প্যাকেজটি ন্যূনতম পরিবর্তিত ফাইলগুলিতে হ্রাস পেয়েছে।

লেআউট ফাইল

আমরা আমাদের নিজস্ব একটি স্ট্যান্ডার্ড কোর মডিউল ব্যবহার করি sonassi.coreহ্যাঁ, আমরা সর্বদা একটি অনন্য শনাক্তকারীর সাথে মডিউল নামের স্থানের উপসর্গ রেখেছি - এটি বিরোধগুলি থামায় যেখানে অন্যান্য সংস্থাগুলি একই নামটি বেছে নিয়েছে (যেমন, ফিশপিগ / ওয়ার্ডপ্রেস এবং সোনাসি / ওয়ার্ডপ্রেস)


নোলোকাল বিন্যাস পদ্ধতি

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

}

উপরের দুটি শ্রেণি ম্যাজেন্টোতে কার্যকারিতা যুক্ত করে যাতে আপনি প্রসারিত করতে পারেন - তবে কোনও বিন্যাসের এক্সএমএল ফাইল ওভাররাইট করতে পারেন না। এক্সএমএল লেআউটটির সম্প্রসারণযোগ্যতা আমাদের পক্ষে গুরুত্বপূর্ণ, কারণ এটি আমাদের এখনও একই ফাইলের বিচ্ছিন্নতা বজায় রাখতে দেয় catalog.xml,cms.xml ইত্যাদি - কিন্তু শুধুমাত্র লেআউট এক্সএমএল সংক্ষিপ্ত অংশ যোগ করার জন্য অবরোধের (ঢোকান / ক্লোন / Remove) নিপূণভাবে করতে হবে।

local.xmlপদ্ধতি আপনি মাত্র এক কষ্টকর দুর্দমনীয় ফাইলে আপনার অগ্রাহ্য পরিবর্তন প্রবেশ করুন।

nolocalপদ্ধতি মানে যে বরং একটি একক ফাইলের মধ্যে সকল পরিবর্তন নির্বাণ পরিবর্তে, আপনি তাদের একটি ফাইলে উপযুক্ত ফাইলের নাম করা এটি পরিবর্তন করা হয় (যেমন। catalog.xml) - কেবল একটি নতুন ফাইল তৈরি করে sonassi/default/layout/custom/catalog.xml- * সঙ্গে শুধুমাত্র পরিবর্তন

আবার, একবার আমরা টেমপ্লেটটি তৈরি করার পরে, কেবলমাত্র sonassi/default/layoutব্যতিক্রমগুলি সহ আমরা সামগ্রীগুলি সরাতে পারিcustom ডিরেক্টরি । এইভাবে আবার, টেমপ্লেটের মতো, আমাদেরও লাইটওয়েট প্রসারিত টেম্পলেট রয়েছে - বেস টেমপ্লেটগুলি বন্ধ করে দেওয়া।

স্টাইল শীট

আমরা সেগুলি মুছে ফেললাম। আমরা আমাদের প্যাকেজের সিএসএস ডিরেক্টরিতে সেগুলি অনুলিপি করা বিরক্ত করি না। আমরা জেএসে অনুলিপি করব এবং এটি হ'ল - imagesএবং CSSডিরেক্টরিটি প্রথম থেকেই খালি থাকবে।

যেহেতু আমরা আজকাল SASS ব্যবহার করছি, আমাদের scssপ্রাক-প্রক্রিয়াজাত 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পক্ষে এবং তৃতীয় পক্ষের পক্ষেও। ওভাররাইডের জন্য এটি একটি ব্যর্থব্যাক, শেষ অবলম্বন, চূড়ান্ত গন্তব্য।

এক্সএএমএমএলকে এই ফ্যাশনে কাঠামো তৈরি করা এটিকে ম্যাজেন্টো মূলত ডিরেক্টরি এবং ফাইলের কাঠামোটি কনফিগার করার সাথে সামঞ্জস্য রাখে। প্লাস, বিকাশের ধারাবাহিকতার জন্য - এটি কেবল আরও বুদ্ধিমান করে তোলে, হজম করা অনেক সহজ এবং লক্ষণীয় ওভারহেড যুক্ত করে না।

ম্যাজেন্টো একটি অদ্ভুত পণ্য, সম্প্রদায় সাধারণ জ্ঞানের ভিত্তিতে এবং ম্যাজেন্টো কোর দল কী করে তা নকল করে তার নিজস্ব সেরা অনুশীলন আবিষ্কার করেছে। সুতরাং কোনও সরকারী উপায় নেই (ম্যাগেন্টো -১ ডকুমেন্টেশনের সাথে কোনও ইউনিকর্ন না চলা পর্যন্ত নয়) ; তবে এটি আমাদের পথ।

তাই আমি এমনকি এটি প্রসারিত করে বলতে চাই যে এটি উত্তর নয়, সাধারণভাবে সম্মুখীন চ্যালেঞ্জ মোকাবেলায় এটির একাধিক উপায়। যদিও আমি ভাবতে চাই যে আমাদের পদ্ধতিটি সেরা।

সোনাসি ডট কম থেকে আনন্দের সাথে সামগ্রীগুলি


1
আপনি ছেলেরা অবিশ্বাস্যভাবে সৃজনশীল না হলে কিছুই না।
ফিলিউঙ্কল

3
চারপাশে খুব সুন্দর লেখা এবং শক্ত পরামর্শ।
কলিনম

আমি বিদ্যমান ফাইলগুলি অনুলিপি করা বা স্থানীয়.xml ব্যবহার না করে বিন্যাসের এক্সএমএল প্রসারিত করার জন্য আপনার পদ্ধতির পছন্দ করি, এটি দুর্দান্ত! প্রাথমিকভাবে সমস্ত টেম্পলেট ফাইলগুলি অনুলিপি করার পরিবর্তে, আমি ম্যাজিকেন্টোর "অনুলিপি টেমপ্লেট" কমান্ডটি পছন্দ করি যা অন্য কোনও থিমে সহজেই টেমপ্লেট অনুলিপি করতে, ডান ফোল্ডারের কাঠামোতে রেখে ব্যবহার করা যেতে পারে। বিকল্পভাবে, শেষে থিমটি পরিষ্কার করার সময়, আপনি n98-magerun.phar এর "dev: থিম: নকল" কমান্ডটি পরীক্ষা করে দেখতে চাইতে পারেন, যা ফাইলগুলির একটি তালিকা তৈরি করবে যা পরিবর্তিত হয়নি।
জিম OHalloran

আমি অবাক হয়েছি যদি এমন কোনও প্লাগইন রয়েছে যা default/defaultসিই ইনস্টলের জন্য ফলব্যাক করে । প্রদত্ত উত্সগুলি দিয়ে হ্যাক করা সম্ভবত সেই কঠিন নয়, কেবল কৌতূহলী (এটিকে চিবানো: কাস্টম থিম এবং তৃতীয় পক্ষের এক্সটেনশনের আলোকে ম্যাজেন্টো থিম ফল-ব্যাক /
হাইয়ারকি

"...the same way that community is for you and local is for 3rd parties..."ম্যাজেন্টো উপায়টি
রিচার্ডবার্নার্ডস

7

এন্টারপ্রাইজের জন্য ফাঁকা বুটস্ট্র্যাপ থিম তৈরি করুন। এর অর্থ enterprise/defaultথিম নেওয়া, এর সিএসএস পরিষ্কার করা এবং আপনি বৈশিষ্ট্যগুলি স্টাইলিং করেছেন কিনা তা যাচাই করতে "সমস্ত কিছুতে ক্লিক করা" পণ্য গ্রিড ভিউ ভুডো সম্পর্কে ভুলবেন না।

সুবিধাগুলির মধ্যে একটি হ'ল এটি একটি কম (বা অন্য) কর্মপ্রবাহ সেটআপ করার সুযোগ দেয়। এটি সম্পর্কে ভাবুন - ফাঁকা থিম হালকা রঙের থিমগুলির জন্য দুর্দান্ত শুরু হলেও এটি অন্ধকার / কালো থিমের সাথে খাপ খাইয়ে নেওয়ার জন্য এটি কিছুটা কাজ। সর্বোপরি, আপনি থিমটি অন্তর্ভুক্ত করতে হবেenterprise/default , অন্যথায় আপনার শুরু থেকেই একটি ভাঙা ইই ইনস্টল রয়েছে।


আপনি একেবারে ঠিক আছেন
ফিলিউঙ্কল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.