contacts_events-8.x-1.x-dev/modules/villages/src/Plugin/VillageGroupType/OrganisationGroup.php
modules/villages/src/Plugin/VillageGroupType/OrganisationGroup.php
<?php
namespace Drupal\contacts_events_villages\Plugin\VillageGroupType;
use Drupal\contacts_events_villages\Entity\VillageGroupInterface;
use Drupal\contacts_events_villages\Plugin\VillageGroupTypeBase;
use Drupal\Core\Field\EntityReferenceFieldItemListInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\entity\BundleFieldDefinition;
/**
* Village group type for villages linked with organisations.
*
* @VillageGroupType(
* id = "organisation",
* label = @Translation("Organisation"),
* description = @Translation("Village groups linked to organisation contacts."),
* )
*/
class OrganisationGroup extends VillageGroupTypeBase {
/**
* {@inheritdoc}
*/
public function buildFieldDefinitions() {
$fields = parent::buildFieldDefinitions();
$fields['organisation'] = BundleFieldDefinition::create('entity_reference')
->setLabel(t('Organisation'))
->setDescription(t('Start typing the name of your organisation to find it.'))
->setSetting('target_type', 'user')
->setSetting('handler', 'search_api')
->setSetting('handler_settings', [
'index' => 'contacts_index',
'conditions' => [['roles', 'crm_org']],
])
->setRequired(TRUE)
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'author',
'weight' => 99,
])
->setDisplayOptions('form', [
'type' => 'entity_reference_autocomplete',
'weight' => 99,
'settings' => [
'match_operator' => 'CONTAINS',
'size' => '60',
'placeholder' => '',
],
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
return $fields;
}
/**
* {@inheritdoc}
*/
public function form(EntityReferenceFieldItemListInterface $items) {
$form = [];
/** @var \Drupal\entity\BundleFieldDefinition[] $definitions */
$definitions = $this->buildFieldDefinitions();
$selection_settings = $definitions['organisation']->getSetting('handler_settings') + ['match_operator' => $definitions['organisation']->getSetting('match_operator')];
$referenced_entities = $items->referencedEntities();
// Check for a default entity and check it has the right bundle.
if (!empty($referenced_entities)) {
$group = $referenced_entities[0];
if ($group->bundle() == $this->getPluginId()) {
$default = $group->get('organisation')->entity;
}
}
$form['organisation'] = [
'#title' => $definitions['organisation']->getLabel(),
'#description' => $definitions['organisation']->getDescription(),
'#type' => 'entity_autocomplete',
'#target_type' => $definitions['organisation']->getSetting('target_type'),
'#selection_handler' => $definitions['organisation']->getSetting('handler'),
'#selection_settings' => $selection_settings,
'#validate_reference' => FALSE,
'#field_parents' => ['organisation'],
'#default_value' => $default ?? NULL,
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validate(array &$element, FormStateInterface $form_state, array &$complete_form) {
if (!$form_state->hasValue($element['organisation']['#parents'])) {
$form_state->setError($element['organisation'], new TranslatableMarkup('Please select an organisation to camp with.'));
}
}
/**
* {@inheritdoc}
*/
public function buildFormEntity(array $values, VillageGroupInterface $group) : VillageGroupInterface {
$group = parent::buildFormEntity($values, $group);
// Update the group name from the organisation if different.
if (!empty($values['organisation'])) {
$user_storage = $this->entityTypeManager->getStorage('user');
$organisation = $user_storage->load($values['organisation']);
if ($organisation && $group->getName() !== $organisation->label()) {
$group->setName($organisation->label());
}
}
return $group;
}
/**
* {@inheritdoc}
*/
public function getExisting(VillageGroupInterface $group) : VillageGroupInterface {
// @todo Find existing based on organisation entity not name.
$storage = $this->entityTypeManager->getStorage('c_events_village_group');
$query = $storage->getQuery()
->condition('event', $group->getEventId())
->condition('organisation', $group->get('organisation')->target_id)
->sort('name', 'ASC');
$query->accessCheck(TRUE);
$result = $storage->loadMultiple($query->execute());
return !empty($result) ? reset($result) : $group;
}
}
