web-dev-qa-db-fra.com

Comment utiliser l'éditeur de texte wysiwyg (text_format) dans un formulaire de configuration système

Je n'ai pas pu trouver de documentation ou d'exemples à ce sujet. La mise en œuvre est très problématique. Avez-vous un moyen de le faire?

Problèmes

En essayant de créer un system settings form Avec l'entrée text_format, J'obtiens les erreurs suivantes lors de l'affichage du formulaire. Le formulaire est soumis normalement et les valeurs sont enregistrées, mais lorsque la page est actualisée, l'éditeur de texte n'est pas rempli avec les valeurs enregistrées et les erreurs sont toujours là.

Erreur utilisateur: "valeur" est une clé de tableau de rendu non valide dans Drupal\Core\Render\Element :: children () (ligne 97 de core/lib/Drupal/Core/Render/Element.php).

Erreur utilisateur: "format" est une clé de tableau de rendu non valide dans Drupal\Core\Render\Element :: children () (ligne 97 de core/lib/Drupal/Core/Render/Element.php).

Le code dans buildForm() est le suivant:

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $config = $this->config('commerce_distance_terms.distanceterms');
    $form['title'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Title'),
      '#description' => $this->t('Title for the terms'),
      '#maxlength' => 64,
      '#size' => 64,
      '#default_value' => $config->get('title'),
    ];
    $form['distance_selling_terms'] = [
      '#type' => 'text_format',
      '#title' => $this->t('Distance Selling Terms'),
      '#description' => $this->t('Enter Distance Selling terms'),
      '#default_value' => [
        'value' => $config->get('distance_selling_terms.value'),
        'format' => $config->get('distance_selling_terms.format'),
//         '#tree' => FALSE,
        '#printed' => TRUE,
      ],
    ];
    return parent::buildForm($form, $form_state);
  }

Informations d'arrière-plan

  • This est l'erreur lors de la liaison avec le code.
  • Les erreurs sont levées en raison de la partie #default_value Du tableau. L'ajout d'une #value => array() réduit les erreurs. Mais rien ne change.
  • Ce que j'ai obtenu de la trace de pile, c'est que le formulaire est rendu, puis la zone de texte est rendue, puis la source de l'erreur est rendue (il y a de petits éléments entre les deux). Je pense donc que la source de l'erreur est l'élément #default_value Du textarea qui est copié et collé à partir de la partie du tableau ci-dessus pendant la création de l'éditeur de texte composé.
  • Dans l'une des itérations de rendu, la Element::children() pense qu'elle doit rendre les éléments value et format du tableau ci-dessus. Puisqu'ils ne commencent pas par #.
  • Il y a un mot ici que le formulaire de paramètres système ne prend pas en charge l'entrée text_area De Drupal 7. De plus, cela et certains problèmes liés indiquent qu'il y a quelques valeurs par défaut automatiques pour system_settings_form mais je n'ai pas pu trouver l'égal.
  • L'entrée text_format Est un élément composé qui comprend un textarea (pour conserver et remplir la valeur réelle), un élément de format déroulant à sélectionner, etc. L'élément textarea vient avec l'exact #default_value que j'ai mis ci-dessus (sous forme de tableau). J'ai essayé de preprocess ce textarea et de changer cette valeur pour la chaîne associée pour remplir le champ mais quoi que je fasse textarea est toujours vide.
  • Les éléments #printed Et #tree Du tableau ne changent rien. Je les ai également mis dans le tableau textarea dans la fonction preprocess mais rien n'a changé.
  • La propriété data-editor-value-original De la zone de texte est livrée avec le tableau ci-dessus aplati, même si je change les #default_value Et #value Dans le pré-processus.
  • L'éditeur de texte ne pouvant pas être rempli peut ne pas être lié aux erreurs ci-dessus. Je ne sais rien.
5
duru
$form['distance_selling_terms'] = [
  '#type' => 'text_format',
  '#title' => $this->t('Distance Selling Terms'),
  '#description' => $this->t('Enter Distance Selling terms'),
  '#default_value' => config->get('distance_selling_terms.value'),
  '#format' => $config->get('distance_selling_terms.format'),
];

