Ember.js и Drupal 8

Тип материала: 
Версия Drupal: 
Ключевые слова: 
Модули и темы: 
Ср, 12/10/2016 - 21:45


upd:
Эта статья кардинально отличается от своей первой редакции, добавлено демо приложения.
31.10.16
Прикрыл репозиторий с кодом в преддверии обновления,
но оставил открытой wiki - если кому интересно: https://bitbucket.org/multpix/ember2drupal/wiki/browse/.
Первая версия демо так и работает по адресу: http://multpix.bitbucket.io.сейчас этот пример устарел, но ревизия до рабочего состояния - не за горами)))

ember to drupal

Вопросы не новы:
Should we decouple Drupal with a client-side framework?
Selecting a client-side framework for Drupal
Can Drupal outdo native applications?

Таблица сравнения js-фреймворков:

(Лично мне приглянулся Ember.js - это замечательный фреймворк для клиента, который позволяет делать удивительные вещи.)

Смотрите доки на оф.сайте, а ниже линки на интересные видео с конф.

Decoupled Drupal and Ember

Amazing User Experiences with Drupal and Ember

Конкретизируя, Headless Drupal8 - эта та тема, которую я хочу обсудить с участниками сообщества drupal.ru.

Возможно несколько различных вариантов связок drupal-бэкенда с клиентом, как показано далее:
Should we decouple Drupal itself?

Я остановился на крайнем правом варианте - полностью отдельные бэкенд и фронтенд приложения.
Ember - это полное приложение (mvc), на стороне клиента;
на стороне сервера - Drupal хранит данные, предоставляя все прелести своей системы пользовательских ролей и прав, в связке со своей моделью данных (сущности - поля).
Обмен данными между клиентом и сервером происходит в формате JSON API - это замечательная спецификация json для организации api.

Принципиальной особенностью использования drupal в этой связке является следующее:
минимальное применение контриб-модулей от сторонних разработчиков.

Это одна из главных проблем большинства пользовательских инсталляций drupal-based сайтов.
Простых пользователей привлекают такие характеристики drupal, как: безопасность, универсальность...
но фактически - установив ядро и добавляя к нему контриб на каждый "чих"
- пользователь получает весьма ресурсо-прожорливую конструкцию, неимоверной степени сложности, сомнительную в плане безопасности.

В моем варианте, из контриб модулей я использовал только  jsonapi, библиотеку docson
(ну и  devel, известно зачем - в продакшн он уже не нужен).

Это простейший пример, как брать данные из drupal и скармливать их ember,
формат - api_json.

А теперь по порядку.

Установка и первоначальная настройка Drupal тривиальна:

drush dl drupal && mv drupal-8.2.1 drupalback && cd drupalback
mkdir libraries && cd libraries
git clone https://github.com/lbovet/docson.git && cd ../
drush dl devel jsonapi --destination='modules/contrib'
drush si minimal --db-url=sqlite://sites/default/files/.ht.sqlite
drush en seven toolbar field_ui  devel_generate jsonapi
drush config-set system.theme default seven
drush pm-uninstall stark

Настройка cors (для разработки)

chmod 0755 sites/default/
cp sites/default/default.services.yml sites/default/services.yml
chmod 0555 sites/default

vim sites/default/services.yml

# Enable CORS for develop in services.yml file:
cors.config:
  enabled: true
  allowedOrigins: ['*']

Сменить пароль да запустить:

drush upwd admin --password='12345'
drush rs

Далее, то что так подкупает в drupal - ui,
создаем нужные сущности и связи используя field_ui,
создаем необходимую систему ролей и прав пользователей,
дополнительно - возможно использовать views_ui для организации административных интерфейсов управления данными и пользователями.

Подмодуль jsonapi_docson из коробки jsonapi, предоставляет наглядный интерфейс для изучения структуры данных.

jsonapi doc
jsonapi docson

Вот и все с серверной частью, теперь фронт.

Что-бы Ember без проблем принимал api_json, который отдает drupal, нужно использовать и расширять дефолтные адаптер и сериализатор, соответственно: JSONAPIAdapter и JSONAPISerializer.
Несколько особенностей я опубликовал в примере кода здесь.

