Drupal — это прежде всего CMS, т.е. система управления контентом. Поэтому все в drupal так или иначе связано с главным объектом системы — с нодами (nodes). Опросы, статьи, разделы сайта, голосования и публикации в форуме — это все экземпляры объекта node, разные типы публикаций.
Модуль node
Управлять публикациями позволяет модуль ядра — Node. Он формирует базовые зацепки для программирования, реализует редактор публикаций, организует интерфейс для создания новых типов публикаций и т.д — все базовые возможности работы с публикациями.
Одной из базовых концепций drupal является проектирование типов публикаций. Когда вы приступаете к новому сайту на Drupal, вы думаете о том, какие типы публикаций вам понадобятся, какие дополнительные свойства, поля им будут нужны. Далее можно планировать внешний вид, шаблоны типов публикаций, создание доп. кода на PHP.
Управление типами публикаций (типами node) выполняется администратором сайта:
Administration > Structure > Content types
http://example.com/admin/structure/types
.
А настройка каждого из типов:
Administration > Structure > Content types > [Specific content type]
http://example.com/admin/structure/types/[system-type-name]
.
В Drupal 6, почти всегда базовый функционал расширяется подборкой модулей CCK, а в Drupal 7 — конструирование полей берут на себя модули ядра.
Управление содержимым
Для управления содержимым модуль Node предоставляет в админке раздел
Administration > Content
http://example.com/admin/content
где вы найдете список всех публикаций, сортированный по дате их последней правки.
Node реализует также концепцию версий или ревизий содержимого. В проектах, где над содержимым сайта работает 1-2 человека — это не очень актуально. Но в сложных проектах, где трудятся десятки редакторов — создание версий содержимого бывает очень востребовано.
Каждая публикация имеет собственный node ID. К примеру, добавив к адресу сайта /node/[nodeID], вы увидите публикацию с соответствующим ID (при условии, что у вас есть соответствующие на это права). А набрав адрес /node/[nodeID]/edit или /node/[nodeID]/delete — вызвать соответственно форму редактирования или удаления материала.
Права доступа
Модуль node, позволяет сформировать права доступа, редактирования и удаления для каждого типа контента. Соответствующие флажки появляются в секции управления правами — /admin/people/permissions.
Элементы Drupal Node API
Управление публикациями в back-end только верхушка айсбера из всего того что, даёт модуль Node и Drupal как CMS. Для работы с публикациями программист получает полноценный API функций на PHP.
Вот некоторые из них:
function node_load(nodeID);
function node_load_multiple(nodeIDs);
Эти две функции предназначены для загрузки данных публикаций. Первая вернет вам объект ноды с указанным ID, а вторая вернет целый массив объектов публикаций, соответствующий переданному массиву идентификаторов.
Полученный таким образом объект, можно модифицировать и сохранить:
function node_save($node);
Функции загрузки и сохранения активируют соответствующие зацепки, связанные с публикацией. В итоге вы получаете весь набор полей публикации при загрузке, включая дополнительные поля, созданные в конструкторе, и вызов необходимых обработчиков при сохранении.
Если в коде вам необходимо сверстать ноду, воспользуйтесь функцией node_view():
drupal_render(node_view($node, $view_mode = ‘full’, $lang_code = NULL));
Здесь:
- $node — объект ноды,
- $view_mode — тип отображения ‘full’ — полный, ‘teaser’ — сокращенный (используется, например, в лентах),
- $lang_code — код языка, по умолчанию используется текущий глобальный код. Нужен для сайтов, содержащих многоязычный контент.
function node_delete($nid);
function node_delete_multiple($nids);
Аналогично с парой ф-ций загрузки, действует пара функций, удаляющих публикации. При вызове будут удалены все связанные с материалом данные (поля, ревизии, поиск по сайту и т.д.), и запущены имеющиеся пользовательские зацепки.
Объект Node в drupal 7
Объект, загруженный функцией node_load(), представляет экземпляр класса stdClass. Большинство свойств взяты из таблицы {node}. Я немного рассортировал свойства объекта, и кое что убрал, заменив (…).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
stdClass Object ( //данные из таблицы {node} [vid] => //VersionID - ID ревизии, в таблице {node_revision} [uid] => //User ID, идентификатор в таблице {users} [title] => //Заголовок публикации [status] => //статус публикации 0 - не опубликована, 1 - опубликована [comment] => //статус комментариев 0 - запрещены, 1 - закрыты (не принимаются новые), //2 - открыты (можно добавлять новые) [promote] => //флаг - показывать ли в ленте на главной, используется для ленты /node, //которая по умолчанию показывается на главной странице, //если вы работаете с Drupal "из коробки" [sticky] => //флаг - закреплять в верху списков, также имеет отношение к ленте /node. [nid] => //идентификатор публикации node ID [type] => //системное название типа публиакации (page, article и т.п.) [language] => //код языка (ru, en и т.п.) [created] => //unix тайм-стамп даты создания [changed] => //unix timestamp даты последней модификации [tnid] => //ID набора переводов, этот идентификатор связывает публикации, //являющиеся языковыми версиями одной и той же статьи [translate] => //флаг, нуждается ли статья в переводе //данные таблицы {node_revision} [revision_timestamp] => //unix timestamp создания последней ревизии [revision_uid] => //User ID, идентификатор в таблице {users}, для последней ревизии //данные таблицы {users} [name] => //login автора, подгружается из таблицы {users} [picture] => //file ID аватарки пользователя, подгружается из {users} [data] => //дополнительные данные пользователя из {users} в виде сериализованного массива //служебные поля [entity_view_prepared] => [log] => //Далее идут описания полей публикации, которые можно добавлять //в конструкторе. //В общем случае каждое поле может иметь языковые варианты //или быть нейтрально по отношению к языку [und]; //и иметь при этом несколько значений, которые //нумеруются начиная с [0] по [n-1] //В Drupal 7 у публикации можно отключить поле body в конструкторе, //в 6й версии этого не сделать. //Вот его структура в Drupal 7 [body] => Array ( [und] => Array ( [0] => Array ( [value] => //текст публикации [summary] => //текст анонса [format] => //фильтр для форматирования, обычно 'full_html' [safe_value] => //значение, после соответствующего фильтра [safe_summary] => //тоже, но для анонса ) ) ) //Данное поле, как пример, было добавлено в конструкторе полей. //Это набор из нескольких картинок. //Думаю, не требует особых пояснений, вместо описания пример реальных данных [field_images] => Array ( [und] => Array ( [0] => Array ( [fid] => 105 [uid] => 1 [filename] => dizayn-interera-lofta-v-ekaterinburge.jpg [uri] => public://rt/dizayn-interera-lofta-v-ekaterinburge.jpg [filemime] => image/jpeg [filesize] => 1016557 [status] => 1 [timestamp] => 1445342114 [rdf_mapping] => Array ( ) [alt] => Студия дизайн создает интерьеры домов и квартир, воплощая Ваши мечты в реальность [title] => Дизайн частных интерьеров [width] => 1918 [height] => 1080 ) [1] => Array ( ... ) ) ) //для публикации создаётся массив свойств rdf - resource description framework //его я здесь описывать не буду, т.к. ни черта в нем не разбираюсь :) [rdf_mapping] => Array ( ... ) ) |