Perché i miei elementi personalizzati non vengono visualizzati?

Aug 19 2020

Ho provato a creare elementi Webform personalizzati di tipo radio e caselle di controllo. L'elemento è disponibile nell'interfaccia utente del modulo Web per l'amministratore, posso aggiungerlo ai miei moduli Web dalla sezione build ma non viene visualizzato nel frontend del modulo Web. Non ho idea di cosa mi sto perdendo.

(Nota: ho creato altri elementi personalizzati di tipo textfield, selectbox, completamento automatico e funzionano tutti bene.)

Di seguito è riportato il mio codice src / elemento personalizzato e il codice src / Plugin / WebformElement: (Devo aggiungere / modificare altri file per ottenere il rendering di questi elementi sul modulo frontend?)

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

}

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

Ho anche allegato un'immagine in modo che possa aiutare se stessi a capire chiaramente il problema. Questo modulo è realizzato in una nuova istanza di drupal 8. Per favore fatemi sapere se sono necessari dettagli specifici.

Nel pannello di amministrazione: (ho la possibilità di aggiungere radio personalizzate nel mio modulo)

In frontend: (Le radio personalizzate non vengono visualizzate, vengono visualizzate solo le radio e le caselle di controllo di drupal e contrib)

Risposte

1 jrockowitz Aug 19 2020 at 08:51

Affinché le radio o le caselle di controllo funzionino, è necessario chiamare

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

o

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

Il tuo codice di esempio sta estendendo le radio ma cercando di visualizzare le caselle di controllo. Consiglio di estendere le caselle di controllo e di ignorare gradualmente i metodi predefiniti, inclusi \ Drupal \ Core \ Render \ Element \ Checkboxes :: processCheckboxes.

Di seguito è un esempio

<?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.
  }
}