프로그래밍 방식으로 필드를 만드는 방법?


56

Drupal 7에서 다음을 구현하려면 어떻게해야합니까?

내가해야 할 일은 '회사'라는 새로운 필드 가능 엔티티를 정의하는 모듈을 만드는 것입니다. 각 Company 인스턴스가 작성해야하는 20 개의 필드 목록이 있습니다. 이러한 질문은 사전 정의되어 있으며 일부는 사용자 정의 유효성 검사를 포함 할 수 있습니다.

현재 회사 엔터티에 새 필드를 추가 할 수있는 시점에 있습니다. 이것은 현재 잘 작동합니다. 내 문제는 모듈을 설치 하자마자이 모든 필드가 있어야하므로 인터페이스를 통해 추가하는 것은 옵션이 아니라는 것입니다.

어떻게 접근 할 수 있을지 궁금했습니다. 'Manage Fields'UI를 사용하여 프로그래밍 방식으로 수행 할 수있는 작업을 수행 할 수 있다고 가정합니다.


나는 당신의 요구의 전체 범위에 대해 명확하지는 않지만이 스레드가 당신에게 유용 할 것이라고 생각합니다 : drupal.org/node/721552 모듈을 처음 설치할 때 필드로 사용자 정의 컨텐츠 유형을 작성하기위한 샘플 코드를 보여줍니다. 필요한 정확한 필드 설정을 얻기 위해 API를 파헤쳐 야 할 수도 있지만, 이것이 좋은 출발점이 될 것입니다. 기본적으로 node_type_set_defaults()그리고 node_type_save()물론, 그리고을 살펴 봐야 hook_install()합니다.
handsofaten

기능이 아닌 코드에서이 작업을 수행하는 경우 예제 프로젝트 의 필드 예제 및 노드 예제를 살펴보십시오 .
rfay

몇 마디의 안내. 필드 구성에 대한 제어 수준을 유지하려면 기능을 사용하여 필드를 기록하고 적용하십시오. 원샷 작업으로 정의하고 나중에 해당 구성을 자유롭게 재정의하려면 .install 파일에서 코드 솔루션을 선택하십시오.
Alfred Armstrong

답변:


41

사용 field_create_field ()을 현장 자체 생성 field_create_instance을 () 주어진 엔티티 번들에 대한 인스턴스를 가지고.

사용자 정의 모듈의 일부로 필드를 만들 때 모듈을 제거 할 때 필드를 삭제하거나 삭제하지 않을 수 있습니다. 이렇게하려면, 당신이 사용할 수있는 () field_delete_field 특정 인스턴스를 삭제하려면 당신은 필드와 모든 필드 인스턴스를 삭제하려면, 또는 당신이 사용할 수 있습니다 ) (field_delete_instance를 .


모듈을 제거 할 때 생성 한 필드를 어떻게 삭제합니까?
Ashok KS

Ashok, 방금 답변을 편집하여 설명을 추가했습니다.
레스터 피바디

9

프로그래밍 방식으로 사용자 프로필에 필드를 추가하는 방법 및 사용자 등록 양식에 필드를 사용하거나 사용하지 않는 방법에 대한 예.


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
이것은 hook_install ()에서 구현되어야합니다.
revagomes

기존 컨텐츠 유형에 새 필드를 추가하고 백엔드에서 계속해서 새 필드를 추가하는 것만으로도 그 접근 방식이 좋습니다. 모듈을 활성화하고 비활성화합니다. 새 필드는 편집 가능하며 모듈을 삭제할 수 있습니다.
leymannx

8

UI 나 프로그래밍을 사용하지 않고 기존 컨텐츠 유형 또는 엔티티에서 필드를 빠르게 작성 / 삭제해야하는 경우 다음과 같이 잘 알려지지 않은 Drush 명령을 사용할 수 있습니다.

drush field-create <bundle(for nodes)> <field_name>,<field_type>,[widget_name] --entity_type: 엔티티 유형 (예 : 노드, 사용자, 주석) 기본적으로 노드입니다.

예 : 기사에 대해 두 개의 새 필드를 만듭니다.

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>

4

다른 사람들이 지적한 것처럼 모듈 의 hook_install () 구현 에서 Field API 함수 를 사용하여 콘텐츠 유형에 대한 필드와 해당 인스턴스를 만들 수 있습니다. 함수 사용법에 대해서는 node_example_install () 을 참조하십시오 .

또 다른 해결책은 기능 모듈 을 사용하는 것 입니다. 기능은 다양한 사이트 구성 요소를 모듈로 코드로 내보낼 수 있습니다. 컨텐츠 유형 및 필드는 이러한 내보내기 가능 파일 중 하나입니다. 기능 모듈을 생성하고 기존 코드를 재정의하면 기능이 코드를 위반하지 않도록 최선을 다할 것입니다. 또는 더미 모듈을 생성하고 필드 관련 코드를 복사하여 모듈에 붙여 넣을 수 있습니다. 이를 위해서는 기능의 작동 방식에 대한 기본 지식이 필요합니다.


3

설치 파일에서 '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);
        }
      }
    }

