Làm thế nào để lập trình tạo các lĩnh vực?


56

Làm thế nào tôi có thể tiếp cận thực hiện những điều sau đây trong Drupal 7?

Những gì tôi cần làm là tạo một mô-đun xác định một thực thể có thể thực hiện mới, được gọi là 'Công ty'. Tôi có một danh sách, giả sử, 20 trường cần được điền theo từng trường hợp Công ty. Những câu hỏi này được xác định trước và một số có thể chứa xác nhận tùy chỉnh.

Hiện tại, tôi đang ở thời điểm tôi có thể thêm các trường mới vào thực thể Công ty. Điều này hoạt động tốt tại thời điểm này. Vấn đề của tôi là tôi cần tất cả các trường này ở đó ngay khi mô-đun được cài đặt, vì vậy việc thêm chúng qua giao diện không phải là một tùy chọn.

Tôi đã tự hỏi làm thế nào tôi có thể tiếp cận điều này? Tôi cho rằng nó có khả năng thực hiện những gì có thể được thực hiện bằng cách sử dụng giao diện người dùng 'Quản lý trường' theo chương trình.


Tôi không rõ về phạm vi đầy đủ của nhu cầu của bạn, nhưng tôi nghĩ chủ đề này sẽ hữu ích cho bạn: drupal.org/node/721552 Nó hiển thị mã mẫu để tạo loại nội dung tùy chỉnh với các trường khi cài đặt mô-đun lần đầu tiên. Có thể bạn sẽ phải tìm hiểu API để có được các cài đặt trường chính xác mà bạn cần, nhưng đây sẽ là điểm khởi đầu tốt. Về cơ bản, bạn sẽ cần phải xem xét node_type_set_defaults()node_type_save(), tất nhiên , hook_install().
handofaten

Nếu bạn đang thực hiện mã này trái ngược với Tính năng, hãy xem Ví dụ trường và Ví dụ nút trong Dự án ví dụ .
rfay

Một vài lời hướng dẫn. Nếu bạn muốn duy trì mức độ kiểm soát cấu hình của các trường, hãy sử dụng Tính năng để ghi lại và áp dụng chúng. Nếu bạn muốn xác định chúng là thao tác một lần và để cấu hình của chúng được ghi đè tự do trong tương lai, hãy chọn giải pháp mã trong tệp .install.
Alfred Armstrong

Câu trả lời:


41

Sử dụng field_create_field () để tạo trường chính và field_create_instance () để có một phiên bản cho gói thực thể đã cho.

Khi tạo các trường như một phần của mô-đun tùy chỉnh, bạn có thể hoặc không muốn xóa trường khi mô-đun được gỡ cài đặt. Để làm như vậy, bạn có thể sử dụng field_delete_field () nếu bạn muốn xóa trường và tất cả trường hợp trường hoặc nếu bạn muốn xóa các trường hợp cụ thể, bạn có thể sử dụng field_delete_instance () .


Làm cách nào để xóa các trường chúng tôi đã tạo khi gỡ cài đặt mô-đun?
Ashok KS

Ashok, tôi đã thêm một sự làm rõ cho bạn trong một chỉnh sửa tôi vừa thực hiện để trả lời.
Lester Peabody

9

Ví dụ về cách thêm các trường vào hồ sơ người dùng theo cách lập trình và cách tận dụng chúng, hoặc không, vào biểu mẫu Đăng ký người dùng.


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
Điều này nên được thực hiện trong hook_install ().
revagomes

Nếu tất cả những gì bạn muốn làm là thêm một trường mới vào một loại nội dung hiện có và từ đó tiếp tục trong phần phụ trợ, cách tiếp cận đó hoàn toàn tốt. Kích hoạt mô-đun, hủy kích hoạt nó, xong. Trường mới ở đó, có thể chỉnh sửa, mô-đun có thể bị xóa.
leymannx 21/07/2015

8

Nếu bạn cần nhanh chóng tạo / xóa các trường từ Loại nội dung hoặc Thực thể hiện có mà không cần sử dụng UI cũng như lập trình, bạn có thể sử dụng các lệnh Drush ít được biết đến này:

drush field-create <bundle(for nodes)> <field_name>,<field_type>,[widget_name] --entity_type: Loại thực thể (ví dụ: nút, người dùng, nhận xét). Mặc định cho nút.

Ví dụ: Tạo hai trường mới cho Bài viết:

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

Các lệnh khác:

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

Như được chỉ ra bởi những người khác, bạn có thể sử dụng các hàm API của Trường từ triển khai hook_install () của mô-đun của bạn để tạo các trường và các thể hiện của chúng cho loại nội dung của bạn. Xem node_example_install () để biết cách sử dụng hàm.

