Bagaimana Anda menetapkan format teks input default per jenis konten?

10

Saya ingin dapat menetapkan format teks input default yang berbeda per jenis konten dan per bidang konten.

Misalnya, pilihan jenis format mungkin " Teks biasa " dan " Editor teks kaya " dan dalam beberapa kasus saya ingin format default ke " Editor teks kaya " tetapi tetap menggunakan " Teks biasa " sebagai pilihan di dropdown. Saya tahu bahwa saya dapat mengubah urutan format teks untuk menjadikan " Editor teks kaya " menjadi pilihan pertama, tetapi metode ini mengubah semuanya, bukan itu yang ingin saya lakukan.

J-Fiz
sumber

Jawaban:

10

Dengan tidak adanya rilis modul Better Format yang stabil , Anda dapat membuat modul khusus untuk melakukan ini untuk jenis konten atau bidang tertentu.

Buat modul (modulename.info dan modulename.module, di dalam folder 'modulename'). Contoh: 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;
}

Dan 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"

Letakkan file-file ini di folder 'default_text_format' di situs / semua / modul / custom.

Ubah nama bundel yang sesuai untuk jenis konten Anda. Dan Anda dapat mengganti 'tubuh' dengan 'field_contenttype_fieldname' Anda sendiri. (Setelah komentar ini / kode better_formats.)

arjan
sumber
1
Saya mencoba ini dan mengubahnya agar berfungsi sehingga bekerja untuk saya. `foreach ($ type ['text_format'] ['# process'] sebagai $ key => $ callback) {if ($ key == 'filter_process_format') {$ type ['text_format'] ['# process'] [ ] = 'MODULE_NAME_default_text_formats_filter_process_format'; ``
awm
Saya dapat mengkonfirmasi solusi @ awm. Jawaban asli tidak berfungsi untuk saya juga, karena menimpa panggilan balik default. solusi awm memperbaikinya dengan menambahkan callback, bukannya mengesampingkan.
timofey.com
Perbarui - Saya mengambil kembali komentar terakhir saya. Jawaban asli berfungsi dan lebih disukai. Itu tidak berfungsi untuk saya karena saya memiliki modul Better Format yang diinstal, yang telah menimpa panggilan balik saya. Idealnya, Anda ingin menonaktifkannya sebelum menambahkan fungsi ini. Sekarang - dalam kasus di mana Anda menambahkan callback kedua ke array (seperti komentar di atas menyarankan saya), callback # 1 akan diproses terlebih dahulu, sehingga mengubah data sebelum menyentuh callback Anda.
timofey.com
3

Gunakan modul Better Format :

Format yang lebih baik adalah modul untuk menambah lebih banyak fleksibilitas ke sistem format input inti Drupal. Ini akan memungkinkan Anda untuk mengatur format default per jenis konten dan banyak lagi.


sumber
Terima kasih, terlihat menjanjikan tetapi saya menggunakan D7 di situs web produksi jadi saya tidak akan menggunakan modul ini karena masih dalam pengembangan.
J-Fiz
3

Saya sendiri menabrak masalah ini, tapi saya tidak ingin menggunakan modul beta (Format Lebih Baik), dan saya harus memperluas fungsionalitas dan mengotomatiskannya, sehingga pengaturan tersebut tidak hardcoded, tetapi diatur dari back-office .

Jadi saya melakukan yang berikut:

  • Saya menambahkan pengaturan pada formulir Edit Pengaturan bidang yang saya butuhkan untuk format teks standar
  • Saya menggunakan kode yang disediakan di atas dan memodifikasinya sedikit sehingga mendapat menetapkan format teks default seperti yang disimpan dalam pengaturan bidang
  • Saya menggunakan Fitur untuk mengekspor tipe konten sehingga pengaturan saya tersimpan dalam kode

Bagian Edit Pengaturan bagian

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

Jadi bagian dari kode ini harus cukup jelas ... ia menambahkan fieldset dan menambahkan daftar pilih di dalamnya, yang diisi oleh profil WYSIWYG yang ada di situs Anda. Profil WYSIWYG tersebut terkait dengan format teks, jadi ketika seseorang memilih format teks / filter, itu benar-benar memilih profil yang dikonfigurasi.

Sekarang bagian ke-2 adalah kode yang sama seperti yang disediakan di atas oleh pengguna lain, dan yang diambil dari modul Better Format.

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

Jadi pengaturan disimpan, oleh karena itu Fitur Ekspor mungkin atau metode apa pun yang Anda gunakan untuk menyimpan pengaturan Anda.

Saya harap ini membantu orang lain yang mengalami masalah ini!

benelori
sumber