Для демонстрации простого приложения, сделано следующее:
для бэкенд - в pantheon.io развернут drupal 8,
для фронтенд - сборка ember выгружена на мою страницу bitbucket.org.

Приложение кране простое, не удивляйтесь некоторым его "приколам" - не все проработано до должного уровня,
это просто небольшая демонстрация возможностей :-)

Точка входа в приложение: http://multpix.bitbucket.org/
Обратите внимание, что при переходе по ссылкам приложения, перезагрузки страниц не происходит.
Посмотрите на эффект перехода между articles <-->users, это работает liquid-fire.
Сама верстка - foundation 6.

Я считаю, что потенциал у подобного стека - огромный :-)

Краткое описание Ember.js:

Ember.js это JavaScript фреймворк для создания динамичных web приложений. Реализует MVC шаблон, предназначен для упрощения создания масштабируемых одностраничных веб-приложений.

Основные особенности:

  • Толстые объектные модели
  • Вычисляемые свойства
  • Декларативная двусторонняя привязка данных
  • Автоматически обновляемые шаблоны с Handlebars.js
  • Маршрутизатор для управления состоянием приложения
  • Включение зависимостей

Принципы

Изначально Ember проектировался с учетом нескольких ключевых идей:

Фокусировка на амбициозных web приложениях
Ember нацелен на полное решение всех задач приложений на стороне клиента, в отличии от многих JavaScript фреймворков, которые реализуют составляющую V в MVC (т.е., Представление из шаблона Модель-Представление-Контроллер).

Больше продуктивности из коробки
Ember является одним из компонентов целого комплекса инструментов для полного стека разработки. Цель этих инструментов - немедленно повысить продуктивность разработки. Например, Ember CLI (интерфейс командной строки) обеспечивает возможности автоматического создания стандартной структуры приложения, генерацию типового кода, инструменты тестирования, проксирование на внутренний сервер, живую перезагрузку браузера при редактировании кода. Он также обладает расширяемой архитектурой и обширным списком дополнений.

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

Предвидение будущих web стандартов
Ember один из первых внедрял много новшеств в сфере Web и JavaScript, таких как промисы, web компоненты, ES6 синтакс. Иегуда Катц, один из основателей Ember, участник группы TC39, ответственной за будущее развитие языка Javascript.

Ember, подобно Ruby on Rails, следует принципам Convention over Configuration (CoC) - Соглашение превыше Конфигурации, и Don't Repeat Yourself (DRY) - Не повторяйся. Он описывается как высоко опциональный, гибкий фреймворк

Примеры работы Ember:
https://cloud.digitalocean.com
https://dashboard.heroku.com

http://discuss.emberjs.com/
https://forum.ionicframework.com/
http://help.apple.com/watch/

Вот и все.
У кого какие вопросы или замечания - в комменты :-)

2 Спасибо
Attached poll"ИМХО: Drupal8 frontend".
Register or login to poll
Результаты
Существующая система темизации полностю покрывает мои потребности: 0 голосов
Angular: 0 голосов
Backbone: 0 голосов
Ember: 0 голосов
Другой client-side framework (какой из многих - озвучу в комментах): 0 голосов
Не понял вопроса: 0 голосов

Комментарии

Аватар пользователя sergeybelya
9 months 2 недели назад sergeybelya #

Я имел в виду, что для того чтобы начать использовать друпал, достаточно его просто установить на сервере, не устанавливая при этом еще что-то дополнительно. По аналогии с js - это ближе к jquery - самодостаточный скрипт, работающий во всех современных браузерах. А если вы хотите кроссбраузерный реакт, например, будьте добры - подключайте еще доп. библиотеки или что-то там компилируйте и т.д. А против интеграции Drupal с другими технологиями я ничего не имею.

0 Спасибо
Аватар пользователя ХулиGUN
9 months 2 недели назад ХулиGUN #

Вы не о том спорите, товарисчи)))

0 Спасибо
Аватар пользователя multpix
9 months 2 недели назад multpix #

эт не спор был, а повышение грамотности)))
Ушли от темы мы, даешь предмет спора!
p.s/
опрос в теме весьма нехорошо себя ведет...

0 Спасибо
Аватар пользователя gun_dose
9 months 2 недели назад gun_dose #
multpix написал:
самое адовое, что может произойти с человеком, который разрабатывает для веб,

