Как написать собственное расширение?

143

Поскольку в последнее время у меня было много проблем со свободным и коммерческим расширением, я решил задать этот вопрос и ответить на него с помощью шагов, которые я обычно выполняю при написании расширения. Не стесняйтесь редактировать ответ или добавить новый.
В большинстве случаев при установке расширения или темы мне приходится тратить несколько часов (иногда больше, иногда меньше), чтобы оно работало во всех необходимых мне средах:

  • dev: обычно localhostтам, где проект находится в подпапке
  • preprod & live

Это происходило даже с расширениями от крупных поставщиков расширений (которые должны оставаться безымянными, по крайней мере, до тех пор, пока я действительно не сойду с ума и не добавлю их имена)
кода и облегчить его использование техническим и нетехническим персоналом, а техническому специалисту - его изменить?

Мариус
источник
11
Похоже, что одному из крупных поставщиков расширений не понравился этот вопрос, и он проголосовал за него. :)
Мариус
1
Лично у Wyomind нет никаких проблем, но они шифруют свой код и все еще являются «премиум-партнерами» :( (только для примера)
sv3n

Ответы:

186

Вот что я обычно делаю:

  1. Всегда развиваться с error_reportingна.
  2. Всегда развиваться с isDeveloperModeустановленным на true. Просто добавьте SetEnv MAGE_IS_DEVELOPER_MODE 1в свой httpd.confфайл (или соответствующий файл для Nginx или что-то еще)
  3. Если расширение связано с основной функциональностью, добавьте зависимость в файл декларации. <depends><Mage_Catalog /></depend>
  4. Если модуль предназначен для использования в сообществе, используйте его в communityкачестве пула кода, чтобы дать разработчикам возможность переопределить некоторые классы без непосредственного изменения кода.
  5. Поместите свои файлы дизайна интерфейса, app/design/frontend/base/default чтобы сделать их доступными для всех тем.
  6. Поместите свои файлы дизайна администратора app/design/adminhtml/default/defaultи не меняйте тему администратора. Я могу хотеть изменить это в одном из моих модулей.
  7. Добавьте имена файлов макета и папки шаблона к названию компании, чтобы их было легче изолировать. easylife_articles.xmlа такжеapp/design/.../easylife_articles
  8. Поместите ваши статические ресурсы (JavaScript, CSS и изображения) в папку, аналогичную файлам шаблона. easylife_articles/images/doh.png
  9. Прикрепите простой текстовый файл с инструкциями по удалению расширения: какие файлы должны быть удалены, какие таблицы должны быть удалены, какие параметры конфигурации должны быть удалены из core_config_dataтаблицы.
  10. Не пишите запросы непосредственно в моделях, блоках или помощниках, используйте для этого модель ресурсов.
  11. Не пишите запросы, используя имена таблиц напрямую Select * from sales_flat_order where .... Используйте Zend_Selectи преобразуйте имена таблиц, используя ->getTable('sales/order').
  12. Используйте базовый URL для включения jsфайлов в шаблон. Неправильно <script type="text/javascript" src="../js/some.js"></script> . Правильно <script type="text/javascript" src="<?php echo Mage::getBaseUrl('js').'some.js'?>"></script>
  13. Не переписывайте классы, если в этом нет необходимости. Используйте наблюдатели, и если невозможно использовать вспомогательные методы, которые получают в качестве параметра и экземпляра класса, который вы хотите переопределить. Неверно : переопределить, Mage_Catalog_Model_Productчтобы добавить метод getProductArticles(). Верно . В свой помощник добавь getProductArticles(Mage_Catalog_Model_Product $product)
  14. Если вы переопределите классы, поместите их список в readme.txtфайл
  15. Используйте путь администратора по умолчанию для раздела администрирования вашего модуля. Неправильный админ URL articles/adminhtml_articles/index . Правильный админский URL admin/articles/index
  16. Добавьте ACL для разделов администратора. Я могу хотеть ограничить доступ к некоторым администраторам.
  17. Не добавляйте другой JavaScript-фреймворк (jQuery, MooTools и т. Д.), Если в этом нет необходимости. Напишите свой код в прототипе.
  18. Сделайте ваш шаблон HTML W3C действительным (это для разработчиков OCD, таких как я).
  19. Не кладите изображения в mediaпапку. Используйте skin. media Папка обычно не версируются , и это делает его более трудным перенести сайт в различные среды.
  20. Проверьте свое расширение с плоским каталогом и выключите. Чтобы не удвоить время разработки, используйте Chaos Monkey .
  21. Протестируйте свое расширение с кешем onи кешем off.
  22. Избегайте использования заглавной буквы в имени модуля и класса. Если не проверено должным образом, это может вызвать проблемы на разных ОС. Это скорее рекомендация, а не необходимость.
  23. Отправляйте события в своем коде, чтобы разработчикам было легче изменять функциональность.
  24. Следуйте тем же стандартам кодирования, которые использует Magento, и комментируйте ваш код.
  25. Не используйте короткие теги PHP ( <? $this->doSomething() ?>). Используйте полные теги ( <?php $this->doSomething()?>). Также пока не используйте короткие эхо-теги. ( <?="D'oh";?>). Использовать ( <?php echo "D'oh";?>)
  26. Переведите ваши тексты, используя $this->__и добавьте файл перевода локали с вашими текстами ( app/local/en_US/Easylife_Articles.csv) хотя бы для en_USязыка. Не все веб-сайты построены на английском языке, и определение текста для перевода занимает много времени.
  27. Если вы продлеваете продление, предлагайте хотя бы базовую поддержку. Или, по крайней мере, отвечайте на письма поддержки, которые вы получаете.
  28. Не делайте постоянных звонков на ваши серверы через ваш добавочный номер для проверки лицензии. Однажды при установке более чем достаточно (этот подход мне тоже не нравится, но лучше, чем совершать звонки постоянно). (Вдохновлен этим вопросом )
  29. Разрабатывайте с активированным журналом и время от времени просматривайте var/log/system.logфайл. Перечисленные здесь ошибки не отображаются даже при включенном режиме разработчика. Если есть хотя бы одна ошибка, вы получите большой файл журнала после нескольких месяцев работы расширения.
  30. Если ваше расширение каким-либо образом влияет на процесс оформления заказа или заказы, убедитесь, что оно работает с мульти-доставкой, или если оно не должно работать с мульти-доставкой, убедитесь, что оно не влияет на него.
  31. Не заменяйте панель уведомлений администратора по умолчанию (или URL-адрес канала). Если меня интересует, что вы можете предложить, я подпишусь на вашу рассылку. Дай мне посмотреть, что скажет Мадженто. Это важнее для меня.
  32. Если вы зашифруете свои файлы кода с помощью Ioncube (или чего-то еще) ... ну ... я просто вас ненавижу и надеюсь, что ваш бизнес обанкротится

Это то, что есть до сих пор. Я добавлю больше, как только я подумаю о чем-то еще.

Marius
источник
Я согласен с вами, это определенно хорошее начало. Конечно, вы также поймете, что не всегда возможно охватить все виды конфигураций и проблем, по крайней мере, это уменьшит возможные. Большинство проблем, с которыми я сталкиваюсь с другими расширениями или людьми, с которыми я встречаюсь, связаны с перезаписью.
Сильвен Райе
2
@ Marius, конечно, 1+ от me.it охватывает большинство случаев и сценариев, с которыми мы сталкиваемся в процессе разработки.
liyakat
4
@ColinM. Прежде всего, это честь, что ваш комментарий здесь. :). Я согласен, что есть разница, я изменю ответ, но я все еще думаю, что их обоих следует избегать, по крайней мере до тех пор, пока PHP 5.3 не станет «новым PHP 4». Я имею в виду, что он все еще используется в больших масштабах.
Мариус
4
@ Мариус, ваши очки очень полезны. До # 31 я серьезно фокусировался на каждой точке, но на # 32 я просто громко рассмеялся. +1 специально для пункта № 32
MTM
1
If you encrypt your code files with Ioncube (or something else)...well...I just hate you and I hope your business goes bankruptЯ чувствую то же самое. Есть некоторые компании, которые не предлагают обновленную версию, вам придется заплатить за них, это действительно расстраивает меня и не понимают, почему они хотят продавать один и тот же продукт снова и снова (очевидно, чтобы заработать деньги). Я просто больше не покупаю их товар. Вы знаете, о ком я говорю.
Адарш Хатри
31

