|
|
|
solenko |
|
||||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 1 Всего: 67 |
Drupal
Все написаноое ниже посвящено drupal 5. Насколько мне известно, изменения в drupal 6 касаются деталей, а не общих принципов, так что обзор можно считать актуальным и для него. Модули в друпал. Каждый модуль представляет из себя как минимум два файла:
Система хуков hook представляет собой функцию специального вида, имя которой строится по принцику {имя_модуля}_{имя_хука}. Я опишу только несколько хуков, которые принципиальны для понимания системы. Полный список стандартных хуков можно посмотреть здесь. hook_menu - описан ниже при рассмотрении системы меню Весь контент в Drupal управляется core модулем node (поэтому отдельный элемент контента принято назвыть node, нодом). Он управляет базовым контентом, таким как статьи и страницы. Модуль node берет на себя управление такими аттрибутами:
Для порождения нового типа контента существует набор хуков:
hook_nodeapi -- этот хук вызывается после того, как отработали функции модуля node и модуля, породившего content type этого нода. Он принимает как параметры опрецию, которая сейчас происходит (сохранение, просмотр и т.д.) и объект node. Т.к. node передается по ссылке, то мы можем изменить его. Таком образом добавляются дополнительные возможности нодам. Например, возможность прикрепления файлов, автоматическое создание URL алиаса и другое. Drupal имеет свой API для работы с формами. Чаще всего, формирование формы выглядит следующим образом:
где form_id -- имя функции, которая фозвращает массив элементов формы. Подробнее о Druapl From API можно почитать здесь. Также есть хук, который позволяет повлиять на уже сформированную форму. hook_form_alter принимает как параметр id формы и сам массив элементов, т.е. мы можем изменить или удалить любое поле формы или добавить новое. Также, с помощью специальных элементов формы #submit и #validate можно добавлять функции обратного вызова. Еще один важный хук, который позволяет достичь гибкости системы -- hook_db_rewrite_sql. Запросы на выборку нодов и некоторых дргих элементов принято перед выполнением обрабатывать функцией db_rewrite_sql, т.е. запрос к базе выглядит приблизительно так:
Функция db_rewrite_sql вызывает хуки hook_db_rewrite_sql, которые могут переписать sql запрос (в следующий хук попадает sql, который возвращает предидущий). Т.о. осуществляется управление доступом для выборок списков нод -- хук просто добавляет соответствующие join и where, которые отсеивают ноды, доступ к которым запрещен текущему пользователю. Система меню Система меню drupal имеет очень малого общего с меню в общепринятом понимании. Это не набор ссылок, которые видит пользователь, а набор URL и сопоставленных им callback функций. Меню формируется при помощи хука hook_menu. Из этого хука каждый модуль возвращает массив, содержачий для каждого пунта меню URL, callback, тип меню и доступен ли он для текущего пользователя. При этом URL не обязательно статичен. Т.к. на момент вызова хука мы уже имеем URL страницы, то часто можно встретить такую конструкцию:
Подробнее о систеие иеню можно почитать здесь. Другое Централизованного кеширования в системе нет. Есть билиотека, предназначенная для управления кешом, хранящимся в базе. Сам drupal кеширует только структуру меню, возлагая остальное на модули. В качестве шаблонизатора используется сам php. Система шаблонов работает по принципу "если не определено другого, то используем тему по умолчанию". Весь вывод происходит с помошью функции theme(). Например, в скрипте мы вызываем theme('node_list', $data); Если есть файл {имя_сайта}_node_list, то будет использована она. Если нет, то ищем функцию {имя_темы}_node_list. Если нет и ее, то отрабатывает дефолтная theme_node_list. Основной плюс Drupal -- его гибкость. Естественно, за эту гибкость приходится платить. Основный расходы -- большое количество запросов к базе данных. Стандартный алгоритм для отображения списка нодов: 1. Выбор списка id нодов, соответствующих условию. 2. Выполнение для каждого id фенкции node_load() При этом, количество запросов зависит от количества модулей, измеяющих этот нод. Обычно один модуль == один запрос, но бывает и больше. -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
||||||
|
|||||||
Sardar |
|
|||
Бегун Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: нет Всего: 317 |
Это большой плюс. Несколько вопросов (доку не читал, вопросы скорее как check list для нашей поделки). Хуки вещь интересная, но навязывает имена функций и кажется все функции должны быть свободными. Ни модулей, ни неймспейсов в PHP нет, поэтому удобно организовывать функции как статичные методы классов, можно ли задать тогда хук как "SomeClass:hookLoad()" и т.п.? Схема построения адресов (URL'ов) пока выглядит жёстко заданной, т.е. страница будет доступна по "/node/453/view', а как сделать просто "/about_us"? Как с много-языковой поддержкой? Как узнать какая локаль сейчас установлена и под каким языком выдавать контент (кодировки исключаем, UTF-8 only). Если контент под заданным языком не нашли, то нужно отдавать под "близкими" и опциональными. В принципе не плохая собственная поделка на эту тему тут и тут. Как собирается страница? Пока видно по хуку можно echo html содержимое, значит собственные вызовы шаблонизатора и другое. А как с другими типами контента, WAP, data XML (для тулбаров, менюшек и других клиентов), быть может какой навороченный фейс на silverlight документе? А вообще движок интересный, покопаюсь на досуге, кажется многое можно из него почерпнуть. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
solenko |
|
||||||||||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 1 Всего: 67 |
Drupal не приемлет ООП как такового. Все, что представляется там как объект -- экземпляр stdClass и используется просто вместо хешей. Потому "SomeClass::hookLoad()" невозно. Хотя я, признаться не вижу особой разницы -- просто замена "::" на "_". Применительно к нашей CMS, я бы сделал именно добавленим слушателей на события. Тогда название метода не имеет значения. Кроме того, листенеры должны кешироваться, чтобы не опрашивать модули каждый раз.
1. Есть алиасы, хранящиеся в базе. Т.е. можно просто сопоставить лубому реальному URL системы алиас. Прямое преобразование выполняется при использовани функции url (стандартные функции типа l() -- создание ссылки -- ее вызывают). обратное преобразование выполняется при старте системы и модули получают уже "истинный" URL (поэтому есть функция arg(), заменяющая прямое обращение к GET). 2. Есть хук custom_url_rewrite, который позволяет выполнять прямое и обратное преобразование руками.
Поддержа многих языков. Локаль либо выставляется вручную, либо определяется автоматически. Все тексты проходят через функцию перевода -- t() -- если в локале есть перевод, то выдается он. Если нет, то выдается исходная строка.
Есть основной шаблон страницы, в кторый выводятся стандартные элементы -- sidebar'ы, menu и content. Стандартные элементы собираются из кусков. sidebar'ы -- наборы блоков. Основной контент -- то, что возвращает callback. echo можно делать только из файлов шаблонов. Из theme функций контент не выводится а возвращается.
Пока не готов ответить -- просто не сталкивался. Думаю можно просто переключить тему, но не уверен. Добавлено через 11 минут и 1 секунду Заглянул в репозиторий модулей... Это, конечно, не штатная поддержка разных видов представления контента, но решение в 5 строк есть -- можно легко сменить текущую тему в хуке init, например. -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
||||||||||
|
|||||||||||
solenko |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1473 Регистрация: 15.1.2006 Где: Украина Репутация: 1 Всего: 67 |
Sardar, может сделаеш такой же обзор по Joomla?
Да и другие CMS тоже не помешают. Вобщем кто с чем работал -- отпишитесь. -------------------- Ла-ла-ла-ла Заметьте, нет официального подтверждения, что это не просто четыре слога. |
|||
|
||||
kaa |
|
|||
Опытный Профиль Группа: Участник Сообщений: 817 Регистрация: 5.11.2005 Репутация: нет Всего: 2 |
С вашего позволения, если можно, я вставлю свои замечания по друпалу, немного совсем
В нем есть такая очень немаловажная штука как CCK, она очень плотно взаимодействует с модулем node и сама из себя представляет тоже модуль. Позволяет создавать новые типы документов, расширяя уже имеющиеся в системе, кликами мыши без всякого кода. В шестой версии получила дальнейшее развитие система Action-ов, тоесть можно определить какое-либо заранее установленное действие при совершении какого-либо события(например создан документ -> отправляем письмо куда-нить). В пятой версии полноценно работать с ними можно было только через модули, если мне не изменяет память. В 6-ой уже можно все через WEB-морду настраивать. Модуль может производить операции "инсталляции" и "деинсталляции", насколько об этом можно говорить в палне CMS. для этого имеется файл {module_name}.install. Обычно там прописываются операции по работе с базой данных и по очистке её от своих данных. Одна деталька: при инсталляции в, 6-ой версии, для работой с БД не используются SQL - команды, а создаётся некая схема: древоподобное описание создаваемых таблиц. Тут есть как плюс - полностью можно абстрагироваться при написании модуля от того, с какой базой будет работать сам движек, так - на сугубо личный взгляд - и минус. Минус в том что синтаксис такого описательства довольно непривычен, вот до сих пор к нему не привык, содержит много лишней информации для описания + невозможность учесть особенности каждой БД если сильно надо. Напрмер я так и не смог найти там эквивалент типа enum MySQL-я. Sardar,
Если я правильно понял вопрос: вернуть XML можно с помощью модуля определив в нем callback пункт меню. Это пункт, обработчик которого возвращает что хочет и на этом обработка запроса заканчивается; по WAP - там есть такая штука как встроенный мультисайтинг, лично с ним не знаком, но думаю можно сделать параллельный портал с той же БД но другим выводом содержимого, только модулями. Специально под WAP Drupal не заточен. |
|||
|
||||
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Vingrad CMS | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |