Pourquoi mes éléments personnalisés ne sont-ils pas rendus?

Aug 19 2020

J'ai essayé de créer des éléments Webform personnalisés de type radios et cases à cocher. L'élément est disponible dans l'interface utilisateur Webform pour l'administrateur, je peux l'ajouter à mes formulaires Web à partir de la section de construction, mais il n'est pas rendu dans le frontend du formulaire Web. Je n'ai aucune idée de ce qui me manque.

(Remarque: j'ai créé un autre élément personnalisé de type textfield, selectbox, autocomplete et ils fonctionnent tous très bien.)

Voici mon code src / Element personnalisé et mon code src / Plugin / WebformElement: (Dois-je ajouter / modifier d'autres fichiers pour obtenir ces éléments rendus sur le formulaire frontal?)

--> src/Element/MyCustomRadio.php

<?php

namespace Drupal\my_custom_element\Element;

use Drupal\Core\Render\Element\Radios;
use Drupal\Core\Render\Element\FormElement;
use Drupal\Core\Form\FormStateInterface;

/**
 * @FormElement("my_custom_element")
 *
 */
class MyCustomRadio extends Radios {

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    $class = get_class($this);
    return [
      '#input' => TRUE,
      '#size' => 60,
      '#process' => [
        [$class, 'processMyCustomRadio'],
        [$class, 'processAjaxForm'],
      ],
      '#element_validate' => [
        [$class, 'validateMyCustomRadio'],
      ],
      '#pre_render' => [
        [$class, 'preRenderMyCustomRadio'],
      ],
      '#theme' => 'input__my_custom_element',
      '#theme_wrappers' => ['form_element'],
    ];
  }

  public static function processMyCustomRadio(&$element, FormStateInterface $form_state, &$complete_form) {
    // Here you can add and manipulate your element's properties and callbacks.
    return $element;
  }

  public static function validateMyCustomRadio(&$element, FormStateInterface $form_state, &$complete_form) {
    // Here you can add custom validation logic.
  }

  /**
   * @param array $element
   * @return array
   */
  public static function preRenderMyCustomRadio(array $element) {
    $element['#attributes']['type'] = 'checkboxes';
    Element::setAttributes($element, ['id', 'name','value']);
    static::setAttributes($element, ['form-text', 'my-custom-element']);
    return $element;
  }

}

=================================================== ==============================================

--> src/Plugin/WebformElement/MyCustomRadio.php
<?php

namespace Drupal\my_custom_element\Plugin\WebformElement;

use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformElement\Radios;
use Drupal\webform\Plugin\WebformElementBase;
use Drupal\webform\WebformSubmissionInterface;

/**
 * Provides a 'my_custom_element' element.
 *
 * @WebformElement(
 *   id = "my_custom_radio_element",
 *   label = @Translation("My Custom Radio"),
 *   description = @Translation("Provides a webform radio element."),
 *   category = @Translation("My Custom elements"),
 * )
 */
class MyCustomRadio extends Radios {

  /**
   * {@inheritdoc}
   */
  protected function defineDefaultProperties() {

    return [
      'multiple' => '',
      'size' => '',
      'minlength' => '',
      'maxlength' => '',
      'placeholder' => '',
    ] + parent::defineDefaultProperties();
  }

  /**
   * {@inheritdoc}
   */
  public function prepare(array &$element, WebformSubmissionInterface $webform_submission = NULL) {
    parent::prepare($element, $webform_submission);
    
  }

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {
    $form = parent::form($form, $form_state);
    return $form;
  }

}

=================================================== ==============================================

J'ai également joint l'image pour qu'elle puisse s'aider soi-même à comprendre clairement le problème. Ce module est réalisé dans une nouvelle instance de drupal 8. Veuillez me faire savoir si des détails spécifiques sont nécessaires.

Dans le panneau d'administration: (j'ai la possibilité d'ajouter des radios personnalisées dans mon formulaire)

En frontend: (Les radios personnalisées ne sont pas rendues, seules les radios drupal et contrib et les cases à cocher sont rendues)

Réponses

1 jrockowitz Aug 19 2020 at 08:51

Pour que les radios ou les cases à cocher fonctionnent, vous devez appeler

\Drupal\Core\Render\Element\Checkboxes::processCheckboxes

ou

\Drupal\Core\Render\Element\Radios::processRadios

Votre exemple de code étend les radios mais essaie de rendre les cases à cocher. Je recommande d'étendre les cases à cocher et de remplacer progressivement les méthodes par défaut, y compris \ Drupal \ Core \ Render \ Element \ Checkboxes :: processCheckboxes.

Ci-dessous un exemple

<?php

namespace Drupal\my_custom_element\Element;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Render\Element\Checkboxes;

/**
 * Provides a form element for a set of My custom element.
 *
 * @FormElement("my_custom_element")
 */
class MyCustomElement extends Checkboxes {

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    $properties = parent::getInfo();
    // My custom properties.
    $class = get_class($this);
    $properties['#process'][] = [$class, 'processMyCustomElement'];
    $properties['#element_validate'] = [[$class, 'validateMyCustomRadio']];
    return $properties;
  }

  /**
   * {@inheritdoc}
   */
  public static function processCheckboxes(&$element, FormStateInterface $form_state, &$complete_form) {
    // You can override and extend this method.
    $element = parent::processCheckboxes($element, $form_state, $complete_form)
    return $element;
  }

  public static function processMyCustomRadio(&$element, FormStateInterface $form_state, &$complete_form) {
    // Here you can add and manipulate your element's properties and callbacks.
    return $element;
  }

  public static function validateMyCustomRadio(&$element, FormStateInterface $form_state, &$complete_form) {
    // Here you can add custom validation logic.
  }
}