blacksmith-8.x-1.x-dev/src/BlacksmithItem.php

src/BlacksmithItem.php
<?php

namespace Drupal\blacksmith;

use Drupal;
use Drupal\blacksmith\Exception\BlacksmithInvalidItemConfiguration;

/**
 * Class BlacksmithItem.
 *
 * @package Drupal\blacksmith
 */
class BlacksmithItem {

  /**
   * Language manager service.
   *
   * @var \Drupal\Core\Language\LanguageManager
   */
  protected $languageManager;

  /**
   * Blacksmith item identifier.
   *
   * @var string
   */
  protected $id;

  /**
   * ID of the file in which the item can be found.
   *
   * @var string
   */
  protected $group;

  /**
   * Data taken from the Yaml file.
   *
   * @var array
   */
  protected $originalData;

  /**
   * Translation in each languages.
   *
   * @var \Drupal\blacksmith\BlacksmithTranslation[]
   */
  protected $translations;

  /**
   * BlacksmithItem constructor.
   *
   * @param array $data
   *   Data from the Blacksmith source file.
   * @param string $groupId
   *   The Blacksmith group ID the item is part of.
   *
   * @throws \Drupal\blacksmith\Exception\BlacksmithInvalidItemConfiguration
   */
  public function __construct(array $data, $groupId) {
    $this->validateData($data);
    $this->id = $data['id'];
    unset($data['id']);
    $this->group = $groupId;
    $this->originalData = $data;
    $this->setTranslations();
    // @todo Find a way to do dependency injection in this.
    $this->languageManager = Drupal::service('language_manager');
  }

  /**
   * Makes sure that the parameters given to the constructor are valid.
   *
   * @param array $data
   *   Data from the original YAML file.
   *
   * @throws \Drupal\blacksmith\Exception\BlacksmithInvalidItemConfiguration
   */
  protected function validateData(array $data) : void {
    if (!isset($data['id'])) {
      throw new BlacksmithInvalidItemConfiguration("Missing parameter 'ID' in Blacksmith item.", $this);
    }

    if (!isset($data['entity_type'])) {
      throw new BlacksmithInvalidItemConfiguration("Missing parameter 'entity_type' in Blacksmith item.", $this);
    }

    if (!isset($data['bundle'])) {
      throw new BlacksmithInvalidItemConfiguration("Missing parameter 'bundle' in Blacksmith item.", $this);
    }
  }

  /**
   * Return the unique ID.
   *
   * @return string
   *   Blacksmith item's unique identifier.
   */
  public function id() : string {
    return $this->id;
  }

  /**
   * Return the selector that will be used in Blacksmith.
   *
   * @param string $separator
   *   The character used to separate the item's group and ID.
   *
   * @return string
   *   The item's selector.
   */
  public function selector($separator = '/') : string {
    return $this->group . $separator . $this->id;
  }

  /**
   * Get the item's group.
   *
   * @return string|null
   *   Item's group name.
   */
  public function group() : ?string {
    return $this->group ?? NULL;
  }

  /**
   * Gets the type of entity.
   *
   * @return string
   *   The entity type machine name.
   */
  public function entityType() : string {
    return $this->originalData['entity_type'];
  }

  /**
   * Get the item's label.
   *
   * @return string
   *   The bundle machine name.
   */
  public function label() : string {
    $labelKeys = ['label', 'title', 'name'];

    foreach ($labelKeys as $labelKey) {
      if (isset($this->originalData[$labelKey])) {
        return $this->originalData[$labelKey];
      }
    }

    return $this->selector('-');
  }

  /**
   * Get the item's bundle.
   *
   * @return string
   *   The bundle machine name.
   */
  public function bundle() : string {
    $bundleKeys = ['bundle', 'type'];

    foreach ($bundleKeys as $bundleKey) {
      if (isset($this->originalData[$bundleKey])) {
        return $this->originalData[$bundleKey];
      }
    }

    return '';
  }

  /**
   * Get a single value from the original data.
   *
   * @param string $fieldName
   *   The field name key.
   *
   * @return string|array
   *   A single value the list of values.
   */
  public function get($fieldName) {
    return $this->originalData[$fieldName] ?? NULL;
  }

  /**
   * Defines if a value is set for a specific field.
   *
   * @param string $fieldName
   *   The field name key.
   *
   * @return bool
   *   Whether or not a value has been set for this field.
   */
  public function hadField(string $fieldName) : bool {
    return isset($this->originalData[$fieldName]);
  }

  /**
   * Retrieves every translations available in the Blacksmith item.
   *
   * @return \Drupal\blacksmith\BlacksmithTranslation[]
   *   Each translation of the Blacksmith item.
   */
  public function getTranslations() : array {
    return $this->translations ?? [];
  }

  /**
   * Retrieves a specific translation available in the Blacksmith item.
   *
   * @param string $langcode
   *   The language code of the translation.
   *
   * @return \Drupal\blacksmith\BlacksmithTranslation|null
   *   Each translation of the Blacksmith item or NULL.
   */
  public function getTranslation($langcode) : ?BlacksmithTranslation {
    return $this->translations[$langcode] ?? NULL;
  }

  /**
   * Define the item translations based on the available data.
   *
   * @throws \Drupal\blacksmith\Exception\BlacksmithInvalidItemConfiguration
   */
  protected function setTranslations() : void {
    if (isset($this->originalData['_translations'])) {
      $translations = $this->originalData['_translations'];

      if (!is_array($translations)) {
        throw new BlacksmithInvalidItemConfiguration('The translations property is invalid.', $this);
      }

      // Make sure that the site support multilingualism.
      if (!$this->languageManager->isMultilingual()) {
        throw new BlacksmithInvalidItemConfiguration('The blacksmith item cannot declare translations if the website doesn\'t have multilingual support.', $this);
      }

      // Go through each translations.
      foreach ($translations as $langcode => $translationData) {
        if ($this->languageManager->getLanguage($langcode) === NULL) {
          throw new BlacksmithInvalidItemConfiguration('The item has a translation in a language that is not supported. (langcode : ' . $langcode . ')', $this);
        }

        // Add the translation to the list.
        $this->translations[$langcode] = new BlacksmithTranslation($langcode, $translationData);
      }

    }
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc