You are here

class Micon in Micon 2.x

Same name in this branch
  1. 2.x src/TwigExtension/Micon.php \Drupal\micon\TwigExtension\Micon
  2. 2.x src/Element/Micon.php \Drupal\micon\Element\Micon
  3. 2.x src/Entity/Micon.php \Drupal\micon\Entity\Micon
  4. 2.x src/Plugin/SocialMediaLinks/Iconset/Micon.php \Drupal\micon\Plugin\SocialMediaLinks\Iconset\Micon
Same name and namespace in other branches
  1. 8 src/Entity/Micon.php \Drupal\micon\Entity\Micon

Defines the Micon entity.

Plugin annotation


@ConfigEntityType(
  id = "micon",
  label = @Translation("Micon package"),
  label_singular = @Translation("Micon package"),
  label_plural = @Translation("Micon packages"),
  label_count = @PluralTranslation(
    singular = "@count Micon package",
    plural = "@count Micon packages",
  ),
  handlers = {
    "view_builder" = "Drupal\micon\MiconViewBuilder",
    "list_builder" = "Drupal\micon\MiconListBuilder",
    "form" = {
      "add" = "Drupal\micon\Form\MiconForm",
      "edit" = "Drupal\micon\Form\MiconForm",
      "delete" = "Drupal\micon\Form\MiconDeleteForm"
    },
    "route_provider" = {
      "html" = "Drupal\micon\MiconHtmlRouteProvider",
    },
  },
  config_prefix = "micon",
  admin_permission = "administer micon",
  entity_keys = {
    "id" = "id",
    "label" = "label",
    "uuid" = "uuid",
    "status" = "status"
  },
  config_export = {
    "id" = "id",
    "label" = "label",
    "status" = "status",
    "type" = "type",
    "archive" = "archive"
  },
  links = {
    "canonical" = "/admin/structure/micon/{micon}",
    "add-form" = "/admin/structure/micon/add",
    "edit-form" = "/admin/structure/micon/{micon}/edit",
    "delete-form" = "/admin/structure/micon/{micon}/delete",
    "collection" = "/admin/structure/micon"
  }
)

Hierarchy

Expanded class hierarchy of Micon

5 files declare their use of Micon
micon.module in ./micon.module
Contains micon.module.
MiconIconManager.php in src/MiconIconManager.php
MiconLinkWidget.php in micon_link/src/Plugin/Field/FieldWidget/MiconLinkWidget.php
MiconMenuConfigForm.php in micon_menu/src/Form/MiconMenuConfigForm.php
StringMiconWidget.php in src/Plugin/Field/FieldWidget/StringMiconWidget.php
8 string references to 'Micon'
micon.info.yml in ./micon.info.yml
micon.info.yml
micon.links.menu.yml in ./micon.links.menu.yml
micon.links.menu.yml
micon_content_type.info.yml in micon_content_type/micon_content_type.info.yml
micon_content_type/micon_content_type.info.yml
micon_link.info.yml in micon_link/micon_link.info.yml
micon_link/micon_link.info.yml
micon_local_task.info.yml in micon_local_task/micon_local_task.info.yml
micon_local_task/micon_local_task.info.yml

... See full list

File

src/Entity/Micon.php, line 60

Namespace

Drupal\micon\Entity
View source
class Micon extends ConfigEntityBase implements MiconInterface {

  /**
   * The Micon ID.
   *
   * @var string
   */
  protected $id;

  /**
   * The Micon label.
   *
   * @var string
   */
  protected $label;

  /**
   * The Micon type. Either 'font' or 'image'. Default is 'font'.
   *
   * @var string
   */
  protected $type = 'font';

  /**
   * The info of this package.
   *
   * @var array
   */
  protected $info = [];

  /**
   * The available icons in this package.
   *
   * @var array
   */
  protected $icons = [];

  /**
   * The folder where Micon packages exist.
   *
   * @var string
   */
  protected $directory = 'public://micon';

  /**
   * {@inheritdoc}
   */
  public function setAsSvg() {
    $this->type = 'image';
  }

  /**
   * {@inheritdoc}
   */
  public function type() {
    return $this->type;
  }

