web-dev-qa-db-fra.com

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

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 par défaut soit "Rich éditeur de texte "mais gardez" 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.

10
J-Fiz

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éer un module (modulename.info et modulename.module, dans 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 commentaire /code better_formats.)

10
arjan

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!

3
benelori

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.

3
user842