web-gelistirme-sc.com

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

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. hook_node_info uyguladım ve İçerik Türü, admin_menu açılır listesindeki İçerik türleri listesinde gösteriliyor, ancak admin/structure/types 'A göz attığımda listelenmiyor.

hook_install uyguladım ve başka bir SO soru üzerinde buldum 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 , ancak Yapı İçerik Türü'ne göz attığımda eklediğim alanı göstermiyor.

İş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 veritabanında field_data_field_mymod_myfile Adlı bir tablo görebilirsiniz, bu yüzden ilk bölüm çalıştı biliyorum. Ancak, tablo boş.

Hata günlüğü field_create_instance() yönteminin bunu döndürdüğünü 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?

9
Kenny Wyland

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 bilgiler: 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 yüzden Özellikler modülünü indirip etkinleştirdim: https://drupal.org/project/features

Sonra içerik türümdeki alanları, Drupal normalde yaptığınız gibi, modülün oluşturmasını istediğim gibi) yönetici arabirimini kullanarak oluşturdum.Ardından Yapı> Özellikler> Özellik oluştur ve koy özellik için sahte bir adla ("test" kullandım) ve sonra bileşenler alanında "Alan Örnekleri" ni tıklayın ve özel alanların kutularını işaretleyin. Alanların tümü düğüm- [düğüm tipi makineniz gibi name] - [alan adı], bu yüzden benim durumumda bir görüntü alanı istediğimden beri node-novel_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.

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 dikkat çeken tenken sayesinde, onu hiç kullanmamıştım ve bunu yapacağını bilmiyordum.

7
Jason Gray

.İ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ını 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');
}
?>
4
Nitesh Sethia

Bu gönderi 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);

    }

}
1
Shlomi Nissan