사용자 정의 모듈에서 파일 필드를 사용하여 컨텐츠 유형을 프로그래밍 방식으로 작성


9

이전에 수행 한 사용자 지정 모듈을 작성하고 있지만, 필드를 사용하여 콘텐츠 형식을 만들려고 시도한 것은 이번이 처음입니다. hook_node_info를 구현 했으며 admin_menu의 드롭 다운에서 컨텐츠 유형 목록에 컨텐츠 유형이 표시되지만 탐색 할 때 admin/structure/types나열되지 않습니다.

hook_install을 구현 하고 다른 SO 질문에서 찾은 코드를 가져 왔습니다 . 코드에 오류 로그에 디버그 정보가 인쇄되어 있으며 모든 것이 작동하는 것처럼 보입니다. 그러나 구조 컨텐츠 유형을 탐색하면 추가 한 필드가 표시되지 않습니다.

후크는 다음과 같습니다.

function mymod_node_info() {
  return array(
    'mymod_content' => array(
      'name' => t('My Mod'),
      'base' => 'mymod_content',
      'description' => t('A Description'),
    )
  );
}

function mymod_install() {
    error_log('mymod_install');
    $types = node_type_get_types();

    if ( ! field_info_field('field_mymod_myfile') ) {
        $field = array(
            'field_name' => 'field_mymod_myfile',
            'type' => 'file',
        );
        $created_field = field_create_field($field);
        error_log('---- field_create_field -----');
        error_log(var_export($created_field, true));
    }

    $instance = array(
        'field_name' => 'field_mymod_myfile',
        'entity_type' => 'mymod_content',
        'bundle' => 'mymod_content',
        'required' => TRUE,
    );
    $created_instance = field_create_instance($instance);
    error_log('---- field_create_instance -----');
    error_log(var_export($created_instance, true));
}

field_data_field_mymod_myfile데이터베이스에서 호출 된 테이블을 볼 수 있으므로 첫 번째 부분이 작동 한 것을 알고 있습니다. 그러나 테이블이 비어 있습니다.

오류 로그는 field_create_instance()메소드가 다음을 리턴 함을 보여줍니다 .

array (
  'field_name' => 'field_mymod_myfile',
  'entity_type' => 'mymod_content',
  'bundle' => 'mymod_content',
  'required' => true,
  'field_id' => '5',
)

내 콘텐츠가이 콘텐츠 유형에 표시되지 않는 이유는 무엇입니까?


1
당신은 기능을 좋아하지 않습니까? FieldUI를 사용하여 컨텐츠 유형을 작성한 다음 기능을 사용자 정의 "기능"(모듈)으로 내보내는 것이 가장 쉽다는 것을 알았습니다. ... 배열은 여기에있는 hook_info와 필드 정의를위한 배열을 사용합니다. 그런 식으로 작업을 교차 점검 할 수 있습니다.
tenken

답변:


7

이것은 이전 답변의 확장이므로 많은 답변이 아닙니다.

이 두 링크는 ​​사용자 정의 필드를 사용자 정의 모듈 노드 유형에 추가하는 데 필요한 시스템을 파악하는 데 매우 유용합니다.

최고 : http://www.sitepoint.com/creating-a-new-drupal-node-type/

좋은 추가 정보 : http://public-action.org/content/drupal-7-field-api-drupal-7-adding-custom-content-type-custom-fields-field-api

내가 가진 문제는 이것들 (그리고 온라인에서 찾을 수있는 다른 모든 예제)은 내 자신의 사용 사례에 대한 해결책을 알아낼 수있는 충분한 문서가없는 매우 구체적인 예라는 것입니다.

기능 모듈을 사용하여 사용자 정의 필드의 배열을 얻는 것에 대해 OP에 대한 tenken의 의견이 도움이되었습니다.

그래서 기능 모듈을 다운로드하여 활성화했습니다 : https://drupal.org/project/features

그런 다음 평소처럼 Drupal의 관리 인터페이스를 사용하여 컨텐츠 유형에 필드를 작성하여 모듈을 작성하려고했습니다. 그런 다음 구조> 기능> 기능 만들기로 이동하여 기능에 대한 가짜 이름 ( "테스트"를 사용함)을 입력 한 다음 컴포넌트 영역에서 "필드 인스턴스"를 클릭하고 사용자 정의 필드의 상자를 선택하십시오. 필드 이름은 모두 node- [노드 유형 머신 이름]-[필드 이름]과 같은 이름으로 지정되었으므로 필자의 경우 이미지 필드를 원했기 때문에 node-novel_section-field_image였습니다.

노드 유형에 대한 사용자 정의 필드를 선택한 후 "Download feature"를 클릭하고 .tar 파일을 데스크탑에 저장 한 후 "test"폴더를 연 다음 test.features.field_base.inc 및 테스트를 보았습니다. features.field_instance.inc 필드에 필요한 배열을 가져옵니다.

그런 다음 방금 게시 한 첫 번째 링크로 요약 된 구조를 사용한 후 완벽하게 작동했습니다. 나를 위해.

이미지 필드 및 분류 참조 필드와 같은 것들에 필요한 배열 구조에 대한 문서를 찾을 수 없었으며 다른 모든 자습서와 온라인 도움말 요청은 텍스트 필드와 같은 특정 사항에 중점을 둔 것으로 보입니다.