это то, что он станет "Друпалером"
(или вэпэшником, или битриксоводом, или джумлорастом, да даже джангистом, энждистом или рельсорубом etc.) только.

Это ситуация, когда ограничивают себя чем-то знакомым, в ущерб изучению нового.

"Остановился, прекратил искать, учить" - читай как: "назад покатился".

Что значит "остановился"? Сколько лет надо изучать друпал, чтобы изучить его полностью? Что лучше: уметь решать любые задачи одним инструментом или уметь писать Hello world на всех языках мира? Другое дело, что есть задачи, которые нереально решить друпаловским аяксом, но если ты пришёл к этой задаче, то значит ты дорос до того, чтобы решить, свернуть тебе на фронт или в бэк. И тут уже надо помнить, что в такой ситуации ты, как разработчик с многолетним стажем, на фронте не будешь иметь никаких преимуществ перед 20-летними студентами.

0 Спасибо
Аватар пользователя multpix
9 months 2 недели назад multpix #
gun_dose написал:
Что лучше: уметь решать любые задачи одним инструментом или уметь писать Hello world на всех языках мира?

Ответ: универсальных инструментов для любых задач не существует, лучше так - знать для каких дел какой инструмент более хорош.

Я даже больше скажу - пока у вас не будет с чем сравнивать, вы не поймете что у вас в руках)))

И не свернуть, но расширить,
И не преимущества, но здоровая конкуренция только приветствуется.

p.s/
тема - бомба, 40+ комментов и ни одного вопроса по существу,
это друпалру детка ))))
ну хоть камрадов поприветствовал - и то радует

Куда запаковали Константина?
Выпустить немедленно!!!

1 Спасибо
Аватар пользователя gun_dose
9 months 2 недели назад gun_dose #

Свернуть или расширить - это уже дело каждого, должен быть баланс между шириной и глубиной кругозора)) А вообще, мечтаю когда-нибудь поковырять нод.жс, посмотреть, что за зверь. Но времени нет совсем.

0 Спасибо
Аватар пользователя bumble
9 months 2 недели назад bumble #
gun_dose написал:
мечтаю когда-нибудь поковырять нод.жс, посмотреть, что за зверь

Вкуснятина неимоверная!!!

0 Спасибо
Аватар пользователя bumble
9 months 2 недели назад bumble #
multpix написал:
Куда запаковали Константина?

Выпустить немедленно!!!

Будет доступен завтра с 22:26.

0 Спасибо
Аватар пользователя multpix
9 months 2 недели назад multpix #
gun_dose написал:
Но времени нет совсем

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

bumble написал:
Будет доступен завтра

Шо, доскакался дед?
Я и не в курсе был))))
А по делу - в этой теме опрос - он с багами, есть возможность просто взять его и удалить?
В принципе - он не нужен.

0 Спасибо
Аватар пользователя bumble
9 months 2 недели назад bumble #
multpix написал:
в этой теме опрос - он с багами, есть возможность просто взять его и удалить?

Да, баг - знатный... Но фиксить сейчас нет возможности, к сожалению.
Закрыл его, удалить нет возможности.

0 Спасибо
Аватар пользователя gun_dose
9 months 2 недели назад gun_dose #
multpix написал:
А я больше скажу - его и не будет))))

Тут мне не привыкать. Например с drush, linux, git и gulp я познакомился во время горящих дедлайнов)) Не со всем одновременно конечно - это были 4 одинаковые истории))

0 Спасибо
Аватар пользователя ХулиGUN
9 months 1 неделя назад ХулиGUN #
multpix написал:
Ответ: универсальных инструментов для любых задач не существует, лучше так - знать для каких дел какой инструмент более хорош.
Я даже больше скажу - пока у вас не будет с чем сравнивать, вы не поймете что у вас в руках)))

Плюсую

