คุณจะตั้งค่ารูปแบบข้อความเริ่มต้นสำหรับแต่ละประเภทเนื้อหาได้อย่างไร


10

ฉันต้องการที่จะสามารถตั้งค่ารูปแบบข้อความเริ่มต้นที่แตกต่างกันสำหรับประเภทเนื้อหาและต่อเนื้อหา

ตัวอย่างเช่นตัวเลือกประเภทรูปแบบอาจเป็น " ข้อความธรรมดา " และ " ตัวแก้ไข Rich Text " และในบางกรณีฉันต้องการให้รูปแบบเริ่มต้นเป็น " ตัวแก้ไขข้อความสมบูรณ์ " แต่เก็บ " ข้อความธรรมดา " เป็นตัวเลือกในเมนูแบบเลื่อนลง ฉันรู้ว่าฉันสามารถเปลี่ยนลำดับของรูปแบบข้อความเพื่อให้เป็น " ตัวเลือก Rich Text " เป็นตัวเลือกแรก แต่วิธีนี้เปลี่ยนแปลงทั้งหมดนั่นไม่ใช่สิ่งที่ฉันต้องการจะทำ

คำตอบ:


10

ในกรณีที่ไม่มีการปล่อยโมดูลรูปแบบที่ดีขึ้นอย่างมั่นคงคุณสามารถสร้างโมดูลที่กำหนดเองเพื่อทำสิ่งนี้สำหรับประเภทเนื้อหาหรือฟิลด์ที่เฉพาะเจาะจง

สร้างโมดูล (modulename.info และ modulename.module ภายในโฟลเดอร์ 'modulename') ตัวอย่าง: 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"

วางไฟล์เหล่านี้ในโฟลเดอร์ 'default_text_format' ใน sites / all / modules / custom

เปลี่ยนชื่อบันเดิลตามความเหมาะสมสำหรับประเภทเนื้อหาของคุณ และคุณสามารถแทนที่ 'ร่างกาย' ด้วย 'field_contenttype_fieldname' ของคุณเอง (หลังจากความคิดเห็นนี้ / รหัส better_formats)


1
ฉันลองและแก้ไขมันเพื่อให้ทำงานได้ดีสำหรับฉัน `foreach ($ type ['text_format'] ['# process'] เป็น $ key => $ callback) {ถ้า ($ key == 'filter_process_format') {$ type ['text_format'] ['# process'] [ ] = 'MODULE_NAME_default_text_formats_filter_process_format'; } `
awm

ฉันสามารถยืนยันโซลูชันของ @ awm คำตอบเดิมไม่ทำงานสำหรับฉันด้วยเพราะมันจะแทนที่การโทรกลับเริ่มต้น โซลูชันของ awm แก้ไขด้วยการเพิ่มการติดต่อกลับแทนการเอาชนะ
timofey.com

อัปเดต - ฉันจะนำความคิดเห็นล่าสุดกลับมา คำตอบเดิมใช้งานได้และเป็นที่ต้องการ มันไม่ทำงานสำหรับฉันเพราะฉันได้ติดตั้งโมดูลฟอร์แมตฟอร์แมตที่แทนที่การโทรกลับของฉันแล้ว เป็นการดีที่คุณต้องการปิดการใช้งานก่อนที่จะเพิ่มฟังก์ชั่นนี้ ตอนนี้ - ในกรณีที่คุณเพิ่มการโทรกลับครั้งที่สองในอาร์เรย์ (ตามความคิดเห็นข้างบนที่ฉันแนะนำ) การโทรกลับ # 1 จะถูกประมวลผลก่อนจึงทำการแก้ไขข้อมูลก่อนที่จะโทรกลับ
timofey.com

3

ใช้โมดูลรูปแบบที่ดีกว่า :

รูปแบบที่ดีขึ้นเป็นโมดูลที่ช่วยเพิ่มความยืดหยุ่นให้กับระบบจัดรูปแบบอินพุตหลักของ Drupal จะช่วยให้คุณกำหนดรูปแบบเริ่มต้นต่อประเภทเนื้อหาและอีกมากมาย


ขอบคุณดูดี แต่ฉันใช้ D7 ในเว็บไซต์ผลิตดังนั้นตอนนี้ฉันไม่ได้ใช้โมดูลนี้เพราะยังอยู่ในระหว่างการพัฒนา
J-Fiz

3

ฉันเพิ่งชนกับปัญหานี้ด้วยตัวเอง แต่ฉันไม่ต้องการใช้โมดูลเบต้า (รูปแบบที่ดีขึ้น) และฉันต้องขยายการทำงานและทำให้เป็นอัตโนมัติเพื่อให้การตั้งค่าดังกล่าวไม่ได้เป็นฮาร์ดโค้ด แต่ตั้งค่าจากสำนักงานหลัง .

ดังนั้นฉันทำต่อไปนี้:

  • ฉันเพิ่มการตั้งค่าในแบบฟอร์มแก้ไขการตั้งค่าของเขตข้อมูลที่ฉันต้องการรูปแบบข้อความเริ่มต้นสำหรับ
  • ฉันใช้รหัสที่ให้ไว้ด้านบนและปรับเปลี่ยนเล็กน้อยเพื่อให้ได้รับการตั้งค่ารูปแบบข้อความเริ่มต้นตามที่บันทึกไว้ในการตั้งค่าของฟิลด์
  • ฉันใช้ฟีเจอร์เพื่อส่งออกประเภทเนื้อหาเพื่อให้การตั้งค่าของฉันถูกเก็บเป็นรหัสไว้

ส่วนการแก้ไขการตั้งค่าฟิลด์

/**
 * 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,
    );
  }
}

ดังนั้นส่วนนี้ของรหัสควรชัดเจนพอ ... มันเพิ่ม fieldset และเพิ่มรายการที่เลือกไว้ซึ่งจะถูกเติมด้วยโพรไฟล์ WYSIWYG ที่มีอยู่ในเว็บไซต์ของคุณ โปรไฟล์ WYSIWYG เหล่านั้นจะเชื่อมโยงกับรูปแบบข้อความดังนั้นเมื่อมีคนเลือกรูปแบบข้อความ / ตัวกรองจริง ๆ แล้วจะเลือกโปรไฟล์ที่มีการกำหนดค่า

ตอนนี้ส่วนที่ 2 เป็นรหัสเดียวกับที่ให้ไว้ข้างต้นโดยผู้ใช้รายอื่นซึ่งนำมาจากโมดูลรูปแบบที่ดีกว่า

/**
 * 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.