¿Por qué no se renderizan mis elementos personalizados?
Intenté crear elementos de formulario web personalizados de tipo radios y casillas de verificación. El elemento está disponible en la interfaz de usuario del formulario web para el administrador, puedo agregarlo a mis formularios web desde la sección de compilación, pero no se representa en la interfaz del formulario web. No tengo idea de lo que me estoy perdiendo.
(Nota: he creado otros elementos personalizados de tipo campo de texto, cuadro de selección, autocompletar y todos funcionan bien).
A continuación se muestra mi código src / Element personalizado y el código src / Plugin / WebformElement: (¿Necesito agregar / modificar otros archivos para obtener estos elementos representados en el formulario de interfaz?
--> 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;
}
}
================================================ ============================================
También he adjuntado imagen para que le ayude a uno mismo a comprender el problema con claridad. Este módulo está hecho en una instancia nueva de drupal 8. Por favor, avíseme si se requiere algún detalle específico.
En el panel de administración: (tengo la opción de agregar radios personalizadas en mi formulario)

En la interfaz: (Las radios personalizadas no se procesan, solo se procesan las radios drupal y contrib y las casillas de verificación)

Respuestas
Para que funcionen las radios o las casillas de verificación, debe llamar
\Drupal\Core\Render\Element\Checkboxes::processCheckboxes
o
\Drupal\Core\Render\Element\Radios::processRadios
Su código de ejemplo está extendiendo Radios pero tratando de renderizar casillas de verificación. Recomiendo extender las casillas de verificación y anular gradualmente los métodos predeterminados, incluidos \ Drupal \ Core \ Render \ Element \ Checkboxes :: processCheckboxes.
A continuación se muestra un ejemplo
<?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.
}
}