Как установить формат ввода текста по умолчанию для каждого типа контента?

10

Я хочу иметь возможность установить другой формат ввода текста по умолчанию для типа контента и для поля контента.

Например, варианты типа формата могут быть « Обычный текст » и « Редактор форматированного текста », и в некоторых случаях я хочу, чтобы формат по умолчанию был « Редактор форматированного текста », но при этом в раскрывающемся списке выберите « Обычный текст ». Я знаю, что могу изменить порядок текстовых форматов, чтобы сделать « Rich text editor » первым выбором, но этот метод меняет все из них, это не то, что я хочу делать.

J-физ
источник

Ответы:

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.

Измените имя пакета в соответствии с вашим типом контента. И вы можете заменить 'body' своим собственным 'field_contenttype_fieldname'. (После этого комментария / кода лучше_форматов.)

Арьян
источник
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
Обновление - я забираю свой последний комментарий. Оригинальный ответ работает и является предпочтительным. Это не сработало для меня, потому что у меня был установлен модуль «Лучшие форматы», который переопределил мой обратный вызов. В идеале вы хотите отключить его перед добавлением этой функции. Теперь - в случае, когда вы добавляете второй обратный вызов в массив (как предполагает приведенный выше комментарий), обратный вызов # 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,
    );
  }
}

Так что эта часть кода должна быть достаточно очевидной ... она добавляет набор полей и добавляет в него список выбора, который заполняется профилями WYSIWYG, существующими на вашем сайте. Эти профили WYSIWYG привязаны к текстовым форматам, поэтому, когда кто-то выбирает текстовый формат / фильтр, он фактически выбирает настроенный профиль.

Теперь вторая часть - это тот же код, который был предоставлен другим пользователем выше, и который взят из модуля «Лучшие форматы».

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

Таким образом, настройки сохраняются, поэтому возможен экспорт функций или любой другой метод, который вы используете для сохранения настроек.

Надеюсь, это поможет любому, кто столкнулся с этой проблемой!

benelori
источник