  /**
   * {@inheritdoc}
   */
  public function getInfo() {
    if (empty($this->info)) {
      $this->info = [];
      $path = $this
        ->getDirectory() . '/selection.json';
      if (file_exists($path)) {
        $data = file_get_contents($path);
        $this->info = Json::decode($data);
      }
    }
    return $this->info;
  }

  /**
   * {@inheritdoc}
   */
  public function getName() {
    $info = $this
      ->getInfo();
    return isset($info['metadata']['name']) ? $info['metadata']['name'] : str_replace('-', '', $this
      ->getPrefix());
  }

  /**
   * {@inheritdoc}
   */
  public function getPrefix() {
    $info = $this
      ->getInfo();
    return $info['preferences'][$this
      ->type() . 'Pref']['prefix'];
  }

  /**
   * {@inheritdoc}
   */
  public function getIcons() {
    if (empty($this->icons) && ($info = $this
      ->getInfo())) {
      $this->icons = [];
      foreach ($info['icons'] as $icon) {
        $icon['name'] = $icon['properties']['name'];
        $icon['tags'] = implode(",", $icon['icon']['tags']);
        $icon['prefix'] = $this
          ->getPrefix();
        $icon['directory'] = file_create_url($this
          ->getDirectory());
        $icon['package_id'] = $this
          ->id();
        $icon['package_label'] = $this
          ->label();
        $micon_icon = new MiconIcon($this
          ->type(), $icon);
        $this->icons[$micon_icon
          ->getSelector()] = $micon_icon;
      }
    }
    return $this->icons;
  }

  /**
   * {@inheritdoc}
   */
  public function setArchive($zip_path) {
    $data = strtr(base64_encode(addslashes(gzcompress(serialize(file_get_contents($zip_path)), 9))), '+/=', '-_,');
    $parts = str_split($data, 200000);
    $this
      ->set('archive', $parts);
  }

  /**
   * {@inheritdoc}
   */
  public function getArchive() {
    $data = implode('', $this
      ->get('archive'));
    return unserialize(gzuncompress(stripslashes(base64_decode(strtr($data, '-_,', '+/=')))));
  }

  /**
   * {@inheritdoc}
   */
  public function getStylesheet() {
    $path = $this
      ->getDirectory() . '/style.css';
    return file_exists($path) ? $path : NULL;
  }

  /**
   * Return the location where Micon packages exist.
   *
   * @return string
   *   The unique path to the package directory.
   */
  protected function getDirectory() {
    return $this->directory . '/' . $this
      ->id();
  }

  /**
   * {@inheritdoc}
   */
  public static function loadActive() {
    return Micon::loadMultiple(Micon::loadActiveIds());
  }

  /**
   * {@inheritdoc}
   */
  public static function loadActiveIds() {
    $query = \Drupal::entityQuery('micon')
      ->condition('status', 1);
    return $query
      ->execute();
  }

  /**
   * {@inheritdoc}
   */
  public static function loadActiveLabels() {
    $labels = [];
    foreach (Micon::loadActive() as $micon) {
      $labels[$micon
        ->id()] = $micon
        ->label();
    }
    return $labels;
  }

  /**
   * {@inheritdoc}
   */
  public function preSave(EntityStorageInterface $storage) {
    parent::preSave($storage);
    if (!$this
      ->isNew()) {
      $original = $storage
        ->loadUnchanged($this
        ->getOriginalId());
    }
    if (!$this
      ->get('archive')) {
      throw new EntityMalformedException('IcoMoon icon package is required.');
    }
    if ($this
      ->isNew() || $original
      ->get('archive') !== $this
      ->get('archive')) {
      $this
        ->archiveDecode();
    }
  }

  /**
   * {@inheritdoc}
   */
  public static function preDelete(EntityStorageInterface $storage, array $entities) {
    parent::preDelete($storage, $entities);
    foreach ($entities as $entity) {

      // Remove all files within package directory.
      \Drupal::service('file_system')
        ->deleteRecursive($entity
        ->getDirectory());

      // Clean up empty directory. Will fail silently if it is not empty.
      @rmdir($entity->directory);
    }
  }