Я большой поклонник использования modman, так что я могу разрабатывать и контролировать исходные тексты только моего расширения и оставить основные файлы и структуру папок без изменений. Это также делает тестирование в разных установках более плавным.

Да, и один важный совет: всегда пытайтесь установить ваше упакованное расширение локально на чистой установке magento, прежде чем загружать его в Magento Connect, я так много раз пропускал файлы в менеджере пакетов.

Дэвид Мэннерс
источник
3
Хороший звонок по поводу «установки вашего упакованного расширения локально». Я думаю, что это относится к категории: «Проверь свое проклятое расширение сверху вниз».
Мариус
Я был пойман этим раньше тоже. Убедитесь, что вы тестировали пакет при чистой установке, отличной от той, на которой он был упакован!
Джозеф Лиди
22

Андреас фон Студниц и доктор Николай Крамброк представили хорошую презентацию о качестве кода на Meet Magento DE 2014. Они различают общее качество кода и качество кода, специфичного для Magento. Короче говоря, существуют следующие общие правила:

  • Использование элементов структуры - так же, как классов и методов - должно быть организовано в средних классах классов. Эти элементы структуры имеют смысл только тогда, когда они используются для структурирования. Поэтому они должны быть среднего размера. Предполагается использовать 100-200 строк кода для классов и 3-20 строк кода для методов.
  • Из-за использования «if» или «while» код имеет отступ. Если имеется более 3 отступов, их лучше пересмотреть. Слишком много отступов свидетельствуют о сложности кода, и поэтому их следует избегать.
  • Мертвого кода следует избегать и удалять. Статический анализ помогает найти его, если он существует.

