Programlı olarak özel bir modülde dosya alanı içeren bir içerik türü oluşturma


9

Daha önce yaptığım özel bir modül yazıyorum, ancak ilk kez alanları olan bir içerik türü oluşturmaya çalıştım. Ben hayata hook_node_info ben göz ne zaman ve İçerik Türü admin_menu gelen açılır listede İçerik türleri listesinde gösterildiğini, ancak, admin/structure/typesbunun listede yok.

Ben hayata hook_install ve başka SO soru üzerine bulunan bazı kod yakaladı. Kod hata günlüğüme bazı hata ayıklama bilgileri yazdırmak ve tüm çalışır gibi görünüyor, ama Yapı İçerik Türü göz attığınızda eklediğim alanı göstermez.

İşte kancalar:

function mymod_node_info() {
  return array(
    'mymod_content' => array(
      'name' => t('My Mod'),
      'base' => 'mymod_content',
      'description' => t('A Description'),
    )
  );
}

function mymod_install() {
    error_log('mymod_install');
    $types = node_type_get_types();

    if ( ! field_info_field('field_mymod_myfile') ) {
        $field = array(
            'field_name' => 'field_mymod_myfile',
            'type' => 'file',
        );
        $created_field = field_create_field($field);
        error_log('---- field_create_field -----');
        error_log(var_export($created_field, true));
    }

    $instance = array(
        'field_name' => 'field_mymod_myfile',
        'entity_type' => 'mymod_content',
        'bundle' => 'mymod_content',
        'required' => TRUE,
    );
    $created_instance = field_create_instance($instance);
    error_log('---- field_create_instance -----');
    error_log(var_export($created_instance, true));
}

Ben field_data_field_mymod_myfileveritabanında denilen bir tablo görebilirsiniz , bu yüzden ilk bölüm çalıştı biliyorum. Ancak, tablo boş.

Hata günlüğü, bunu field_create_instance()döndüren yöntemi gösterir :

array (
  'field_name' => 'field_mymod_myfile',
  'entity_type' => 'mymod_content',
  'bundle' => 'mymod_content',
  'required' => true,
  'field_id' => '5',
)

Alanım neden bu içerik türünde görünmüyor?


1
Özellikleri sevmiyor musun? FieldUI kullanarak İçerik Türü yapmak en kolay buluyorum ve sonra Özelliği özel bir "Özellik" (modül) ihracat. ... sadece dizilerin burada bulunan hook_info'yu kullanmasını sağlıyor - ve alan tanımları için diziler. İşinizi bu şekilde kontrol edebilirsiniz.
13'te tenken

Yanıtlar:


7

Bu, önceki cevabın genişlemesi olduğu için bir cevap değildir.

Bu iki bağlantıyı, özel modül düğümü türünüze eklenecek özel alanlar için sistemin neye ihtiyacı olduğunu bulmada çok yararlı buldum.

En iyi: http://www.sitepoint.com/creating-a-new-drupal-node-type/

İyi ek bilgi: http://public-action.org/content/drupal-7-field-api-drupal-7-adding-custom-content-type-custom-fields-field-api

Sahip olduğum sorun, bunların (ve çevrimiçi bulabildiğim diğer tüm örneklerin) kendi kullanım durumuma bir çözüm bulmama yardımcı olacak yeterli belge olmadan çok spesifik örnekler olmasıydı.

Yardımcı olan şey, tenken'in OP'ye özel alanlar için dizileri almak için Özellikler modülünü kullanma hakkındaki yorumu idi.

Bu nedenle Özellikler modülünü indirip etkinleştirdim: https://drupal.org/project/features

Sonra, içerik türümdeki alanları, normalde yaptığınız gibi Drupal'daki yönetici arayüzünü kullanarak modülün oluşturmasını istediğim şekilde oluşturdum. Daha sonra Yapı> Özellikler> Özellik oluştur'a göz attım ve özellik için sahte bir ad ("test" kullandım) koydum ve ardından bileşenler alanında "Alan Örnekleri" ni tıklayın ve özel alanların kutularını işaretleyin. Alanların hepsi düğüm- [düğüm tipi makine adı] - [alan adı] gibi bir şey olarak adlandırılır, bu yüzden benim durumumda bir görüntü alanı istediğimden beri düğüm-roman_section-field_image idi.

Düğüm türüm için özel alanları seçtikten sonra "İndirme özelliği" ni tıkladım ve .tar dosyasını masaüstüme kaydettim, açtım, "test" klasörünü açıp test.features.field_base.inc ve test görüntüledik. features.field_instance.inc alanlarım için gerekli dizileri almak için.

Daha sonra ilk yayınladığım bağın ana hatlarını çizdim ve bundan sonra mükemmel çalıştı. Benim için.