  /**
   * Take base64 encoded archive and save it to a temporary file for extraction.
   */
  protected function archiveDecode() {
    $data = $this
      ->getArchive();
    $zip_path = 'temporary://' . $this
      ->id() . '.zip';
    file_put_contents($zip_path, $data);
    $this
      ->archiveExtract($zip_path);
  }

  /**
   * Properly extract and store an IcoMoon zip file.
   *
   * @param string $zip_path
   *   The absolute path to the zip file.
   */
  public function archiveExtract($zip_path) {
    $file_system = \Drupal::service('file_system');
    $archiver = \Drupal::service('plugin.manager.archiver')
      ->getInstance([
      'filepath' => $file_system
        ->realpath($zip_path),
    ]);
    if (!$archiver) {
      throw new \Exception(t('Cannot extract %file, not a valid archive.', [
        '%file' => $zip_path,
      ]));
    }
    $directory = $this
      ->getDirectory();
    $file_system
      ->deleteRecursive($directory);
    $file_system
      ->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS);
    $archiver
      ->extract($directory);

    // Remove unnecessary files.
    $file_system
      ->deleteRecursive($directory . '/demo-files');
    $file_system
      ->deleteRecursive($directory . '/demo.html');
    $file_system
      ->delete($directory . '/Read Me.txt');

    // Set package type to svg.
    if (file_exists($directory . '/symbol-defs.svg')) {
      $this
        ->setAsSvg();

      // Update symbol to match new id.
      $file_path = $directory . '/symbol-defs.svg';
      $file_contents = file_get_contents($file_path);
      $file_contents = str_replace($this
        ->getPrefix(), $this
        ->id() . '-', $file_contents);
      file_put_contents($file_path, $file_contents);
    }
    else {
      $font_directory = $directory . '/fonts';
      $files_to_rename = $font_directory . '/*.*';
      foreach (glob($file_system
        ->realpath($files_to_rename)) as $file_to_rename_path) {
        $file_new_path = str_replace('fonts/' . $this
          ->getName(), 'fonts/' . $this
          ->id(), $file_to_rename_path);
        if ($file_to_rename_path !== $file_new_path) {
          $file_system
            ->move($file_to_rename_path, $file_new_path, FileSystemInterface::EXISTS_REPLACE);
        }
      }
    }

    // Update IcoMoon selection.json.
    $file_path = $directory . '/selection.json';
    $file_contents = file_get_contents($file_path);

    // Protect icon keys.
    $file_contents = str_replace('"icons":', 'MICONSIcons', $file_contents);
    $file_contents = str_replace('"icon":', 'MICONIcon', $file_contents);
    $file_contents = str_replace('iconIdx', 'MICONIdx', $file_contents);
    $file_contents = str_replace($this
      ->getPrefix(), 'MICONPrefix', $file_contents);

    // The name and selector should be updated to match entity info.
    $file_contents = str_replace($this
      ->getName(), $this
      ->id(), $file_contents);

    // Return protected keys.
    $file_contents = str_replace('MICONSIcons', '"icons":', $file_contents);
    $file_contents = str_replace('MICONIcon', '"icon":', $file_contents);
    $file_contents = str_replace('MICONIdx', 'iconIdx', $file_contents);
    $file_contents = str_replace('MICONPrefix', $this
      ->id() . '-', $file_contents);
    file_put_contents($file_path, $file_contents);

    // Update IcoMoon stylesheet.
    $file_path = $directory . '/style.css';
    $file_contents = file_get_contents($file_path);

    // The style.css file provided by IcoMoon contains query parameters where it
    // loads in the font files. Drupal CSS aggregation doesn't handle this well
    // so we need to remove it.
    $file_contents = preg_replace('(\\?[a-zA-Z0-9#\\-\\_]*)', '', $file_contents);

    // Protect prefixes.
    $file_contents = str_replace($this
      ->getPrefix(), 'MICON', $file_contents);

    // The name and selector should be updated to match entity info.
    $file_contents = str_replace($this
      ->getName(), $this
      ->id(), $file_contents);

