outlayer-8.x-1.4/src/Plugin/views/style/OutlayerViewsFilter.php

src/Plugin/views/style/OutlayerViewsFilter.php
<?php

namespace Drupal\outlayer\Plugin\views\style;

use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Template\Attribute;
use Drupal\outlayer\OutlayerDefault;
use Drupal\outlayer\OutlayerHook;

/**
 * Outlayer style plugin for Isotope filter.
 *
 * @ingroup views_style_plugins
 *
 * @ViewsStyle(
 *   id = "outlayer_filter",
 *   title = @Translation("Outlayer Filter"),
 *   help = @Translation("Display the results in an Outlayer filter."),
 *   theme = "item_list",
 *   register_theme = FALSE,
 *   display_types = {"normal"}
 * )
 */
class OutlayerViewsFilter extends OutlayerViewsBase {

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = [];
    foreach (OutlayerDefault::viewsFilterSettings() as $key => $value) {
      $options[$key] = ['default' => $value];
    }
    return $options + parent::defineOptions();
  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    $fields                  = ['classes'];
    $definition              = $this->getDefinedFieldOptions($fields);
    $definition['namespace'] = 'outlayer';
    $definition['outlayers'] = $this->getViewsAsOptions('outlayer_isotope');

    $this->admin()->filterForm($form, $definition);
    $this->admin()->closingForm($form, $definition);
  }

  /**
   * {@inheritdoc}
   */
  public function render() {
    $settings  = $this->buildSettings();
    $settings += OutlayerDefault::htmlSettings();
    $outlayers = $settings['outlayers'];
    $instance  = $settings['instance_id'];
    $plugin_id = $settings['plugin_id'];

    // All views must have the same instance in order to coordinate.
    if (!empty($settings['outlayer'])) {
      [$main_view_name, $main_view_display] = explode(":", $settings['outlayer'], 2);
      $instance = str_replace('_', '-', "{$main_view_name}-{$main_view_display}");
    }

    $settings['id'] = $this->manager->getHtmlId("{$plugin_id}-{$instance}");
    $settings['instance_id'] = $instance;

    $outlayers->set('css.id', $settings['id'])
      ->set('view.base_id', $instance);

    $elements = [];
    foreach ($this->renderGrouping($this->view->result, $settings['grouping']) as $rows) {
      $items = $this->buildElements($settings, $rows);

      $elements[0] = $this->buildItemList($items, $settings, 'filter');

      // Searchable.
      if (!empty($settings['searchable'])) {
        if (!empty($settings['search_reset'])) {
          $variables = [
            'classes' => ['button--search', 'button--reset'],
            'filter'  => '*',
            'title'   => $settings['search_reset'],
          ];
          $items = ['all' => OutlayerHook::button($variables)];
        }

        $attributes = new Attribute();
        $attributes->addClass(['form-text', 'form-text--search']);
        $attributes->setAttribute('type', 'text');
        $attributes->setAttribute('value', '');
        $attributes->setAttribute('placeholder', strip_tags($settings['searchable']));
        $items['search'] = [
          '#markup' => '<span class="icon icon-search"></span><input' . $attributes . ' />',
          '#allowed_tags' => ['span', 'input'],
        ];

        $elements[1] = $this->buildItemList($items, $settings, 'search');
      }
    }

    return $elements;
  }

  /**
   * {@inheritdoc}
   */
  public function buildElements($settings, $rows) {
    $build = [];

    if (empty($settings['filters'])) {
      return [];
    }

    $selector = '*';
    $button_classes[] = 'button--filter';
    if (!empty($settings['filter_reset'])) {
      $variables = [
        'classes' => array_merge(['button--reset', 'is-active'], $button_classes),
        'filter'  => $selector,
        'title'   => $settings['filter_reset'],
      ];

      $build['all'] = OutlayerHook::button($variables);
    }

    $items = [];
    foreach ($rows as $index => $row) {
      $this->view->row_index = $index;

      $classes = $this->getFieldString($row, $settings['filters'], $index);
      if (empty($classes[$index])) {
        continue;
      }

      $items[] = $classes[$index];
    }

    unset($this->view->row_index);
    if (empty($items)) {
      return [];
    }

    foreach (array_unique($items) as $item) {
      $selectors = [];
      $filters = explode(' ', $item);
      foreach ($filters as $filter) {
        $selectors[] = '.fltr-' . $filter;
      }
      $selector = implode(',', $selectors);

      if (is_string($item)) {
        $item = str_replace('-', ' ', $item);
      }

      $variables = [
        'classes' => $button_classes,
        'filter'  => $selector,
        'title'   => $item,
      ];

      $box = OutlayerHook::button($variables);

      // Build outlayer items.
      $build[] = $box;
      unset($box);
    }

    return $build;
  }

}

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

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