EntityAutocomplete.php in Webform 8.5
File
src/Plugin/WebformElement/EntityAutocomplete.php
View source
<?php
namespace Drupal\webform\Plugin\WebformElement;
use Drupal\Core\Form\FormStateInterface;
use Drupal\webform\Plugin\WebformElementBase;
use Drupal\webform\Plugin\WebformElementEntityReferenceInterface;
use Drupal\webform\WebformSubmissionInterface;
class EntityAutocomplete extends WebformElementBase implements WebformElementEntityReferenceInterface {
use WebformEntityReferenceTrait;
protected function defineDefaultProperties() {
return [
'target_type' => '',
'selection_handler' => 'default',
'selection_settings' => [],
'tags' => FALSE,
] + parent::defineDefaultProperties() + $this
->defineDefaultMultipleProperties();
}
public function setDefaultValue(array &$element) {
if (!empty($element['#tags']) && isset($element['#multiple'])) {
unset($element['#multiple']);
}
if (isset($element['#multiple'])) {
$element['#default_value'] = isset($element['#default_value']) ? (array) $element['#default_value'] : NULL;
return;
}
if (!empty($element['#default_value'])) {
$target_type = $this
->getTargetType($element);
$entity_storage = $this->entityTypeManager
->getStorage($target_type);
if ($entities = $entity_storage
->loadMultiple((array) $element['#default_value'])) {
$element['#default_value'] = empty($element['#tags']) ? reset($entities) : $entities;
}
else {
$element['#default_value'] = NULL;
}
}
else {
$element['#default_value'] = NULL;
}
}
public function supportsMultipleValues() {
return TRUE;
}
public function hasMultipleWrapper() {
return TRUE;
}
public function hasMultipleValues(array $element) {
if ($this
->hasProperty('tags') && isset($element['#tags'])) {
return $element['#tags'];
}
else {
return parent::hasMultipleValues($element);
}
}
public function prepare(array &$element, WebformSubmissionInterface $webform_submission = NULL) {
parent::prepare($element, $webform_submission);
$element['#maxlength'] = NULL;
if (!empty($element['#selection_settings']['auto_create']) && !empty($element['#selection_settings']['auto_create_bundle'])) {
$element['#autocreate']['bundle'] = $element['#selection_settings']['auto_create_bundle'];
}
}
protected function prepareElementValidateCallbacks(array &$element, WebformSubmissionInterface $webform_submission = NULL) {
parent::prepareElementValidateCallbacks($element, $webform_submission);
$element['#element_validate'][] = [
'\\Drupal\\webform\\Plugin\\WebformElement\\EntityAutocomplete',
'validateEntityAutocomplete',
];
}
public static function validateEntityAutocomplete(array &$element, FormStateInterface $form_state) {
$value = $form_state
->getValue($element['#parents']);
if (empty($value) || !is_array($value)) {
return;
}
$element_manager = \Drupal::service('plugin.manager.webform.element');
$element_plugin = $element_manager
->getElementInstance($element);
if ($element_plugin
->hasMultipleValues($element)) {
$entity_ids = [];
foreach ($value as $item) {
$entity_ids[] = (string) static::getEntityIdFromItem($item);
}
$form_state
->setValueForElement($element, $entity_ids);
}
else {
$form_state
->setValueForElement($element, (string) static::getEntityIdFromItem($value));
}
}
protected static function getEntityIdFromItem($item) {
if (isset($item['target_id'])) {
return $item['target_id'];
}
elseif (isset($item['entity'])) {
$entity = $item['entity'];
$entity
->save();
return $entity
->id();
}
else {
return $item;
}
}
public function getExportDefaultOptions() {
return [
'entity_reference_items' => [
'id',
'title',
'url',
],
];
}
}