다행스럽게도 내가 겪었던 것과 같은 어려움을 겪고있는 사람이라면 누구나 이것을보고이 예제와 기능 모듈을 사용하여 설정 작업을 수행 할 수 있기를 바랍니다.

기능 모듈의이 기능을 지적한 tenken 덕분에 나는 그것을 사용하지 않았으며 그것을 할 줄 몰랐습니다.


4

이 코드는 .install 파일에 추가 할 새 컨텐츠 유형을 작성합니다.

hook_install () 추가 :

<?php
function your_module_name_install() {
  // use get_t() to get the name of our localization function for translation
  // during install, when t() is not available.
  $t = get_t();

  // Define the node type.
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );

  // Complete the node type definition by setting any defaults not explicitly
  // declared above.
  // http://api.drupal.org/api/function/node_type_set_defaults/7
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);

  // Save the content type
  node_type_save($content_type);
}
?>

drupal 메시지를 작성하고이 이벤트를 로그에 작성해야합니다.

<?php
function your_module_name_install() {
  $t = get_t();
  $node_example = array(
    'type' => 'node_example',
    'name' => $t('Example Node'),
    'base' => 'node_content',
    'description' => $t('This is an example node type with a few fields.'),
    'body_label' => $t('Example Description')
  );
  $content_type = node_type_set_defaults($node_example);
  node_add_body_field($content_type);
// Check if we create content type or update.
  $status = node_type_save($content_type);
// Replacement rule for the messages.
  $t_args = array('%name' => $content_type->name);
  if ($status == SAVED_UPDATED) { // update case
    drupal_set_message($t('The content type %name has been updated.', $t_args));
  } 
  elseif ($status == SAVED_NEW) { // create case
    drupal_set_message($t('The content type %name has been added.', $t_args));
    watchdog('node', 'Added content type %name.', $t_args, WATCHDOG_NOTICE, l($t('view'), 'admin/structure/types')); 
  }
}
?>

컨텐츠 유형을 제거하려면 hook_uninstall ()을 제공하십시오 .

<?php
function your_module_name_uninstall() {
  // Gather all the example content that might have been created while this
  // module was enabled.  Simple selects still use db_query().
  // http://api.drupal.org/api/function/db_query/7
  $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
  $result = db_query($sql, array(':type' => 'node_example'));
  $nids = array();
  foreach ($result as $row) {
    $nids[] = $row->nid;
  }
  // Delete all the nodes at once
  // http://api.drupal.org/api/function/node_delete_multiple/7
  node_delete_multiple($nids);
  // Delete our content type
  // http://api.drupal.org/api/function/node_type_delete/7
  node_type_delete('node_example');
}
?>

매우 자세한 응답에 감사하지만 파일 유형이 작성된 후 파일 유형을 컨텐츠 유형에 추가하려면 어떻게합니까?
Kenny Wyland

위의 코드를 사용했는데 콘텐츠 유형이 추가되었지만 표시되지 않습니다.admin/structure/types
Kenny Wyland

1
이 작업을 수행하려면 모듈에서 hook_form ()을 구현해야합니다. 그렇지 않으면 데이터베이스의 node_type 테이블을 보면 새로 작성된 유형이 사용 불가능 함을 알 수 있습니다. hook_form ()을 구현하면 활성화하는 것 같습니다 (왜 이런 식인지 알지 못하며 이해가되지 않습니다). 그건 그렇고 두 번째 의견을 해결합니다.
user5013

1

이 게시물은 약간 오래되었지만 도움이된다면이 기사가 매우 명확하다는 것을 알았습니다. 새로운 컨텐츠 유형을 단계별로 작성하는 방법을 보여줍니다.

튜토리얼 링크

<?php

/**
 * Implements hook_install().
 */
function book_install()
{

    $t = get_t();

    // Step 1 - Define the custom content type

    $content_type = array(

        'type'          => 'book',
        'name'          => $t('Book'),
        'description'   => $t('Create a new book'),
        'title_label'   => $t('Book title'),
        'base'          => 'node_content',
        'custom'        => TRUE,

    );

    $node_type = node_type_set_defaults($content_type);

    node_type_save($node_type);

    // Step 2 - Create new fields

    $fields = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'    => 'book_author_name',
            'type'          => 'text',
            'cardinality'   => 1,

        ),

        // Description

        'book_description'  => array(

            'field_name'    => 'book_description',
            'type'          => 'text_long',
            'cardinality'   => 1,

        ),

    );

    foreach( $fields as $field ) {

        field_create_field($field);

    }

    // Step 3 - Attach fields to content type

    $instances = array(

        // Author’s name

        'book_author_name'  => array(

            'field_name'   => 'book_author_name',
            'label'        => $t('Author Name'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textfield'
            ),

        ),

        // Description

        'book_description'  => array(

            'field_name'   => 'book_description',
            'label'        => $t('Description'),
            'required'     => TRUE,
            'widget'       => array(
                'type'  => 'text_textarea'
            ),

        ),

    );

    foreach( $instances as $instance ) { // Loop through our instances

        $instance['entity_type']   = 'node';
        $instance['bundle']        = 'book'; // Attach the instance to our content type

        field_create_instance($instance);

    }

}

답변에 관련 견적을 포함시켜주십시오
Pierre.Vriens
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.