Еще более важными являются специфичные для Magento правила:

  • Модули должны работать независимо. Они должны иметь небольшую зависимость от других модулей и не зависеть от шаблонов. Решение состоит в том, чтобы использовать обновления макета (базовый / по умолчанию) вместо адаптации к файлам шаблона и модуля, который охватывает дополнительные функции шаблона.
  • Для поддержания возможности обновлений в ядре Magento следует избегать взломов и взломов внешних модулей. Лучшим способом является использование переписчиков или наблюдателей.
  • Для изменений лучше использовать сценарии установки, а не прямые изменения базы данных или администратора. Благодаря им изменения должны быть сделаны только один раз.

Вот еще некоторые подробности и видео презентации: http://www.code4business.de/code-quality-magento/

user3743859
источник
1
Но если бы у вас была английская версия ссылки, которую вы разместили, было бы еще лучше.
Мариус
Английская версия этой презентации будет написана в ближайшее время. Я буду держать вас в курсе и поделюсь новой ссылкой, как только будет опубликована английская версия.
user3743859
Английская версия презентации теперь онлайн. Вот ссылка на него: code4business.de/code-quality-magento
user3743859
да? Это все еще на немецком языке. Но я случайно попал на эту презентацию на английском языке на MeetMagentRo около 2 недель назад. Отличный материал.
Мариус
18

Если вы продаете свое расширение или делитесь им с другими, подумайте о написании кода, понятного человеку.

  1. не делайте метод слишком сложным
  2. добавить блоки DOC в ваши методы *
  3. используйте правильные имена переменных, например $productIdsвместо$ids
  4. То же самое для методов, public function myOnProductSaveMethod() {...}говорит ... ничего, но tryDisableInternetOnProductSave()даст подсказку хотят, планируется
  5. используйте подсказки типа там, где это имеет смысл someMethod(Varien_Data_Db_Collection $collection)
  6. избегайте магических чисел и строк **
  7. если вы используете модели, установите $_eventPrefixсвойство (и $_eventObject), чтобы сделать их лучше доступными для наблюдателей
  8. если вы добавите поля конфигурации системы
    • установить значения по умолчанию в config.xml
    • добавить <validate>узлы в поля вsystem.xml
    • добавить ресурсы ACL в adminhtml.xml
  9. не добавляйте бесполезные / рекламные записи меню первого уровня в административный бэкэнд - ни в верхней панели, ни в разделах конфигурации
  10. добавить ресурсы ACL для всех действий контроллера (тоже массовые действия!)
  11. убедитесь, что ваши запросы работают с префиксами таблиц БД
  12. думать о (нет) обратной совместимости (это действительно основано на мнении)
    • не поддерживают Mysql4классы
    • не используйте устаревшие методы
  13. убедитесь, что ваше исключение работает как положено в каждом случае - добавьте UnitTests (PhpUnit, например)
  14. в дополнение к Дэвиду Мэннерсу ... добавьте composer.jsonтакже, чтобы упростить развертывание
  15. поскольку PHP5.6 - это EOL, напишите свой код для PHP7. Используйте declare(strict_types=1);и определяйте ваши типы ввода и вывода
  16. Magento2: проверьте ваш код с помощью инструментов статического анализа кода, таких как phpstan . Поддержка магических методов здесь . (последний коммит работает с 2.3, ранее для 2.1 / 2.2 - требуется phpstan 0.8.5)

