Здравствуйте! Это aRpi.
Вот решил написать статью не тему “Создание своего типа материала программно”. На изучение этого вопроса, и написание статьи было потрачено 6 часов. В начале и сам не знал как это делать, так что если что то не так, поправьте.
Готовый модуль к статье можно скачать здесь.
Как правило операции по созданию и удалению типа материала выполняются при создании и удалении модуля. В функциях называемых modulename_install и modulename_uninstall, размещенных в файле modulename.install. Однако в нашем случаи, в приложенном к статье модуле, мы будем все делать напрямую. По нажатию кнопки, будет запускаться та или иная функция, создающая или удаляющая тип материала. У меня это функции: mtpn_cretypnod и mtpn_remtypnod.
Весь код модуля целиком приводить не буду.
Напишу лишь код, выполняющий непосредственно создание и удаление типа материала.
Прошу обратить внимание имя модуля у меня “mtpn”.
Кстати! Чтобы просто определить есть ли тип материала достаточно просто попытаться его загрузить, в случаи неудачи будет возвращен false.
Для этого нужно использовать функцию node_type_load передав в неё машинное имя типа материала.
<?php
$sta = node_type_load('mtpn');
?>И так! Создаем свой типа материала программно:
Для того чтобы создать тип материала, необходимо вызвать функцию node_type_save.
Передав в неё контент материала, на основе которого и будет создан тип материала.
Создаем контент материала, это массив заполненный данными описывающими материал.
<?php
$inf = array(
'type' => 'mtpn',
'name' => 'Наш тип материала',
'base' => 'node_content',
'description' => 'Наш тип материала, который был создан программно.',
'custom' => true,
'locked' => false, //замок, если включен запрещает администратору сайта, удалять тип материала в ручную, по умолчанию включен
);
?>Затем мы окончательно формируем контент материала, заполнив неуказанные поля дефаултными значениями.
<?php
$con = node_type_set_defaults($inf);
?>Следующей функцией в контент материала добавляются поля по умолчанию, свойственные стандартному типу материала.
В частности это поле body, в котором как правило размещается текст любой ноды.
<?php
node_add_body_field($con);
?>Создаем тип материала. Этаже функция позволяет сохранить ранее созданный тип материала.
<?php
node_type_save($con);
?>Теперь наш тип материала добавлен в базу данных, в таблицу node_type.
Однако он ничем не отличается от типа материала созданного через админку.
И к сожалению, мы даже не можем создать ноду на основе этого типа материала, пункта добавления, на странице “/node/add” ещё нет.
Тип материала нужно ещё настроить.
Продолжаем…
Получаем инстанцию материала, специальный объект который позволяет настроить тип-материал.
<?php
$ins = field_info_instance('node', 'body', 'mtpn');
?>Добавляем пункт на страницу “/node/add”, позволяющий создать ноду, нашего типа материала.
Кстати если пункт не появился, возможно необходимо перестроить меню, что мы и сделаем немного позже.
<?php
$ins['display']['mtpn_list'] = array(
'label' => 'hidden',
'type' => 'text_summary_or_trimmed',
);
?>Применяем внесённые изменения. Иначе все то что мы проделали с инстанцией материала не имеет смысла.
<?php
field_update_instance($ins);
?>Чтобы ноды нашего типа материала не были скучными, добавляем в него уникальные поля.
Создаются поля при помощи функции field_create_field.
Однако после создания их необходимо ещё связать с типом материала.
Связывание осуществляется созданием инстанции поля, функцией field_create_instance.
Создаем поля.
<?php
//Добавляем поле mtpn_f1, 3 экземпляра текста длиной не более 60 символов.
field_create_field(
array(
'field_name' => 'mtpn_f1', //указываем префикс соответствующий типу материала, чтобы не запутаться, какое поле к кому относится
'cardinality' => 3, //количество элементов, данного типа
'type' => 'text',
'settings' => array('max_length' => 60),
)
);
//Добавляем поле mtpn_f2, 1 экземпляр текста неограниченной длины и размера.
field_create_field(
array(
'field_name' => 'mtpn_f2',
'cardinality' => 1,
'type' => 'text'
)
);
?>Как только поля будут созданы, они будут добавлены в базу в таблицу field_config.
Создаем инстанции-полей, функцией field_create_instance.
Инстанция поля это такая вещь которая позволяет связать ранее созданное поле с указанным типом материала.
И определить как и в каком виде значение поля будет редактироваться на странице редактирования ноды.
Создаем инстанции полей.
<?php
//Создаем инстанцию-поля, для поля mtpn_f1.
field_create_instance(
array(
'entity_type' => 'node',
'bundle' => 'mtpn',
'field_name' => 'mtpn_f1',
'label' => 'Значение поля mtpn_f1',
'widget' => array('type' => 'text_textfield'),
'display' => array(
'mtpn_list' => array(
'label' => 'hidden',
'type' => 'hidden',
),
),
)
);
//Создаем инстанцию-поля, для поля mtpn_f2.
field_create_instance(
array(
'entity_type' => 'node',
'bundle' => 'mtpn',
'field_name' => 'mtpn_f2',
'label' => 'Значение поля mtpn_f2',
'widget' => array('type' => 'text_textfield'),
'display' => array(
'mtpn_list' => array(
'label' => 'hidden',
'type' => 'hidden',
),
),
)
);
?>Перестраиваем меню чтобы пункт добавления ноды в “/node/add” был доступен.
К несчастью это долгая операция но к счастью, мы не так часто будем создавать свой собственный тип материала, так что все в порядке.
<?php
menu_rebuild();
?>Вот и все!
Да кстати.
Как только будет создана хотя бы одна нода нашего типа материала, в базе будут созданы таблицы соответствующие полям, в которых и будут храниться данные полей, из которых состоит нода.
В нашем случаи это таблицы field_data_mtpn_f1 и field_data_mtpn_f2.
Эти таблицы точно также будут удалены при удалении полей.
Удаление своего типа материала программно:
Для начала удалим абсолютно все узлы соответствующие нашему типу материала.
<?php
//Выполняем запрос к базе данных выделив nid-ды узлов соответствующие нашему типу материала.
$sel = db_query('SELECT nid FROM {node} WHERE type = \'mtpn\'');
//Вытаскиваем из объекта выделения, массив nid-ов.
$nid = $sel->fetchAllKeyed(0,0);
//Удаляем те узлы, nid-ды которых перечислены в передаваемом массиве.
node_delete_multiple($nid);
?>Теперь можно приступить к удалению полей, инстанций-полей, и уже после этого удалить тип материала.
Удаляем поля.
<?php
//Удляем поле mtpn_f1.
field_delete_field('mtpn_f1');
//Удляем поле mtpn_f2.
field_delete_field('mtpn_f2');
?>Удаляем инстанции полей.
<?php
//Получаем массив инстанций полей, принадлежащих тому, к кому они были прикреплены.
$ins = field_info_instances('node', 'mtpn');
//Удаляем инстанции полей перечисленные в массиве.
foreach ($ins as $n => $i) {
field_delete_instance($n);//здесь $n это имя инстанции
}
?>Удаляем тип материала.
<?php
node_type_delete('mtpn');
?>Перестраиваем меню чтобы пункт добавления ноды в “/node/add” был уничтожен.
<?php
menu_rebuild();
?>Чистка. Подчищает базу, удаляя всякие там уже казалось бы удаленные поля и таблицы.
<?php
field_purge_batch(1000);
?>| Прикрепленный файл | Размер |
|---|---|
| mtpn.zip | 3.62 кб |
Источник: http://www.drupal.ru/node/71971
Добавить комментарий к записи "Создание своего типа материала программно"
Чтобы комментировать, необходимо войти в систему.