Создание своего типа материала программно

Здравствуйте! Это 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

Добавить комментарий к записи "Создание своего типа материала программно"

Чтобы комментировать, необходимо войти в систему.

© 2009 Обзор CMS