View source
<?php
namespace Drupal\webform\Plugin\WebformElement;
use Drupal\Component\Utility\NestedArray;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\WebformSubmissionInterface;
class WebformCustomComposite extends WebformCompositeBase {
protected function defineDefaultProperties() {
$properties = [
'title_display' => '',
'element' => [],
] + $this
->defineDefaultMultipleProperties() + parent::defineDefaultProperties();
unset($properties['flexbox']);
return $properties;
}
protected function defineDefaultMultipleProperties() {
$properties = [
'multiple' => TRUE,
'multiple__header' => TRUE,
] + parent::defineDefaultMultipleProperties();
return $properties;
}
public function hasMultipleValues(array $element) {
return TRUE;
}
public function prepare(array &$element, WebformSubmissionInterface $webform_submission = NULL) {
parent::prepare($element, $webform_submission);
if (isset($element['#multiple'])) {
$element['#cardinality'] = $element['#multiple'] === FALSE ? 1 : $element['#multiple'];
}
$multiple_properties = $this
->defineDefaultMultipleProperties();
foreach ($multiple_properties as $multiple_property => $multiple_value) {
if (strpos($multiple_property, 'multiple__') === 0) {
$property_name = str_replace('multiple__', '', $multiple_property);
$element["#{$property_name}"] = isset($element["#{$multiple_property}"]) ? $element["#{$multiple_property}"] : $multiple_value;
}
}
$element += [
'#header' => TRUE,
];
foreach ($element['#element'] as $composite_key => $composite_element) {
foreach ($element as $property_key => $property_value) {
if (strpos($property_key, '#' . $composite_key . '__') === 0) {
$composite_property_key = str_replace('#' . $composite_key . '__', '#', $property_key);
$element['#element'][$composite_key][$composite_property_key] = $property_value;
}
}
}
}
protected function prepareElementPreRenderCallbacks(array &$element, WebformSubmissionInterface $webform_submission = NULL) {
parent::prepareElementPreRenderCallbacks($element, $webform_submission);
if (isset($element['#wrapper_type'])) {
$element['#theme_wrappers'] = [
$element['#wrapper_type'],
];
$element += [
'#attributes' => [],
];
switch ($element['#wrapper_type']) {
case 'fieldset':
$element['#attributes']['class'][] = 'fieldgroup';
$element['#attributes']['class'][] = 'form-composite';
break;
case 'container':
if (isset($element['#wrapper_attributes'])) {
$element['#attributes'] = NestedArray::mergeDeep($element['#attributes'], $element['#wrapper_attributes']);
}
break;
}
}
}
protected function prepareMultipleWrapper(array &$element) {
}
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
unset($form['multiple']['#states']);
return $form;
}
protected function buildCompositeElementsTable(array $form, FormStateInterface $form_state) {
return [
'#type' => 'webform_element_composite',
'#title' => $this
->t('Elements'),
'#title_display' => 'invisible',
];
}
public function preview() {
return [
'#type' => $this
->getTypeName(),
'#title' => $this
->getPluginLabel(),
'#element' => [
'name' => [
'#type' => 'textfield',
'#title' => 'Name',
'#title_display' => 'invisible',
],
'sex' => [
'#type' => 'select',
'#title' => 'Sex',
'#title_display' => 'invisible',
'#options' => [
'Male' => $this
->t('Male'),
'Female' => $this
->t('Female'),
],
],
],
];
}
public function initializeCompositeElements(array &$element) {
$element['#webform_composite_elements'] = [];
foreach ($element['#element'] as $composite_key => $composite_element) {
$this->elementManager
->initializeElement($composite_element);
$element['#webform_composite_elements'][$composite_key] = $composite_element;
}
$this
->initializeCompositeElementsRecursive($element, $element['#webform_composite_elements']);
}
public function getCompositeElements() {
return [];
}
}