entity_change_notifier-8.x-1.0/src/Entity/Publisher.php
src/Entity/Publisher.php
<?php
namespace Drupal\entity_change_notifier\Entity;
use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
/**
* Defines the Publisher entity.
*
* @ConfigEntityType(
* id = "ecn_publisher",
* label = @Translation("Publisher"),
* label_singular = @Translation("publisher"),
* label_plural = @Translation("publishers"),
* label_count = @PluralTranslation(
* singular = "@count publisher",
* plural = "@count publishers",
* ),
* label_collection = @Translation("Publishers"),
* handlers = {
* "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
* "list_builder" = "Drupal\entity_change_notifier\PublisherListBuilder",
* "form" = {
* "add" = "Drupal\entity_change_notifier\Form\PublisherForm",
* "edit" = "Drupal\entity_change_notifier\Form\PublisherForm",
* "delete" = "Drupal\entity_change_notifier\Form\PublisherDeleteForm"
* },
* "route_provider" = {
* "html" = "Drupal\Core\Entity\Routing\AdminHtmlRouteProvider",
* },
* },
* config_prefix = "ecn_publisher",
* admin_permission = "administer site configuration",
* entity_keys = {
* "id" = "id",
* "label" = "label",
* "uuid" = "uuid"
* },
* links = {
* "canonical" = "/admin/config/services/entity-change-notifier/publisher/{ecn_publisher}",
* "add-form" = "/admin/config/services/entity-change-notifier/publisher/add",
* "edit-form" = "/admin/config/services/entity-change-notifier/publisher/{ecn_publisher}/edit",
* "delete-form" = "/admin/config/services/entity-change-notifier/publisher/{ecn_publisher}/delete",
* "collection" = "/admin/config/services/entity-change-notifier/publisher"
* }
* )
*/
class Publisher extends ConfigEntityBase implements PublisherInterface {
use StringTranslationTrait;
/**
* The Publisher ID.
*
* @var string
*/
protected $id;
/**
* The Publisher label.
*
* @var string
*/
protected $label;
/**
* The ID of the destination configuration entity.
*
* @var string
*/
protected $destination;
/**
* The array of entity types to publish.
*
* Each array key is the entity type, containing a list of entity bundles.
*
* @var array
*/
protected $publish_types = [];
/**
* {@inheritdoc}
*/
public function getDestination() {
return $this->destination;
}
/**
* {@inheritdoc}
*/
public function getPublishTypes() {
return $this->publish_types;
}
/**
* {@inheritdoc}
*/
public function setPublishTypes(array $publishTypes) {
$this->publish_types = $publishTypes;
}
/**
* {@inheritdoc}
*/
public function notify($action, EntityInterface $entity) {
$types = $this->getPublishTypes();
$entityTypeId = $entity->getEntityTypeId();
if (isset($types[$entityTypeId]) && in_array($entity->bundle(), $types[$entityTypeId])) {
/** @var \Drupal\entity_change_notifier\Entity\DestinationInterface $destinationConfigEntity */
$destinationConfigEntity = \Drupal::service('entity_type.manager')->getStorage('ecn_destination')->load($this->destination);
/** @var \Drupal\entity_change_notifier\Plugin\MessageDestination\MessageDestinationInterface $messageDestination */
$messageDestinationSettings = $destinationConfigEntity->getMessageDestinationSettings();
$messageDestination = \Drupal::service('entity_change_notifier.message_destination_manager')->createInstance($destinationConfigEntity->getMessageDestination(), $messageDestinationSettings);
$messageDestination->setDestinationConfigurationEntity($destinationConfigEntity->id());
$messageDestination->notify($action, $entity);
$context = [
'%action' => $action,
'%label' => $destinationConfigEntity->label(),
'%entity' => $entity->label(),
];
if ($entity->hasLinkTemplate('canonical')) {
$context['link'] = $this->t('<a href="@url">View</a>', [
'@url' => $entity->toUrl()
->toString(),
]);
}
\Drupal::logger('entity_change_notifier')->info('%action notification sent to %label for %entity', $context);
}
}
/**
* {@inheritdoc}
*/
public function calculateDependencies() {
parent::calculateDependencies();
// Add a dependency on the destination.
$destination = $this->entityTypeManager()->getStorage('ecn_destination')->load($this->getDestination());
$this->addDependency('config', $destination->getConfigDependencyName());
// Add a dependency on all configured entities and bundles.
foreach ($this->getPublishTypes() as $entity => $bundles) {
foreach ($bundles as $bundle) {
$definition = $this->entityTypeManager()->getDefinition($entity);
$dependency = $definition->getBundleConfigDependency($bundle);
$this->addDependency($dependency['type'], $dependency['name']);
}
}
return $this;
}
/**
* {@inheritdoc}
*/
public function fetchEntities() {
$entities = [];
foreach ($this->getPublishTypes() as $entity => $bundles) {
$query = $this->entityTypeManager()->getStorage($entity)->getQuery();
$query->condition('type', $bundles, 'IN');
$results = $query->execute();
foreach ($results as $entity_id) {
$entities[] = [
'entity_type' => $entity,
'entity_id' => $entity_id,
];
}
}
return $entities;
}
}