Görüntü alanları ve sınıflandırma referans alanları gibi şeyler için gereken dizi yapıları hakkında herhangi bir belge bulamadım ve diğer tüm öğreticiler ve yardım istekleri çevrimiçi metin alanları gibi belirli şeylere odaklanmış gibi görünüyordu.

Umarım yaşadığım aynı sıkıntıya sahip olan herkes bunu görecek ve benim yaptığım gibi bu örnekleri ve Özellikler modülünü kullanarak kurulum çalışmalarını yapabilecektir.

Özellikler modülünün bu işlevselliğine işaret ettiği için tenken sayesinde, onu hiç kullanmamıştım ve bunu yapacağını bilmiyordum.


4

.İnstall dosyasına eklenecek yeni içerik türü oluşturulacak bu kod.

Hook_install () ekleniyor:

<?php
function your_module_name_install() {
  // use get_t() to get the name of our localization function for translation
  // during install, when t() is not available.
  $t = get_t();

  // Define the node type.
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );

  // Complete the node type definition by setting any defaults not explicitly
  // declared above.
  // http://api.drupal.org/api/function/node_type_set_defaults/7
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);

  // Save the content type
  node_type_save($content_type);
}
?>

Drupal mesajı yapmalı ve bu olayı günlüğe yazmalısınız:

<?php
function your_module_name_install() {
  $t = get_t();
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);
// Check if we create content type or update.
  $status = node_type_save($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')); 
  }
}
?>

İçerik türünüzü kaldırmak için hook_uninstall () sağlayın :

<?php
function your_module_name_uninstall() {
  // Gather all the example content that might have been created while this
  // module was enabled.  Simple selects still use db_query().
  // http://api.drupal.org/api/function/db_query/7
  $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
  $result = db_query($sql, array(':type' => 'node_example'));
  $nids = array();
  foreach ($result as $row) {
    $nids[] = $row->nid;
  }
  // Delete all the nodes at once
  // http://api.drupal.org/api/function/node_delete_multiple/7
  node_delete_multiple($nids);
  // Delete our content type
  // http://api.drupal.org/api/function/node_type_delete/7
  node_type_delete('node_example');
}
?>

Çok ayrıntılı bir yanıt için teşekkür ederim, ancak oluşturulduktan sonra içerik türüne nasıl Dosya alanı ekleyebilirim?
Kenny Wyland

Yukarıdaki kodunuzu kullandım ve içerik türünün eklendiğini söylüyor, ancak görünmüyoradmin/structure/types
Kenny Wyland

1
Bunun çalışması için modülünüzde hook_form () yöntemini uygulamanız gerekir, aksi takdirde veritabanındaki node_type tablosuna bakarsanız, yeni oluşturulan türünüzün devre dışı olduğunu göreceksiniz. Hook_form () uygulamak onu etkinleştiriyor gibi görünüyor (neden bu şekilde, hiçbir fikrim yok ve pek mantıklı değil). Bu arada ikinci yorumunuzu ele alır.
user5013

1

Bu yazı biraz eskimiş, ancak yardımcı olursa, bu makalenin çok açık olduğunu gördüm. Adım adım yeni bir içerik türünün nasıl oluşturulacağını gösterir.

Eğiticiye bağlantı

<?php

/**
 * Implements hook_install().
 */
function book_install()
{

    $t = get_t();

    // Step 1 - Define the custom content type

    $content_type = array(

        'type'          => 'book',
        'name'          => $t('Book'),
        'description'   => $t('Create a new book'),
        'title_label'   => $t('Book title'),
        'base'          => 'node_content',
        'custom'        => TRUE,

    );

    $node_type = node_type_set_defaults($content_type);

    node_type_save($node_type);

    // Step 2 - Create new fields

    $fields = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'    => 'book_author_name',
            'type'          => 'text',
            'cardinality'   => 1,

        ),

        // Description

        'book_description'  => array(

            'field_name'    => 'book_description',
            'type'          => 'text_long',
            'cardinality'   => 1,

        ),

    );

    foreach( $fields as $field ) {

        field_create_field($field);

    }

    // Step 3 - Attach fields to content type

    $instances = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'   => 'book_author_name',
            'label'        => $t('Author Name'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textfield'
            ),

        ),

        // Description

        'book_description'  => array(

            'field_name'   => 'book_description',
            'label'        => $t('Description'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textarea'
            ),

        ),

    );

    foreach( $instances as $instance ) { // Loop through our instances

        $instance['entity_type']   = 'node';
        $instance['bundle']        = 'book'; // Attach the instance to our content type

        field_create_instance($instance);

    }

}

Lütfen cevabınıza ilgili bir alıntı ekleyin
Pierre.Vriens
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.