Một giải pháp khác là sử dụng mô-đun Tính năng . Các tính năng có thể xuất các thành phần trang web khác nhau để mã trong một mô-đun. Các loại nội dung và các lĩnh vực là một trong số có thể xuất khẩu. Bạn có thể tạo mô-đun Tính năng và ghi đè mã hiện tại của mình, Các tính năng sau đó sẽ cố gắng hết sức để tránh phá mã của bạn. Hoặc bạn có thể tạo một mô-đun giả và sao chép. Hãy thử mã liên quan đến các trường vào mô-đun của bạn. Điều này đòi hỏi sự hiểu biết cơ bản về cách các tính năng hoạt động.


3

Trong tệp cài đặt của bạn, bạn sẽ cần xác định cả 'hook_install' và 'hook_uninstall'. Ví dụ bao gồm nhưng đọc tất cả về các khóa bổ sung trong tài liệu tham khảo API (mã chưa được kiểm tra nên có thể là lỗi chính tả trong đó).

Trong phần hook_installbạn có thể thêm các trường bằng cách sử dụng:

field_create_field , Hàm này xây dựng một mẫu cho một trường.

field_create_instance Có thể được sử dụng sau khi tạo trường để thêm nó vào content_types (còn được gọi là gói).

LƯU Ý Tên của các loại trường khác nhau có thể được tìm thấy trong các mô-đun tạo ra chúng (đó là khóa của mục mảng trong hook_field_info của chúng). Bạn có thể tìm thấy tất cả các mô-đun triển khai trường lõi trong thư mục mô-đun / trường / mô-đun.

Cài đặt cũng có thể được lấy từ các mô-đun trường. Các cài đặt bạn đặt trong field_create_fieldlà các cài đặt rộng của trang web. Những cái bạn đặt field_instance_createlà những cái cụ thể của 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); 
      }
    }

bên trong hook_uninstall

field_delete_instancefield_delete_field có thể được sử dụng để xóa chúng một lần nữa, field_delete_fieldđược gọi tự động nếu bạn xóa phiên bản cuối cùng (thông thường).

    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

Gần đây tôi có một nhu cầu tương tự cho một dự án, đây là cách tôi tiếp cận nó, hy vọng nó sẽ giúp được ai đó.

Về cơ bản, bạn sẽ tạo các trường bạn cần bằng UI trường, xuất chúng thành mã và sau đó đưa chúng vào mô-đun tùy chỉnh của bạn. Bạn sẽ cần mô-đun Devel được kích hoạt.

Tôi cũng đã tạo một Gist với thông tin này.

Chúng ta đi đây ....

  1. Tạo các trường bạn cần, sử dụng UI Drupal thông thường.
  2. Trên cùng một trang, hãy truy cập example.com/devel/php
  3. Dán đoạn mã sau vào hộp văn bản "Mã PHP để thực thi".
  4. Đặt 3 biến đầu tiên và sau đó nhấp vào thực thi

    $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. Bạn sẽ nhận được 2 mảng, một cái gì đó như thế này, hy vọng với tất cả các thuộc tính được điền vào.

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

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

Bây giờ thêm mã sau vào tệp .install của bạn. Thay thế tất cả các phiên bản của mymodule bằng tên mô-đun thực tế. Dán mã từ đầu ra phát vào _mymodule_field_data và _mymodule_instance_data, như đã lưu ý các hàm tương ứng bên dưới. Bạn có thể làm điều này cho bao nhiêu trường tùy thích, chỉ cần đặt tất cả các mảng $ trong hàm _mymodule_field_data và tất cả các thể hiện $ trong hàm _mymodule_instance_data.

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

Bạn cũng có thể xem xét sử dụng mô-đun Tính năng để tạo các trường khi cài đặt.

Vì Tính năng tạo mã cho các trường, một tùy chọn chỉ là sử dụng mô-đun Tính năng để tạo mã vào mô-đun giả, sau đó sao chép và dán vào tệp .install của mô-đun.

Lợi ích là mô-đun không phụ thuộc vào mô-đun Tính năng trong môi trường mục tiêu của bạn.


1
Tính năng thay đổi là một cách tốt để xuất các trường sang mã, đó không phải là cách sử dụng Tính năng. Các tính năng không sử dụng CRUD API trường để tạo các trường từ .install được tạo.
Pierre Buyle

0

Bạn có thể sử dụng mã tùy chỉnh mô hình được đưa ra dưới đây để lập trình tạo một loại nội dung với các trường khác nhau.

Bạn có thể thêm mã này vào tệp .install của mô-đun tùy chỉnh. Nó sẽ lập trình thêm một loại nội dung gọi là "công ty" và các loại trường khác nhau (văn bản, số, ngày (lưu ý: bạn sẽ cần cài đặt mô-đun Ngày vì trường Ngày không được cung cấp theo mặc định), hình ảnh, danh sách).

Tôi cũng đã thêm mã gỡ cài đặt sẽ xóa loại nội dung "công ty" cùng với tất cả các trường và dữ liệu của nó khi bạn sẽ gỡ cài đặt mô-đun 'customcompanymodule' của mình.

Bạn có thể sửa đổi / xóa các trường này theo nhu cầu của bạn:

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);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.