web-gelistirme-sc.com

Programsal olarak Alanlar nasıl oluşturulur?

Drupal 7) bölümünde aşağıdakileri uygulamaya nasıl yaklaşabilirim?

Yapmam gereken, 'Şirket' adı verilen yeni bir uygulanabilir varlığı tanımlayan bir modül oluşturmak. Diyelim ki, her Şirket örneği 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 noktadayım. Şu anda iyi çalışıyor. Benim sorunum modül yüklenir kurulmaz orada olması gerekiyor, bu yüzden onları arabirim yoluyla eklemek bir seçenek değil.

Buna nasıl yaklaşabileceğimi merak ediyordum? 'Alanları Yönet' kullanıcı arayüzünü programlı olarak kullanarak neler yapılabileceğini varsayalım.

56
NRaf

Alanın kendisini oluşturmak için field_create_field () ve verilen varlık paketi için bir örneğe sahip olmak için field_create_instance () kullanın.

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

41
tamasd

Kullanıcı kaydına programlı olarak alanların nasıl ekleneceği ve Kullanıcı Kaydı formuna nasıl kullanılacağı veya kullanılamayacağı ile ilgili ö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);
  }
}
9
Francisco Luz

Kullanıcı arayüzünü veya programlamayı kullanmadan mevcut bir İçerik Türü veya Varlığından alanları hızlı bir şekilde oluşturmanız/silmeniz gerekiyorsa, bu az bilinen Drush komutlarını kullanabilirsiniz:

drush field-create <bundle(for nodes)> <field_name>,<field_type>,[widget_name] --entity_type: Varlık türü (örn. düğüm, kullanıcı, yorum). Varsayılan olarak düğüm.

Ör .: 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>
8
Interdruper

Başkaları tarafından işaret edildiği gibi, içerik türünüz için alanlar ve örnekleri oluşturmak için modülünüzün hook_install () uygulamasından Alan API işlevleri kullanabilirsiniz. Örneğin işlevin kullanımı için node_example_install () konusuna bakın.

Başka bir çözüm Features modülünü kullanmaktır. Özellikler, çeşitli site bileşenlerini bir modüldeki kodlara aktarabilir. İçerik türleri ve alanlar bu dışa aktarılabilirler arasındadır. Bir Özellikler modülü oluşturabilir ve mevcut kodunuzu geçersiz kılabilirsiniz, Özellikler daha sonra kodunuzu kırmamak için elinden geleni yapacaktır. Ya da 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ığına ilişkin temel bilgileri gerektirir.

4
Pierre Buyle

Yükleme dosyanızda hem 'hook_install' hem de 'hook_uninstall' tanımlamanız gerekir. Örnek dahil ancak API referanslarındaki fazladan anahtarları okuyun (kod test edilmemiştir, bu nedenle burada yazım hataları olabilir).

hook_install İçine alanları kullanarak şunları ekleyebilirsiniz:

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

field_create_instance Alanı içerik_türlerine (paketler olarak da bilinir) eklemek için oluşturulduktan sonra kullanılabilir.

NOT Çeşitli alan türlerinin adları, bunları oluşturan modüllerde bulunabilir (bu, hook_field_info içindeki dizi öğesinin anahtarıdır). Tüm temel alan uygulama modüllerini modüller/alan/modüller klasöründe bulabilirsiniz.

Ayarlar saha modüllerinden de türetilebilir. field_create_field İçinde ayarladığınız ayarlar site genelindendir. field_instance_create İçinde ayarladığınız düğüme ö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); 
      }
    }

hook_uninstall

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

    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);
        }
      }
    }

Son zamanlarda benzer bir projeye ihtiyacım vardı, işte böyle yaklaştım, umarım birisine yardım eder.

Temel olarak, UI alanları kullanarak ihtiyacınız olan alanları oluşturacak, bunları koda aktaracak ve daha sonra bunları özel modülünüze dahil edeceksiniz. Devel modülünün etkinleştirilmiş olması gerekir.

Ayrıca bu bilgilerle bir Gist oluşturdum.

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

  1. Her zamanki Drupal UI) kullanarak ihtiyacınız olan alanları oluşturun.
  2. Aynı sitede example.com/devel/php adresine gidin
  3. Aşağıdaki kodu "Yürütülecek PHP kodu" metin kutusuna yapıştırın.
  4. İlk 3 değişkeni ayarlayın ve ardından yürüt'e tıklayın

    $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. İnşallah tüm özellikleri ile 2 diziler, böyle bir şey alacaksınız.

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

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

Şimdi .install dosyanıza aşağıdaki kodu ekleyin. Mymodule'ün tüm örneklerini gerçek modül adıyla değiştirin. Devel çıkışındaki kodu, aşağıdaki ilgili işlevlerde belirtildiği gibi _mymodule_field_data ve _mymodule_instance_data içine yapıştırın. Bunu istediğiniz kadar alan için yapabilirsiniz, tüm $ alan dizilerini _mymodule_field_data işlevine ve tüm $ örneklerini _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;
}
2
John Laine

Yükleme zamanında alanları oluşturmak için Özellikler modülünü de kullanabilirsiniz.

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

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

0

Çeşitli alanlarıyla programlı olarak bir içerik türü oluşturmak için aşağıda verilen özel şirket modülü kodunu kullanabilirsiniz.

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

Ayrıca, 'customcompanymodule' modülünüzü kaldıracağınız zaman, "company" içerik türünü ve tüm alanlarını ve verilerini kaldıracak olan kaldırma kodunu da ekledim.

Bu alanları ihtiyaçlarınıza 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);
}
0
Nadeem Khan