Jak ustawić domyślny format tekstu wejściowego dla każdego typu zawartości?

10

Chcę mieć możliwość ustawienia innego domyślnego formatu tekstu wejściowego dla typu zawartości i pola zawartości.

Na przykład do wyboru typu formatu mogą być „ Zwykły tekst ” i „ Edytor tekstu sformatowanego ”, a w niektórych przypadkach chcę, aby format był domyślnie ustawiony na „ Edytor tekstu sformatowanego ”, ale w menu rozwijanym wybierz opcję „ Zwykły tekst ”. Wiem, że mogę zmienić kolejność formatów tekstu, aby „ Bogaty edytor tekstu ” był pierwszym wyborem, ale ta metoda zmienia je wszystkie, to nie jest to, co chcę zrobić.

J-Fiz
źródło

Odpowiedzi:

10

W przypadku braku stabilnej wersji modułu Better Formats możesz utworzyć moduł niestandardowy, aby to zrobić dla określonych typów treści lub pól.

Utwórz moduł (modulename.info i modulename.module, w folderze „modulename”). Przykład: 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;
}

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

Umieść te pliki w folderze „default_text_format” w witrynach / wszystkie / moduły / niestandardowe.

Zmień nazwę pakietu odpowiednio do typu zawartości. I możesz zastąpić „body” własnym „field_contenttype_fieldname”. (Po tym komentarzu / kod better_formats.)

arjan
źródło
1
Próbowałem tego i zmieniłem, aby działało, więc zadziałało dla mnie. `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
Mogę potwierdzić rozwiązanie @ awm. Oryginalna odpowiedź również dla mnie nie działa, ponieważ zastępuje ona domyślne wywołanie zwrotne. Rozwiązanie awm naprawia to poprzez dodanie wywołania zwrotnego zamiast zastępowania.
timofey.com
Aktualizacja - cofam mój ostatni komentarz. Oryginalna odpowiedź działa i jest preferowana. Nie działało to dla mnie, ponieważ zainstalowałem moduł Better Formats, który zastąpił moje wywołanie zwrotne. Najlepiej jest wyłączyć tę funkcję przed dodaniem tej funkcji. Teraz - w przypadku dodania do tablicy drugiego wywołania zwrotnego (jak sugeruje powyższy komentarz) najpierw zostanie przetworzone wywołanie zwrotne nr 1, zmieniając w ten sposób dane, zanim trafią one do wywołania zwrotnego.
timofey.com,
3

Użyj modułu Better Formats :

Lepsze formaty to moduł zwiększający elastyczność podstawowego systemu formatowania danych wejściowych Drupala. Pozwoli ci to ustawić domyślny format dla każdego typu zawartości i wiele więcej.


źródło
Dzięki, wygląda obiecująco, ale używam D7 na stronie produkcyjnej, więc w tej chwili nie zamierzam używać tego modułu, ponieważ wciąż jest w fazie rozwoju.
J-Fiz,
3

Właśnie wpadłem na ten problem, ale nie chciałem używać modułu beta (lepsze formaty) i musiałem rozszerzyć funkcjonalność i zautomatyzować go, aby takie ustawienia nie były zakodowane na stałe, ale ustawione z zaplecza .

Zrobiłem więc:

  • Dodałem ustawienie w polu Edytuj ustawienia pola, dla którego potrzebuję domyślnego formatu tekstu
  • Użyłem powyższego kodu i nieznacznie go zmodyfikowałem, aby ustawił domyślny format tekstu zapisany w ustawieniach pola
  • Użyłem funkcji, aby wyeksportować typ zawartości, aby moje ustawienia zostały zachowane w kodzie

Część Ustawienia edycji pola

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

Więc ta część kodu powinna być wystarczająco widoczna ... dodaje zestaw pól i dodaje w nim listę wyboru, która jest zapełniana profilami WYSIWYG istniejącymi w Twojej witrynie. Te profile WYSIWYG są powiązane z formatami tekstowymi, więc gdy ktoś wybierze format / filtr tekstowy, faktycznie wybiera skonfigurowany profil.

Teraz druga część jest tym samym kodem, który został podany powyżej przez innego użytkownika i pochodzi z modułu 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;
}

Tak więc ustawienia są zapisywane, dlatego eksport funkcji jest możliwy lub dowolną metodą, której używasz do zapisywania ustawień.

Mam nadzieję, że pomoże to każdemu, kto napotkał ten problem!

benelori
źródło