Erstellen Sie einen neuen Inhaltstyp bei hook_install

11

Kann mir jemand ein geeignetes Beispiel zeigen, wie ein neuer Inhaltstyp in der hook_install- Methode eines Moduls erstellt wird?

Ich würde auch gerne wissen, ob / was ich während hook_uninstall tun soll , um mein Chaos zu beseitigen . Ich habe gelesen, dass es eine Debatte darüber gibt, einfach den Inhalt zu entfernen.

Ich konnte kein Beispiel für die richtige Methode finden, um diese Aufgabe zu erfüllen. Jede Hilfe wäre willkommen!

Jane Panda
quelle

Antworten:

7

Um Ihre Fragen genau zu beantworten:

Erstellen eines Inhaltstyps in der Hook-Installation : Sie verwenden node_type_save () , um den Inhaltstyp zu erstellen. Hier ein Beispiel aus 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);

Was Sie in hook_uninstall tun sollten : Bereinigen Sie einfach nach sich selbst, löschen Sie also die von Ihrem Modul erstellten Variablen (mit variable_del () ), löschen Sie alle vom Modul hochgeladenen Dateien (mit file_unmanaged_delete_recursive () ), löschen Sie definierte Inhaltstypen (mit node_type_delete () ). etc.

Hoffe das hilft!

Alex Weber
quelle
Vielen Dank, es ist gut zu wissen, wie man das auch programmiert, und ich musste einige gute Informationen zur Deinstallation finden
Jane Panda
Kein Problem, gerne helfen! :)
Alex Weber
11

Eine der besten Möglichkeiten, diese Informationen im Code zu speichern, ist die Verwendung von Funktionen . Funktionen können in Code eingefügt werden:

  • Inhaltstypen
  • CCK-Felder
  • Berechtigungen
  • Rollen

Die Liste geht weiter.

Ein nettes Feature über Features ist die Drush-Integration

drush features Sie erhalten eine Liste aller Funktionen auf der Website und deren Status
drush features revert all alle Funktionen auf den Code zurück (sehr praktisch für die Ausführung nach Bereitstellungen).

Hilfe das hilft

wiifm
quelle
Einverstanden, obwohl es die Frage nicht direkt beantwortet ...
Alex Weber
Ja, ich weiß, dass dies nicht genau die angeforderte Lösung ist, aber letztendlich werden beide das gleiche Ziel erreichen. Es ist nur so, dass einer ein Albtraum ist und der andere einfach mit Point & Click und einer fantastischen Drush-Integration . Bob kann entscheiden, was für ihn funktioniert
am
1
Wieder einverstanden! Drush + Features können zunächst einschüchternd sein, aber es ist so nützlich, wenn Sie den Dreh raus haben :)
Alex Weber
Ich werde es versuchen, ich denke, es wird Zeit sparen, wenn ich einen benutzerdefinierten Inhaltstyp exportieren kann, damit ich nicht alle Felder von Hand blockieren muss. Danke!
Jane Panda
3

Schauen Sie sich die D7- Beispiele an Modul . node_example hat installiert und deinstalliert.

Möglicherweise können Sie den Typ mit den Schnittstellentools ausarbeiten und dann eine Funktion (mit Funktionsmodul) erstellen und relevante Teile in die Installationsfunktion Ihres benutzerdefinierten Moduls extrahieren.

Drew
quelle
0

Wenn Sie einen neuen Inhaltstyp mit einigen Feldern erstellen möchten, können Sie den folgenden Code verwenden.

Dieser Code funktioniert perfekt für mich.

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
quelle
-1

Ich habe dies im MySpace Sync- Modul getan .
Ich erinnere mich, dass ich das aus verschiedenen Quellen zusammengesetzt habe, aber ich erinnere mich nicht, was alle Quellen waren. Sie können dort im Git-Repository nachsehen, was ich getan habe. Grundsätzlich handelt es sich jedoch um einen Export jedes Inhaltstyps mit dem CCK-Modul "Inhaltskopie" bei der Installation und anschließend um das Löschen aller Knoten, bevor der Inhaltstyp bei der Deinstallation gelöscht wird.

Scott Reynen
quelle
4
Während die Frage mit drupal-7 gekennzeichnet ist, ist das MySpace Sync-Modul nur für Drupal 6 verfügbar. Die zum Erstellen des Inhaltstyps verwendete API hat sich zwischen Drupal 6 und Drupal 7 stark geändert.
Pierre Buyle