Темінг - починаючи з нуля


30

Який найкращий спосіб почати повноцінне створення сайту з нуля ? Мої збірки, як правило, починаються зі сторінок каркаса HTML5 із каркасною версією HTML5, і ми тут підключаємо функціональність.

Але частина мене вважає, що більшість часу на пізніх етапах проекту ми закінчуємо пошук усіх областей функціональності, які потрібно підключити - зазвичай такі речі, як Enterprise RMA, розділ "Мій обліковий запис клієнта" тощо. цього можна уникнути, починаючи з теми Magento з першого дня; протилежна думка говорить про те, що час написання CSS та модифікація структури за замовчуванням буде рівною .

Ви будуєте на основній "порожній" темі ? Чи є у Enterprise версії цієї порожньої теми? Яка тут найкраща практика?

Відповіді:


32

Таким чином, це викличе остаточний шум і піде проти зерна кожного розробника Magento - але у нас є надійний процес їх розробки, який не використовує local.xml (докладніше про це пізніше).

Ми завжди працюємо за шаблоном base/defaultenterprise/defaultдля EE), але не враховуємо CSS. Незважаючи на те, що всі дизайни не особливо піддаються структурному плануванню магазину ванільного Magento - ми вважаємо гарною практикою використання defaultтеми як вихідної точки; ми можемо видалити невикористані методи / циклі / html тощо за необхідності під час шаблонування.

При запуску теми

Для ЕЕ

Спочатку ми встановлюємо це розширення , щоб ми отримали рівень відпадання теми - коли згодом видаляємо файли тем, які ми скопіювали.

Пакунок

Спочатку починаємо зі створення пакету та копіювання у всій 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)


Методика нолокального компонування

<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. Так що офіційного шляху не існує (доки єдиноріг не їде з документацією на Magento-1) ; але це наш шлях.

Так що я б навіть розтягнути сказати , що це не відповідь, його тільки один з багатьох способів вирішення з якими нерідко стикаються виклику. Хоча я хотів би вважати, що наш метод найкращий.

Вміст із задоволенням походить від sonassi.com


1
Ви, хлопці, нічого, якщо не неймовірно креативні.
philwinkle

3
Дуже приємна написання та ґрунтовна порада.
ColinM

Мені подобається ваш підхід до розширення макета xml, а не просто копіювання між наявними файлами або використання local.xml, це приголомшливо! Замість того, щоб спочатку копіювати всі файли шаблонів, я люблю команду Magicento «Копіювати шаблон», яку можна легко скопіювати на іншу тему, розмістивши його у правій структурі папок. Крім того, очищаючи тему the3 наприкінці, ви можете перевірити команду "dev: topic: дублікати" n98-magerun.phar, яка створить список файлів, які не були змінені.
Джим Охаллоран

Цікаво, чи є плагін, який підходить default/defaultдля встановлення CE. Можливо, не так складно зламати дані джерела, просто цікаво (жувати це: Magento Theme Back-back / Ієрархія у світлі користувацької теми та сторонніх розширень )
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

Побудувати порожню тему завантаження для Enterprise. Це означає взятиenterprise/default тему, очистити її CSS та "натиснути все", щоб переконатися, що ви обробляли стилістику функцій. Не забувайте про вуду продуктової сітки.

Однією з переваг є те, що це надає можливість налаштувати менший (або інший) робочий процес. Подумайте над цим - хоча пуста тема - це гарний початок для темних темних тем, для її адаптації до темно-чорної теми потрібно трохи попрацювати. Перш за все, ви повинні Включити enterprise/defaultтему, інакше у вас є зламана установка EE з самого початку.


Ви абсолютно праві
philwinkle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.