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.