Работа с материалами (nodes) в Drupal 7

15
Работа с материалами (node) в Drupal 7 Материал (node) — основная единица контента в Drupal Каждый материал в системе имеет собственную страницу с адресом вида node/номер_материала. (node/17)

description

Лекция для студентов НТУ ХПИ. Рассматривает основы работы с материалами (nodes) в Drupal 7 - NodeAPI, хуки для работы с материалами,

Transcript of Работа с материалами (nodes) в Drupal 7

Page 1: Работа с материалами (nodes) в Drupal 7

Работа с материалами (node) в Drupal 7

Материал (node) — основная единица контента в Drupal Каждый материал в системе имеет собственную страницу с

адресом вида node/номер_материала. (node/17)

Page 2: Работа с материалами (nodes) в Drupal 7

Типы материалов (node types) в Drupal 7

Материал могут быть различных типов – по-умолчанию доступны Page и Article (/admin/structure/types)

Page 3: Работа с материалами (nodes) в Drupal 7

Типы материалов (node types) в Drupal 7

Типы материалов добавляются – модулями (например Forum, Blog)

– вручную (/admin/structure/types/add)

Page 4: Работа с материалами (nodes) в Drupal 7

Создание новых материалов (node) в Drupal 7

Drupal cоздает форму для добавления/редактирования материалов каждого типа

– /node/add/<название типа>

Page 5: Работа с материалами (nodes) в Drupal 7

Как материалы храняться в БД 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 - флаг, определяющий, закреплялась ли нода вверху списков в данной версии

Page 6: Работа с материалами (nodes) в Drupal 7

Как материалы храняться в БД 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 - язык, для которого задается алиас

Page 7: Работа с материалами (nodes) в Drupal 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;

Page 8: Работа с материалами (nodes) в Drupal 7

Редактирование, удаление материалов в БД 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 нужной ноды

Page 9: Работа с материалами (nodes) в Drupal 7

Вывод и отображение материалов в БД Drupal 7

node_view() - рендеринг содержимого ноды – $node = node_load(17); //указываем nid нужной ноды

//указываем какой вид отображения //полный 'full' или анонс 'teaser'//указываем какой язык нужен (необязательно)//если NULL — береться текущий язык сайта$rendered_node = node_view($node, 'full', NULL);//полученный массив преобразуем в HTMLprint drupal_render($rendered_node);

Page 10: Работа с материалами (nodes) в Drupal 7

Хуки для работы с материалами в БД 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); }}

Page 11: Работа с материалами (nodes) в Drupal 7

Хуки для работы с материалами в БД 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, ); }}

– function mymodule_node_view_alter(&$build) {//поменяем нахвание ссылки Read more$build['links']['node']['#links']['node-readmore']['title'] = t('New Title');}

Page 12: Работа с материалами (nodes) в Drupal 7

Хуки для работы с материалами в БД 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;}}

Page 13: Работа с материалами (nodes) в Drupal 7

Расширенные возможности

Понятие “сущности” (entity) как более высокого уровня абстрации над материалом

Работа с ревизиями материалов

Работа с мультиязычными материалами

Работа с дополнительными полями материалов (отдельная лекция)

Работа с шаблонами материалов (отдельная лекция)

Page 14: Работа с материалами (nodes) в Drupal 7

Ссылки на подробную информацию

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

Page 15: Работа с материалами (nodes) в Drupal 7

Контакты

Фиделин Евгений

Компания QArea

Email: [email protected]

Skype: eugene.fidelin