Обычно в ширь растут, когда инструмент перестаёт удовлетворять потребностям, когда приходит осознание того, что можно это сделать проще, красивей, быстрее. Для php, может, это и не критично, так как нет такого понятия, как время жизни приложения, но для некоторых других ЯП - приобретает особый вес на стадии планирования. Я не против полностью укомплектованных систем, но они, как, правило накладывают свои ограничения на процесс разработки и наоборот мешают развитию "в глубину". Ты можешь знать/нагуглить, как сделать тот или иной функционал с помощью API предлагаемого инструмента, но алгоритм работы этой фичи на атомарном уровне - маловероятно. И тут стоит переключится на саму спецификацию, а как вообще это работает. После изучения копнуть глубже свой инструмент, понять, что всё отвратительно и попробовать найти новый, но уже с пониманием всего процесса.
Например друпал:

  1. Нужно сделать сайт со сложной структурой сущностей.
  2. О, берём друпал, я его знаю. Там можно сколько угодно полей к сущности прилепить, через референс объединить. И всё это из админки - кодить не придётся.
  3. Блин, что-то долго вьюха с фильтрами открывается, да и меню с деревом таксономии. Тут 2 варианта либо настроить кеш и забить, либо изучить почему так происходит. Если выбрать кеш, то дальше беда с обновлением сущностей - много времени на понимание, поиск инфы, эксперименты. Выбираем изучение, лезем в mysql, узнаём про джойны, форейнкей и вообще структуру таблиц. + понадобилось добавить/убрать какое-нить поле и возник вопрос переноса изменений на продакшн, а так же Вы открываете для себя понятие версионирования
  4. Гугл. открывает такое понятие, как миграции, лицо уже не такое радужное от того, что изучал сего лишь друпал, и глядя, как происходит процесс разработки с другими инструментами, появляется некоторое сомнение в использовании друпала.
  5. Итак мы узнали про сложные запросы в mysql и как устроены связи, познакомились с sql запросами. Узнали о паттернах построения деревьев в реляционных БД, магическое слово миграции и версионирование проекта.
  6. Вернувшись к друпалу, понимаем, что наша серебряая пуля оказывается не такая уж и серебряная. И это заставляет нас изучать новые инструменты.

Конечно, всё это не учитывает грящих дедлайнов, но показывает тот момент, когда лучше в ширь, чем в глубь

2 Спасибо
Аватар пользователя dashiwa
9 months 1 неделя назад dashiwa #

Тема интересна. Как раз такой функционал нужно реализовать. Пока мучаем джекуэри
Много подобного интерфейса

Для господ "модников" статья по теме
https://m.habrahabr.ru/post/312022/

0 Спасибо
Аватар пользователя multpix
9 months 1 день назад multpix #
dashiwa написал:
статья по теме

На первой странице комментов уже мелькала, улыбнулись по ее поводу)
Все намного проще - организация рабочего процесса, подтягивание зависимостей, сборка, тесты, типовые участки кода - очень многое автоматизированно.
Но это лучше попробовать, чем слушать мои объяснения - в контексте сабжа, это три инструмента: composer, drush, ember-cli.

dashiwa написал:
Пока мучаем джекуэри

С голым jQuery реализация подобных штук - действительно мучение)
Но можете глянуть в vendor.js - там jQuery 2.2.4, куда уж без нее.

Друзья, давайте feedback по сабжу, тема-то горячая!

0 Спасибо
Аватар пользователя sergeybelya
9 months 1 день назад sergeybelya #
multpix написал:
Друзья, давайте feedback по сабжу, тема-то горячая!

Тема особо не востребована по правде говоря, таких проектов очень мало.

0 Спасибо
Аватар пользователя dashiwa
9 months 1 день назад dashiwa #

По чем судим?

0 Спасибо
Аватар пользователя sergeybelya
9 months 1 день назад sergeybelya #

По своему опыту конечно.

0 Спасибо
Аватар пользователя dashiwa
9 months 1 день назад dashiwa #

А я бы судил по индивидуальным заказам. Мировые биржы,доски обьявлений.
Так и по корпоративным заказам. - Предложение работы,поиск сотрудников

0 Спасибо
Аватар пользователя sergeybelya
9 months 1 день назад sergeybelya #

Ок, какова доля таких проектов на рынке, вы располагаете конкретными цифрами?

0 Спасибо
Аватар пользователя dashiwa
9 months 1 день назад dashiwa #

Да. распологаю источниками. Для анализа мне понадобится часа 3-5 ..пока что нет приоритета этим заниматься)) Много дел и личное время

