Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Врага нужно знать в лицо! обзор популярных CMS 
:(
    Опции темы
solenko
Дата 2.3.2008, 23:33 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 1
Всего: 67



Drupal
Все написаноое ниже посвящено drupal 5. Насколько мне известно, изменения в drupal 6 касаются деталей, а не общих принципов, так что обзор можно считать актуальным и для него.

Модули в друпал.
Каждый модуль представляет из себя как минимум два файла:
  • {module_name}.info - файл описания модуля в формате ini
  • {module_name}.module - основной php код модуля
Модуль становится доступен для управления из админки сразу же после копирования его в одну из дирркторий:
  • /modules - обычно тут лежат только core модули
  • /sites/all - drupal позволяет управлять несколькими сайтами; это место предназначено для модулей, которые будут подключаться для каждого сайта
  • /sites/{site_name} - модули, которые будут доступны только для конкретного сайта.
Модуль не содержит никакого кода, исполняемого немедленно (исключением могут стать только объявления констант). Управление в модуль передается посредством функций специального вида -- хуков.
Система хуков
hook представляет собой функцию специального вида, имя которой строится по принцику {имя_модуля}_{имя_хука}.
Я опишу только несколько хуков, которые принципиальны для понимания системы. Полный список стандартных хуков можно посмотреть здесь.
hook_menu - описан ниже при рассмотрении системы меню

Весь контент в Drupal управляется core модулем node (поэтому отдельный элемент контента принято назвыть node, нодом). Он управляет базовым контентом, таким как статьи и страницы. Модуль node берет на себя управление такими аттрибутами:
  • Тип контента
  • Заголовок
  • Основное "тело" ноды
  • Автор
  • Дата создания и изменения
Новые типы контента (content type) могут создавать через админку (в таком случае их поведение будет определяться только модулем node) или порождаться модулем.
Для порождения нового типа контента существует набор хуков:
  • hook_node_info -- описывает новый content type;
  • hook_load, hook_insert, hook_update, hook_delete,  -- вызываются при загрузе, создании, изменении и удалении ноды, соответственно
  • hook_form, hook_validate, hook_submit  -- при показе формы редактирования ноды, ее валидации и отправке (т.е. после валидации, но до начала сохранения)
  • hook_view -- просмотр ноды
  • hook_access -- управление доступом
Также есть способ влиять на нод из других модулей.
hook_nodeapi -- этот хук вызывается после того, как отработали функции модуля node и модуля, породившего content type этого нода. Он принимает как параметры опрецию, которая сейчас происходит (сохранение, просмотр и т.д.) и объект node. Т.к. node передается по ссылке, то мы можем изменить его. Таком образом добавляются дополнительные возможности нодам. Например, возможность прикрепления файлов, автоматическое создание URL алиаса и другое.

Drupal имеет свой API для работы с формами. Чаще всего, формирование формы выглядит следующим образом:
Код

drupal_get_form('form_id');

где form_id -- имя функции, которая фозвращает массив элементов формы. Подробнее о Druapl From API можно почитать здесь.
Также есть хук, который позволяет повлиять на уже  сформированную форму.
hook_form_alter принимает как параметр id формы и сам массив элементов, т.е. мы можем изменить или удалить любое поле формы или добавить новое. Также, с помощью специальных элементов формы #submit и #validate можно добавлять функции обратного вызова.

Еще один важный хук, который позволяет достичь гибкости системы -- hook_db_rewrite_sql. Запросы на выборку нодов и некоторых дргих элементов принято перед выполнением обрабатывать функцией db_rewrite_sql, т.е. запрос к базе выглядит приблизительно так:
Код

db_query(db_rewrite_sql($sql));

Функция db_rewrite_sql вызывает хуки hook_db_rewrite_sql, которые могут переписать sql запрос (в следующий хук попадает sql, который возвращает предидущий). Т.о. осуществляется управление доступом для выборок списков нод -- хук просто добавляет соответствующие join и where, которые отсеивают ноды, доступ к которым запрещен текущему пользователю.

Система меню
Система меню drupal имеет очень малого общего с меню в общепринятом понимании. Это не набор ссылок, которые видит пользователь, а набор URL и сопоставленных им callback функций. Меню формируется при помощи хука hook_menu. Из этого хука каждый модуль возвращает массив, содержачий для каждого пунта меню URL, callback, тип меню и доступен ли он для текущего пользователя. При этом URL не обязательно статичен. Т.к. на момент вызова хука мы уже имеем URL страницы, то часто можно встретить такую конструкцию:
Код

if (arg(0) == 'node' && is_numeric(arg(1)))
  $items[] = array(
    'path' => 'node/'.arg(1).'/view',
    'callback' => 'some_function',
    'access' => true,
    'title' => t('Node view'),
    'type' => MENU_CALLBACK,
  );
}
return $items;

