Hook_node_info () içine alan ekle;


9

Hook_node_info kullanılarak bildirilen bir düğüm türüne alan eklemek mümkün müdür? Alanları ayrı ayrı eklemek zorunda mıyım? Öyleyse, bunun için hangi kancayı kullanırdım?

Yanıtlar:


8

Alanları ayrı ayrı eklemeniz gerekir, bunlar eklenemez hook_node_info(). Bunu genellikle hook_install()modülünüzün .install dosyasındaki bir işlevde yaparsınız .

Blog modülünün kurulum dosyasında Drupal çekirdeğinden güzel ve basit bir örnek:

function blog_install() {
  // Ensure the blog node type is available.
  node_types_rebuild();
  $types = node_type_get_types();
  node_add_body_field($types['blog']);
}

İşlev yalnızca düğüm türlerini yeniden oluşturur (böylece yeni eklenen tür kullanılabilir), ardından node_add_body_field()işlevi kullanarak bir gövde alanı ekler . Bu işlev kendi içinde bir alanın, o alanın bir örneğinin nasıl oluşturulacağına ve field_create_field()ve field_create_instance()işlevlerini kullanarak bir içerik türüne nasıl ekleneceğine dair mükemmel bir örnek verir .

Kod o kadar uzun değil bu yüzden buraya örnek olarak ekleyeceğim:

function node_add_body_field($type, $label = 'Body') {
  // Add or remove the body field, as needed.
  $field = field_info_field('body');
  $instance = field_info_instance('node', 'body', $type->type);
  if (empty($field)) {
    $field = array(
      'field_name' => 'body', 
      'type' => 'text_with_summary', 
      'entity_types' => array('node'),
    );
    $field = field_create_field($field);
  }
  if (empty($instance)) {
    $instance = array(
      'field_name' => 'body', 
      'entity_type' => 'node', 
      'bundle' => $type->type, 
      'label' => $label, 
      'widget' => array('type' => 'text_textarea_with_summary'), 
      'settings' => array('display_summary' => TRUE), 
      'display' => array(
        'default' => array(
          'label' => 'hidden', 
          'type' => 'text_default',
        ), 
        'teaser' => array(
          'label' => 'hidden', 
          'type' => 'text_summary_or_trimmed',
        ),
      ),
    );
    $instance = field_create_instance($instance);
  }
  return $instance;
}

Teşekkürler. Hook_uninstall'ımda bir şey yapmam gerekir mi?
— Gaelan

Gerçekten size kalmış ... eğer oluşturduğunuz herhangi bir içeriği / içerik türünü / alanı kaldırmak istiyorsanız evet, eğer yapmazsanız, o zaman hayır :)
— Clive

Yani modülüm kapatıldığında içerik türüm kaybolmuyor mu?
— Gaelan

2
Devre dışı bırakılan modülü kaldırsanız bile modülünüz devre dışı bırakıldığında (Drupal 7'de) özel İçerik Türünüz kaybolmaz. Modülünüzün hook_uninstall () işlemi sırasında yükleme sırasında oluşturduğunuz İçerik Türlerini silmek için kod yazarsanız, evet, modülünüzü Kaldırdığınızda İçerik Türü kaybolur (ancak yalnızca devre dışı bıraktığınızda hala görünmez).
— Kod Amca Maymun
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.