Создать новый тип контента на hook_install

11

Может кто-нибудь показать мне пример того, как создать новый тип контента в методе hook_install модуля ?

Я также хотел бы знать, если / что я должен сделать во время hook_uninstall, чтобы очистить мой беспорядок; Я читал, что есть некоторые споры о простом удалении контента.

Я не смог найти пример правильного метода выполнения этой задачи, любая помощь будет оценена!

Джейн Панда
источник

Ответы:

7

Чтобы ответить на ваши вопросы точно:

Создание типа контента в процессе установки : вы используете node_type_save () для создания типа контента, вот пример из webform.install:

  // Create the default webform type.
  $webform_type = array(
    'type' => 'webform',
    'name' => st('Webform'),
    'base' => 'node_content',
    'description' => st('Create a new form or questionnaire accessible to users. Submission results and statistics are recorded and accessible to privileged users.'),
    'custom' => TRUE,
    'modified' => TRUE,
    'locked' => FALSE,
  );

  $webform_type = node_type_set_defaults($webform_type);
  node_type_save($webform_type);
  node_add_body_field($webform_type);

Что делать в hook_uninstall : в основном просто выполняйте очистку после себя, поэтому удалите переменные, созданные вашим модулем (используя variable_del () ), удалите все файлы, загруженные модулем (используя file_unmanaged_delete_recursive () ), удалите определенные типы содержимого (используя node_type_delete () ), и т.п.

Надеюсь это поможет!

Алекс Вебер
источник
Спасибо, это хорошо, чтобы знать способ кодирования, чтобы сделать это, и мне нужно было найти некоторую полезную информацию об использовании удаления
Джейн Панда
нет проблем, рад помочь! :)
Алекс Вебер
11

Одним из лучших способов сохранить эту информацию в коде является использование функций . Особенности можно вставить в код:

  • Типы контента
  • Поля CCK
  • права доступа
  • Роли

Список можно продолжить.

Одна приятная особенность функций - интеграция с Drush

drush featuresпредоставит вам список всех функций на сайте, и их статус
drush features revert allвернет все функции обратно к тому, что в коде (очень удобно для запуска после развертываний)

Помогите это поможет

WIIFM
источник
Согласен, хотя он не дает прямого ответа на вопрос ...
Алекс Вебер
Да, я знаю, что это не совсем точное запрошенное решение, но в конечном итоге они оба достигнут одной и той же цели, просто один будет кошмаром для обслуживания, а другой будет легко с помощью функции «укажи и щелкни» и потрясающей интеграцией в виде пушей , Боб может решить, что для него работает
wiifm
1
Договорились еще раз! Функции Drush + могут пугать поначалу, но они так полезны, когда вы освоитесь с ними :)
Алекс Вебер
Я сделаю это, я думаю, что это сэкономит время, если я смогу экспортировать пользовательский тип контента, поэтому мне не придется вручную вставлять все поля. Спасибо!
Джейн Панда
3

Проверьте модуль примеров D7 . У узла node_example есть установка и удаление.

Вы можете уточнить тип с помощью инструментов интерфейса, а затем создать функцию (с модулем функций) и извлечь соответствующие части в функцию установки вашего пользовательского модуля.

Нарисовался
источник
0

Если вы хотите создать новый тип контента с некоторыми полями, вы можете использовать приведенный ниже код.

Этот код работает для меня отлично.

function HOOK_install() {

 /* CREATE THE CONTENT TYPE */
 $t = get_t();
 $node_example = array(
    'type' => 'slider',
    'name' => $t('Slider Content'),
    'base' => 'node_content',
    'description' => $t('Add slider content.'),
    'body_label' => $t('Slider Description')
 );
 $content_type = node_type_set_defaults($node_example);

// Create a custom Field with our required field-type.
$field = array(
  'field_slider_images' => array (
    'field_name' => 'field_slider_images',
    'type' => 'image',
  ),
 'field_slider_links' => array (
   'field_name' => 'field_slider_links',
   'type' => 'text',
   'entity_types' => array('node'),
  ),

);
foreach ($field as $fields) {
  field_create_field($fields);
}

// Create a instances of that Field.
$instance = array(
'field_slider_images' => array (
  'field_name' => 'field_slider_images',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Image'),
  'description' => 'Add Slider Image.',
  'settings' => array(
    'file_directory' => 'field/document',
    'file_extensions' => 'png PNG jpg jpeg JPG JPEG',
    'max_filesize' => '10MB',
    'title_field' => '',
  ),
  'widget' => array(
     'type' => 'image_image',
     'weight'=> 10,
  ),
  'formatter' => array(
    'label' => t('label'),
    'format' => 'image'
  ),
  'settings' => array(
    'file_directory' => 'slider-image', // save inside "public://photos"
    'max_filesize' => '4M',
    'preview_image_style' => 'thumbnail',
    'title_field' => TRUE,
    'alt_field' => FALSE,
  )
),
'field_slider_links' => array (
  'field_name' => 'field_slider_links',
  'entity_type' => 'node',
  'bundle' => 'slider',
  'label' => t('Slider Link'),
  'widget' => array('type' => 'text_textfield'),
 ),
);

foreach ($instance as $fieldinstance) {
 field_create_instance($fieldinstance);
}

$status = node_type_save($content_type);
node_add_body_field($content_type);

// Replacement rule for the messages.
$t_args = array('%name' => $content_type->name);
if ($status == SAVED_UPDATED) { // update case
 drupal_set_message($t('The content type %name has been updated.', $t_args));
} 
 elseif ($status == SAVED_NEW) { // create case
   drupal_set_message($t('The content type %name has been added.', $t_args));
   watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l($t('view'), 'admin/structure/types')); 
}

}
Санджай
источник
-1

Я сделал это в модуле синхронизации MySpace .
Я помню, как складывал это из разных источников, но я не помню, какими были все источники. Вы можете просмотреть репозиторий git там, чтобы увидеть, что я сделал, но это в основном экспорт каждого типа контента с модулем CCK Content Copy при установке, а затем удаление всех узлов перед удалением типа контента при удалении.

Скотт Рейнен
источник
4
Хотя вопрос помечен как drupal-7, модуль MySpace Sync доступен только для Drupal 6. API, используемый для создания типа контента, сильно изменился между Drupal 6 и Drupal 7.
Pierre Buyle
-1

Попробуйте ссылку ниже, это будет полезно.

Drupal 7 Field API - Установите новый тип контента при установке и добавьте поля

Суреш Кумара
источник
Я предлагаю вам расширить свой ответ, чтобы добавить более подробную информацию о том, о чем эта ссылка (краткое изложение). Это может помочь удалить ваше пониженное голосование (которое не мое ...) ...
Pierre.Vriens