Подробнее о систеие иеню можно почитать здесь.

Другое
Централизованного кеширования в системе нет. Есть билиотека, предназначенная для управления кешом, хранящимся в базе. Сам drupal кеширует только структуру меню, возлагая остальное на модули.

В качестве шаблонизатора используется сам php. Система шаблонов работает по принципу "если не определено другого, то используем тему по умолчанию". Весь вывод происходит с помошью функции theme(). Например, в скрипте мы вызываем theme('node_list', $data); Если есть файл {имя_сайта}_node_list, то будет использована она. Если нет, то ищем функцию {имя_темы}_node_list. Если нет и ее, то отрабатывает дефолтная theme_node_list.

Основной плюс Drupal -- его гибкость. Естественно, за эту гибкость приходится платить. Основный расходы -- большое количество запросов к базе данных. Стандартный алгоритм для отображения списка нодов:
1. Выбор списка id нодов, соответствующих условию.
2. Выполнение для каждого id фенкции node_load()
При этом, количество запросов зависит от количества модулей, измеяющих этот нод. Обычно один модуль == один запрос, но бывает и больше.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Sardar
Дата 3.3.2008, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: нет
Всего: 317



Цитата(solenko @  2.3.2008,  22:33 Найти цитируемый пост)
Модуль становится доступен для управления из админки сразу же после копирования его в одну из дирркторий

Это большой плюс.

Несколько вопросов (доку не читал, вопросы скорее как check list для нашей поделки).

Хуки вещь интересная, но навязывает имена функций и кажется все функции должны быть свободными. Ни модулей, ни неймспейсов в PHP нет, поэтому удобно организовывать функции как статичные методы классов, можно ли задать тогда хук как "SomeClass:hookLoad()" и т.п.?

