SlideShare a Scribd company logo
Работа с материалами (node) в Drupal 7

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


    Материал могут быть различных типов
       –    по-умолчанию доступны Page и Article (/admin/structure/types)
Типы материалов (node types) в Drupal 7

    Типы материалов добавляются
      –    модулями (например Forum, Blog)
      –    вручную (/admin/structure/types/add)
Создание новых материалов (node) в Drupal 7

    Drupal cоздает форму для добавления/редактирования
    материалов каждого типа
       –   /node/add/<название типа>
Как материалы храняться в БД 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 - флаг, определяющий, закреплялась ли нода вверху списков в данной версии
Как материалы храняться в БД 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 - язык, для которого задается алиас
Создание новых материалов в БД 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;
Редактирование, удаление материалов в БД 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 нужной ноды
Вывод и отображение материалов в БД 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);
Хуки для работы с материалами в БД 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);
            }
Хуки для работы с материалами в БД 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,
               );
             }
           }
Хуки для работы с материалами в БД 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;
           }
           }
Расширенные возможности

    Понятие “сущности” (entity) как более высокого уровня
    абстрации над материалом

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

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

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


    Работа с шаблонами материалов (отдельная лекция)
Ссылки на подробную информацию


    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
Контакты

    Фиделин Евгений


    Компания QArea


    Email: eugene.fidelin@gmail.com


    Skype: eugene.fidelin

More Related Content

What's hot (16)

PDF
Authemployee
Tatiana rey
 
PPTX
Темизация и Twig в Drupal 8
DrupalSPB
 
PPT
Лекция 5
itc73
 
PPTX
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Ekaterina Kuchinskaya
 
PPT
Lection1
alexey1991
 
PPT
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf Conference
 
PPT
Kozhemyakin dcm2011 1
drupalconf
 
PPTX
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
 
PPTX
Игорь Любин - PowerShell - ConfeT&QA 2011
ilyubin
 
PDF
Entity возрождение легенды. Исай Руслан
DrupalSib
 
PPTX
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Fedor Lavrentyev
 
PPTX
Сущности в Drupal 7
Itech4Web
 
PDF
Лекция #3. Введение в языки разметки web-страниц
Яковенко Кирилл
 
PPTX
работа с потоками ввода вывода
metaform
 
PPT
Толстая модель. История разработки ORM
Mikhail Shamin
 
PPT
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
Authemployee
Tatiana rey
 
Темизация и Twig в Drupal 8
DrupalSPB
 
Лекция 5
itc73
 
Протокол HTTP. Клиент-серверная модель взаимодействия. Servlet API
Ekaterina Kuchinskaya
 
Lection1
alexey1991
 
ZFConf 2010: What News Zend Framework 2.0 Brings to Us
ZFConf Conference
 
Kozhemyakin dcm2011 1
drupalconf
 
kranonitS20 Сергей Бурма. Django - легко, быстро, эффективно
Krivoy Rog IT Community
 
Игорь Любин - PowerShell - ConfeT&QA 2011
ilyubin
 
Entity возрождение легенды. Исай Руслан
DrupalSib
 
Industrial Programming Java - Lection Pack 01 - Building an application - Lav...
Fedor Lavrentyev
 
Сущности в Drupal 7
Itech4Web
 
Лекция #3. Введение в языки разметки web-страниц
Яковенко Кирилл
 
работа с потоками ввода вывода
metaform
 
Толстая модель. История разработки ORM
Mikhail Shamin
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 

Viewers also liked (16)

PPT
Работа с Views в Drupal 7
Eugene Fidelin
 
PDF
AngularJS in practice
Eugene Fidelin
 
PDF
Безопасность Drupal сайтов
Eugene Fidelin
 
PPT
Разработка модуля для Cms Drupal
Drupal Camp Kyiv
 
ODP
Что такое Drupal CMS
Illya Stankevich
 
PPT
Выбираем CMS - шаг за шагом
Petr Ponomarev
 
PPT
Drupal And Google
guest2766ed
 
PPT
Дмитро Суслов “Порівняння різних типів CMS: самописні «движки», безкоштовні с...
Lviv Startup Club
 
PPTX
Bionic University. Разработка с использованием CMS/CMF Drupal. Быстрый старт....
Alex Barkov
 
PPTX
Основы создания сайта. Часть вторая. Обзор CMS. Выбор CMS под нужды бизнеса.
ARTW
 
PPTX
Drupal: система для быстрой и комфортной разработки web-сайтов
Alex Barkov
 
PPT
Drupal Paranoia
Drupal Camp Kyiv
 
PDF
Lviv 2013 d7 vs d8
Andy Postnikov
 
PPTX
Презентация к вебинару по CMS WordPress
Евгений Холин
 
PPT
Многоязычие сайта на Drupal
Drupal Camp Kyiv
 
PPTX
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 
Работа с Views в Drupal 7
Eugene Fidelin
 
AngularJS in practice
Eugene Fidelin
 
Безопасность Drupal сайтов
Eugene Fidelin
 
Разработка модуля для Cms Drupal
Drupal Camp Kyiv
 
Что такое Drupal CMS
Illya Stankevich
 
Выбираем CMS - шаг за шагом
Petr Ponomarev
 
Drupal And Google
guest2766ed
 
