Wie legen Sie ein Standardeingabetextformat pro Inhaltstyp fest?


10

Ich möchte in der Lage sein, ein anderes Standardeingabetextformat pro Inhaltstyp und Inhaltsfeld festzulegen.

Beispielsweise können die Formattypoptionen " Nur Text " und " Rich-Text-Editor " sein. In einigen Fällen möchte ich, dass das Format standardmäßig " Rich-Text-Editor " ist, aber " Nur- Text " als Auswahl in der Dropdown-Liste beibehalten. Ich weiß, dass ich die Reihenfolge der Textformate ändern kann, um " Rich Text Editor " zur ersten Wahl zu machen, aber diese Methode ändert alle, das ist nicht das, was ich tun möchte.

Antworten:


10

Wenn keine stabile Version des Moduls " Bessere Formate" verfügbar ist, können Sie ein benutzerdefiniertes Modul erstellen, um dies für bestimmte Inhaltstypen oder Felder zu tun.

Erstellen Sie ein Modul (modulename.info und modulename.module in einem Ordner 'modulename'). Beispiel: 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;
}

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

Legen Sie diese Dateien in einem Ordner 'default_text_format' in sites / all / modules / custom ab.

Ändern Sie den Bundle-Namen entsprechend Ihrem Inhaltstyp. Und Sie können 'body' durch Ihren eigenen 'field_contenttype_fieldname' ersetzen. (Nach diesem Kommentar / Better_Formats-Code.)


1
Ich habe es versucht und es so geändert, dass es funktioniert, damit es für mich funktioniert. `foreach ($ type ['text_format'] ['# process'] als $ key => $ callback) {if ($ key == 'filter_process_format') {$ type ['text_format'] ['# process'] [ ] = 'MODULE_NAME_default_text_formats_filter_process_format'; } `
awm

Ich kann die Lösung von @ awm bestätigen. Die ursprüngliche Antwort funktioniert auch bei mir nicht, da sie den Standardrückruf überschreibt. Die Lösung von awm behebt dies, indem der Rückruf hinzugefügt wird, anstatt ihn zu überschreiben.
timofey.com

Update - Ich nehme meinen letzten Kommentar zurück. Die ursprüngliche Antwort funktioniert und wird bevorzugt. Es hat bei mir nicht funktioniert, weil ich das Modul "Bessere Formate" installiert hatte, das meinen Rückruf überschrieben hat. Idealerweise möchten Sie es deaktivieren, bevor Sie diese Funktion hinzufügen. Jetzt - in dem Fall, in dem Sie dem Array einen zweiten Rückruf hinzufügen (wie aus dem obigen Kommentar hervorgeht), wird Rückruf Nr. 1 zuerst verarbeitet, wodurch Daten geändert werden, bevor sie auf Ihren Rückruf treffen.
timofey.com

3

Verwenden Sie das Modul Bessere Formate :

Bessere Formate sind ein Modul, das dem zentralen Eingabeformatsystem von Drupal mehr Flexibilität verleiht. Hier können Sie das Standardformat pro Inhaltstyp und vieles mehr festlegen.


Danke, sieht vielversprechend aus, aber ich verwende D7 auf einer Produktionswebsite, daher werde ich dieses Modul derzeit nicht verwenden, da es sich noch in der Entwicklung befindet.
J-Fiz

3

Ich bin selbst auf dieses Problem gestoßen, wollte aber kein Beta-Modul (Better Formats) verwenden, und ich musste die Funktionalität erweitern und automatisieren, damit solche Einstellungen nicht fest codiert, sondern vom Backoffice aus festgelegt werden .

Also habe ich folgendes gemacht:

  • Ich habe im Formular "Einstellungen bearbeiten" des Felds eine Einstellung hinzugefügt, für die ich das Standardtextformat benötige
  • Ich habe den oben angegebenen Code verwendet und ihn leicht geändert, damit das Standardtextformat festgelegt wird, das in den Einstellungen des Felds gespeichert ist
  • Ich habe Features verwendet, um den Inhaltstyp zu exportieren, damit meine Einstellungen im Code erhalten bleiben

Feld Einstellungen bearbeiten

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

Dieser Teil des Codes sollte also offensichtlich genug sein ... er fügt ein Feldset und eine Auswahlliste hinzu, die mit den auf Ihrer Site vorhandenen WYSIWYG-Profilen gefüllt wird. Diese WYSIWYG-Profile sind an die Textformate gebunden. Wenn also jemand ein Textformat / einen Filter auswählt, wählt er tatsächlich das konfigurierte Profil aus.

Jetzt ist der zweite Teil derselbe Code, den ein anderer Benutzer oben angegeben hat und der aus dem Modul "Bessere Formate" stammt.

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

Die Einstellungen werden also gespeichert, daher ist der Export von Funktionen möglich oder eine andere Methode, mit der Sie Ihre Einstellungen speichern.

Ich hoffe, das hilft allen anderen, die auf dieses Problem gestoßen sind!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.