mason-8.x-1.x-dev/src/MasonManager.php

src/MasonManager.php
<?php

namespace Drupal\mason;

use Drupal\blazy\BlazyManagerBase;
use Drupal\mason\Entity\Mason;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Provides mason manager service.
 *
 * @todo lazyload[x], granular image styles, decent skins, stamps.
 */
class MasonManager extends BlazyManagerBase implements MasonManagerInterface {

  /**
   * {@inheritdoc}
   */
  protected static $namespace = 'mason';

  /**
   * {@inheritdoc}
   */
  protected static $itemId = 'box';

  /**
   * {@inheritdoc}
   */
  protected static $itemPrefix = 'box';

  /**
   * The mason skin manager service.
   *
   * @var \Drupal\mason\MasonSkinManagerInterface
   */
  protected $skinManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    $instance = parent::create($container);
    $instance->setSkinManager($container->get('mason.skin_manager'));
    return $instance;
  }

  /**
   * {@inheritdoc}
   */
  public static function trustedCallbacks() {
    return ['preRenderMason'];
  }

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

  /**
   * Sets mason skin manager service.
   */
  public function setSkinManager(MasonSkinManagerInterface $skin_manager) {
    $this->skinManager = $skin_manager;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function build(array $build): array {
    foreach (MasonDefault::themeProperties() as $key => $default) {
      $k = in_array($key, ['items', 'postscript']) ? $key : "#$key";
      $build[$k] = $this->toHashtag($build, $key) ?: $default;
    }

    $mason = [
      '#theme'      => 'mason',
      '#items'      => [],
      '#build'      => $build,
      '#pre_render' => [[$this, 'preRenderMason']],
      'items'       => [],
    ];

    $this->moduleHandler->alter('mason_build', $mason);
    return empty($build['items']) ? [] : $mason;
  }

  /**
   * {@inheritdoc}
   */
  public function loadSafely($name): Mason {
    return Mason::loadSafely($name);
  }

  /**
   * {@inheritdoc}
   */
  public function preRenderMason($element) {
    $build = $element['#build'];
    unset($element['#build']);

    // Build mason elements.
    $settings = &$build['#settings'];
    $this->verifySafely($settings);

    $optionset = Mason::verifyOptionset($build, $settings['optionset']);

    $settings['_count']    = count($optionset->getOption('sizes'));
    $element['#optionset'] = $optionset;
    $element['#settings']  = $settings;
    $element['#items']     = $this->buildItems($build);
    $element['#json']      = $optionset->getJson();

    $this->setAttachments($element, $settings);

    unset($build);
    return $element;
  }

  /**
   * {@inheritdoc}
   */
  public function toBlazy(array &$data, array &$captions, $delta): void {
    $settings = $this->toHashtag($data);
    $this->verifySafely($settings);

    $blazies = $settings['blazies'];
    $prefix  = 'box';

    $blazies->set('item.id', $prefix)
      ->set('item.prefix', $prefix);

    $data['#wrapper_attributes']['class'][] = $prefix . '__content';
    if ($attrs = $blazies->get('item.wrapper_attributes', [])) {
      $data['#wrapper_attributes'] = $this->merge($data['#wrapper_attributes'], $attrs);
    }
    // @todo enable blazy:2.17: parent::toBlazy($data, $captions, $delta);
  }

  /**
   * {@inheritdoc}
   *
   * @todo remove at 3.x.
   */
  public function verify(array &$settings): void {
    parent::verify($settings);

    MasonDefault::verify($settings);
  }

  /**
   * {@inheritdoc}
   */
  public function verifySafely(array &$settings, $key = 'blazies', array $defaults = []) {
    MasonDefault::verify($settings);

    return parent::verifySafely($settings, $key, $defaults);
  }

  /**
   * {@inheritdoc}
   */
  protected function attachments(array &$load, array $attach, $blazies): void {
    $this->verifySafely($attach);

    $attach['blazy'] = TRUE;
    parent::attachments($load, $attach, $blazies);

    $load['library'][] = 'mason/load';

    if (isset($attach['skin']) && $skin = $attach['skin']) {
      $skins = $this->skinManager->getSkins();
      $provider = $skins[$skin]['provider'] ?? 'mason';
      $load['library'][] = 'mason/' . $provider . '.' . $skin;
    }

    $load['drupalSettings']['mason'] = Mason::load('default')->getOptions();

    $this->moduleHandler->alter('mason_attach', $load, $attach, $blazies);
  }

  /**
   * Returns grid items.
   */
  protected function buildItems(array $build) {
    $settings = $build['#settings'];
    $items    = [];

    foreach ($build['items'] as $delta => $item) {
      if ($delta > $settings['_count'] - 1) {
        continue;
      }

      $attrs = $this->toHashtag($item, 'attributes');
      $sets  = $this->toHashtag($item);
      $sets += $settings;

      $content = [
        'box'     => $this->toHashtag($item, 'box'),
        'caption' => $this->toHashtag($item, 'caption'),
      ];

      $box = [
        '#theme'      => 'mason_box',
        '#item'       => $content,
        '#delta'      => $delta,
        '#attributes' => $attrs,
        '#settings'   => $sets,
        '#cache'      => $item['#cache'] ?? [],
      ];

      $items[] = $box;
      unset($box);
    }

    return $items;
  }

  /**
   * {@inheritdoc}
   *
   * @todo remove post blazy:2.17.
   */
  public function verifyItem(array &$element, $delta): void {
    // Do nothing.
  }

}

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

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