    // Return changed prefixes. This prevents something like m-icon from
    // becoming m-icon-icon.
    $file_contents = str_replace('MICON', $this
      ->id() . '-', $file_contents);
    file_put_contents($file_path, $file_contents);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CacheableDependencyTrait::$cacheContexts protected property Cache contexts.
CacheableDependencyTrait::$cacheMaxAge protected property Cache max-age.
CacheableDependencyTrait::$cacheTags protected property Cache tags.
CacheableDependencyTrait::setCacheability protected function Sets cacheability; useful for value object constructors.
ConfigEntityBase::$isUninstalling private property Whether the config is being deleted by the uninstall process.
ConfigEntityBase::$langcode protected property The language code of the entity's default language.
ConfigEntityBase::$originalId protected property The original ID of the configuration entity.
ConfigEntityBase::$status protected property The enabled/disabled status of the configuration entity. 4
ConfigEntityBase::$third_party_settings protected property Third party entity settings.
ConfigEntityBase::$trustedData protected property Trust supplied data and not use configuration schema on save.
ConfigEntityBase::$uuid protected property The UUID for this entity.
ConfigEntityBase::$_core protected property
ConfigEntityBase::addDependency protected function Overrides \Drupal\Core\Entity\DependencyTrait:addDependency().
ConfigEntityBase::calculateDependencies public function Calculates dependencies and stores them in the dependency property. Overrides ConfigEntityInterface::calculateDependencies 14
ConfigEntityBase::createDuplicate public function Creates a duplicate of the entity. Overrides EntityBase::createDuplicate 1
ConfigEntityBase::disable public function Disables the configuration entity. Overrides ConfigEntityInterface::disable 1
ConfigEntityBase::enable public function Enables the configuration entity. Overrides ConfigEntityInterface::enable
ConfigEntityBase::get public function Returns the value of a property. Overrides ConfigEntityInterface::get
ConfigEntityBase::getCacheTagsToInvalidate public function Returns the cache tags that should be used to invalidate caches. Overrides EntityBase::getCacheTagsToInvalidate 1
ConfigEntityBase::getConfigDependencyName public function Gets the configuration dependency name. Overrides EntityBase::getConfigDependencyName
ConfigEntityBase::getConfigManager protected static function Gets the configuration manager.
ConfigEntityBase::getConfigTarget public function Gets the configuration target identifier for the entity. Overrides EntityBase::getConfigTarget
ConfigEntityBase::getDependencies public function Gets the configuration dependencies. Overrides ConfigEntityInterface::getDependencies
ConfigEntityBase::getOriginalId public function Gets the original ID. Overrides EntityBase::getOriginalId
ConfigEntityBase::getThirdPartyProviders public function Gets the list of third parties that store information. Overrides ThirdPartySettingsInterface::getThirdPartyProviders
ConfigEntityBase::getThirdPartySetting public function Gets the value of a third-party setting. Overrides ThirdPartySettingsInterface::getThirdPartySetting
ConfigEntityBase::getThirdPartySettings public function Gets all third-party settings of a given module. Overrides ThirdPartySettingsInterface::getThirdPartySettings
ConfigEntityBase::getTypedConfig protected function Gets the typed config manager.
ConfigEntityBase::hasTrustedData public function Gets whether on not the data is trusted. Overrides ConfigEntityInterface::hasTrustedData
ConfigEntityBase::invalidateTagsOnDelete protected static function Override to never invalidate the individual entities' cache tags; the config system already invalidates them. Overrides EntityBase::invalidateTagsOnDelete
ConfigEntityBase::invalidateTagsOnSave protected function Override to never invalidate the entity's cache tag; the config system already invalidates it. Overrides EntityBase::invalidateTagsOnSave
ConfigEntityBase::isInstallable public function Checks whether this entity is installable. Overrides ConfigEntityInterface::isInstallable 2
ConfigEntityBase::isNew public function Overrides Entity::isNew(). Overrides EntityBase::isNew
ConfigEntityBase::isUninstalling public function Returns whether this entity is being changed during the uninstall process. Overrides ConfigEntityInterface::isUninstalling
ConfigEntityBase::onDependencyRemoval public function Informs the entity that entities it depends on will be deleted. Overrides ConfigEntityInterface::onDependencyRemoval 8
ConfigEntityBase::save public function Saves an entity permanently. Overrides EntityBase::save 1
ConfigEntityBase::set public function Sets the value of a property. Overrides ConfigEntityInterface::set
ConfigEntityBase::setOriginalId public function Sets the original ID. Overrides EntityBase::setOriginalId
ConfigEntityBase::setStatus public function Sets the status of the configuration entity. Overrides ConfigEntityInterface::setStatus
ConfigEntityBase::setThirdPartySetting public function Sets the value of a third-party setting. Overrides ThirdPartySettingsInterface::setThirdPartySetting
ConfigEntityBase::setUninstalling public function
ConfigEntityBase::sort public static function Helper callback for uasort() to sort configuration entities by weight and label. 6
ConfigEntityBase::status public function Returns whether the configuration entity is enabled. Overrides ConfigEntityInterface::status 4
ConfigEntityBase::toArray public function Gets an array of all property values. Overrides EntityBase::toArray 2
ConfigEntityBase::toUrl public function Gets the URL object for the entity. Overrides EntityBase::toUrl
ConfigEntityBase::trustData public function Sets that the data should be trusted. Overrides ConfigEntityInterface::trustData
ConfigEntityBase::unsetThirdPartySetting public function Unsets a third-party setting. Overrides ThirdPartySettingsInterface::unsetThirdPartySetting
ConfigEntityBase::__construct public function Constructs an Entity object. Overrides EntityBase::__construct 10
ConfigEntityBase::__sleep public function Overrides EntityBase::__sleep 4
DependencySerializationTrait::$_entityStorages protected property
DependencySerializationTrait::$_serviceIds protected property
DependencySerializationTrait::__sleep public function Aliased as: traitSleep 2
DependencySerializationTrait::__wakeup public function 2
DependencyTrait::$dependencies protected property The object's dependencies.
DependencyTrait::addDependencies protected function Adds multiple dependencies.
DependencyTrait::addDependency protected function Adds a dependency. Aliased as: addDependencyTrait
EntityBase::$enforceIsNew protected property Boolean indicating whether the entity should be forced to be new.
EntityBase::$entityTypeId protected property The entity type.
EntityBase::$typedData protected property A typed data object wrapping this entity.
EntityBase::access public function Checks data value access. Overrides AccessibleInterface::access 1
EntityBase::bundle public function Gets the bundle of the entity. Overrides EntityInterface::bundle 1
EntityBase::create public static function Constructs a new entity object, without permanently saving it. Overrides EntityInterface::create
EntityBase::delete public function Deletes an entity permanently. Overrides EntityInterface::delete 2
EntityBase::enforceIsNew public function Enforces an entity to be new. Overrides EntityInterface::enforceIsNew
EntityBase::entityTypeBundleInfo protected function Gets the entity type bundle info service.
EntityBase::entityTypeManager protected function Gets the entity type manager.
EntityBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyTrait::getCacheContexts
EntityBase::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyTrait::getCacheMaxAge
EntityBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyTrait::getCacheTags
EntityBase::getConfigDependencyKey public function Gets the key that is used to store configuration dependencies. Overrides EntityInterface::getConfigDependencyKey
EntityBase::getEntityType public function Gets the entity type definition. Overrides EntityInterface::getEntityType
EntityBase::getEntityTypeId public function Gets the ID of the type of the entity. Overrides EntityInterface::getEntityTypeId
EntityBase::getListCacheTagsToInvalidate protected function The list cache tags to invalidate for this entity.
EntityBase::getTypedData public function Gets a typed data object for this entity object. Overrides EntityInterface::getTypedData
EntityBase::hasLinkTemplate public function Indicates if a link template exists for a given key. Overrides EntityInterface::hasLinkTemplate
EntityBase::id public function Gets the identifier. Overrides EntityInterface::id 11
EntityBase::label public function Gets the label of the entity. Overrides EntityInterface::label 6
EntityBase::language public function Gets the language of the entity. Overrides EntityInterface::language 1
EntityBase::languageManager protected function Gets the language manager.
EntityBase::linkTemplates protected function Gets an array link templates. 1
EntityBase::load public static function Loads an entity. Overrides EntityInterface::load
EntityBase::loadMultiple public static function Loads one or more entities. Overrides EntityInterface::loadMultiple
EntityBase::postCreate public function Acts on a created entity before hooks are invoked. Overrides EntityInterface::postCreate 4
EntityBase::postDelete public static function Acts on deleted entities before the delete hook is invoked. Overrides EntityInterface::postDelete 18
EntityBase::postLoad public static function Acts on loaded entities. Overrides EntityInterface::postLoad 2
EntityBase::postSave public function Acts on a saved entity before the insert or update hook is invoked. Overrides EntityInterface::postSave 14
EntityBase::preCreate public static function Changes the values of an entity before it is created. Overrides EntityInterface::preCreate 7
EntityBase::referencedEntities public function Gets a list of entities referenced by this entity. Overrides EntityInterface::referencedEntities 1
EntityBase::toLink public function Generates the HTML for a link to this entity. Overrides EntityInterface::toLink
EntityBase::uriRelationships public function Gets a list of URI relationships supported by this entity. Overrides EntityInterface::uriRelationships
EntityBase::urlRouteParameters protected function Gets an array of placeholders for this entity. 2
EntityBase::uuid public function Gets the entity UUID (Universally Unique Identifier). Overrides EntityInterface::uuid 1
EntityBase::uuidGenerator protected function Gets the UUID generator.
Micon::$directory protected property The folder where Micon packages exist.
Micon::$icons protected property The available icons in this package.
Micon::$id protected property The Micon ID.
Micon::$info protected property The info of this package.
Micon::$label protected property The Micon label.
Micon::$type protected property The Micon type. Either 'font' or 'image'. Default is 'font'.
Micon::archiveDecode protected function Take base64 encoded archive and save it to a temporary file for extraction.
Micon::archiveExtract public function Properly extract and store an IcoMoon zip file.
Micon::getArchive public function Gets the archive from a base64 encoded string. Overrides MiconInterface::getArchive
Micon::getDirectory protected function Return the location where Micon packages exist.
Micon::getIcons public function Get Micon package icons with tag as key. Overrides MiconInterface::getIcons
Micon::getInfo public function Get Micon package information. Overrides MiconInterface::getInfo
Micon::getName public function Get unique IcoMoon package name. Overrides MiconInterface::getName
Micon::getPrefix public function Get unique IcoMoon package prefix. Overrides MiconInterface::getPrefix
Micon::getStylesheet public function Return the stylesheet of the Micon package if it exists. Overrides MiconInterface::getStylesheet
Micon::loadActive public static function Load all Micon packages. Overrides MiconInterface::loadActive
Micon::loadActiveIds public static function Load all active Micon IDs. Overrides MiconInterface::loadActiveIds
Micon::loadActiveLabels public static function Load all active Micon labels. Overrides MiconInterface::loadActiveLabels
Micon::preDelete public static function Acts on entities before they are deleted and before hooks are invoked. Overrides ConfigEntityBase::preDelete
Micon::preSave public function Acts on an entity before the presave hook is invoked. Overrides ConfigEntityBase::preSave
Micon::setArchive public function Set the archive as base64 encoded string. Overrides MiconInterface::setArchive
Micon::setAsSvg public function
Micon::type public function Gets the type of package. Overrides MiconInterface::type
PluginDependencyTrait::calculatePluginDependencies protected function Calculates and adds dependencies of a specific plugin instance. 1
PluginDependencyTrait::getPluginDependencies protected function Calculates and returns dependencies of a specific plugin instance.
PluginDependencyTrait::moduleHandler protected function Wraps the module handler. 1
PluginDependencyTrait::themeHandler protected function Wraps the theme handler. 1
RefinableCacheableDependencyTrait::addCacheableDependency public function 1
RefinableCacheableDependencyTrait::addCacheContexts public function
RefinableCacheableDependencyTrait::addCacheTags public function
RefinableCacheableDependencyTrait::mergeCacheMaxAge public function
SynchronizableEntityTrait::$isSyncing protected property Whether this entity is being created, updated or deleted through a synchronization process.
SynchronizableEntityTrait::isSyncing public function
SynchronizableEntityTrait::setSyncing public function