Обзор Drupal


Когда я впервые взглянул на Drupal еще в 2002 году, я признаю, что меня это совершенно не впечатлило. У него был очень простой интерфейс и, казалось, предлагались только базовые функции. В июле 2009 года у меня было немного свободного времени, и на основании множества положительных отзывов я решил попробовать Drupal еще раз.

Я так рад, что сделал это.

Год с тех пор это был путь открытий через множество бесплатных модулей Drupal и хорошо документированный, грамотно разработанный код и API Drupal. Drupal — это фантастическая программа, за которой стоит организованное, дружелюбное и великодушное сообщество, которое постоянно и часто улучшает.

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

Обзор — Что такое Drupal?
Разработчики описывают Drupal как «систему публикации сообщества». Это все еще система управления контентом, но она была оптимизирована для Интернета в качестве социальной среды.

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

Drupal также является средой разработки приложений, которая настоятельно рекомендует (если не фактически вынуждает) разработчиков следовать общему структурированному подходу, который ведет к модульному, поддерживаемому, функционально совместимому коду с общим пользовательским интерфейсом.

Drupal — это технология, «меняющая правила игры», поскольку она делает возможным для «Опытных пользователей» для создания веб-приложений для управления контентом без написания кода.

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

Начало работы с Drupal
Установка сам по себе прост и доступен любому, кто знаком с установкой приложений на веб-серверы, или любителю приключений, способному читать документацию и использовать ftp для загрузки файлов.

После установки, несомненно, есть впереди долгая и крутая кривая обучения для всех, кто плохо знаком с Drupal. Этого следует ожидать от любого сложного приложения корпоративного класса.

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

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

Views & Content Construction Kit (CCK) )
Первыми модулями, которые должны быть установлены на любом сайте Drupal, являются «Просмотры» и «Content Construction Kit». Понимание этих двух модулей является ключом к получению максимальной отдачи от возможности «создания сайтов» для опытных пользователей.

Content Construction Kit (CCK) добавляет простой в использовании интерфейс для администрирования Drupal, который позволяет нетехническим пользователям (и даже техническим) создавать «типы контента». Типом контента может быть что-то вроде сообщения в блоге, продукта, вакансии, события или чего-то более «эзотерического», например, кадровой записи.

CCK позволяет пользователям добавлять любое количество полей к своим типам контента, чтобы полные объекты контента могли быть сохранены в cms. В терминологии Drupal эти объекты содержимого называются «узлами».

Дополнительный модуль CCK — это представления. Views добавляет еще один пользовательский интерфейс, который позволяет нетехническим пользователям выбирать «узлы» из CMS, используя довольно сложные критерии, сортировать их и выбирать, какие поля отображать на выходе. Представления могут выводиться в виде таблиц, сеток, неформатированных списков или «представления узлов», что позволяет программистам гибко кодировать вывод.

Есть много не веб-приложений, которые делают что-то похожее на Views, так что это не оригинальная идея, но Views удобные, продвинутые и мощные.

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

Это мощный инструмент. Даже для меня, как программиста, так быстро создавать типы контента и выводить их с помощью представлений, что я могу сэкономить дни (или даже недели) на программирование пользовательских интерфейсов для достижения того же эффекта, что и в других системах управления контентом.

Более того, поскольку CCK сам по себе является расширяемым, сообщество Drupal создало множество свободно загружаемых типов полей, так что можно иметь поля, в которых хранятся изображения, документы, категории, что угодно!

Тип поля CCK Date с его способностью обрабатывать повторяющиеся даты и разными уровнями «детализации» — это особое произведение искусства. Чтобы создать такую ​​же богатую функциональность по обработке дат в специальных формах, потребуются дни программирования, но здесь он доступен бесплатно с быстрой загрузкой и простой установкой.

Редактирование и обработка изображений WYSIWYG
Редактирование WYSIWYG и обработка изображений — одно из слабых мест в системах управления контентом с открытым исходным кодом и Drupal. не является исключением.

Редактирование WYSIWYG было бы лучше описать как редактирование «форматированного текста», поскольку оно происходит в «поле редактирования форматированного текста», и содержимое необходимо предварительно просмотреть, чтобы увидеть, что он будет * действительно * похоже. В Drupal редактирование WYSIWYG, кажется, прибавляется после размышлений (больше, чем кажется, я подозреваю).

