Фичи н-н-нада? Или почему стоит использовать модуль Features.
Работа с материалами (nodes) в Drupal 7
1. Работа с материалами (node) в Drupal 7
Материал (node) — основная единица контента в Drupal
Каждый материал в системе имеет собственную страницу с
адресом вида node/номер_материала. (node/17)
2. Типы материалов (node types) в Drupal 7
Материал могут быть различных типов
– по-умолчанию доступны Page и Article (/admin/structure/types)
3. Типы материалов (node types) в Drupal 7
Типы материалов добавляются
– модулями (например Forum, Blog)
– вручную (/admin/structure/types/add)
4. Создание новых материалов (node) в Drupal 7
Drupal cоздает форму для добавления/редактирования
материалов каждого типа
– /node/add/<название типа>
5. Как материалы храняться в БД Drupal 7
Таблица node — базовая информация о всех нодах
nid - первичный ключ таблицы
vid - связка с таблицей node_revision, идентификатор текущей версии ноды
type - связка с таблицей node_type, тип материала данной ноды
language - связка с таблицей languages, текущий язык материала
title - заголовок ноды
uid - идентификатор пользователя-собственника ноды, как правило тот, кто ее создал
status - флаг, определяющий опубликована ли нода
created - unix timestamp времени создания ноды
changed - unix timestamp времени последнего обновления ноды
comment - флаг, определяющий позволено ли коментировать данную ноду
promote - флаг, определяющий выведена ли нода на главную страницу сайта
sticky - флаг, определяющий нужно ли закреплять ноду вверху списков
tnid - идентификатор набора переводов для данной ноды
translate - флаг, определяющий должен ли быть обновлен перевод для данной ноды
Таблица node_revisions — информация о каждой
сохраненной версии ноды
nid - какой ноде принадлежит данная версия
vid - первичный ключ таблицы
uid - идентификатор пользователя, создавшего данную версию ноды
title - заголовок данной версии ноды
log - запись лога, описывающая изменения в данной версии по сравнению с предыдущей
timestamp - unix timestamp времени создания версии ноды
status - флаг, определяющий, была ли опубликована нода в данной версии
comment - флаг, определяющий, разрешалось ли комментировать ноду в данной версии
promote - флаг, определяющий, выводилась ли нода на главную страницу сайта в данной версии
sticky - флаг, определяющий, закреплялась ли нода вверху списков в данной версии
6. Как материалы храняться в БД Drupal 7
Таблица field_data_body — значения поля body ноды
entity_type - тип сущности. В нашем случае всегда будет = 'node'.
bundle - тип материала.
deleted - флаг, показывающий было ли это поле удалено
entity_id - связка с сущностью. В нашем случае, с полем nid из таблицы 'node'.
revision_id - связка с версией сущности, В нашем случае, с полем мid из таблицы 'node_revisions'.
language - язык поля
delta - порядковый номер, используется для полей, принимающих множество значений
body_value - собственно, значение поля
body_summary - краткое значение поля, тизер
body_format - связка с таблицей filter_format, формат ввода для данного поля
Таблица url_alias — синонимы (aliases) системных путей
Drupal
pid - первичный ключ таблицы
source - системный путь Drupal, для которого задаем алиас (например, node/1)
alias - сам алиас (например company/about)
language - язык, для которого задается алиас
7. Создание новых материалов в БД Drupal 7
node_save() - создание новой ноды и сохранение в БД
– $new_node = new StdClass();
$new_node->type = 'page';
$new_node->title = 'Новый заголовок';
$new_node->status = 1;
$new_node->promote = 1;
$new_node->comment = 2;
$new_node->sticky = 0;
$new_node->language = 'ru'; //если нет языков - LANGUAGE_NONE
$new_node->body[$node->language]['0']['value'] = 'Содержимое';
$new_node->body[$node->language]['0']['summary'] = 'Анонс';
$new_node->body[$node->language]['0']['format'] = 'full_html';
$new_node->uid = 1;
$node->path = array('alias' => 'url/goes/here');
node_save($new_node);
// узнаем какой ID присвоился созданной ноде
$nid = $new_node->nid;
8. Редактирование, удаление материалов в БД Drupal 7
node_load() и node_save() - загрузка и обновление ноды
– $node = node_load(17); //указываем nid нужной ноды
//теперь в $node храниться вся информация о ноде
//загруженная из БД
//меняем нужные значения
$node->title = 'Обновили заголовок';
$node->status = 0;
$node->body[$node->language]['0']['value'] = 'Новое';
$node->body[$node->language]['0']['summary'] = 'Новое';
$node->body[$node->language]['0']['format'] = 'full_html';
node_save($node);
node_delete() - удаление ноды
– node_delete(17); //указываем nid нужной ноды
9. Вывод и отображение материалов в БД Drupal 7
node_view() - рендеринг содержимого ноды
– $node = node_load(17); //указываем nid нужной ноды
//указываем какой вид отображения
//полный 'full' или анонс 'teaser'
//указываем какой язык нужен (необязательно)
//если NULL — береться текущий язык сайта
$rendered_node = node_view($node, 'full', NULL);
//полученный массив преобразуем в HTML
print drupal_render($rendered_node);
10. Хуки для работы с материалами в БД Drupal 7
Создание новой ноды (вызов node_save() с данными новой
ноды)
– hook_node_presave() - для изменения ноды перед сохранением
– hook_node_insert() - для изменения новой ноды перед вставкой
– function mymodule_node_insert($node) {
if ($node->type == 'mytype') {
$node->path['alias'] = 'mytype/' . $node->nid;
}
}
Редактирование существующей ноды (вызов node_save() с
данными существующей ноды)
– hook_node_presave() - для изменения ноды перед сохранением
– hook_node_update() - для сущесвующей новой ноды перед
обновлением
– function mymodule_node_update($node) {
if ($node->type == 'mytype') {
$node->title = trim($node->title);
}
11. Хуки для работы с материалами в БД Drupal 7
Загрузка данных ноды (вызов node_load())
– hook_node_load() - для добавления своих данных или изменения
существующих
– function mymodule_node_load($nodes, $types) {
foreach ($nodes as $node) {
$node->mynewfield = 'node nid = '. $node->nid;
}
}
Отображение ноды (вызов node_view())
– hook_node_view() - для добавления содержимого к выводу
– hook_node_view_alter() - для изменения содержимого к выводу
– function mymodule_node_view($node, $view_mode, $langcode) {
if ($view_mode == 'full') {
$node->content['mycontent'] = array(
'#markup' => 'My node content',
'#weight' => 10,
);
}
}
12. Хуки для работы с материалами в БД Drupal 7
Удаление ноды (вызов node_delete())
– hook_node_delete() - для удаления собственных данных связанных
с нодой (нода еще существует в БД)
– function mymodule_node_delete($node) {
db_delete('mytable')
->condition('nid', $node->nid)
->execute();
}
Подготовка ноды к редактированию (отображение формы
добавления/редактирования ноды)
– hook_node_prepare() - для изменения данных выводимых на форме
– function mymodule_node_prepare($node) {
if (!isset($node->comment)) {
$node->comment = 2;
}
}
13. Расширенные возможности
Понятие “сущности” (entity) как более высокого уровня
абстрации над материалом
Работа с ревизиями материалов
Работа с мультиязычными материалами
Работа с дополнительными полями материалов (отдельная
лекция)
Работа с шаблонами материалов (отдельная лекция)
14. Ссылки на подробную информацию
http://api.drupal.org/api/drupal/modules!node!
node.api.php/group/node_api_hooks/7
http://api.drupal.org/api/drupal/modules!node!node.module/7
15. Контакты
Фиделин Евгений
Компания QArea
Email: eugene.fidelin@gmail.com
Skype: eugene.fidelin