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

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

namespace Drupal\outlayer\Plugin\views\style;

use Drupal\Component\Serialization\Json;
use Drupal\Core\Form\FormStateInterface;
use Drupal\outlayer\OutlayerDefault;
use Drupal\outlayer\OutlayerHook;

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

  /**
   * Sorter fields.
   *
   * @var array
   */
  protected $sorterItems = [];

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = [];
    foreach (OutlayerDefault::viewsSorterSettings() 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['outlayers'] = $this->getViewsAsOptions('outlayer_isotope');

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

    $form['sorters']['#attributes']['class'][] = 'form-wrapper--caption';
  }

  /**
   * {@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;
    $settings['sorters'] = array_filter($settings['sorters']);

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

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

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

      $element = $this->buildItemList($items, $settings, 'sorter');
      $element['#attributes']['data-sorters'] = Json::encode(array_keys($this->sorterItems));

      $elements[] = $element;
    }

    return $elements;
  }

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

    if (!empty($settings['sort_by'])) {
      $variables = [
        'classes' => ['button--reset', 'button--sorter', 'is-active'],
        'sorter'  => str_replace(' ', '-', mb_strtolower($settings['sort_by'])),
        'title'   => str_replace('-', ' ', $settings['sort_by']),
      ];

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

    foreach ($settings['sorters'] as $field_name => $sorter) {
      $title = str_replace('field_', '', $field_name);
      $sorter_key = str_replace('_', '', $title);
      $variables = [
        'classes' => ['button--sorter'],
        'sorter'  => $sorter_key,
        'title'   => str_replace('_', ' ', $title),
      ];

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

      $this->sorterItems[$sorter_key] = $field_name;
    }

    unset($this->view->row_index);
    return $build;
  }

}

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

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