สร้างประเภทเนื้อหาใหม่ใน hook_install


11

บางคนสามารถแสดงตัวอย่างที่ถูกต้องเกี่ยวกับวิธีสร้างประเภทเนื้อหาใหม่ในวิธีการhook_installของโมดูลได้หรือไม่

ฉันยังต้องการทราบว่า / สิ่งที่ฉันควรทำในระหว่างhook_uninstallเพื่อล้างความยุ่งเหยิงของฉัน; ฉันอ่านมีการถกเถียงกันเรื่องการลบเนื้อหา

ฉันไม่สามารถหาตัวอย่างของวิธีการที่เหมาะสมในการบรรลุภารกิจนี้ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม!

คำตอบ:


7

เพื่อตอบคำถามของคุณอย่างแน่นอน:

การสร้างชนิดเนื้อหาในการติดตั้ง hook : คุณใช้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

หนึ่งในวิธีที่ดีที่สุดในการเก็บข้อมูลนี้ไว้ในรหัสคือการใช้คุณสมบัติต่างๆ Feaures สามารถใส่รหัสได้:

  • ประเภทเนื้อหา
  • เขตข้อมูล CCK
  • สิทธิ์
  • บทบาท

รายการดำเนินต่อไป

ฟีเจอร์หนึ่งที่ดีเกี่ยวกับฟีเจอร์คือการผสมผสานที่น่าประทับใจ

drush featuresจะให้รายการคุณลักษณะทั้งหมดบนไซต์และสถานะของ
drush features revert allคุณสมบัติเหล่านั้นจะเปลี่ยนกลับเป็นคุณสมบัติที่อยู่ในโค้ด (มีประโยชน์จริง ๆ สำหรับการทำงานหลังจากการปรับใช้)

ช่วยด้วย


เห็นด้วยแม้ว่ามันจะไม่ตอบคำถามโดยตรง ...
อเล็กซ์วีเบอร์

ใช่ฉันรู้ว่านี่ไม่ใช่คำตอบที่ถูกต้องตามที่ร้องขอ แต่ท้ายที่สุดแล้วพวกเขาทั้งสองจะบรรลุเป้าหมายเดียวกันมันเป็นเพียงแค่ฝันร้ายที่จะรักษาไว้และอื่น ๆ จะง่ายด้วยการชี้และคลิกและการบูรณาการที่ยอดเยี่ยม . บ๊อบสามารถตัดสินใจได้ว่าอะไรที่เหมาะกับเขา
wiifm

1
ตกลงอีกครั้ง! คุณสมบัติ Drush + สามารถข่มขู่ในตอนแรก แต่มันมีประโยชน์มากเมื่อคุณได้รับมัน :)
อเล็กซ์เวเบอร์

ฉันจะให้ช็อตนั้นฉันคิดว่ามันจะประหยัดเวลาถ้าฉันสามารถส่งออกประเภทเนื้อหาที่กำหนดเองได้ดังนั้นฉันจึงไม่จำเป็นต้องติดขัดทุกฟิลด์ค่ะขอบคุณ!
Jane Panda

3

ตรวจสอบโมดูลตัวอย่าง D7 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 Sync นั้นสามารถใช้ได้เฉพาะ Drupal 6 API ที่ใช้ในการสร้างประเภทเนื้อหามีการเปลี่ยนแปลงอย่างมากระหว่าง Drupal 6 และ Drupal 7
Pierre Buyle

-1

ฉันขอแนะนำให้คุณขยายคำตอบเพื่อเพิ่มรายละเอียดเพิ่มเติมเกี่ยวกับลิงค์นั้น (สรุปหรืออย่างนั้น) มันอาจช่วยให้คุณลบ downvote (ซึ่งไม่ใช่ของฉัน ... ) ออก ...
Pierre.Vriens
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.