Дмитро Суслов “Порівняння різних типів CMS: самописні «движки», безкоштовні с...
Lviv Startup Club
 
Bionic University. Разработка с использованием CMS/CMF Drupal. Быстрый старт....
Alex Barkov
 
Основы создания сайта. Часть вторая. Обзор CMS. Выбор CMS под нужды бизнеса.
ARTW
 
Drupal: система для быстрой и комфортной разработки web-сайтов
Alex Barkov
 
Drupal Paranoia
Drupal Camp Kyiv
 
Lviv 2013 d7 vs d8
Andy Postnikov
 
Презентация к вебинару по CMS WordPress
Евгений Холин
 
Многоязычие сайта на Drupal
Drupal Camp Kyiv
 
Дизайн REST API для высокопроизводительных систем / Александр Лебедев (Новые ...
Ontico
 
Ad

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

PPT
Drupal и возможности его применения
Media Gorod
 
ODP
Семинар-практикум по Drupal
it-people
 
PPT
Drupal 7 deploy database updates
Anton Ivanov
 
PPT
Drupal Vs Other
Andrii Lundiak
 
PPTX
Render API.
DrupalForumZP2012
 
RTF
Text
Inna Tuyeva
 
PDF
сравнение Drupal и 1с битрикс
Andrii Podanenko
 
PDF
Андрей Юн Удобная разработка Drupal проекта. Полезные модули
Albina Tiupa
 
PPTX
Comfortable drupal project development. Useful modules (Andriy Yun, studio de...
Andriy Yun
 
PPT
Dc P
Inna Tuyeva
 
PPT
Эффективное управление содержимым веб-сайтов
Drupal Camp Kyiv
 
PDF
Yaremchuk - Drupal CodeLobster
Andrii Podanenko
 
PPT
компоненты E learn для Plone
Sergey Greger
 
PPTX
Это Drupal, %username%! - Андрей Черноус
DrupalCampDN
 
PDF
Creating custom module
yulia_tsyba
 
PPTX
Html лаб 2
Vladimir Burdaev
 
PPT
Yulia tsuba
jurenites
 
PPT
Введение в веб-проектирование
Maryia Davidouskaia
 
PPTX
Создаем Drupal дистрибутив: от идеи до сопровождения.
DrupalForumZP2012
 
Drupal и возможности его применения
Media Gorod
 
Семинар-практикум по Drupal
it-people
 
Drupal 7 deploy database updates
Anton Ivanov
 
Drupal Vs Other
Andrii Lundiak
 
Render API.
DrupalForumZP2012
 
сравнение Drupal и 1с битрикс
Andrii Podanenko
 
Андрей Юн Удобная разработка Drupal проекта. Полезные модули
Albina Tiupa
 
Comfortable drupal project development. Useful modules (Andriy Yun, studio de...
Andriy Yun
 
Эффективное управление содержимым веб-сайтов
Drupal Camp Kyiv
 
Yaremchuk - Drupal CodeLobster
Andrii Podanenko
 
компоненты E learn для Plone
Sergey Greger
 
Это Drupal, %username%! - Андрей Черноус
DrupalCampDN
 
Creating custom module
yulia_tsyba
 
Html лаб 2
Vladimir Burdaev
 
Yulia tsuba
jurenites
 
Введение в веб-проектирование
Maryia Davidouskaia
 
Создаем Drupal дистрибутив: от идеи до сопровождения.
DrupalForumZP2012
 
Ad

More from Eugene Fidelin (10)

PDF
Marko.js - Unsung Hero of Scalable Web Frameworks (DevDays 2025)
Eugene Fidelin
 
PDF
Testing: do more with less (JSNation 2024)
Eugene Fidelin
 
PDF
Testing: Do More With Less (AdvancedJS 2024)
Eugene Fidelin
 
PDF
Node.js BFFs - our way to the better/micro frontends
Eugene Fidelin
 
PDF
Housekeeping the platform at scale
Eugene Fidelin
 
PPTX
Node.js BFFs: our way to better/micro frontends
Eugene Fidelin
 
PDF
Redis persistence in practice
Eugene Fidelin
 
PDF
Разработка и deploy Drupal сайтов с помощью Features.
Eugene Fidelin
 
ODP
Работа с БД в Drupal 7
Eugene Fidelin
 
PPT
Фичи н-н-нада? Или почему стоит использовать модуль Features.
Eugene Fidelin
 
Marko.js - Unsung Hero of Scalable Web Frameworks (DevDays 2025)
Eugene Fidelin
 
Testing: do more with less (JSNation 2024)
Eugene Fidelin
 
Testing: Do More With Less (AdvancedJS 2024)
Eugene Fidelin
 
Node.js BFFs - our way to the better/micro frontends
Eugene Fidelin
 
Housekeeping the platform at scale
Eugene Fidelin
 
Node.js BFFs: our way to better/micro frontends
Eugene Fidelin
 
Redis persistence in practice
Eugene Fidelin
 
Разработка и deploy Drupal сайтов с помощью Features.
Eugene Fidelin
 
Работа с БД в Drupal 7
Eugene Fidelin
 
Фичи н-н-нада? Или почему стоит использовать модуль Features.
Eugene Fidelin
 

Работа с материалами (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: [email protected]  Skype: eugene.fidelin