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!

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!


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


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.


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

}

-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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.