Como você define um formato de texto de entrada padrão por tipo de conteúdo?

10

Quero poder definir um formato de texto de entrada padrão diferente por tipo de conteúdo e por campo de conteúdo.

Por exemplo, as opções de tipo de formato podem ser " Texto sem formatação " e " Editor de texto rico " e, em alguns casos, desejo que o formato seja padrão como " Editor de texto sem formatação ", mas mantenha " Texto sem formatação " como uma opção no menu suspenso. Sei que posso alterar a ordem dos formatos de texto para tornar o " Rich text editor " a primeira escolha, mas esse método altera todos eles, não é isso que eu quero fazer.

J-Fiz
fonte

Respostas:

10

Na ausência de uma versão estável do módulo Better Formats , você pode criar um módulo personalizado para fazer isso para campos ou tipos de conteúdo específicos.

Crie um módulo (modulename.info e modulename.module, dentro de uma pasta 'modulename'). Exemplo: 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"

Coloque esses arquivos em uma pasta 'default_text_format' em sites / all / modules / custom.

Altere o nome do pacote conforme apropriado para o seu tipo de conteúdo. E você pode substituir 'body' por seu próprio 'field_contenttype_fieldname'. (Após este código de comment / better_formats.)

arjan
fonte
1
Eu tentei isso e alterei-o para funcionar, assim funcionou para mim. `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 28/10
Posso confirmar a solução da @ awm. A resposta original também não funciona para mim, porque substitui o retorno de chamada padrão. A solução da awm corrige isso adicionando o retorno de chamada, em vez de substituir.
precisa saber é o seguinte
Atualização - retiro meu último comentário. A resposta original funciona e é preferida. Não funcionou para mim porque eu tinha o módulo Better Formats instalado, que substituiu meu retorno de chamada. Idealmente, você deseja desativá-lo antes de adicionar esta função. Agora - no caso em que você adiciona um segundo retorno de chamada à matriz (como sugere o comentário acima), o retorno de chamada nº 1 será processado primeiro, alterando os dados antes que ele atinja seu retorno de chamada.
timofey.com
3

Use o módulo Better Formats :

Melhores formatos é um módulo para adicionar mais flexibilidade ao sistema principal de formatos de entrada do Drupal. Isso permitirá que você defina o formato padrão por tipo de conteúdo e muito mais.


fonte
Obrigado, parece promissor, mas estou usando o D7 em um site de produção, então não vou usar este módulo no momento porque ele ainda está em desenvolvimento.
precisa
3

Acabei de me deparar com esse problema, mas não queria usar um módulo beta (Better Formats), e tive que estender a funcionalidade e automatizá-la, para que essas configurações não sejam codificadas, mas definidas na retaguarda .

Então eu fiz o seguinte:

  • Adicionei uma configuração no formulário Editar configurações do campo em que preciso do formato de texto padrão para
  • Eu usei o código fornecido acima e modifiquei-o levemente para que ele defina o formato de texto padrão como salvo nas configurações do campo
  • Usei Recursos para exportar o tipo de conteúdo, para que eu tenha minhas configurações preservadas no código

Parte Configurações de Edição 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,
    );
  }
}

Portanto, essa parte do código deve ser evidente o suficiente ... ele adiciona um conjunto de campos e uma lista de seleção nele, preenchida pelos perfis WYSIWYG existentes em seu site. Esses perfis WYSIWYG estão vinculados aos formatos de texto; portanto, quando alguém seleciona um formato / filtro de texto, ele realmente seleciona o perfil que está configurado.

Agora, a segunda parte é o mesmo código fornecido acima por outro usuário e retirado do módulo 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;
}

Portanto, as configurações são salvas, portanto, é possível exportar recursos ou qualquer outro método usado para salvar suas configurações.

Espero que isso ajude qualquer pessoa que tenha encontrado esse problema!

benelori
fonte