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?
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);
}
#default_value
Du tableau. L'ajout d'une #value => array()
réduit les erreurs. Mais rien ne change.#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é.Element::children()
pense qu'elle doit rendre les éléments value
et format
du tableau ci-dessus. Puisqu'ils ne commencent pas par #
.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.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.#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é.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.$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'
],
];
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();
}
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
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.