0 Спасибо
Аватар пользователя gun_dose
9 months 1 день назад gun_dose #

А вот ни разу нет. Уже даже на всяких отвлечённых от программухи ресурсах пошла волна постов типа "ребята, я хочу сделать форум, как этот, только лучше, движок будет нод.жс, а база - монга". Всё идёт к тому, что всё больше сайтов на морде будут иметь жс-фреймворки, а бэкенд будет отдавать json

0 Спасибо
Аватар пользователя bumble
9 months 1 день назад bumble #

Даешь Express в массы!

0 Спасибо
Аватар пользователя multpix
9 months 1 день назад multpix #

Express это очень хорошо!
Но я тут пытаюсь обосновать разумность применения именно Drupal
в стеке, использующем популярные client-side фреймворки)

Ведь мы берем только ядро D8,
и просто его используем.
Со всеми его плюшками, и поддержкой.

А поддержка - немаловажно, моя мысль такая:
пока дру используется в gov секторе многих развитых стран - он будет на плаву, а тут еще Дрис говорил - NASDAQ в 17-ом подтягивается,
это такой пулл мощных игроков - то что они используют opensource - читай: они в него инвестируют.
Какие у кого по этому поводу мыслишки?
И по демке че, ни у кого ни каких вопросов?
))

0 Спасибо
Аватар пользователя bumble
9 months 1 день назад bumble #

NASDAQ, на сколько я понял, просто рекомендует использовать D8, как одну из возможных платформ.
А .gov-сектор - не уверен что тот-самый, которому SPA нужен.

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

ЗЫ - сам, последние несколько недель активно выбираю технологию из Angular/Ember/React. Из всего прочтенного, мой вывод:

  • Angular: для низкого старта - прост в освоении, работает и развивается.
  • Ember: трохи сложнее (и профессиональнее, что-ли) инструмент. Аля Друпал, среди SPA-фреймворков.
  • React: за ним будущее, он крут...
0 Спасибо
Аватар пользователя multpix
9 months 1 день назад multpix #

Они разные.
а ember - это просто полное приложение на клиенте,
вот оцени хотя бы этот кусок из доков:
https://guides.emberjs.com/v2.7.0/models/relationships/
там все очень глубоко)))

0 Спасибо
Аватар пользователя multpix
9 months 1 день назад multpix #
bumble написал:
По демке вот

Я для этого отдельную статью сделаю, когда демка вообще жирная будет)))
со сложными связями, с внешними аутентификаторами, github-овским хотя-бы...

1 Спасибо
Аватар пользователя sergeybelya
9 months 1 день назад sergeybelya #

Переболеет народ модными js-"фреймворками", на этапе становления языка это нормально.

0 Спасибо
Аватар пользователя gun_dose
9 months 1 день назад gun_dose #

Становления какого языка? Без того же node.js сейчас и не поверстаешь толком, ибо всё заточено под gulp.

1 Спасибо
Аватар пользователя multpix
9 months 1 день назад multpix #

К слову об удобствах, то вот, к примеру кусок компонента навигации,
как по мне - то такое и читать и писать приятно:

.top-bar
  .top-bar-left
    = page-title
  .top-bar-right
    ul.menu
      li.menu-text
        = link-to 'articles'
          |articles
      li.menu-text
        = link-to 'users'
          |users
0 Спасибо
Аватар пользователя gun_dose
9 months 1 день назад gun_dose #

Да, выглядит очень лаконично, но я ничего не понял)))

0 Спасибо
Аватар пользователя multpix
9 months 1 день назад multpix #

А на что похоже?
На css селекторы похоже?
доты - классы, шарпы - идентификаторы, а теги это теги.
отступ - дочерний элемент,
а компоненты, переменные, условия и т.п. - это отдельный разговор

Есть целый ряд подобных шаблонизаторов.
Это embelm, он очень похож на slim, есть подобный для php - это jade

0 Спасибо
Аватар пользователя sergeybelya
9 months 1 день назад sergeybelya #

А как по мне - это какой-то треш) Было бы хорошо, если бы вы привели аргументы, на каких проектах headless drupal хорош, так как в любом случае разработка при таком подходе дольше и дороже. У Drupal 8 довольно мощная и гибкая темизация, какой смысл от нее отказываться? В чем выгода клиенту, как это продать? Только скорость загрузки и быстродействие сайта? Если да, то во сколько раз она возрастает? Или просто дань моде?