Et si vous souhaitez limiter l'éditeur wysiwyg au seul format, ajoutez #allowed_formats comme dans:

$form['distance_selling_terms'] = [
  '#type' => 'text_format',
  '#title' => $this->t('Distance Selling Terms'),
  '#description' => $this->t('Enter Distance Selling terms'),
  '#default_value' => config->get('distance_selling_terms.value'),
  '#format' => $config->get('distance_selling_terms.format'),
  '#allowed_formats' => [
    $config->get('distance_selling_terms.format') => 'Description of format'
  ],
];
10
user72086

Dans votre méthode builForm () , votre utilisation de l'élément text_format form/render est incorrecte.

Vous pouvez voir les propriétés et l'utilisation des éléments de rendu au format texte sur drupal.org: élément de rendu au format texte

Vous pouvez donc utiliser comme ceci:

/**
 * Provides a text format render element.
 *
 * Properties:
 * - #base_type: The form element #type to use for the 'value' element.
 *   'textarea' by default.
 * - #format: (optional) The text format ID to preselect. If omitted, the
 *   default format for the current user will be used.
 * - #allowed_formats: (optional) An array of text format IDs that are available
 *   for this element. If omitted, all text formats that the current user has
 *   access to will be allowed.
 *
 * Usage Example:
 * @code
 * $form['body'] = array(
 *   '#type' => 'text_format',
 *   '#title' => 'Body',
 *   '#format' => 'full_html',
 *   '#default_value' => '<p>The quick brown fox jumped over the lazy dog.</p>',
 * );
 * @endcode
 */

Dans votre cas, votre code doit être modifié comme suit:

 $form['distance_selling_terms'] = [
   '#type' => 'text_format',
   '#title' => $this->t('Distance Selling Terms'),
   '#description' => $this->t('Enter Distance Selling terms'),
   '#format' => $config->get('distance_selling_terms.format'),
   '#default_value' => $config->get('distance_selling_terms.value'),
 ];

Dans la méthode submitForm () , vous devez mettre à jour la configuration:

/**
 * {@inheritdoc}
 */
public function submitForm(array &$form, FormStateInterface $form_state) {
  // This parent class's submitForm method only shows
  // "The configuration options have been saved." message
  parent::submitForm($form, $form_state);

  // You can get all submitted values in array format with $form_state->getValues()
  $values = $form_state->getValues();

  // Update the configuration
  $this->config('commerce_distance_terms.distanceterms')
    // Set the title to the configuration
    ->set('title', $values['title'])
    // Set the value of the textarea to the configuration
    ->set('distance_selling_terms.value', $values['distance_selling_terms']['value'])
    // Set the format of the textarea to the configuration
    ->set('distance_selling_terms.format', $values['distance_selling_terms']['format'])
    // Save the configuration
    ->save();
}
1
David Czinege

En outre, la section de mappage du fichier de schéma du module, le champ doit être quelque chose comme:

YOUR_MODULE.settings
  type: mapping
  label: Settings or whatever
  mapping:
    distance_selling_terms.value:
      type: text
    distance_selling_terms.format:
      type: string

De même, votre fichier settings.yml ressemblera à quelque chose comme:

 distance_selling_terms:
     value: "whatever"
     format: basic_html
1
Dan Chadwick

Afin de rendre votre configuration traduisible lorsqu'elle utilise un text_format, vous devez disposer du mappage suivant:

your_custom_form_field:
  type: mapping
  label: 'Free text with text format support'
  translatable: true
  mapping:
    value:
      type: text
      label: 'Custom Text'
    format:
      type: string
      label: 'Text format'

Jetez un œil à ce patch et thread principal:
https://www.drupal.org/files/issues/2144413-185-config-translation-text-format.patch
https://www.drupal.org/node/214441
pour un exemple et une discussion plus détaillés.

0
bserem