contacts_events-8.x-1.x-dev/modules/teams/src/Entity/Team.php
modules/teams/src/Entity/Team.php
<?php
namespace Drupal\contacts_events_teams\Entity;
use Drupal\commerce_order\Entity\OrderItemInterface;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\contacts_events\Entity\EventInterface;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\StringTranslation\TranslatableMarkup;
use Drupal\entity\BundleFieldDefinition;
/**
* Defines the Team entity.
*
* @ingroup contacts_events_teams
*
* @ContentEntityType(
* id = "c_events_team",
* label = @Translation("Team"),
* label_plural = @Translation("Teams"),
* label_collection = @Translation("Teams"),
* handlers = {
* "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
* "list_builder" = "Drupal\contacts_events_teams\TeamListBuilder",
* "views_data" = "Drupal\views\EntityViewsData",
* "form" = {
* "add" = "Drupal\contacts_events_teams\Form\TeamForm",
* "edit" = "Drupal\contacts_events_teams\Form\TeamForm",
* "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm",
* },
* "access" = "Drupal\contacts_events_teams\TeamAccessControlHandler",
* "route_provider" = {
* "html" = "Drupal\contacts_events_teams\TeamHtmlRouteProvider",
* },
* },
* base_table = "c_events_team",
* admin_permission = "administer contacts events teams",
* entity_keys = {
* "id" = "id",
* "label" = "name",
* "uuid" = "uuid",
* "langcode" = "langcode",
* },
* links = {
* "canonical" = "/event/{contacts_event}/teams/{c_events_team}",
* "edit-form" = "/event/{contacts_event}/teams/{c_events_team}/edit",
* "add-form" = "/event/{contacts_event}/teams/add",
* "delete-form" = "/event/{contacts_event}/teams/{c_events_team}/delete",
* "collection" = "/event/{contacts_event}/teams/manage",
* }
* )
*/
class Team extends ContentEntityBase implements TeamInterface {
/**
* {@inheritdoc}
*/
public function getName() {
return $this->get('name')->value;
}
/**
* {@inheritdoc}
*/
public function setName($name) {
$this->set('name', $name);
return $this;
}
/**
* {@inheritdoc}
*/
public function getEvent() : EventInterface {
return $this->get('event')->entity;
}
/**
* {@inheritdoc}
*/
public function setEvent($event) {
$this->set('event', $event);
return $this;
}
/**
* {@inheritdoc}
*/
public function isTeamLeader($user) : bool {
if ($user instanceof AccountInterface) {
$user = $user->id();
}
foreach ($this->get('leaders') as $team_leader_item) {
if ($team_leader_item->target_id == $user) {
return TRUE;
}
}
return FALSE;
}
/**
* {@inheritdoc}
*/
protected function urlRouteParameters($rel) {
$parameters = parent::urlRouteParameters($rel);
$parameters['contacts_event'] = $this->get('event')->target_id;
return $parameters;
}
/**
* {@inheritdoc}
*/
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields = parent::baseFieldDefinitions($entity_type);
$fields['name'] = BaseFieldDefinition::create('string')
->setLabel(new TranslatableMarkup('Team Name'))
->setSettings([
'max_length' => 50,
'text_processing' => 0,
])
->setDefaultValue('')
->setDisplayOptions('view', [
'label' => 'above',
'type' => 'string',
'weight' => 0,
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
'weight' => 0,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['event'] = BaseFieldDefinition::create('entity_reference')
->setLabel(new TranslatableMarkup('Event'))
->setDescription(new TranslatableMarkup('The Event'))
->setSetting('target_type', 'contacts_event')
->setSetting('handler', 'default')
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'author',
'weight' => 1,
])
->setDisplayOptions('form', [
'region' => 'hidden',
])
->setDisplayConfigurable('form', FALSE)
->setDisplayConfigurable('view', TRUE);
$fields['public'] = BaseFieldDefinition::create('boolean')
->setLabel(new TranslatableMarkup('Is this team publicly visible?'))
->setDefaultValue(TRUE)
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
'weight' => 2,
])
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['form'] = BaseFieldDefinition::create('entity_reference')
->setLabel(new TranslatableMarkup('Application Form'))
->setDescription(new TranslatableMarkup('Select the application form to be used.'))
->setRequired(TRUE)
->setSetting('target_type', 'c_events_team_app_type')
->setSetting('handler', 'default')
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'author',
'weight' => 3,
])
->setDisplayOptions('form', [
'type' => 'options_select',
'weight' => 3,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
// Translatable strings should have leading/trailing whitespace, but we need
// that for rendered output, so wrap in formattable markup.
$age_suffix = new FormattableMarkup(' @year', [
'@year' => new TranslatableMarkup('year(s)'),
]);
$fields['age_min'] = BaseFieldDefinition::create('integer')
->setLabel(new TranslatableMarkup('Minimum age'))
->setDescription(new TranslatableMarkup('The minimum age for team applicants.'))
->setRequired(TRUE)
->setDefaultValue(18)
->setSetting('suffix', $age_suffix)
->setDisplayOptions('view', [
'label' => 'above',
'type' => 'string',
'weight' => 4,
])
->setDisplayOptions('form', [
'type' => 'number',
'weight' => 4,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['age_max'] = BaseFieldDefinition::create('integer')
->setLabel(new TranslatableMarkup('Maximum age'))
->setDescription(new TranslatableMarkup('The maximum age for team applicants.'))
->setRequired(FALSE)
->setDefaultValue(NULL)
->setSetting('suffix', $age_suffix)
->setDisplayOptions('view', [
'label' => 'above',
'type' => 'string',
'weight' => 5,
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
'weight' => 5,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['leaders'] = BaseFieldDefinition::create('entity_reference')
->setCardinality(FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED)
->setLabel(new TranslatableMarkup('Team Leaders'))
->setRevisionable(TRUE)
->setSetting('target_type', 'user')
->setSetting('handler', 'search_api')
->setSetting('handler_settings', [
'index' => 'contacts_index',
'conditions' => [['roles', 'crm_indiv']],
])
->setTranslatable(TRUE)
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'author',
'weight' => 6,
])
->setDisplayOptions('form', [
'type' => 'entity_reference_autocomplete',
'weight' => 6,
'settings' => [
'match_operator' => 'CONTAINS',
'size' => '60',
'autocomplete_type' => 'tags',
'placeholder' => '',
],
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['price_override'] = BaseFieldDefinition::create('commerce_price')
->setLabel(new TranslatableMarkup('Price Override'))
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'commerce_order_total_summary',
'weight' => 7,
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
'weight' => 7,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['category'] = BaseFieldDefinition::create('entity_reference')
->setLabel(new TranslatableMarkup('Category'))
->setSetting('target_type', 'taxonomy_term')
->setSetting('handler', 'default')
->setSetting('handler_settings', ['target_bundles' => ['contacts_events_teams']])
->setRequired(TRUE)
->setDisplayOptions('view', [
'label' => 'hidden',
'type' => 'author',
'weight' => 8,
])
->setDisplayOptions('form', [
'type' => 'options_select',
'weight' => 8,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['capacity'] = BaseFieldDefinition::create('integer')
->setLabel(new TranslatableMarkup('Team Capacity'))
->setRequired(FALSE)
->setDefaultValue(NULL)
->setDisplayOptions('view', [
'label' => 'above',
'type' => 'string',
'weight' => 9,
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
'weight' => 9,
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['disable_automatic_emails'] = BaseFieldDefinition::create('boolean')
->setLabel(new TranslatableMarkup('Disable automatic emails for this team'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['team_email_override'] = BaseFieldDefinition::create('boolean')
->setLabel(new TranslatableMarkup('Override team emails'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
return $fields;
}
/**
* {@inheritdoc}
*/
public static function bundleFieldDefinitions(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) {
$fields = parent::bundleFieldDefinitions($entity_type, $bundle, $base_field_definitions);
$fields['application_request_team_enabled'] = BundleFieldDefinition::create('boolean')
->setName('application_request_team_enabled')
->setLabel(new TranslatableMarkup('Enable application request (with team)?'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_request_team_b_man'] = BundleFieldDefinition::create('boolean')
->setName('application_request_team_b_man')
->setLabel(new TranslatableMarkup('Do not send to the booking manager'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_request_team_subject'] = BundleFieldDefinition::create('string')
->setName('application_request_team_subject')
->setLabel(new TranslatableMarkup('Application request subject (with team)'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_request_team_body'] = BundleFieldDefinition::create('text_long')
->setName('application_request_team_body')
->setLabel(new TranslatableMarkup('Application request email (with team)'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'text_textarea',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_accepted_enabled'] = BundleFieldDefinition::create('boolean')
->setName('application_accepted_enabled')
->setLabel(new TranslatableMarkup('Enable application accepted?'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_accepted_subject'] = BundleFieldDefinition::create('string')
->setName('application_accepted_subject')
->setLabel(new TranslatableMarkup('Application accepted subject'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_accepted_body'] = BundleFieldDefinition::create('text_long')
->setName('application_accepted_body')
->setLabel(new TranslatableMarkup('Application accepted email'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'text_textarea',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_submitted_enabled'] = BundleFieldDefinition::create('boolean')
->setName('application_submitted_enabled')
->setLabel(new TranslatableMarkup('Enable application submitted?'))
->setDefaultValue(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'boolean_checkbox',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_submitted_subject'] = BundleFieldDefinition::create('string')
->setName('application_submitted_subject')
->setLabel(new TranslatableMarkup('Application submitted subject'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'string_textfield',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
$fields['application_submitted_body'] = BundleFieldDefinition::create('text_long')
->setName('application_submitted_body')
->setLabel(new TranslatableMarkup('Application submitted email'))
->setRequired(FALSE)
->setDisplayOptions('view', [
'region' => 'hidden',
])
->setDisplayOptions('form', [
'type' => 'text_textarea',
])
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', FALSE);
return $fields;
}
/**
* Gets the team name from an order item.
*
* Used as a callback for the ticket list screen.
* See contacts_events_teams_inline_entity_form_table_fields_alter.
*
* @param \Drupal\commerce_order\Entity\OrderItemInterface $order_item
* The order item.
*
* @return string
* The team name
*/
public static function getTeamNameFromOrderItem(OrderItemInterface $order_item) {
if ($order_item->bundle() === 'contacts_ticket') {
/** @var \Drupal\contacts_events\Entity\Ticket $ticket */
/** @var \Drupal\contacts_events_teams\Entity\TeamInterface $team */
if ($team = $order_item->getPurchasedEntity()->team->entity) {
return $team->getName();
}
}
return NULL;
}
}