0 Спасибо
Аватар пользователя gun_dose
9 months 1 день назад gun_dose #

Если у тебя весь сайт зиждется на рест-апи и есть смысл создать мобильное приложение, то нафиг не нужна темизация.

ЗЫ: я правильно понимаю, что twig должен как-то быть особенно дружен с js-фронтендом или нет?

0 Спасибо
Аватар пользователя multpix
9 months 1 день назад multpix #
sergeybelya написал:

При всем уважении, друг,
но Иегуда Кац не похож на больного человека,
да и корпорация добра не замечена за не приносящими прибыль делишками)))

0 Спасибо
Аватар пользователя ХулиGUN
9 months 11 часов назад ХулиGUN #
multpix написал:
есть подобный для php - это jade

jade на ноде. И теперь уже это pug

1 Спасибо
Аватар пользователя multpix
8 months 3 недели назад multpix #

Интересные новостишки,
может кто простенький пример с ng2 оформит?

ps
фронт - это вынос мозга еще тот, на самом-то деле)))

0 Спасибо
Аватар пользователя bumble
8 months 3 недели назад bumble #

А вот как обстоят дела с, например динамической подгрузкой стилей/скриптов для "отдельных страниц" из своих модулей (аля drupal_add_* из 7ки)? Есть ли способы автоматизации?

0 Спасибо
Аватар пользователя multpix
8 months 3 недели назад multpix #

Грубо говоря, все собирается в один (ну, не один, а несколько)).
Но, в исходниках - все отдельно и очень по полочкам.
Так что, что модели, что шаблоны, или сервисы, или хелперы, компоненты и шаблоны компонентов -
все весьма разумно разложено по каталогам - а язык один - js (es6 точнее).
Стили лежат в каталоге app/styles,
есть такой https://emberobserver.com/addons/ember-css-modules - так он еще удобней поступает,
но я пока его не пользую.

Структура приложения (ember-cli) следующая:

.
├── app
│   ├── adapters
│   ├── app.js
│   ├── components
│   ├── controllers
│   ├── helpers
│   ├── index.html
│   ├── models
│   ├── resolver.js
│   ├── router.js
│   ├── routes
│   ├── serializers
│   ├── services
│   ├── styles
│   ├── templates
│   └── transitions.js
├── bower_components
├── bower.json
├── config
│   └── environment.js
├── dist
├── ember-cli-build.js
├── node_modules
├── package.json
├── public
│   ├── crossdomain.xml
│   └── robots.txt
├── README.md
├── testem.js
├── tests
│   ├── helpers
│   ├── index.html
│   ├── integration
│   ├── test-helper.js
│   └── unit
├── tmp
└── vendor

Для старта, есть вполне понятные руководства (на енгл, и на рус.)
http://emjs.ru/v2/tutorial/ember-cli/

1 Спасибо
Аватар пользователя bumble
8 months 3 недели назад bumble #

А где, собственно, Drupal должен находится? vendor? bower_components?
Или Ember-App = [part of] Drupal-theme?

0 Спасибо
Аватар пользователя multpix
8 months 3 недели назад multpix #

Дак в этом вся соль:
это два отдельных приложения которые общаются по сети, через jsonapi)))

Локально у меня ember 0.0.0.0:4200, а drupal 0.0.0.0:8888 - это дефолтные порты для запуска их дев-серваков.
В демо - drupal живет в pantheon.io, а ember выложен на страницу bitbucket.org

0 Спасибо
Аватар пользователя mbaev
8 months 3 недели назад mbaev #

Не убиваемая тема!

0 Спасибо
Аватар пользователя Frantsuzzz
8 months 2 недели назад Frantsuzzz #
multpix написал:
Принципиальной особенностью использования drupal в этой связке является следующее:

минимальное применение контриб-модулей от сторонних разработчиков.

Контриб контрибу - рознь! Дожили, уже давайте d.org закроем, оставим на главной ссылку для скачивания основного дистрибутива и веселый смайлик. Автор поста не обижайся! В моей практике основной проблемой всегда был не contrib, а custom...

0 Спасибо

Страницы