* DOC блоки:

Если вы проверите свой код Magento-1 с помощью PHP_CodeSniffer для стандарта PSR2 или PHPMD , возможно, вы захотите добавить эти строки (где это имеет смысл) ...

  • на занятия
    • @phpcs:disable PSR1.Classes.ClassDeclaration.MissingNamespace
    • @phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore - унаследованные свойства
    • @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
    • @SuppressWarnings(PHPMD.CamelCaseClassName)
    • @SuppressWarnings(PHPMD.CamelCasePropertyName) - унаследованные свойства
  • к методам
    • @SuppressWarnings(PHPMD.CamelCaseMethodName) - унаследованные методы
    • @SuppressWarnings(PHPMD.StaticAccess)- если вы используете Mage::или другие статические звонки

** Часто используемые:

  • ID магазина администратора
    • 0 > Mage_Core_Model_App::ADMIN_STORE_ID
  • продукт status
    • 1 > Mage_Catalog_Model_Product_Status::STATUS_ENABLED
    • 2> Mage_Catalog_Model_Product_Status::STATUS_DISABLED (не так, 0как ожидалось)
  • продукт type
    • simple > Mage_Catalog_Model_Product_Type::TYPE_SIMPLE
    • bundle > Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
    • configurable > Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE
    • grouped > Mage_Catalog_Model_Product_Type::TYPE_GROUPED
    • virtual > Mage_Catalog_Model_Product_Type::TYPE_VIRTUAL
  • продукт visibity
    • 1 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE
    • 2 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_CATALOG
    • 3 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_IN_SEARCH
    • 4 > Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH

То же самое для порядка SQL ASCпротив Zend_Db_Select::SQL_ASC (например) .

Сказать «это не обязательно, потому что это никогда не изменится» ? Например, идентификатор объекта для catalog_productатрибутов изменился где-то между Magento 1.5 и 1.9 с 10на 4, так что это может сломать ваше расширение:

$collection->addFieldToFilter('entity_type_id', 10)

Использование этого вместо этого добавляет один запрос, но вы будете в безопасности ...

$entityTypeId = Mage::getModel('eav/config')
    ->getEntityType(Mage_Catalog_Model_Product::ENTITY)
    ->getEntityTypeId();

$collection->addFieldToFilter('entity_type_id', $entityTypeId)
sv3n
источник
8

@marius, о стандартах кодирования (пункт 24 в вашем списке).

Мне нравится использовать PHP_CodeSniffer вместе с EQP и ECG CS для автоматического обеспечения соблюдения этих стандартов.

Используя PHP_CodeSniffer, вам не нужно беспокоиться о том, чтобы забыть такие вещи, как замена array()на [], избегать использования is_null, оставлять неиспользованные локальные переменные или даже метод без блока PHPDoc.

PHP_CodeSniffer всегда расскажет вам об этом.

diazwatson
источник
Согласовано! Возможные инструкции
sv3n
Я думаю, что нет способа настроить обе CS в PHPStorm (для тех, кто использует PHPStorm), но вы всегда можете использовать терминал для проверки CS в вашем коде. Также есть такие инструменты, как grumphp github.com/phpro/grumphp, которые немного помогают.
diazwatson
Это может помочь вам magento.stackexchange.com/questions/200022/…
Прамод Хараде