Несмотря на запрет на редактирование WYSIWYG, единственное место, где я Мы обнаружили, что Drupal серьезно не хватает обработки изображений в полях редактирования форматированного текста.

Если вы используете редактирование обычного текста, процесс добавления изображений в порядке. Щелкните значок « Image Assist », которая будет представлена ​​с категоризированным списком существующих изображений или возможностью загрузки нового изображения. Параметр« Загрузить новое изображение »работает плавно, позволяя вам определять атрибуты изображения, такие как его« альтернативный »текст, с выравниванием по левому или правому краю, и показывать ли гвоздь или в полный размер.

Проблема в том, что какой-либо редактор WYSIWYG, который вы используете, не «знает» о Drupal, что приводит к сложной процедуре, включающей переключение между режимами редактирования, настройку выравнивания в двух местах и ​​проблемы, если вы попробуете некоторые из варианты, которые, похоже, вообще не работают.

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

Честно говоря, неуклюжая обработка изображений в редакторах форматированного текста контрастирует с превосходной обработкой изображений во всей остальной части Drupal.

Типы контента могут быть созданы с помощью полей изображений », Которые позволяют прикреплять одно или несколько изображений к элементам (узлам) контента и ссылаться на них с использованием имени поля в представлениях или шаблонах. Загрузка изображений очень проста и надежна, а модуль ImageCache позволяет гибко изменять размер изображений на лету без потери производительности.

URL-адреса и псевдонимы

Простая, но важная часть любой системы управления контентом, но в которой, очевидно, легко ошибиться. Drupal понимает это совершенно правильно!

Drupal позволяет использовать дружественные URL-адреса в формате «/my-friendly-url». URL-адрес может быть введен автором контента при создании контента или обычно он автоматически генерируется системой с использованием заголовка контента и набора простых правил. Например, сообщениям в блогах присваивается URL-адрес, например/blog/my-blog-title, URL-адрес продуктов -/products/my-product-name и т. Д.

URL-адреса являются« платформенно-нейтральными »в том смысле, что у файлов нет расширения .php или .html. Это должно быть абсолютным требованием любой современной системы управления контентом для предотвращения неработающих ссылок в случае изменения системы управления контентом.. URL-адреса также являются «предполагаемыми» в том смысле, что обычно посещение/blog или/products генерирует соответствующий и предсказуемый контент.

Можно поддерживать набор «псевдонимов» для любого URL-адреса в системе. . Например, если у вас есть URL-адрес «/products/offer/my-special-offer», но в маркетинговых целях вы хотели бы опубликовать упрощенный URL-адрес «/special-offer» или «/july-madness» или что-то еще легко достижимо через простой пользовательский интерфейс. Также легко увидеть все URL-адреса, которые публикует ваша система Drupal, и либо удалить их, либо присвоить им псевдонимы.

Forms
Drupal имеет отличную базовую архитектуру форм, называемую Forms API. Forms API упрощает разработку форм и в то же время упрощает для разработчиков кодирование форм в соответствии с общим стандартом.

Forms API предоставляет набор типов полей и других элементов формы, которые означают что высококачественные формы могут быть быстро «собраны», и разработчикам не нужно беспокоиться о кодировании каких-либо деталей, таких как установка меток, базовая проверка или многоязычный перевод.

Поддерживаются все очевидные типы полей, такие как текстовые поля, поля выбора, флажки и т. д. API форм также автоматически добавляет сложная проверка данных представленных форм для защиты от уязвимостей, таких как атаки с использованием SQL и сценариев.

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

Forms API — это e xtensible разработчиками модуля, позволяющими добавлять в систему дополнительные типы полей. Ярким примером этого является модуль «Иерархический выбор», который реализует очень аккуратное и гибкое решение проблемы, когда пользователям предлагается выбрать из длинного списка «древовидных» данных. Демонстрация модуля иерархического выбора доступна здесь.

