hook_installで新しいコンテンツタイプを作成する


11

誰かがモジュールのhook_installメソッドで新しいコンテンツタイプを作成する方法の適切な例を私に示すことができますか?

また、hook_uninstallの実行中に混乱を解消するために何をすべきかを知りたいです。単にコンテンツを削除することについての議論があると私は読んだ。

このタスクを実行する適切な方法の例を見つけることができませんでした。助けていただければ幸いです。

回答:


7

質問に正確に答えるには:

フックインストールでのコンテンツタイプの作成node_type_save()を使用してコンテンツタイプを作成します。以下は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);

hook_uninstallで行うこと:基本的には自分でクリーンアップするので、モジュールが作成した変数を削除(variable_del()を使用)、モジュールがアップロードしたファイルを削除(file_unmanaged_delete_recursive()を使用)、定義済みのコンテンツタイプを削除(node_type_delete()を使用)、等

お役に立てれば!


ありがとう、それを行うためのコーディング方法も知っているのは良いことです。アンインストールの使用に関するいくつかの良い情報を見つける必要がありました
Jane Panda

問題ありません、喜んでお手伝いします!:)
Alex Weber

11

この情報をコードに保持する最良の方法の1つは、機能を使用することです。Feauresはコードに入れることができます:

  • コンテンツタイプ
  • CCKフィールド
  • 許可
  • 役割

リストは続きます。

機能に関する素晴らしい機能の1つは、Drushの統合です。

drush featuresサイト上のすべての機能のリストを提供し、それらのステータス
drush features revert allはすべての機能をコード内の状態に戻します(展開後に実行するのに非常に便利です)

これが役立つ


同意しますが、質問には直接回答しません...
Alex Weber

ええ、私はこれが要求された正確な解決策ではないことを知っていますが、最終的にはどちらも同じ目標を達成します、一方は維持するのが悪夢であり、もう一方はポイントアンドクリックと素晴らしいドラッシュ統合で簡単になります。ボブは彼のために何がうまくいくかを決めることができます
wiifm

1
再度同意します!Drush +機能は最初は怖いかもしれませんが、コツをつかめばとても便利です:)
Alex Weber

それを試してみます。カスタムコンテンツタイプをエクスポートできれば、すべてのフィールドを手動でジャムする必要がないため、時間を節約できると思います。ありがとうございます。
ジェーンパンダ

3

D7 Examplesモジュールをご覧ください。node_exampleにはインストールとアンインストールがあります。

インターフェースツールを使用してタイプを具体化し、機能(機能モジュールを使用)を作成して、関連モジュールをカスタムモジュールのインストール機能に抽出することができる場合があります。


0

一部のフィールドで新しいコンテンツタイプを作成する場合は、以下のコードを使用できます。

このコードは完全に機能します。

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

MySpace Syncモジュールでこれを行いました。
さまざまな情報源をつなぎ合わせたのを覚えていますが、すべての情報源が何であったかは覚えていません。ここでgitリポジトリを参照して、私が何をしたかを確認できますが、これは基本的に、インストール時にCCKのコンテンツコピーモジュールを使用した各コンテンツタイプのエクスポートで、アンインストール時にコンテンツタイプを削除する前にすべてのノードを削除します。


4
質問がタグ付けされたdrupalの-7ですが、MySpaceの同期モジュールが利用可能のあちこちには、コンテンツタイプを作成するために使用されるAPIは、Drupalの6とDrupalの7の間に多くのことを変更しましたDrupalの6です
ピエールBuyle

-1

回答を拡張して、そのリンクの内容に関する詳細(要約など)を追加することをお勧めします。それはあなたの反対票(私のものではない...)を削除するのに役立つかもしれません...
Pierre.Vriens
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.