当前位置: 首页>>技术解读>>正文


如何以编程方式创建字段?

webfans 技术解读 , , 去评论

问题描述

如何在Drupal 7中实现以下功能?

我需要做的是创建一个模块,该模块定义一个名为’Company’的新的可现场实体。我有一个列表,比方说,每个公司实例需要填写20个字段。这些问题是预定义的,有些可能包含自定义验证。

目前,我正在向公司实体添加新字段。这个目前工作正常。我的问题是,我需要在安装模块后立即将所有这些字段放在那里,因此通过接口添加它们不是一种选择。

我想知道我该如何处理这个问题?我假设它能够以编程方式使用’Manage Fields’ UI完成所有工作。

最佳解决办法

使用field_create_field()创建字段本身,使用field_create_instance()创建给定实体包的实例。

在将字段创建为自定义模块的一部分时,您可能希望也可能不希望在卸载模块时删除该字段。为此,如果要删除字段和所有字段实例,可以使用field_delete_field(),或者如果要删除特定实例,可以使用field_delete_instance()

次佳解决办法

有关如何以编程方式将字段添加到用户配置文件以及如何在用户注册表单中使用它们的示例。


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

第三种解决办法

如果您需要快速创建/删除现有内容类型或实体中的字段,而无需使用UI或编程,则可以使用以下little-known Drush命令:

drush field-create <bundle(for nodes)> <field_name>,<field_type>,[widget_name] --entity_type : Type of entity (e.g. node, user, comment). Defaults to node.

例如:为文章创建两个新字段:

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

其他命令:

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>

第四种办法

如其他人所指出的,您可以使用模块的hook_install()实现中的Field API functions为您的内容类型创建字段及其实例。有关该函数的示例用法,请参阅node_example_install()

另一种解决方案是使用Features模块。功能可以将各种站点组件导出到模块中的代码。内容类型和字段是可导出的。您可以生成功能模块并覆盖现有代码,然后功能将尽力避免破坏您的代码。或者,您可以生成虚拟模块并将fields-related代码复制/粘贴到模块中。这需要基本了解功能的工作原理。

第五种办法

在安装文件中,您需要同时定义’hook_install’和’hook_uninstall’。示例包括但是阅读了所有关于API引用中的额外键(代码未经测试,因此可能是错误的)。

hook_install中,您可以使用以下命令添加字段:

field_create_field,此函数为字段构建模板。

field_create_instance可在创建字段后使用,将其添加到content_types(也称为包)。

注意可以在生成它们的模块中找到各种字段类型的名称(它是hook_field_info中数组项的键)。您可以在modules /field /modules文件夹中找到所有核心字段实现模块。

设置也可以从现场模块中派生。您在field_create_field中设置的设置是站点范围的设置。您在field_instance_create中设置的是node_type特定的那些

    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_instancefield_delete_field再次删除它们,如果删除最后一个实例(通常),则会自动调用field_delete_field

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

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2717.html,转载请务必附带本地址声明。