Схема построения адресов (URL'ов) пока выглядит жёстко заданной, т.е. страница будет доступна по "/node/453/view',  а как сделать просто "/about_us"? 

Как с много-языковой поддержкой? Как узнать какая локаль сейчас установлена и под каким языком выдавать контент (кодировки исключаем, UTF-8 only). Если контент под заданным языком не нашли, то нужно отдавать под "близкими" и опциональными. В принципе не плохая собственная поделка на эту тему тут и тут.

Как собирается страница? Пока видно по хуку можно echo html содержимое, значит собственные вызовы шаблонизатора и другое. А как с другими типами контента, WAP, data XML (для тулбаров, менюшек и других клиентов), быть может какой навороченный фейс на silverlight документе?

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


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
solenko
Дата 3.3.2008, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 1
Всего: 67



Цитата

Хуки вещь интересная, но навязывает имена функций и кажется все функции должны быть свободными. Ни модулей, ни неймспейсов в PHP нет, поэтому удобно организовывать функции как статичные методы классов, можно ли задать тогда хук как "SomeClass:hookLoad()" и т.п.?

Drupal не приемлет ООП как такового. Все, что представляется там как объект -- экземпляр stdClass и используется просто вместо хешей. Потому "SomeClass::hookLoad()" невозно. Хотя я, признаться не вижу особой разницы -- просто замена "::" на "_".
Применительно к нашей CMS, я бы сделал именно добавленим слушателей на события. Тогда название метода не имеет значения. Кроме того, листенеры должны кешироваться, чтобы не опрашивать модули каждый раз.

Цитата

Схема построения адресов (URL'ов) пока выглядит жёстко заданной, т.е. страница будет доступна по "/node/453/view',  а как сделать просто "/about_us"? 

1. Есть алиасы, хранящиеся в базе. Т.е. можно просто сопоставить лубому реальному URL системы алиас. Прямое преобразование выполняется при использовани функции url (стандартные функции типа l() -- создание ссылки -- ее вызывают). обратное преобразование выполняется при старте системы и модули получают уже "истинный" URL (поэтому есть функция arg(), заменяющая прямое обращение к GET).
2. Есть хук custom_url_rewrite, который позволяет выполнять прямое и обратное преобразование руками.

Цитата

Как с много-языковой поддержкой?

Поддержа многих языков. Локаль либо выставляется вручную, либо определяется автоматически. Все тексты проходят через функцию перевода -- t() -- если в локале есть перевод, то выдается он. Если нет, то выдается исходная строка.

Цитата

Как собирается страница? Пока видно по хуку можно echo html содержимое, значит собственные вызовы шаблонизатора и другое. 

Есть основной шаблон страницы, в кторый выводятся стандартные элементы -- sidebar'ы, menu и content. Стандартные элементы собираются из кусков. sidebar'ы -- наборы блоков. Основной контент -- то, что возвращает callback.
echo можно делать только из файлов шаблонов. Из theme функций контент не выводится а возвращается.

Цитата

А как с другими типами контента

Пока не готов ответить -- просто не сталкивался. Думаю можно просто переключить тему, но не уверен.

Добавлено через 11 минут и 1 секунду
Заглянул в репозиторий модулей... Это, конечно, не штатная поддержка разных видов представления контента, но решение в 5 строк есть -- можно легко сменить текущую тему в хуке init, например.



--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
solenko
Дата 4.3.2008, 12:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 1
Всего: 67



Sardar, может сделаеш такой же обзор по Joomla? 
Да и другие CMS тоже не помешают. Вобщем кто с чем работал -- отпишитесь.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
kaa
Дата 14.9.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 817
Регистрация: 5.11.2005

Репутация: нет
Всего: 2



С вашего позволения, если можно, я вставлю свои замечания  по друпалу, немного совсем smile

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

В шестой версии получила дальнейшее развитие система Action-ов, тоесть можно определить какое-либо заранее установленное действие при совершении какого-либо события(например создан документ -> отправляем письмо куда-нить). В пятой версии полноценно работать с ними можно было только через модули, если мне не изменяет память. В 6-ой уже можно все через WEB-морду настраивать.

Модуль может производить операции "инсталляции" и "деинсталляции", насколько об этом можно говорить в палне CMS. для этого имеется файл {module_name}.install. Обычно там прописываются операции по работе с базой данных и по очистке её от своих данных.

Одна деталька: при инсталляции в, 6-ой версии, для работой с БД не используются SQL - команды, а создаётся некая схема: древоподобное описание создаваемых таблиц. Тут есть как плюс - полностью можно абстрагироваться при написании модуля от того, с какой базой будет работать сам движек, так - на сугубо личный взгляд - и минус. Минус в том что синтаксис такого описательства довольно непривычен, вот до сих пор к нему не привык, содержит много лишней информации для описания + невозможность учесть особенности каждой БД если сильно надо. Напрмер я так и не смог найти там эквивалент типа enum MySQL-я.

Sardar
Код

А как с другими типами контента, WAP, data XML (для тулбаров, менюшек и других клиентов), быть может какой навороченный фейс на silverlight документе?


Если я правильно понял вопрос: вернуть XML можно с помощью модуля определив в нем callback пункт меню. Это пункт, обработчик которого возвращает что хочет и на этом обработка запроса заканчивается; по WAP - там есть такая штука как встроенный мультисайтинг, лично с ним не знаком, но думаю можно сделать параллельный портал с той же БД но другим выводом содержимого, только модулями. Специально под WAP Drupal не заточен.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Vingrad CMS | Следующая тема »


 




[ Время генерации скрипта: 0.1449 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.