Come si imposta un formato di testo di input predefinito per tipo di contenuto?


10

Voglio essere in grado di impostare un formato di testo di input predefinito diverso per tipo di contenuto e per campo di contenuto.

Ad esempio, le opzioni del tipo di formato potrebbero essere " Testo normale " e " Editor di testo RTF " e in alcuni casi desidero che il formato predefinito sia " Editor di testo RTF " ma mantenere " Testo normale " come scelta nel menu a discesa. So che posso cambiare l'ordine dei formati di testo per rendere " Rich text editor " la prima scelta, ma questo metodo li cambia tutti, non è quello che voglio fare.

Risposte:


10

In assenza di una versione stabile del modulo Better Formats , è possibile creare un modulo personalizzato per eseguire questa operazione per tipi o campi di contenuto specifici.

Crea un modulo (modulename.info e modulename.module, all'interno di una cartella 'modulename'). Esempio: 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;
}

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

Metti questi file in una cartella 'default_text_format' in sites / all / modules / custom.

Cambia il nome del pacchetto in base al tuo tipo di contenuto. E puoi sostituire "body" con il tuo "field_contenttype_fieldname". (Dopo questo commento / codice better_formats.)


1
Ho provato questo e l'ho modificato per funzionare, quindi ha funzionato per me. `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

Posso confermare la soluzione di @ awm. La risposta originale non funziona anche per me, perché sostituisce il callback predefinito. La soluzione di awm risolve questo aggiungendo il callback, invece di sovrascriverlo.
timofey.com

Aggiornamento - Riprendo il mio ultimo commento. La risposta originale funziona ed è preferita. Non ha funzionato per me perché avevo installato il modulo Better Formats, che ha annullato il mio callback. Idealmente, si desidera disabilitarlo prima di aggiungere questa funzione. Ora - nel caso in cui si aggiunga un secondo callback all'array (come suggerisce il commento sopra di me), il callback # 1 verrà elaborato per primo, alterando così i dati prima che colpiscano il callback.
timofey.com

3

Utilizza il modulo Formati migliori :

Formati migliori è un modulo per aggiungere maggiore flessibilità al sistema di formati di input core di Drupal. Ti permetterà di impostare il formato predefinito per tipo di contenuto e molto altro.


Grazie, sembra promettente ma sto usando D7 su un sito Web di produzione, quindi al momento non userò questo modulo perché è ancora in fase di sviluppo.
J-Fiz,

3

Mi sono appena imbattuto in questo problema da solo, ma non volevo usare un modulo beta (formati migliori) e ho dovuto estendere la funzionalità e automatizzarlo, in modo che tali impostazioni non siano codificate, ma impostate dal back-office .

Quindi ho fatto quanto segue:

  • Ho aggiunto un'impostazione nel modulo Modifica impostazioni del campo per cui ho bisogno del formato di testo predefinito
  • Ho usato il codice fornito sopra e l'ho modificato leggermente in modo da ottenere il formato di testo predefinito salvato nelle impostazioni del campo
  • Ho usato Funzionalità per esportare il tipo di contenuto in modo da mantenere le mie impostazioni nel codice

Parte Impostazioni modifica campo

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

Quindi questa parte del codice dovrebbe essere abbastanza evidente ... aggiunge un fieldset e aggiunge un elenco selezionato in esso, che è popolato dai profili WYSIWYG esistenti sul tuo sito. Quei profili WYSIWYG sono legati ai formati di testo, quindi quando qualcuno seleziona un formato / filtro di testo, in realtà seleziona il profilo che è configurato.

Ora la seconda parte è lo stesso codice fornito sopra da un altro utente e che è preso dal modulo 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;
}

Quindi le impostazioni vengono salvate, pertanto è possibile l'esportazione delle funzioni o qualunque metodo si usi per salvare le impostazioni.

Spero che questo aiuti chiunque altro abbia riscontrato questo problema!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.