Тематика - начиная с нуля


30

Каков предпочтительный способ начать полную сборку сайта с нуля ? Мои сборки обычно начинаются с полностью смоделированных каркасных страниц HTML5, и мы подключаем их оттуда.

Но часть меня чувствует, что большую часть времени на поздних стадиях проекта мы сталкиваемся с поиском всех областей функциональности, которые необходимо подключить - обычно такие вещи, как Enterprise RMA, раздел «Моя учетная запись клиента» и т. Д. Я думаю, этого можно избежать, начав с темы Magento с первого дня; противоположное мнение говорит, что будет столько же времени на написание CSS и изменение структуры по умолчанию.

Вы строите на ядре "пустую" тему ? Есть ли версия этой пустой темы для предприятия? Какова лучшая практика здесь?

Ответы:


32

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

Мы всегда отрабатываем base/defaultenterprise/defaultдля EE) шаблон - но обнуляем CSS. Даже при том, что все проекты не особенно подходят для структурного макета ванильного магазина Magento - мы считаем хорошей практикой использовать эту 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)


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

<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, и все - каталог imagesand CSSбудет пуст с самого начала.

Поскольку в настоящее время мы используем SASS, у нас будет еще один каталог ( scss) для предварительно обработанного CSS - и вывод в основной файл (ы) style / print 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 «Копировать шаблон», которую можно использовать для простого копирования шаблона в другую тему, поместив его в нужную структуру папок. В качестве альтернативы, при очистке темы 3 в конце, вы можете проверить команду n98-magerun.phar «dev: theme: duplicates», которая выдаст список файлов, которые не были изменены.
Джим Охаллоран

Интересно, есть ли плагин, который используется 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

Создайте пустую тему начальной загрузки для предприятия. Это означает, enterprise/defaultчто нужно взять тему, очистить ее CSS и «щелкнуть по всем вещам», чтобы убедиться, что вы обработали стилистику функций. Не забывайте про вид сетки товара вуду.

Одним из преимуществ является то, что это дает возможность настроить МЕНЬШИЙ (или другой) рабочий процесс. Подумайте об этом - хотя пустая тема - хорошее начало для тем светлых тонов, нужно немного поработать, чтобы адаптировать ее к темной / черной теме. Прежде всего, вы ДОЛЖНЫ включить enterprise/defaultтему, иначе у вас с самого начала будет установлена ​​неработающая EE.


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