rocketship_core-8.x-2.0-alpha11/src/Plugin/Field/FieldFormatter/AuthorRender.php
src/Plugin/Field/FieldFormatter/AuthorRender.php
<?php
namespace Drupal\rocketship_core\Plugin\Field\FieldFormatter;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\FormatterBase;
use Drupal\user\EntityOwnerInterface;
/**
* Plugin implementation of the 'author_render' formatter.
*
* @FieldFormatter(
* id = "author_render",
* label = @Translation("Author render"),
* field_types = {
* "boolean"
* }
* )
*/
class AuthorRender extends FormatterBase {
/**
* {@inheritdoc}
*/
public function settingsSummary() {
$summary = [];
$summary[] = t("Output the parent's author when the field value evaluates to true");
// Implement settings summary.
return $summary;
}
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = [];
$renderer = \Drupal::service('renderer');
foreach ($items as $delta => $item) {
if ($item->value != TRUE) {
continue;
}
$entity = $items->getEntity();
/** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
$entity = $this->getHighestLevelParentEntity($entity);
if (!$entity instanceof EntityOwnerInterface) {
continue;
}
// Why the fuck does this not work? Well, until it does just output the
// value
// $build = $entity->get('uid')->view('default');.
$build = [
'#markup' => $entity->getOwner()->label(),
];
$renderer->addCacheableDependency($build, $entity);
$renderer->addCacheableDependency($build, $items->getEntity());
$renderer->addCacheableDependency($build, $entity->getOwner());
$elements[0] = $build;
return $elements;
}
return $elements;
}
/**
* Get highest parent.
*
* Recursively fetches the parent entity until top is reached and then
* returns that one.
*
* @param \Drupal\Core\Entity\EntityInterface $entity
* Entity.
*
* @return \Drupal\Core\Entity\EntityInterface
* Parent.
*/
protected function getHighestLevelParentEntity(EntityInterface $entity) {
if (method_exists($entity, 'getParentEntity')) {
$parent = $entity->getParentEntity();
if ($parent) {
return $this->getHighestLevelParentEntity($parent);
}
// Empty parent, assume this level is fine.
return $entity;
}
// Already highest level as far as we can tell.
return $entity;
}
}
