Created
October 1, 2019 22:07
-
-
Save baisong/a7bd685cc1b92d210e9b19bc1f3e270a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Drupal\views\Plugin\views\row; | |
use Drupal\Core\DependencyInjection\DeprecatedServicePropertyTrait; | |
use Drupal\Core\Entity\EntityDisplayRepositoryInterface; | |
use Drupal\Core\Entity\EntityRepositoryInterface; | |
use Drupal\Core\Entity\EntityTypeManagerInterface; | |
use Drupal\Core\Form\FormStateInterface; | |
use Drupal\Core\Language\LanguageManagerInterface; | |
use Drupal\views\Entity\Render\EntityTranslationRenderTrait; | |
use Drupal\views\Plugin\views\display\DisplayPluginBase; | |
use Drupal\views\ViewExecutable; | |
use Symfony\Component\DependencyInjection\ContainerInterface; | |
/** | |
* Generic entity row plugin to provide a common base for all entity types. | |
* | |
* @ViewsRow( | |
* id = "entity", | |
* deriver = "Drupal\views\Plugin\Derivative\ViewsEntityRow" | |
* ) | |
*/ | |
class EntityRow extends RowPluginBase { | |
use EntityTranslationRenderTrait; | |
use DeprecatedServicePropertyTrait; | |
/** | |
* {@inheritdoc} | |
*/ | |
protected $deprecatedProperties = ['entityManager' => 'entity.manager']; | |
/** | |
* The table the entity is using for storage. | |
* | |
* @var string | |
*/ | |
public $base_table; | |
/** | |
* The actual field which is used for the entity id. | |
* | |
* @var string | |
*/ | |
public $base_field; | |
/** | |
* Stores the entity type ID of the result entities. | |
* | |
* @var string | |
*/ | |
protected $entityTypeId; | |
/** | |
* Contains the entity type of this row plugin instance. | |
* | |
* @var \Drupal\Core\Entity\EntityTypeInterface | |
*/ | |
protected $entityType; | |
/** | |
* The entity type manager. | |
* | |
* @var \Drupal\Core\Entity\EntityTypeManagerInterface | |
*/ | |
protected $entityTypeManager; | |
/** | |
* The entity repository service. | |
* | |
* @var \Drupal\Core\Entity\EntityRepositoryInterface | |
*/ | |
protected $entityRepository; | |
/** | |
* The entity display repository. | |
* | |
* @var \Drupal\Core\Entity\EntityDisplayRepositoryInterface | |
*/ | |
protected $entityDisplayRepository; | |
/** | |
* The language manager. | |
* | |
* @var \Drupal\Core\Language\LanguageManagerInterface | |
*/ | |
protected $languageManager; | |
/** | |
* Constructs a new EntityRow object. | |
* | |
* @param array $configuration | |
* A configuration array containing information about the plugin instance. | |
* @param string $plugin_id | |
* The plugin_id for the plugin instance. | |
* @param array $plugin_definition | |
* The plugin implementation definition. | |
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager | |
* The entity manager. | |
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager | |
* The language manager. | |
* @param \Drupal\Core\Entity\EntityRepositoryInterface $entity_repository | |
* The entity repository. | |
* @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository | |
* The entity display repository. | |
*/ | |
public function __construct(array $configuration, $plugin_id, array $plugin_definition, EntityTypeManagerInterface $entity_type_manager, LanguageManagerInterface $language_manager, EntityRepositoryInterface $entity_repository = NULL, EntityDisplayRepositoryInterface $entity_display_repository = NULL) { | |
parent::__construct($configuration, $plugin_id, $plugin_definition); | |
$this->entityTypeManager = $entity_type_manager; | |
$this->languageManager = $language_manager; | |
if (!$entity_repository) { | |
@trigger_error('Calling EntityRow::__construct() with the $entity_repository argument is supported in drupal:8.7.0 and will be required before drupal:9.0.0. See https://www.drupal.org/node/2549139.', E_USER_DEPRECATED); | |
$entity_repository = \Drupal::service('entity.repository'); | |
} | |
$this->entityRepository = $entity_repository; | |
if (!$entity_display_repository) { | |
@trigger_error('Calling EntityRow::__construct() with the $entity_display_repository argument is supported in drupal:8.7.0 and will be required before drupal:9.0.0. See https://www.drupal.org/node/2549139.', E_USER_DEPRECATED); | |
$entity_display_repository = \Drupal::service('entity_display.repository'); | |
} | |
$this->entityDisplayRepository = $entity_display_repository; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) { | |
parent::init($view, $display, $options); | |
$this->entityTypeId = $this->definition['entity_type']; | |
$this->entityType = $this->entityTypeManager->getDefinition($this->entityTypeId); | |
$this->base_table = $this->entityType->getDataTable() ?: $this->entityType->getBaseTable(); | |
$this->base_field = $this->entityType->getKey('id'); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { | |
return new static( | |
$configuration, | |
$plugin_id, | |
$plugin_definition, | |
$container->get('entity_type.manager'), | |
$container->get('language_manager'), | |
$container->get('entity.repository'), | |
$container->get('entity_display.repository') | |
); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getEntityTypeId() { | |
return $this->entityType->id(); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function getEntityManager() { | |
// This relies on DeprecatedServicePropertyTrait to trigger a deprecation | |
// message in case it is accessed. | |
return $this->entityManager; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function getEntityTypeManager() { | |
return $this->entityTypeManager; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function getEntityRepository() { | |
return $this->entityRepository; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function getLanguageManager() { | |
return $this->languageManager; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function getView() { | |
return $this->view; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
protected function defineOptions() { | |
$options = parent::defineOptions(); | |
$options['view_mode'] = ['default' => 'default']; | |
return $options; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function buildOptionsForm(&$form, FormStateInterface $form_state) { | |
parent::buildOptionsForm($form, $form_state); | |
$form['view_mode'] = [ | |
'#type' => 'select', | |
'#options' => $this->entityDisplayRepository->getViewModeOptions($this->entityTypeId), | |
'#title' => $this->t('View mode'), | |
'#default_value' => $this->options['view_mode'], | |
]; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function summaryTitle() { | |
$options = $this->entityDisplayRepository->getViewModeOptions($this->entityTypeId); | |
if (isset($options[$this->options['view_mode']])) { | |
return $options[$this->options['view_mode']]; | |
} | |
else { | |
return $this->t('No view mode selected'); | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function query() { | |
parent::query(); | |
$relationship_table = NULL; | |
if (isset($this->options['relationship'], $this->view->relationship[$this->options['relationship']])) { | |
$relationship_table = $this->view->relationship[$this->options['relationship']]->alias; | |
} | |
$this->getEntityTranslationRenderer()->query($this->view->getQuery(), $relationship_table); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function preRender($result) { | |
parent::preRender($result); | |
if ($result) { | |
$this->getEntityTranslationRenderer()->preRenderByRelationship($result, isset($this->options['relationship']) ? $this->options['relationship'] : 'none'); | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function render($row) { | |
return $this->getEntityTranslationRenderer()->renderByRelationship($row, isset($this->options['relationship']) ? $this->options['relationship'] : 'none'); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function calculateDependencies() { | |
$dependencies = parent::calculateDependencies(); | |
$view_mode = $this->entityTypeManager | |
->getStorage('entity_view_mode') | |
->load($this->entityTypeId . '.' . $this->options['view_mode']); | |
if ($view_mode) { | |
$dependencies[$view_mode->getConfigDependencyKey()][] = $view_mode->getConfigDependencyName(); | |
} | |
return $dependencies; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment