컨텐츠 유형별로 기본 입력 텍스트 형식을 어떻게 설정합니까?


10

컨텐츠 유형 및 컨텐츠 필드마다 다른 기본 입력 텍스트 형식을 설정할 수 있기를 원합니다.

예를 들어 형식 유형 선택은 " 일반 텍스트 "및 " 리치 텍스트 편집기 "일 수 있으며 경우에 따라 형식을 기본적으로 " 리치 텍스트 편집기 " 로 설정하고 드롭 다운에서 " 일반 텍스트 "를 선택으로 유지하려고 합니다. " 서식있는 텍스트 편집기 "를 첫 번째로 선택 하기 위해 텍스트 형식의 순서를 변경할 수 있다는 것을 알고 있지만이 방법은 모든 것을 변경합니다.

답변:


10

Better Formats 모듈 의 안정적인 릴리스가없는 경우 특정 컨텐츠 유형 또는 필드에 대해이를 수행하기 위해 사용자 정의 모듈을 작성할 수 있습니다.

모듈 (폴더 'modulename'내에 모듈 이름 .info 및 모듈 이름 .module)을 만듭니다 . 예 : default_text_format.module :

<?php
/**
* Implements hook_element_info_alter().
*
* Sets the text format processor to a custom callback function.
* This code is taken from the Better Formats module.
*/
function default_text_format_element_info_alter(&$type) {
  if (isset($type['text_format']['#process'])) {
    foreach ($type['text_format']['#process'] as &$callback) {
      if ($callback === 'filter_process_format') {
        $callback = 'default_text_format_filter_process_format';
      }
    }
  }
}

/**
* Callback for MODULENAME_element_info_alter().
*/
function default_text_format_filter_process_format($element) {
  $element = filter_process_format($element);
  // Change input format to "Filtered HTML" for body fields of article nodes
  if ($element['#bundle'] == 'article' && $element['#field_name'] == 'body') {
    $element['format']['format']['#default_value'] = 'filtered_html';
  }
  return $element;
}

그리고 default_text_format.info :

name = Default text format
description = Adapt the module code to set a default format for a content type.
package = Custom modules
core = "7.x"

이 파일들을 sites / all / modules / custom의 'default_text_format'폴더에 넣으십시오.

컨텐츠 유형에 맞게 번들 이름을 변경하십시오. 그리고 'body'를 자신의 'field_contenttype_fieldname'으로 대체 할 수 있습니다. ( 이 주석 후 / better_formats 코드.)


1
나는 이것을 시도하고 작동하도록 변경하여 나를 위해 일했다. `foreach ($ type [ 'text_format'] [ '# process'] as $ key => $ callback) {if ($ key == 'filter_process_format') {$ type [ 'text_format'] [ '# process'] [ ] = 'MODULE_NAME_default_text_formats_filter_process_format'; }`
awm

@awm의 솔루션을 확인할 수 있습니다. 원래의 답변은 기본 콜백을 무시하기 때문에 나에게도 효과가 없습니다. awm의 솔루션은 재정의 대신 콜백을 추가하여 문제를 해결합니다.
timofey.com

업데이트-마지막 코멘트를 다시받습니다. 원래 답변이 효과가 있으며 선호됩니다. 콜백을 재정의 한 Better Formats 모듈이 설치되어있어 작동하지 않았습니다. 이 기능을 추가하기 전에 비활성화하는 것이 이상적입니다. 이제 배열에 두 번째 콜백을 추가하는 경우 (위의 주석에서 제안한대로) 콜백 # 1이 먼저 처리되므로 콜백에 도달하기 전에 데이터가 변경됩니다.
timofey.com

3

더 나은 형식 모듈을 사용하십시오 .

더 나은 형식은 Drupal의 핵심 입력 형식 시스템에 유연성을 더하는 모듈입니다. 컨텐츠 유형별 기본 형식 등을 설정할 수 있습니다.


