Мои Best Practices
Мои лучшие практики при разработке сайтов на друпале:
-
Добавляю в машинные имена полей название бандла, например —
field_news_image
вместоfield_image
. Исключение для полей, которые используются одновременно в нескольких бандлах. -
Избегаю использование одного поля в разных бандлах. Т.е. вместо одного поля
field_image
на несколько бандлов, создаю в каждом бандле по полюfield_bundle_image
. Но конечно многое зависит от архитектуры, бывают и исключения. -
Машинные имена multi-value полей пишу в единственном числе, например
field_image
вместоfield_images
. Бывают случаи когда в ходе разработки приходится делать поле single-value, и "s" на конце начинает резать глаз. (На самом деле придумал это только сейчас, но будут соблюдать :)) -
Машинные имена словарей в множественном числе —
categories
,colors
. -
В каждом друпал сайте есть custom модуль с именем custom_helpers, в который складываются служебные функции, реализации хуков, альтер-функции и так далее.
-
Если какой-то функционал требует 3-4 функции в модуле custom_helpers, то он выносится в отдельный custom модуль.
-
Если custom модуль будет использоваться только на текущем сайте, то в имя модуля добавляется префикс
custom_
, чтобы не заморачиваться с выбором имени и возможными конфликтами. Пример таких модулей —custom_checkout
илиcustom_profile
. -
Custom модули создаются одной командой drush. Можете самостоятельно написать её или воспользоваться уже готовой.
-
Как понятно из прошлого пункта — drush, drush и ещё раз drush. Основные кейсы — установка модулей, создание модулей, обновление друпала/модулей, drush make.
-
Модули рассортированы по подпапкам
contrib
,custom
иsandbox
. -
Использую SASS вместо альтера/препроцесса/переопределения_шаблонов где это возможно. Пример — вместо альтера формы и добавления кнопке класса
btn-warning
, пишу в scss файле:.form .button { @include btn-warning; }
. Не люблю лишней разметки/классов/атрибутов и стараюсь этого избегать. -
Переопределяю шаблоны только если не удаётся реализовать задуманное с помощью preprocess и alter-а.
-
Не держу в
template.php
кода отвечающего за функционал и бизнес логику. Для это есть модуль custom_helper. -
Не стоит увлекаться дисплеями Views. Как правило любое сложное представление следует выносить в отдельный View, а не делать его дисплеем уже существующего. В дисплеях очень легко намудрить с переопределением. Конечно есть и исключения, когда сделать отдельный view технически невозможно.
-
Стараюсь использовать формат вывода Fields в представлениях, вместо Rendered entity. Это быстрее работает и гибче темизируется из админки.
-
Своя базовая тема. Её в любой момент можно изменить/допилить.
-
Выношу часто используемые кейсы в базовую тему. Например можно добавить в базовую тему опцию "Скрывать заголовок на главной", которая позволит одним кликом убирать h1 с главной страницы.
-
По возможности решаю задачи уже установленным набором модулей или своим кодом. Если задача не решается текущими модулями и требует больших временных затрат, то можно воспользоваться contrib-ом. Стараюсь не плодить сущностей (читай модулей).
-
Структура директорий в
sites/default/files
:files
— обычные файлы, вsites/default/files
ничего заливаться не должно.images
— картинки в подпапках.inline
— файлы вставленные в текст, например с помощью OCUpload.private
— приватная директория.temp
— временная директория. -
В dev окружении отключён кэш страниц и блоков, а так же агрегация css и js. Отключается с помощью хардкода в
settings.php
. -
Приемлемое время загрузки страницы — меньше 500-700 ms. Если больше, то приходится разбираться почему и по возможности устранять причину или искать альтернативные решения задачи.
-
Свой установочный профиль. Позволяет за пару минут развернуть настроенный и готовый к работе сайт.
-
Нашёл решение задачи, на которое потратил больше 5 минут? Напиши решение в блог, потом сам себе спасибо скажешь :) А в комментах может и чего лучше посоветуют.
-
Все ajax формы делаются по принципу Progressive enhancement, т.е. сначала форма делается рабочей даже с отключённым js, а дальше навешивается ajax функционал. AJAX Framework чертовски нелогичен и в нём легко запутаться если работать по принципу Graceful degradation.
-
Активно использую CSS3. Все дизайн-решения которые можно сделать с помощью CSS должны делаться с помощью CSS, а не картинок. Закруглённые углы, тени, градиенты, множественные бэкграунды, анимация, трансформация — всё уже можно использовать, времена IE6/7/8, Opera 10, Firefox 3 давно закончились. caniuse.com расскажет о поддержке браузерами того или иного свойства.
-
Если какой-то функционал требует больше 200-300 строчек CSS кода, то код выносится в отдельный файл.
-
При написании селекторов начинаю с id блока. Если это контент, то с соответствующего класса вьюхи/формы/ноды. Стараюсь не использовать больше двух элементов в селекторе. Пример:
#block-last-news { .news { ... } .news-title { ... } .news-body { ... } }