Отличной особенностью Drupal Forms API является возможность для разработчиков кодировать модули, вызывающие функцию с именем form_alter (). Эта функция может изменять поведение любой другой формы в системе Drupal. Это можно использовать для добавления (или удаления) дополнительных полей в форму или для изменения того, что происходит при отправке формы. Сложности этого обрабатываются внутри Drupal, и используется кеширование, так что form_alter можно широко использовать, не влияя на производительность. Это дает разработчикам модулей огромные возможности и возможности для настройки и улучшения интерфейса Drupal.

Еще одна замечательная функция — это возможность для разработчиков модулей вызывать «drupal_execute ()» для отправки данных в формы в других модулях. Это автоматически превращает каждую форму в мини-API.

Модуль Webform позволяет конечным пользователям создавать формы, используя интерфейс «укажи и щелкни», не зная ничего о базовом API форм. Модуль Webforms позволяет пользователю указать простые действия при отправке формы, чтобы разрешить отправку данных представленных форм по электронной почте или регистрацию в базе данных. Ответы на формы, зарегистрированные в базе данных, можно запрашивать, загружать или публиковать с помощью модуля Views.

Модули и разработка
Одно из лучших преимуществ Drupal — это широта и глубина свободно доступных модулей. На сайте Drupal.org представлено около 6000 модулей. Я обнаружил, что все используемые мной модули довольно хорошо документированы, очень просты в установке и настройке.

В отличие от многих других CMS, свободно доступные модули (я не видел платных -для своих) превосходного качества. Поистине, произведения искусства управления контентом.

Сообщество Drupal скоординировало разработку модулей, чтобы не было много до степени смешения похожих модулей, выполняющих разные варианты одного и того же. Как правило, существует один незаметный, но сложный модуль с легко настраиваемыми параметрами, который делает все, что вы когда-либо хотели — и обычно даже больше!

Drupal был создан с нуля для обеспечения расширяемости. Это достигается с помощью концепции «крючков». Хуки позволяют разработчикам модулей писать код, который присоединяется к событию или действию в системе. Разработчики модулей могут использовать хуки для изменения большинства аспектов поведения системы по умолчанию, и, что не менее важно, разработчики могут создавать свои собственные хуки, чтобы позволить другим разработчикам повторно использовать и улучшать свои модули.

В результате получается, что большинство модулей Drupal интегрируются с другими модулями Drupal и полагаются на них. Полученные зависимости прекрасно управляются в простом пользовательском интерфейсе и хорошо документированы на странице модулей drupal.org.

Таксономия и категоризация
Drupal имеет очень продвинутая функция таксономии и категоризации.

Для тех, кто не знает, таксономия — это иерархический список категорий, которые можно использовать для классификации контента как относящегося к определенной теме.

Таксономии полезны для навигации, фильтрации результатов поиска по определенным темам и для поисковой оптимизации, чтобы обеспечить «релевантность» определенным категориям контента.

Легко создать и поддерживать несколько таксономии в Drupal и классифицируйте контент по одному или всем из них.

Модуль Content Construction Kit (CCK) позволяет создавать поля контента, в которых хранятся результаты пользовательской классификации. CCK позволяет классифицировать (или маркировать) контент одним из нескольких способов. Категории можно выбрать из списка (используя традиционный список выбора или иерархический выбор) или ввести теги с предложениями из интеллектуального текстового поля.. Этот процесс чрезвычайно удобен и поддерживает таксономии, онтологии или фолксономии, если это то, что вы ищете.

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

jQuery
Я не буду притворяться полностью понимать степень и детали интеграции Drupals с jQuery. Я знаю, что Drupal разумно реализует «поведение jQuery» для прозрачного и значительного улучшения многих областей пользовательского интерфейса. Во всех случаях, которые я видел, интеграция постепенно ухудшалась, если JavaScript недоступен.

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

Профили пользователей и разрешения
Drupal — это система публикации сообщества, что означает, что управление большим количеством пользователей является основной частью ее функциональности.

Некоторые из этих пользователей будут доверенными «членами команды» »И другие будут очень ненадежными« анонимными »посетителями Интернета. Drupal предоставляет средства для предоставления им всем контролируемого доступа для редактирования контента безопасным способом в зависимости от их уровня доверия.

Drupal включает в себя все стандартные функции регистрации/входа/забытого пароля в красивом интерфейс с вкладками и может отправлять персонализированные сообщения для подтверждения адресов электронной почты до утверждения новых пользователей.

