Comment définissez-vous un format de texte d'entrée par défaut par type de contenu?

10

Je veux pouvoir définir un format de texte d'entrée par défaut différent par type de contenu et par champ de contenu.

Par exemple, les choix de type de format peuvent être « Texte brut » et « Éditeur de texte enrichi » et dans certains cas, je souhaite que le format soit par défaut « Éditeur de texte enrichi » mais conservez « Texte brut » comme choix dans la liste déroulante. Je sais que je peux changer l'ordre des formats de texte pour faire de " Rich text editor " le premier choix, mais cette méthode les modifie tous, ce n'est pas ce que je veux faire.

J-Fiz
la source

Réponses:

10

En l'absence d'une version stable du module Better Formats , vous pouvez créer un module personnalisé pour ce faire pour des types de contenu ou des champs spécifiques.

Créez un module (modulename.info et modulename.module, à l'intérieur d'un dossier 'modulename'). Exemple: 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;
}

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

Placez ces fichiers dans un dossier 'default_text_format' dans sites / all / modules / custom.

Modifiez le nom du groupe en fonction de votre type de contenu. Et vous pouvez remplacer "body" par votre propre "field_contenttype_fieldname". (Après ce code commentaire / better_formats.)

arjan
la source
1
J'ai essayé cela et l'ai modifié pour que ça marche pour moi. `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
Je peux confirmer la solution de @ awm. La réponse d'origine ne fonctionne pas pour moi également, car elle remplace le rappel par défaut. La solution d'AWM corrige cela en ajoutant le rappel, au lieu de remplacer.
timofey.com
Mise à jour - Je reprends mon dernier commentaire. La réponse originale fonctionne et est préférable. Cela n'a pas fonctionné pour moi car j'avais installé le module Better Formats, qui a annulé mon rappel. Idéalement, vous souhaitez le désactiver avant d'ajouter cette fonction. Maintenant - dans le cas où vous ajoutez un deuxième rappel au tableau (comme le suggère le commentaire ci-dessus), le rappel # 1 sera traité en premier, modifiant ainsi les données avant qu'il ne frappe votre rappel.
timofey.com
3

Utilisez le module Better Formats :

De meilleurs formats est un module pour ajouter plus de flexibilité au système de format d'entrée principal de Drupal. Il vous permettra de définir le format par défaut par type de contenu et bien plus encore.


la source
Merci, ça a l'air prometteur mais j'utilise D7 sur un site de production donc je ne vais pas pour le moment utiliser ce module car il est encore en développement.
J-Fiz
3

Je viens de tomber sur ce problème moi-même, mais je ne voulais pas utiliser un module bêta (meilleurs formats), et j'ai dû étendre les fonctionnalités et l'automatiser, afin que ces paramètres ne soient pas codés en dur, mais définis à partir du back-office .

J'ai donc fait ce qui suit:

  • J'ai ajouté un paramètre dans le formulaire Modifier les paramètres du champ pour lequel j'ai besoin du format de texte par défaut pour
  • J'ai utilisé le code fourni ci-dessus et l'ai légèrement modifié afin qu'il définisse le format de texte par défaut tel qu'il est enregistré dans les paramètres du champ
  • J'ai utilisé les fonctionnalités pour exporter le type de contenu afin que mes paramètres soient conservés dans le code

Partie Paramètres de modification du champ

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

Cette partie du code devrait donc être suffisamment évidente ... elle ajoute un champ et y ajoute une liste de sélection, qui est remplie par les profils WYSIWYG existant sur votre site. Ces profils WYSIWYG sont liés aux formats de texte, donc quand quelqu'un sélectionne un format / filtre de texte, il sélectionne en fait le profil qui est configuré.

Maintenant, la 2ème partie est le même code que celui fourni ci-dessus par un autre utilisateur, et qui est extrait du module 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;
}

Ainsi, les paramètres sont enregistrés, par conséquent, l'exportation des fonctionnalités est possible ou quelle que soit la méthode que vous utilisez pour enregistrer vos paramètres.

J'espère que cela aide toute autre personne qui a rencontré ce problème!

benelori
la source