고마워, 유망 해 보이지만 프로덕션 웹 사이트에서 D7을 사용하고 있으므로 아직 개발 중이므로이 모듈을 사용하지 않을 것입니다.
J-Fiz

3

방금이 문제에 부딪 쳤지 만 베타 모듈 (Better Formats)을 사용하고 싶지 않았으며 기능을 확장하고 자동화하여 그러한 설정이 하드 코딩되지 않고 백 오피스에서 설정되도록해야했습니다. .

그래서 나는 다음을 수행했다.

  • 기본 텍스트 형식이 필요한 필드의 설정 편집 양식에 설정을 추가했습니다.
  • 위의 코드를 사용하고 필드 설정에 저장된 기본 텍스트 형식을 설정하도록 약간 수정했습니다.
  • 코드에서 설정을 유지하도록 기능을 사용하여 컨텐츠 유형을 내보냈습니다.

필드 편집 설정 부분

/**
 * Implements hook_form_FIELD_UI_FIELD_EDIT_FORM_alter().
 */
function MY_MODULE_form_field_ui_field_edit_form_alter(&$form, &$form_state) {
  if ($form['#field']['type'] == 'text_long') {
    $instance = $form['#instance'];
    // Fieldset for Default Formats settings.
    $filters = filter_formats();
    $options = array('_none' => t('None'));
    foreach ($filters as $key => $filter) {
      $options[$key] = $filter->name;
    }
    $form['instance']['settings']['default_filter'] = array(
      '#type' => 'fieldset',
      '#title' => t('Default Filter Settings'),
      '#collapsible' => FALSE,
      '#collapsed' => FALSE,
    );
    $form['instance']['settings']['default_filter']['wysiwyg_profile'] = array(
      '#type' => 'select',
      '#title' => t('Select a default format for this field'),
      '#description' => t('The selected text format will influence the button and plugin configuration of WYSIWYG.'),
      '#default_value' => isset($instance['settings']['default_filter']['wysiwyg_profile'])
          ? $instance['settings']['default_filter']['wysiwyg_profile'] : '_none',
      '#options' => $options,
    );
  }
}

따라서 코드 의이 부분은 충분히 분명해야합니다 ... 필드 세트를 추가하고 선택 목록을 추가합니다.이 목록은 사이트에 존재하는 WYSIWYG 프로파일로 채워집니다. 이러한 WYSIWYG 프로파일은 텍스트 형식에 연결되므로 누군가 텍스트 형식 / 필터를 선택하면 실제로 구성된 프로파일을 선택합니다.

이제 두 번째 부분은 다른 사용자가 제공 한 것과 동일한 코드이며 Better Formats 모듈에서 가져온 것입니다.

/**
 * Implements hook_element_info_alter().
 *
 * Sets the text format processor to a custom callback function.
 * This code is taken from the Better Formats module.
 */
function MY_MODULE_element_info_alter(&$type) {
  if (isset($type['text_format']['#process'])) {
    foreach ($type['text_format']['#process'] as &$callback) {
      if ($callback === 'filter_process_format') {
        $callback = 'MY_MODULE_filter_process_format';
      }
    }
  }
}

/**
 * Callback for MY_MODULE_element_info_alter().
 *
 * Alters the default text format of fields.
 */
function MY_MODULE_filter_process_format($element) {
  $element = filter_process_format($element);
  // Configuration array that specifies the fields that need to be altered.
  $field_info = field_info_instance($element['#entity_type'],
                                    $element['#field_name'], 
                                    $element['#bundle']);
  // Change input format to configured value.
  if (isset($field_info['settings']['default_filter']['wysiwyg_profile']) && $field_info['settings']['default_filter']['wysiwyg_profile'] != '_none') {
    $element['format']['format']['#default_value'] = $field_info['settings']['default_filter']['wysiwyg_profile'];
  }
  return $element;
}

따라서 설정이 저장되므로 기능 내보내기가 가능하거나 설정을 저장하는 데 사용하는 방법이 있습니다.

이 문제가 발생한 다른 사람에게 도움이 되었기를 바랍니다.

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