コンテンツタイプごとにデフォルトの入力テキスト形式をどのように設定しますか?


10

コンテンツタイプごと、コンテンツフィールドごとに異なるデフォルトの入力テキスト形式を設定できるようにしたいと思います。

たとえば、フォーマットタイプの選択肢は「プレーンテキスト」と「リッチテキストエディター」の場合があり、場合によっては、フォーマットをデフォルトの「リッチテキストエディター」にしたいが、ドロップダウンの選択肢として「プレーンテキスト」のままにしておきます。テキスト形式の順序を変更して「リッチテキストエディター」を最初の選択肢にできることはわかっていますが、この方法ではすべてのテキスト形式が変更されるので、それは望んでいません。

回答:


10

Better Formatsモジュールの安定リリースがない場合は、カスタムモジュールを作成して、特定のコンテンツタイプまたはフィールドに対してこれを行うことができます。

モジュール(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"

これらのファイルを、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 2013年

@awmの解決策を確認できます。元の回答はデフォルトのコールバックを上書きするため、私にとっても機能しません。awmのソリューションは、オーバーライドするのではなく、コールバックを追加することで修正します。
timofey.com 2014

更新-最後のコメントを取り戻します。元の答えは機能し、優先されます。コールバックを上書きしたBetter Formatsモジュールがインストールされていたため、機能しませんでした。理想的には、この機能を追加する前にそれを無効にする必要があります。さて-配列に2番目のコールバックを追加する場合(上記のコメントが示唆するように)、コールバック#1が最初に処理され、コールバックに到達する前にデータが変更されます。
timofey.com 2014

3

Better Formatsモジュールを使用します。

Betterフォーマットは、Drupalのコア入力フォーマットシステムに柔軟性を追加するモジュールです。コンテンツタイプごとにデフォルトの形式を設定することができます。


ありがとう、有望に見えますが、私はプロダクションWebサイトでD7を使用しています。このモジュールはまだ開発中であるため、現時点では使用しません。
J-Fiz

3

私はこの問題にぶつかっただけですが、ベータモジュール(Better Formats)を使用したくなかったため、機能を拡張して自動化する必要がありました。そのため、このような設定はハードコーディングされず、バックオフィスから設定されました。 。

だから私は次のことをしました:

  • デフォルトのテキスト形式が必要なフィールドの[設定の編集]フォームに設定を追加しました
  • 上記のコードを使用し、フィールドの設定に保存されているデフォルトのテキスト形式を設定するように少し修正しました
  • Featuresを使用してコンテンツタイプをエクスポートし、設定をコードに保存しました

フィールド編集設定パーツ

/**
 * 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プロファイルはテキスト形式に関連付けられているため、誰かがテキスト形式/フィルターを選択すると、実際に構成されているプロファイルが選択されます。

ここで、2番目の部分は、別のユーザーが上記で提供したものと同じコードであり、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.