2

최근에 비슷한 프로젝트가 필요했습니다. 여기에 어떻게 접근했는지, 누군가에게 도움이되기를 바랍니다.

기본적으로 필드 UI를 사용하여 필요한 필드를 작성하고이를 코드로 내보내고 사용자 정의 모듈에 포함시킵니다. Devel 모듈이 활성화되어 있어야합니다.

나는 또한 이 정보 로 요점 을 만들었습니다 .

여기 간다 ....

  1. 일반적인 Drupal UI를 사용하여 필요한 필드를 만듭니다.
  2. 같은 사이트에서 example.com/devel/php로 이동하십시오
  3. 다음 코드를 "PHP 코드 실행"텍스트 상자에 붙여 넣습니다.
  4. 처음 3 개의 변수를 설정 한 후 실행을 클릭하십시오.

    $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. 모든 속성이 채워진 2 개의 배열을 얻을 수 있습니다.

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

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

이제 다음 코드를 .install 파일에 추가하십시오. mymodule의 모든 인스턴스를 실제 모듈 이름으로 바꾸십시오. 아래의 각 기능에 언급 된대로 devel 출력의 코드를 _mymodule_field_data 및 _mymodule_instance_data에 붙여 넣습니다. 원하는만큼 많은 필드에 대해이 작업을 수행 할 수 있습니다. 모든 $ fields 배열을 _mymodule_field_data 함수에 넣고 모든 $ instances를 _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

설치시 필드를 작성하기 위해 기능 모듈 사용을 고려할 수도 있습니다.

기능이 필드에 대한 코드를 생성 할 때 기능 모듈을 사용하여 코드를 더미 모듈로 생성 한 다음 모듈의 .install 파일에 복사하여 붙여 넣기 만하면됩니다.

이점은 모듈이 대상 환경의 기능 모듈에 의존하지 않는다는 것입니다.


1
다른 기능은 필드를 코드로 내보내는 좋은 방법이지만 기능을 사용하는 방법은 아닙니다. 기능은 Field API CRUD를 사용하여 생성 된 .install에서 필드를 작성하지 않습니다.
Pierre Buyle

0

아래에 제공된 customcompanymodule 코드를 사용하여 다양한 필드로 프로그래밍 방식으로 컨텐츠 유형을 작성할 수 있습니다.

이 코드를 사용자 정의 모듈의 .install 파일에 추가 할 수 있습니다. 프로그래밍 방식으로 "회사"라는 컨텐츠 유형과 다양한 유형의 필드 (텍스트, 숫자, 날짜 (참고 : 날짜 필드는 기본적으로 제공되지 않으므로 날짜 모듈을 설치해야 함), 이미지, 목록)를 추가합니다.

또한 'customcompanymodule'모듈을 제거 할 때 컨텐츠 유형 "company"를 해당 필드 및 데이터와 함께 제거하는 제거 코드를 추가했습니다.

필요에 따라이 필드를 수정 / 제거 할 수 있습니다.

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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.