View source
<?php
namespace Drupal\entity_extra_field\Entity;
use Drupal\Core\Annotation\Translation;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\Core\Entity\Annotation\ConfigEntityType;
use Drupal\Core\Entity\Display\EntityDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Url;
use Drupal\entity_extra_field\ExtraFieldTypePluginInterface;
class EntityExtraField extends ConfigEntityBase implements EntityExtraFieldInterface {
public $id;
public $name;
public $label;
public $description;
public $display = [];
public $field_type_id;
public $display_label = FALSE;
public $field_type_config = [];
public $field_type_condition = [];
public $field_conditions_all_pass = FALSE;
public $base_entity_type_id;
public $base_bundle_type_id;
protected $build_attachments = [];
public function id() {
if (empty($this->name) || empty($this->base_entity_type_id) || empty($this->base_bundle_type_id)) {
return NULL;
}
return "{$this->base_entity_type_id}.{$this->base_bundle_type_id}.{$this->name}";
}
public function name() {
return $this->name;
}
public function description() {
return $this->description;
}
public function displayLabel() {
return $this->display_label;
}
public function getDisplay() {
return $this->display;
}
public function getDisplayType() {
$display = $this
->getDisplay();
return isset($display['type']) ? $display['type'] : NULL;
}
public function getFieldTypeLabel() {
return $this
->getFieldTypePlugin()
->label();
}
public function getFieldTypePluginId() {
return $this->field_type_id;
}
public function getFieldTypePluginConfig() {
return $this->field_type_config;
}
public function getFieldTypeCondition() {
return $this->field_type_condition;
}
public function getFieldTypeConditionsAllPass() {
return $this->field_conditions_all_pass;
}
public function getBaseEntityTypeId() {
return $this->base_entity_type_id;
}
public function getBaseBundleTypeId() {
return $this->base_bundle_type_id;
}
public function getBaseEntityType() {
return $this
->entityTypeManager()
->getDefinition($this
->getBaseEntityTypeId());
}
public function getBaseEntityTypeBundle() {
$entity_type = $this
->getBaseEntityType();
return $this
->entityTypeManager()
->getDefinition($entity_type
->getBundleEntityType());
}
public function getCacheDiscoveryId() {
$langcode = $this
->languageManager()
->getCurrentLanguage()
->getId();
return "entity_bundle_extra_fields:{$this->getBaseEntityTypeId()}:{$this->getBaseBundleTypeId()}:{$langcode}";
}
public function getCacheRenderTag() {
return "entity_extra_field:{$this->getDisplayType()}.{$this->getBaseEntityTypeId()}.{$this->getBaseBundleTypeId()}";
}
public function getBuildAttachments() {
return $this->build_attachments;
}
public function getActiveFieldTypeConditions() {
return array_filter($this
->getFieldTypeCondition(), static function ($value) {
unset($value['id'], $value['negate'], $value['context_mapping']);
return !empty(array_filter($value));
});
}
public function setBuildAttachment($type, array $attachment) {
if (!isset($this->build_attachments[$type])) {
$this->build_attachments[$type] = [];
}
$this->build_attachments[$type] = array_replace_recursive($this->build_attachments[$type], $attachment);
return $this;
}
public function build(EntityInterface $entity, EntityDisplayInterface $display) {
$field_type_plugin = $this
->getFieldTypePlugin();
if (!$field_type_plugin instanceof ExtraFieldTypePluginInterface) {
return [];
}
return [
'#field' => $this,
'#view_mode' => $display
->getMode(),
'#theme' => 'entity_extra_field',
'label' => [
'#plain_text' => $this
->displayLabel() ? $this
->label() : NULL,
],
'content' => $field_type_plugin
->build($entity, $display),
];
}
public function hasDisplayComponent(EntityDisplayInterface $display) {
return $display
->getComponent($this
->name()) !== NULL;
}
public function hasConditionsBeenMet(array $contexts, $all_must_pass = FALSE) {
$conditions = $this
->getActiveFieldTypeConditions();
if (empty($conditions)) {
return TRUE;
}
$verdicts = [];
foreach ($this
->getActiveFieldTypeConditions() as $plugin_id => $configuration) {
$condition = $this
->conditionPluginManager()
->createInstance($plugin_id, $configuration);
if ($context_definitions = $condition
->getContextDefinitions()) {
$condition_contexts = array_intersect_key($contexts, $context_definitions);
foreach ($condition_contexts as $name => $context) {
$condition
->setContextValue($name, $context);
}
}
$verdict = $condition
->evaluate();
if ($verdict && !$all_must_pass) {
return TRUE;
}
$verdicts[] = $verdict;
}
$verdicts = array_unique($verdicts);
return count($verdicts) === 1 && current($verdicts) === TRUE;
}
public function exists($name) {
return (bool) $this
->getQuery()
->condition('id', "{$this->getBaseEntityTypeId()}.{$this->getBaseBundleTypeId()}.{$name}")
->execute();
}
public function toUrl($rel = 'edit-form', array $options = []) {
$base_route_name = $this
->getBaseRouteName();
$route_parameters = $this
->urlRouteParameters($rel);
switch ($rel) {
case 'collection':
return URL::fromRoute($base_route_name, $route_parameters, $options);
case 'add-form':
return Url::fromRoute("{$base_route_name}.add", $route_parameters, $options);
case 'edit-form':
return Url::fromRoute("{$base_route_name}.edit", $route_parameters, $options);
case 'delete-form':
return Url::fromRoute("{$base_route_name}.delete", $route_parameters, $options);
}
throw new \RuntimeException(sprintf('Unable to find %s to built a URL.', $rel));
}
public function calculateDependencies() {
parent::calculateDependencies();
if ($field_type_plugin = $this
->getFieldTypePlugin()) {
$this
->calculatePluginDependencies($field_type_plugin);
}
return $this;
}
protected function getFieldTypePlugin() {
return \Drupal::service('plugin.manager.extra_field_type')
->createInstance($this
->getFieldTypePluginId(), $this
->getFieldTypePluginConfig());
}
protected function urlRouteParameters($rel) {
$base_bundle_type_id = $this
->getBaseEntityTypeBundle()
->id();
$uri_route_parameters = [];
$uri_route_parameters[$base_bundle_type_id] = $this
->getBaseBundleTypeId();
switch ($rel) {
case 'edit-form':
case 'delete-form':
$uri_route_parameters[$this
->getEntityTypeId()] = $this
->id();
break;
}
return $uri_route_parameters;
}
protected function linkTemplates() {
$templates = [];
$ui_base_path = $this
->getBaseEntityBundleUiPath();
$entity_type = $this
->getEntityType();
$entity_handlers = $entity_type
->getHandlerClasses();
if (isset($entity_handlers['form'])) {
foreach (array_keys($entity_handlers['form']) as $rel) {
$template_path = "{$ui_base_path}/extra-fields";
switch ($rel) {
case 'add':
$template_path = "{$template_path}/{$rel}";
break;
case 'edit':
case 'delete':
$template_path = "{$template_path}/{" . $entity_type
->id() . "}/{$rel}";
break;
}
$templates[$rel . '-form'] = $template_path;
}
}
$templates['collection'] = "{$ui_base_path}/extra-fields";
return $templates;
}
protected function getBaseEntityBundleUiPath() {
$base_route = $this
->getBaseEntityType()
->get('field_ui_base_route');
if (!isset($base_route)) {
return NULL;
}
$base_route_rel = strtr(substr($base_route, strrpos($base_route, '.') + 1), [
'_' => '-',
]);
$base_entity_bundle = $this
->getBaseEntityTypeBundle();
if (!$base_entity_bundle
->hasLinkTemplate($base_route_rel)) {
return NULL;
}
return $base_entity_bundle
->getLinkTemplate($base_route_rel);
}
protected function getBaseRouteName() {
return "entity.{$this->getBaseEntityTypeId()}.extra_fields";
}
protected function getQuery() {
return $this
->getStorage()
->getQuery();
}
protected function getStorage() {
return $this
->entityTypeManager()
->getStorage($this
->getEntityTypeId());
}
protected function conditionPluginManager() {
return \Drupal::service('plugin.manager.condition');
}
}