Nasıl programsal olarak alanlar oluşturulur?


56

Drupal 7’de aşağıdakilerin uygulanmasına nasıl yaklaşabilirim?

Yapmam gereken, 'Şirket' adında yeni bir yanabilir varlık tanımlayan bir modül oluşturmak. Diyelim ki her Şirket vakası tarafından doldurulması gereken 20 alanın bir listesi var. Bu sorular önceden tanımlanmıştır ve bazıları özel doğrulama içerebilir.

Şu anda, Şirket varlığına yeni alanlar ekleyebileceğim bir noktadayım. Bu şu anda iyi çalışıyor. Sorunum şu ki, modül yüklenir yüklenmez tüm bu alanlara ihtiyacım var, bu yüzden arayüz üzerinden bunları eklemek bir seçenek değil.

Acaba buna nasıl yaklaşabilirim? Programlı olarak 'Manage Fields' (Kullanıcı Alanlarını Yönet) kullanıcı arayüzünü kullanarak yapılabilecekleri yapabilmekle sonuçlandığını varsayardım.


İhtiyaçlarınızın kapsamı konusunda net değilim, ancak bu konunun sizin için yararlı olacağını düşünüyorum: drupal.org/node/721552 Bir modül ilk kurulduğunda alanlarla özel bir içerik türü oluşturmak için örnek kod gösterir. İhtiyacınız olan tam saha ayarlarını almak için muhtemelen API'yi incelemelisiniz, ancak bu iyi bir başlangıç ​​noktası olacaktır. Temel olarak, elbette, içine node_type_set_defaults()ve node_type_save()ayrıca bakmak gerekir hook_install().
handsofaten

Bunu Özellikler'in yerine kodda yapıyorsanız, Örnekler Projesinde Alan Örneği ve Düğüm Örneği'ne bakın .
rfay

Birkaç rehberlik kelimesi. Alanların yapılandırması üzerinde bir kontrol seviyesi elde etmek istiyorsanız, bunları kaydetmek ve uygulamak için Özellikler'i kullanın. Bunları tek seferlik bir işlem olarak tanımlamak ve daha sonra yapılandırmalarının serbestçe geçersiz kılınmasını istiyorsanız, bir .install dosyasında bir kod çözümü seçin.
Alfred Armstrong

Yanıtlar:


41

Kullanım field_create_field () alanını kendisi ve oluşturmak için field_create_instance () verilen varlık paket için bir örnek olması.

