Version 1
[yaffs-website] / web / modules / contrib / embed / src / Entity / EmbedButton.php
diff --git a/web/modules/contrib/embed/src/Entity/EmbedButton.php b/web/modules/contrib/embed/src/Entity/EmbedButton.php
new file mode 100644 (file)
index 0000000..9188b95
--- /dev/null
@@ -0,0 +1,228 @@
+<?php
+
+namespace Drupal\embed\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Entity\EntityStorageInterface;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+use Drupal\embed\EmbedButtonInterface;
+
+/**
+ * Defines the EmbedButton entity.
+ *
+ * @ConfigEntityType(
+ *   id = "embed_button",
+ *   label = @Translation("Embed button"),
+ *   handlers = {
+ *     "form" = {
+ *       "add" = "Drupal\embed\Form\EmbedButtonForm",
+ *       "edit" = "Drupal\embed\Form\EmbedButtonForm",
+ *       "delete" = "Drupal\Core\Entity\EntityDeleteForm",
+ *     },
+ *     "list_builder" = "Drupal\embed\EmbedButtonListBuilder",
+ *   },
+ *   admin_permission = "administer embed buttons",
+ *   config_prefix = "button",
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "label",
+ *   },
+ *   links = {
+ *     "edit-form" = "/admin/config/content/embed/button/manage/{embed_button}",
+ *     "delete-form" = "/admin/config/content/embed/button/manage/{embed_button}/delete",
+ *     "collection" = "/admin/config/content/embed",
+ *   },
+ *   config_export = {
+ *     "label",
+ *     "id",
+ *     "type_id",
+ *     "type_settings",
+ *     "icon_uuid",
+ *   }
+ * )
+ */
+class EmbedButton extends ConfigEntityBase implements EmbedButtonInterface {
+
+  use StringTranslationTrait;
+
+  /**
+   * The EmbedButton ID.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * Label of EmbedButton.
+   *
+   * @var string
+   */
+  public $label;
+
+  /**
+   * The embed type plugin ID.
+   *
+   * @var string
+   */
+  public $type_id;
+
+  /**
+   * Embed type settings.
+   *
+   * An array of key/value pairs.
+   *
+   * @var array
+   */
+  public $type_settings = [];
+
+  /**
+   * UUID of the button's icon file.
+   *
+   * @var string
+   */
+  public $icon_uuid;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTypeId() {
+    return $this->type_id;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTypeLabel() {
+    if ($definition = $this->embedTypeManager()->getDefinition($this->getTypeId(), FALSE)) {
+      return $definition['label'];
+    }
+    else {
+      return $this->t('Unknown');
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTypePlugin() {
+    if ($plugin_id = $this->getTypeId()) {
+      return $this->embedTypeManager()->createInstance($plugin_id, $this->getTypeSettings());
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIconFile() {
+    if ($this->icon_uuid) {
+      return $this->entityManager()->loadEntityByUuid('file', $this->icon_uuid);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getIconUrl() {
+    if ($image = $this->getIconFile()) {
+      return file_create_url($image->getFileUri());
+    }
+    else {
+      return $this->getTypePlugin()->getDefaultIconUrl();
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function calculateDependencies() {
+    parent::calculateDependencies();
+
+    // Add the file icon entity as dependency if an UUID was specified.
+    if ($this->icon_uuid && $file_icon = $this->entityManager()->loadEntityByUuid('file', $this->icon_uuid)) {
+      $this->addDependency($file_icon->getConfigDependencyKey(), $file_icon->getConfigDependencyName());
+    }
+
+    // Gather the dependencies of the embed type plugin.
+    $plugin = $this->getTypePlugin();
+    $this->calculatePluginDependencies($plugin);
+
+    return $this->dependencies;
+  }
+
+  /**
+   * Gets the embed type plugin manager.
+   *
+   * @return \Drupal\embed\EmbedType\EmbedTypeManager
+   *   The embed type plugin manager.
+   */
+  protected function embedTypeManager() {
+    return \Drupal::service('plugin.manager.embed.type');
+  }
+
+  /**
+   * Gets the file usage service.
+   *
+   * @return \Drupal\file\FileUsage\FileUsageInterface
+   *   The file usage service.
+   */
+  protected function fileUsage() {
+    return \Drupal::service('file.usage');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function postSave(EntityStorageInterface $storage, $update = TRUE) {
+    parent::postSave($storage, $update);
+
+    $icon_file = $this->getIconFile();
+    if (isset($this->original) && $old_icon_file = $this->original->getIconFile()) {
+      /** @var \Drupal\file\FileInterface $old_icon_file */
+      if (!$icon_file || $icon_file->uuid() != $old_icon_file->uuid()) {
+        $this->fileUsage()->delete($old_icon_file, 'embed', $this->getEntityTypeId(), $this->id());
+      }
+    }
+
+    if ($icon_file) {
+      $usage = $this->fileUsage()->listUsage($icon_file);
+      if (empty($usage['embed'][$this->getEntityTypeId()][$this->id()])) {
+        $this->fileUsage()->add($icon_file, 'embed', $this->getEntityTypeId(), $this->id());
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function postDelete(EntityStorageInterface $storage, array $entities) {
+    parent::postDelete($storage, $entities);
+
+    // Remove file usage for any button icons.
+    foreach ($entities as $entity) {
+      /** @var \Drupal\embed\EmbedButtonInterface $entity */
+      if ($icon_file = $entity->getIconFile()) {
+        \Drupal::service('file.usage')->delete($icon_file, 'embed', $entity->getEntityTypeId(), $entity->id());
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTypeSetting($key, $default = NULL) {
+    if (isset($this->type_settings[$key])) {
+      return $this->type_settings[$key];
+    }
+    else {
+      return $default;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTypeSettings() {
+    return $this->type_settings;
+  }
+
+}