Utwórz nowy typ zawartości na hook_install

11

Czy ktoś może mi pokazać właściwy przykład tworzenia nowego typu zawartości w metodzie hook_install modułu ?

Chciałbym również wiedzieć, czy / co powinienem zrobić podczas hook_uninstall, aby posprzątać mój bałagan; Czytam, że jest trochę debaty na temat zwykłego usuwania treści.

Nie udało mi się znaleźć przykładu właściwej metody wykonania tego zadania, każda pomoc byłaby mile widziana!

Jane Panda
źródło

Odpowiedzi:

7

Aby dokładnie odpowiedzieć na pytania:

Tworzenie typu zawartości w instalacji hook : Do utworzenia typu zawartości używasz node_type_save () , oto przykład z 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);

Co zrobić w hook_uninstall : Zasadniczo po prostu posprzątaj po sobie, więc usuń zmienne utworzone przez moduł (przy użyciu zmiennej_del () ), usuń wszystkie pliki przesłane przez moduł (przy użyciu file_unmanaged_delete_recursive () ), usuń zdefiniowane typy treści (używając node_type_delete () ), itp.

Mam nadzieję że to pomoże!

Alex Weber
źródło
Dziękuję, dobrze jest też znać sposób kodowania, aby to zrobić, i potrzebowałem znaleźć dobre informacje na temat korzystania z odinstalowywania
Jane Panda
nie ma problemu, chętnie pomogę! :)
Alex Weber
11

Jednym z najlepszych sposobów na zachowanie tych informacji w kodzie jest użycie funkcji . Feaures mogą umieścić w kodzie:

  • Typy treści
  • Pola CCK
  • Uprawnienia
  • Role

I tak dalej.

Jedną fajną cechą funkcji jest integracja drush

drush featuresda ci listę wszystkich funkcji na stronie, a ich status
drush features revert allprzywróci wszystkie funkcje z powrotem do tego, co jest w kodzie (bardzo przydatne do uruchamiania po wdrożeniach)

Pomóż to pomaga

wiifm
źródło
Zgadzam się, chociaż nie odpowiada bezpośrednio na pytanie ...
Alex Weber
Tak, wiem, że nie jest to dokładnie żądane rozwiązanie, ale ostatecznie oba osiągną ten sam cel, po prostu jeden będzie koszmarem do utrzymania, a drugi będzie łatwy dzięki point and click i niesamowitej integracji drush . Bob może zdecydować, co dla niego działa
wiifm,
1
Zgoda ponownie! Funkcje Drush + na początku mogą być zastraszające, ale są tak przydatne, kiedy się zorientujesz :)
Alex Weber
Dam temu szansę, myślę, że zaoszczędzę czas, jeśli będę mógł wyeksportować niestandardowy typ zawartości, więc nie będę musiał ręcznie blokować wszystkich pól. Dzięki!
Jane Panda,
3

Sprawdź moduł D7 Przykłady . node_example ma instalację i deinstalację.

Możesz być w stanie dopracować ten typ za pomocą narzędzi interfejsu, a następnie utworzyć funkcję (z modułem funkcji) i wyodrębnić odpowiednie części do funkcji instalacji niestandardowego modułu.

Rysował
źródło
0

Jeśli chcesz utworzyć nowy typ zawartości z niektórymi polami, możesz użyć poniższego kodu.

Ten kod działa dla mnie idealnie.

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')); 
}

}
Sanjay
źródło
-1

Zrobiłem to w module MySpace Sync .
Pamiętam, że składałem to z różnych źródeł, ale nie pamiętam, jakie były wszystkie źródła. Możesz przeszukać tam repozytorium git, aby zobaczyć, co zrobiłem, ale w zasadzie jest to eksport każdego typu zawartości z modułem Content Copy CCK podczas instalacji, a następnie usunięcie wszystkich węzłów przed usunięciem typu zawartości podczas odinstalowywania.

Scott Reynen
źródło
4
Chociaż pytanie jest oznaczone jako drupal-7, moduł MySpace Sync jest dostępny tylko dla Drupal 6. Interfejs API użyty do tworzenia typu zawartości bardzo się zmienił między Drupal 6 i Drupal 7.
Pierre Buyle