¿Cómo se configura un formato de texto de entrada predeterminado por tipo de contenido?

10

Quiero poder establecer un formato de texto de entrada predeterminado diferente por tipo de contenido y por campo de contenido.

Por ejemplo, las opciones de tipo de formato pueden ser " Texto sin formato " y " Editor de texto enriquecido " y, en algunos casos, quiero que el formato sea " Editor de texto enriquecido " de forma predeterminada, pero mantenga " Texto sin formato " como opción en el menú desplegable. Sé que puedo cambiar el orden de los formatos de texto para que el " Editor de texto enriquecido " sea la primera opción, pero este método los cambia a todos, eso no es lo que quiero hacer.

J-Fiz
fuente

Respuestas:

10

En ausencia de una versión estable del módulo Better Formats , puede crear un módulo personalizado para hacer esto para tipos de contenido o campos específicos.

Cree un módulo (modulename.info y modulename.module, dentro de una carpeta 'modulename'). Ejemplo: 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;
}

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

Coloque estos archivos en una carpeta 'default_text_format' en sites / all / modules / custom.

Cambie el nombre del paquete según corresponda para su tipo de contenido. Y puede sustituir 'cuerpo' con su propio 'field_contenttype_fieldname'. (Después de este comentario / código better_formats).

Arjan
fuente
1
Intenté esto y lo modifiqué para que funcione, así que funcionó para mí. `foreach ($ type ['text_format'] ['# process'] como $ key => $ callback) {if ($ key == 'filter_process_format') {$ type ['text_format'] ['# process'] [ ] = 'MODULE_NAME_default_text_formats_filter_process_format'; } `
AWM
Puedo confirmar la solución de @ awm. La respuesta original tampoco funciona para mí, porque anula la devolución de llamada predeterminada. La solución de awm corrige eso agregando la devolución de llamada, en lugar de anular.
timofey.com
Actualización - Retiro mi último comentario. La respuesta original funciona y se prefiere. No funcionó para mí porque tenía instalado el módulo Better Formats, lo que ha anulado mi devolución de llamada. Idealmente, desea deshabilitarlo antes de agregar esta función. Ahora, en el caso de que agregue una segunda devolución de llamada a la matriz (como sugiere el comentario anterior), la devolución de llamada # 1 se procesará primero, alterando así los datos antes de que llegue a su devolución de llamada.
timofey.com
3

Utilice el módulo Mejores formatos :

Mejores formatos es un módulo para agregar más flexibilidad al sistema de formato de entrada principal de Drupal. Le permitirá establecer el formato predeterminado por tipo de contenido y mucho más.


fuente
Gracias, parece prometedor, pero estoy usando D7 en un sitio web de producción, así que en este momento no voy a usar este módulo porque todavía está en desarrollo.
J-Fiz
3

Acabo de encontrarme con este problema yo mismo, pero no quería usar un módulo beta (Mejores Formatos), y tuve que extender la funcionalidad y automatizarla, para que tales configuraciones no estén codificadas, sino que se establezcan desde la oficina administrativa .

Entonces hice lo siguiente:

  • Agregué una configuración en el formulario Editar configuración del campo para el que necesito el formato de texto predeterminado
  • Utilicé el código provisto anteriormente y lo modifiqué ligeramente para que establezca el formato de texto predeterminado como está guardado en la configuración del campo
  • Utilicé Características para exportar el tipo de contenido para que mis configuraciones se conservaran en el código

Parte de configuración de edición de 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,
    );
  }
}

Entonces, esta parte del código debería ser bastante evidente ... agrega un conjunto de campos y agrega una lista de selección, que se completa con los perfiles WYSIWYG existentes en su sitio. Esos perfiles WYSIWYG están vinculados a los formatos de texto, por lo que cuando alguien selecciona un formato / filtro de texto, en realidad selecciona el perfil que está configurado.

Ahora la 2da parte es el mismo código provisto anteriormente por otro usuario, y que se toma del módulo Mejores Formatos.

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

Por lo tanto, se guardan las configuraciones, por lo tanto, es posible Exportar características o cualquier método que use para guardar sus configuraciones.

¡Espero que esto ayude a cualquiera que haya encontrado este problema!

benelori
fuente