Drupal поддерживает создание неограниченного количества «ролей». Каждой роли может быть назначен набор разрешений, и каждый пользователь может быть связан с одной или несколькими ролями, чтобы определять, что каждому пользователю разрешено делать.

Кроме того, Drupal также имеет концепцию «форматов ввода», которая обеспечивает преобладающее ограничение на типы контента, который может вводить пользователь с данной ролью. Например, это означает, что ненадежный анонимный пользователь может добавлять комментарии, но может использовать только простые теги html, такие как или . Автору доверенного контента может быть разрешен «полный HTML», что означает, что он может использовать любой тег HTML или контент. Это предотвращает создание ненадежных групп пользователей контента, уязвимого для атак путем внедрения сценария, или более вероятных комментариев с ужасными тегами форматирования, такими как «marquee» или «blink».

Drupal упрощает задачу для разработчиков модулей для включения и проверки прав пользователей в код модуля. В результате модули обычно имеют очень подробные разрешения, контролирующие, что каждая роль может делать с данным модулем..

Обратной стороной этого при настройке нетривиального сайта с несколькими ролями и несколькими модулями является то, что можно легко проверить более 1000+ разрешений. Это может быть что-то вроде задачи — хотя это не так плохо, как кажется.

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

Несмотря на то, что настраиваемые профили великолепны, быстро наступает момент, когда возникает некоторая путаница. Было бы очень хорошо использовать поля CCK в ваших профилях. Это то, что осознали многие пользователи Drupal, и существует ряд решений для использования типов контента в качестве профилей. У этого подхода есть ряд плюсов и минусов, но суть в том, что в настоящее время в этой области есть значительные сложности, и неясно, что делать, чтобы Drupal 6 был лучше совместим с версией 7.

(Насколько я понимаю, поскольку представления и CCK являются основными функциями в Drupal 7, поля CCK могут применяться непосредственно к профилям пользователей в версии 7, однако это не помогает людям, создающим рабочие сайты в версии 6. К счастью, «профили содержимого» настолько хорошо используются в 6, что я уверен, что будет путь обновления до 7 независимо от того, какой выбор вы сделаете сейчас)

Multi -Управление сайтами с помощью Drupal
Для многих организаций (или даже отдельных лиц) нередко имеется более одного веб-сайта или даже десятки или сотни веб-сайтов.

Каждый веб-сайт создает накладные расходы на обслуживание с точки зрения обновления программного обеспечения и исправлений модулей для обеспечения безопасности, поддержки шаблонов и тем и обслуживания пользователей, роли и разрешения. Использование многосайтовой архитектуры может сэкономить огромное количество времени и упростить для пользователей перемещение по корпоративному «портфелю» сайтов без повторной регистрации.

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

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

Модуль Drupal «Multisite Manager» позволяет нетехническим пользователям создавать и удалять микросайты почти так же легко, как создание сообщений в блогах (хотя, честно говоря, модуль Multi-site подходит не для всех пользователей — я бы посоветовал только опытным пользователям ).

Модуль Drupal Remote Dashboard — новый модуль (работает лучше всего на Drupal 7), что позволяет централизованно управлять полностью отдельными установками Drupal (то есть разными серверами в разных центрах обработки данных) и обновлять их с помощью одной главной установки. (Основной установкой должен быть Drupal 7. Подчиненные сайты могут быть Drupal 6 или 7). Это идеально подходит для разработчиков, которые управляют несколькими сайтами Drupal для нескольких клиентов. Remote Dashboard можно комбинировать (или нет) с модулем Multi-site. .

Электронная коммерция
Ни одно обсуждение Drupal или электронной коммерции с открытым исходным кодом не может быть полным без упоминания модуля электронной коммерции Drupals … Ubercart .

Трудно понять, с чего начать обобщение Ubercart всего в нескольких строках. Ubercart — это намного больше, чем просто корзина для покупок, отсюда и название.

Ubercart использует Drupal и его библиотеку модулей, так что представления, CCK и меню таксономии, среди прочего, могут использоваться при создании онлайн-каталога продуктов и магазина.

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