Özel bir modülün parçası olarak alanlar oluştururken, modül kaldırıldığında alanı silmek isteyebilirsiniz veya istemeyebilirsiniz. Bunu yapmak için, kullanabilirsiniz () field_delete_field belirli örneklerini silmek istiyorsanız alanını ve tüm alan örneğini silmek istiyorsanız veya kullanabilirsiniz ) (field_delete_instance .


Modülü kaldırırken oluşturduğumuz alanları nasıl siliyoruz?
Ashok KS

Ashok, cevabım için yaptığım bir düzenleme ile ilgili açıklama ekledim.
Lester Peabody

9

Kullanıcı profiline programatik olarak nasıl alan eklenmesi ve Kullanıcı Kaydı formuna nasıl doldurulacağına veya boşaltılmamasına örnek.


function MYMODULE_enable() {
  // Check if our field is not already created.
  if (!field_info_field('field_myField')) {

    // Create the field base.
    $field = array(
      'field_name' => 'field_myField', 
      'type' => 'text', 
    );
    field_create_field($field);

    // Create the field instance on the bundle.
    $instance = array(
      'field_name' => 'field_myField', 
      'entity_type' => 'user', 
      'label' => 'My Field Name', 
      'bundle' => 'user', 
      // If you don't set the "required" property then the field wont be required by default.
      'required' => TRUE,
      'settings' => array(
        // Here you inform either or not you want this field showing up on the registration form.
        'user_register_form' => 1,
      ),
      'widget' => array(
        'type' => 'textfield',
      ), 
    );
    field_create_instance($instance);
  }
}

3
Bu hook_install () içinde uygulanmalıdır.
revagomes

Tek yapmak istediğiniz, mevcut bir içerik türüne yeni bir alan eklemek ve oradan da arka uçta devam etmekse, bu yaklaşım tamamen iyidir. Modülü çalıştırın, kapatın, bitti. Yeni alan var, düzenlenebilir, modül silinebilir.
leymannx,

8

Kullanıcı Arayüzünü veya programlamayı kullanmadan, mevcut bir İçerik Türünden veya veya Varlıktan hızlı bir şekilde alan oluşturmanız / silmeniz gerekirse, bu az bilinen Drush komutlarını kullanabilirsiniz:

drush field-create <bundle(for nodes)> <field_name>,<field_type>,[widget_name] --entity_type: Varlığın türü (örn. Düğüm, kullanıcı, yorum). Düğüm için varsayılanlar.

Örn: Makale için iki yeni alan oluşturun:

drush field-create article city,text,text_textfield subtitle,text,text_textfield

Diğer komutlar:

drush field-delete <field_name> [--bundle] [--entity_type]
drush field-info [field | types]
drush field-update <field_name> Return URL for field editing web page.
drush field-clone <source_field_name> <dst_field_name>

4

Başkaları tarafından belirtildiği gibi, kullanabileceğiniz Saha API işlevlerini gelen hook_install () içerik türüne ait alanların ve bunların örneklerini oluşturmak için modülün uygulanması. Bkz node_example_install () işlev örneğin kullanım için.

Başka bir çözüm de Özellikler modülünü kullanmaktır . Özellikler, çeşitli site bileşenlerini bir modülde kodlamak üzere dışa aktarabilir. İçerik türleri ve alanları bunlar arasında ihraç edilebilir. Bir Özellikler modülü oluşturabilir ve var olan kodunuzu geçersiz kılabilirsiniz, daha sonra Özellikler kodunuzu kırmamak için elinden gelenin en iyisini yapar. Veya sahte bir modül oluşturabilir ve alanlarla ilgili kodu kopyalayıp modülünüze yapıştırabilirsiniz. Bu, Özellikler'in nasıl çalıştığını temel olarak anlamayı gerektirir.


3

Yükleme dosyanızda hem 'hook_install' hem de 'hook_uninstall' tanımlamanız gerekir. Örnek dahil, ancak API referanslarındaki ilave anahtarlar hakkında her şeyi okuyun (kod test edilmemiştir, bu nedenle yazım hatası orada olabilir).

İçinde hook_installkullanarak alanları ekleyebilirsiniz:

field_create_field , Bu fonksiyon bir alan için bir şablon oluşturur.

field_create_instance Alanını oluşturduktan sonra content_types'e (paket olarak da bilinir) eklemek için kullanılabilir.

DİKKAT Çeşitli alan tiplerinin isimleri, onları oluşturan modüllerde bulunabilir (bu, onların hook_field_info içindeki dizi öğesinin anahtarıdır). Tüm çekirdek alan uygulama modüllerini modüller / alan / modüller klasöründe bulabilirsiniz.

Ayarlar ayrıca saha modüllerinden de alınabilir. Ayarladığınız ayarlar field_create_fieldsite genelidir. Ayarladıklarınız field_instance_create, node_type'ye özgü olanlardır.

    MY_MODULE_install(){
      // Generate the base for the field
      $field = array( 
        'field_name' => 'FIELD_MACHINE_NAME', 
        'type' => 'FIELD_TYPE' // See note above for what to put here
      );
      // Instance 
      $instance = array(
        'field_name' => 'FIELD_MACHINE_NAME', 
        'entity_type' => 'node', 
      ); 

      // Create instances of the field and add them to the content_types
      $node_types = node_type_get_types(); 
      foreach($node_types as $node_type){
         $instance['bundle'] = $node_type->type; 
         field_create_instance($instance); 
      }
    }

İçinde hook_uninstall

field_delete_instance ve field_delete_field tekrar kaldırmak için kullanılabilir field_delete_field, son örneği silerseniz otomatik olarak çağrılır (normalde).

    MY_MODULE_uninstall(){
      $node_types = node_type_get_types(); 
      foreach($node_types as $node_type){
        if($instance = field_info_instance('node', 'FIELD_MACHINE_NAME', $node_type->type)) {
          field_delete_instance($instance);
        }
      }
    }

2

Geçenlerde bir projeye benzer bir ihtiyaç duydum, işte nasıl yaklaştığım, birisinin yardımcı olacağını umuyorum.

Temel olarak, UI alanlarını kullanarak ihtiyaç duyduğunuz alanları oluşturacak, kodları dışa aktaracak ve özel modülünüze ekleyeceksiniz. Devel modülünün etkinleştirilmiş olması gerekir.

Ayrıca bu bilgiyle bir Gist yarattım .

İşte başlıyoruz....

  1. Her zamanki Drupal UI'yi kullanarak ihtiyaç duyduğunuz alanları oluşturun.
  2. Aynı sitede example.com/devel/php adresine gidin.
  3. Aşağıdaki kodu "yürütmek için PHP kodu" metin kutusuna yapıştırın.
  4. İlk 3 değişkeni ayarlayın ve ardından çalıştır

    $entity_type = 'node';    
    $field_name = 'body';    
    $bundle_name = 'article'; 
    
    $info_config = field_info_field($field_name);
    $info_instance = field_info_instance($entity_type, $field_name, $bundle_name);
    unset($info_config['id']);
    unset($info_instance['id'], $info_instance['field_id']);
    include_once DRUPAL_ROOT . '/includes/utility.inc';
    $output = "\$fields['" . $field_name . "'] = " . drupal_var_export($info_config) . ";\n";
    $output .= "\$instances['" . $field_name . "'] = " . drupal_var_export($info_instance) . ";";
    drupal_set_message("<textarea rows=30 style=\"width: 100%;\">" . $output . '</textarea>');
  5. Bunun gibi bir şey olan 2 diziyi elde edersiniz, umarım tüm özellikleri doldurursunuz.

$fields['field_some_field'] = array(
  'properties of the field'
);

$instances['field_some_field'] = array(
  'properties of the instance'
);

Şimdi aşağıdaki kodu .install dosyanıza ekleyin. Modülün tüm örneklerini gerçek modül adı ile değiştirin. Devel çıktısından gelen kodu, aşağıdaki ilgili işlevlerde belirtildiği gibi, _mymodule_field_data ve _mymodule_instance_data'ya yapıştırın. Bunu istediğiniz kadar alan için yapabilirsiniz, sadece tüm $ fields dizilerini _mymodule_field_data işlevine ve tüm $ örnekleri _mymodule_instance_data işlevine koyun.

function mymodule_install() {

  // Create all the fields we are adding to our entity type.
  // http://api.drupal.org/api/function/field_create_field/7
  foreach (_mymodule_field_data() as $field) {
    field_create_field($field);
  }

  // Create all the instances for our fields.
  // http://api.drupal.org/api/function/field_create_instance/7
  foreach (_mymodule_instance_data() as $instance) {
    field_create_instance($instance);
  }
}

// Create the array of information about the fields we want to create.
function _mymodule_field_data() {
  $fields = array();
  // Paste $fields data from devel ouput here.
  return $fields;
  }

// Create the array of information about the instances we want to create.
function _mymodule_instance_data() {
  $instances = array();
  // Paste $instances data from devel output here.
  return $instances;
}


0

Yükleme sırasında alanları oluşturmak için Özellikler modülünü kullanmayı da düşünebilirsiniz.

Özellikler alanlar için kod oluştururken, bir seçenek yalnızca kodu sahte bir modüle dönüştürmek için Özellik modülünü kullanmak ve ardından modülünüzün .install dosyasına kopyalayıp yapıştırmaktır.

Bunun avantajı, modülün hedef ortamınızdaki Özellikler modülüne bağlı olmamasıdır.


1
Altough Features, alanları kodlara dışa aktarmanın iyi bir yoludur, özellikleri nasıl kullanacağınız değildir. Özellikler, oluşturulan .install alanlarını oluşturmak için Alan API CRUD'sunu kullanmaz.
Pierre Buyle

0

Çeşitli alanlarıyla programlanmış bir içerik türü oluşturmak için aşağıda verilen customcompanymodule kodunu kullanabilirsiniz.

Bu kodu, özel modülünüzün bir .install dosyasına ekleyebilirsiniz. Programlı olarak "company" adlı bir içerik türü ve çeşitli alan türlerini ekleyecektir (metin, sayısal, tarih (not: Date alanını varsayılan olarak sağlamadığı için Date modülünü kurmanız gerekir), resim, liste).

'Customcompanymodule' modülünüzü kaldıracağınız zaman, "company" içerik türünü kaldıracak tüm alanları ve verileri içeren kaldırma kodunu da ekledim.

Bu alanları gereksinimlerinize göre değiştirebilir / kaldırabilirsiniz:

function customcompanymodule_install() {
     $t = get_t();
     node_types_rebuild();
     $company = array(
    'type' => 'company',
    'name' => $t('Company'),
    'base' => 'node_content',
    'module' => 'node',
    'description' => $t('Content type to handle companys.'),
    'body_label' => $t('Company Description'),
    'title_label' => $t('Company Title'),
    'promote' => 0,
    'status' => 1,
    'comment' => 0,
);
$content_type = node_type_set_defaults($company);

node_type_save($content_type);

foreach (_company_installed_fields() as $field) {
    field_create_field($field);
}

foreach (_company_installed_instances() as $instance) {
    $instance['entity_type'] = 'node';
    $instance['bundle'] = 'company';
    field_create_instance($instance);
}

$weight = db_query("SELECT weight FROM {system} WHERE name = :name",    array(':name' => 'categories'))->fetchField();
db_update('system')->fields(array(
            'weight' => $weight + 1,
        ))
        ->condition('name', 'company')
        ->execute();
}

function _company_installed_fields() {
$t = get_t();
$fields = array(
    'company_startdate' => array(
        'field_name' => 'company_startdate',
        'label' => $t('Company Start Date'),
        'cardinality' => 1,
        'type' => 'datetime',
        'module' => 'date',
        'settings' => array(
            'granularity' => array(
                'month' => 'month',
                'day' => 'day',
                'hour' => 'hour',
                'minute' => 'minute',
                'year' => 'year',
                'second' => 0,
            ),
            'tz_handling' => 'site',
            'timezone_db' => 'UTC',
            'cache_enabled' => 0,
            'cache_count' => '4',
            'todate' => 'required',
        ),
    ),
    'company_totalwinners' => array(
        'field_name' => 'company_totalwinners',
        'label' => $t('Maximum Company Winners'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_minwinner' => array(
        'field_name' => 'company_minwinner',
        'label' => $t('Minimum Entries for Company to Activate'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_totalentries' => array(
        'field_name' => 'company_totalentries',
        'label' => $t('Company Total Entries'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_points' => array(
        'field_name' => 'company_points',
        'label' => $t('Company Points'),
        'cardinality' => 1,
        'type' => 'number_integer',
        'module' => 'number',
        'settings' => array(
            'max_length' => 10000,
        ),
    ),
    'company_image' => array(
        'field_name' => 'company_image',
        'label' => $t('Image'),
        'cardinality' => 1,
        'type' => 'image',
        'settings' => array(
            'default_image' => 0,
            'uri_scheme' => 'public',
        ),
    ),
    'company_description' => array(
        'field_name' => 'company_description',
        'label' => $t('Company Description'),
        'cardinality' => 1,
        'type' => 'text',
        'module' => 'text',
        'length' => '255'
    ),
    'company_winner' => array(
        'field_name' => 'company_winner',
        'label' => $t('Company Description'),
        'cardinality' => 1,
        'type' => 'text',
        'module' => 'text',
        'length' => '255'
    ),
    'field_autowinnerselection' => array(
        'field_name' => 'field_autowinnerselection',
        'label' => $t('Auto Company Winner Selection'),
        'type' => 'list_boolean',
        'module' => 'list',
        'active' => '1',
        'locked' => '0',
        'cardinality' => '1',
        'deleted' => '0'
    ),
);
return $fields;
}

function _company_installed_instances() {
$t = get_t();
$instances = array(
    'company_startdate' => array(
        'field_name' => 'company_startdate',
        'label' => $t('Company Lifespan'),
        'cardinality' => 1,
        'widget' => array(
            'type' => 'date_popup',
            'module' => 'date',
            'settings' => array(
                'input_format' => 'm/d/Y - H:i:s',
                'input_format_custom' => '',
                'year_range' => '-3:+3',
                'increment' => '15',
                'label_position' => 'above',
                'text_parts' => array(),
            ),
        ),
    ),
    'company_totalwinners' => array(
        'field_name' => 'company_totalwinners',
        'label' => $t('Maximum Company Winners'),
        'cardinality' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_minwinner' => array(
        'field_name' => 'company_minwinner',
        'label' => $t('Minimum Number of Entries for Company to Activate'),
        'cardinality' => 1,
        'required' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_totalentries' => array(
        'field_name' => 'company_totalentries',
        'label' => $t('Company Total Entries'),
        'cardinality' => 1,
        'required' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_points' => array(
        'field_name' => 'company_points',
        'label' => $t('Company Points'),
        'cardinality' => 1,
        'required' => 1,
        'widget' => array(
            'type' => 'number',
            'module' => 'number',
            'settings' => array('size' => 60),
        ),
    ),
    'company_image' => array(
        'field_name' => 'company_image',
        'label' => $t('Image'),
        'cardinality' => 1,
        'required' => 1,
        'type' => 'company_image',
        'settings' => array(
            'max_filesize' => '',
            'max_resolution' => '213x140',
            'min_resolution' => '213x140',
            'alt_field' => 1,
            'default_image' => 0
        ),
        'widget' => array(
            'settings' => array(
                'preview_image_style' => 'thumbnail',
                'progress_indicator' => 'throbber',
            ),
        ),
        'display' => array(
            'default' => array(
                'label' => 'hidden',
                'type' => 'image',
                'settings' => array('image_style' => 'medium', 'image_link' => ''),
                'weight' => -1,
            ),
            'teaser' => array(
                'label' => 'hidden',
                'type' => 'image',
                'settings' => array('image_style' => 'thumbnail', 'image_link' => 'content'),
                'weight' => -1,
            ),
        ),
    ),
    'company_description' => array(
        'field_name' => 'company_description',
        'label' => $t('Company Description'),
        'cardinality' => 1,
        'widget' => array(
            'weight' => '-3',
            'type' => 'text_textfield',
            'module' => 'text',
            'active' => 1,
            'settings' => array(
                'size' => '1000',
            ),
        ),
    ),
    'company_winner' => array(
        'field_name' => 'company_winner',
        'label' => $t('Company Winner'),
        'cardinality' => 1,
        'widget' => array(
            'weight' => '-3',
            'type' => 'text_textfield',
            'module' => 'text',
            'active' => 1,
            'settings' => array(
                'size' => '60',
            ),
        ),
    ),
    'field_autowinnerselection' => array(
        'field_name' => 'field_autowinnerselection',
        'required' => 1,
        'label' => $t('Auto Company Winner Selection'),
        'widget' => array(
            'weight' => '-3',
            'type' => 'options_buttons',
            'module' => 'options',
            'active' => 1,
            'settings' => array(),
        ),
    ),
);
return $instances;
}

function customcompanymodule_uninstall() {
$content_types = array(
    'name1' => 'company',
);
$sql = 'SELECT nid FROM {node} n WHERE n.type = :type1';
$result = db_query($sql, array(':type1' => $content_types['name1']));
$nids = array();
foreach ($result as $row) {
    $nids[] = $row->nid;
}
node_delete_multiple($nids);
node_type_delete($content_types['name1']);
field_purge_batch(1000);
}
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.