Drupal node_type_get_type () и hook_uninstall () - PullRequest
1 голос
/ 20 февраля 2012

У меня есть модуль job_post, который устанавливает job_post тип контента.

В этом модуле у меня есть hook_unistall(), который вызывает функцию node_type_delete(), которая удаляет мой тип контента.

После процесса удаления я получаю ошибки из основного модуля Drupal comment, который запускается с node_type_delete() после module_invoke_all('node_type_delete', $info).

Ошибка следующая и повторяется 8раз (из-за цикла в comment_node_type_delete()):

Notice: Trying to get property of non-object in comment_node_type_delete()
(line 343 of ....\comment.module).

У меня есть эта ошибка, потому что переменная $info в node_type_delete() функция равна false.

У меня вопрос, почему, когда мой модуль установлен и когда я печатаю var_dump(node_type_get_type('job_post')) на любой странице, у меня есть объект, но когда я пытаюсь напечатать тот же код в моей функции unistall, я получаю false, и этоошибка?

job_post.install

/**
 * Implements hook_install().
 */
function job_post_install() {
  node_types_rebuild();

  $types = node_type_get_types();
  node_add_body_field($types['job_post']);

  $body_instance = field_info_instance('node', 'body', 'job_post');
  $body_instance['type'] = 'text_summary_or_trimmed';

  field_update_instance($body_instance);
}

/**
 * Implements hook_uninstall().
 */
function job_post_uninstall() {
  $instances = field_info_instances('node', 'job_post');
  foreach ($instances as $instance_name => $instance) {
    field_delete_instance($instance);
  }

  // Force rebuild of the node type cache
  // as Clive suggested didn't help
  // _node_types_build(TRUE);

  node_type_delete('job_post');

  field_purge_batch(1000);
}

job_post.module

/**
 * Implements hook_node_info() to provide our job_post type.
 */
function job_post_node_info() {
  return array(
    'job_post' => array(
      'name' => t('Job Post'),
      'base' => 'job_post',
      'description' => t('Use this content type to post a job.'),
      'has_title' => TRUE,
      'title_label' => t('Job Title'),
      'help' => t('Enter the job title and job description')
    )
  );
}

/**
 * Implement hook_form() with the standard default form.
 */
function job_post_form($node, $form_state) {
  return node_content_form($node, $form_state);
}

Примечание: Этот пример модуля был взят из Pro Drupal 7 Development book (стр. 141) с небольшими изменениями, и он выдавал ошибки даже с оригиналом.

Ответы [ 2 ]

2 голосов
/ 01 марта 2012

Привет, обратившись к документации по основным модулям Drupal 7. Возникла проблема с использованием.

hook_node_info определяет тип содержимого автоматически.Типы контента, которые создаются таким способом, деинсталлируются - отключаются автоматически.

Основной модуль блога определяет hook_node_info, но не обрабатывает никакой node_type_delete для hook_uninstall

http://api.drupal.org/api/drupal/modules%21blog%21blog.module/function/blog_node_info/7

Когда вы вызываете node_type_delete('job_post'); для hook_uninstall, информация о типе узла уже исчезла.Из-за этого модуль комментариев выдает ошибку.

Обычно вы должны удалять только любые данные, относящиеся к вашему типу контента.И пусть все остальное будет сделано ядром.

Кроме того, если вы действительно хотите создать / удалить свой тип контента, вы не можете использовать hook_node_info.Вы можете вручную создать / удалить тип контента на хуке установки / удаления.

Пример удаления здесь: http://public -action.org / content / drupal-7-field-api-drupal-7-добавление-custom-контент типа пользовательских-поля-поля-апи

1 голос
/ 20 февраля 2012

Кажется, что кеш типа узла по какой-то причине не был построен полностью, попробуйте принудительно перестроить перед вызовом node_type_delete(), и все типы узлов должны быть доступны:

// Force rebuild of the node type cache
_node_types_build(TRUE);

// Delete our content type
node_type_delete('job_post');
...