Ubercart позволяет (через Drupal Actions) добавлять «роли» пользователям, когда они совершают покупку в вашем магазине Drupal. Эти роли могут быть постоянными или истекать через определенный период времени. Это упрощает создание «платных стен» или продажу цифровых товаров через безопасную загрузку (и позволяет платным клиентам повторно загружать их в любое время).

Модуль Ubercart Userpoints позволяет участникам сайта платить за товары с виртуальной валютой.

Ubercart сама по себе является передовой системой электронной коммерции — просто так случилось, что она полностью интегрирована с мировой передовой системой управления контентом с открытым исходным кодом.

Входные фильтры
Входные фильтры — небольшая, но важная часть системы Drupal. Для меня они символизируют внимание к деталям, продуманности и просто «правильность», которые вошли в разработку Drupal.

Каждый раз, когда пользователь сохраняет контент, он помещается в базу данных * точно * как пользователь ввел его. В то же время контент проходит через список входных фильтров. Каждый фильтр в списке запускается последовательно для содержимого, каждый из которых может каким-либо образом изменять содержимое.

Например, входной фильтр может гарантировать, что HTML-код, введенный пользователем, безопасен (т.е. не включает теги или ), а другой может изменить все вхождения строки {user_real_name} на настоящее имя текущего пользователя, вошедшего в систему. Для большей части контента будет запущен ряд входных фильтров в зависимости от того, какой «формат ввода» используется..

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

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

При включенном кешировании простая установка Drupal на умеренном сервере может поддерживать очень большое количество одновременных пользователей.

Для сайтов с очень высоким трафиком модуль Drupal Memcached использует алгоритм для хранения наиболее часто используемых страниц в ОЗУ, чтобы полностью обслуживать их из кеша с помощью абсолютный минимум обработки. (Drupal Memcached не подходит для учетных записей общего хостинга).

Как и во многих CMS текущего поколения, кеширование в Drupal 6 не так хорошо работает для аутентифицированных пользователей. Если пользователь аутентифицирован, вполне вероятно, что страница и различные элементы будут персонализированы для этого пользователя, и для системы кеширования становится сложно узнать, может ли она обслуживать определенный фрагмент контента из кеша или его нужно регенерировать с нуля.

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

Drupal 7 и будущее
На момент написания, Drupal 7 приближается к бета-версии, и, похоже, в ближайшем будущем ожидается выпуск рабочей версии.

С другой стороны, Drupal 6 уже великолепен, надежен и стабилен, поэтому, пока я очень хочу начать создавать и запускать сайты Drupal 7, я не спешу с этим.

В Drupal 7 есть несколько больших улучшений, таких как «наложение администратора» и превращение представлений и CCK в основную часть системы, что, как я думаю, значительно сократит сложность обучения. с Drupal 6.

Значительные улучшения в обработке изображений с расширенным контентом также были сделаны для Drupal 7.

Похоже, Ubercart 2 будет доступен для Drupal 7, но затем разработка Ubercart перейдет на совершенно новый модуль (в том же духе) под названием DrupalCommerce. Будет путь обновления с Ubercart до DrupalCommerce.

Заключение
10 лет назад, когда я был разработчиком для Immediacy (основанный на .NET поставщик CMS с закрытым исходным кодом), CMS с открытым исходным кодом были довольно простыми. Было легко понять, почему организации, которые могли себе это позволить, были готовы платить десятки тысяч фунтов за хорошее качественное, но проприетарное программное обеспечение для управления контентом..

В наши дни системы с открытым исходным кодом, такие как Drupal, прокладывают путь и устанавливают стандарты, которым стараются следовать устаревшие коммерческие системы управления контентом.

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

Многие организации по-прежнему платят 30 000 фунтов стерлингов и выше в качестве лицензионных сборов, но при этом терпят нестандартную документацию, плохую поддержку и дорогие, базовые модули и плагины. Таким организациям было бы трудно поверить, насколько лучше они могли бы получить его бесплатно.

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

Об авторе
Саймон Гарднер — внештатный веб-технолог, специализирующийся на управлении контентом и, в частности, на Drupal. Для получения дополнительной информации о преимуществах Drupal, Саймон может связаться через его блог

Оцените статью
techsly.ru
Добавить комментарий