You are here

FacetsSerializer.php in Facets 8

File

modules/facets_rest/src/Plugin/views/style/FacetsSerializer.php
View source
<?php

namespace Drupal\facets_rest\Plugin\views\style;

use Drupal\Core\Form\FormStateInterface;
use Drupal\facets\FacetManager\DefaultFacetManager;
use Drupal\rest\Plugin\views\style\Serializer;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Serializer\SerializerInterface;

/**
 * The style plugin for serialized output formats.
 *
 * @ingroup views_style_plugins
 *
 * @ViewsStyle(
 *   id = "facets_serializer",
 *   title = @Translation("Facets serializer"),
 *   help = @Translation("Serializes views row data using the Serializer component."),
 *   display_types = {"data"}
 * )
 */
class FacetsSerializer extends Serializer {

  /**
   * Tha facet manager.
   *
   * @var \Drupal\facets\FacetManager\DefaultFacetManager
   */
  protected $facetsManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('serializer'), $container
      ->getParameter('serializer.formats'), $container
      ->getParameter('serializer.format_providers'), $container
      ->get('facets.manager'));
  }

  /**
   * Constructs a FacetsSerializer object.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, SerializerInterface $serializer, array $serializer_formats, array $serializer_format_providers, DefaultFacetManager $facets_manager) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer, $serializer_formats, $serializer_format_providers);
    $this->facetsManager = $facets_manager;
  }

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = parent::defineOptions();
    $options['show_facets'] = [
      'default' => TRUE,
    ];
    return $options;
  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    parent::buildOptionsForm($form, $form_state);
    $form['show_facets'] = [
      '#type' => 'checkbox',
      '#title' => $this
        ->t('Show facets in the output'),
      '#default_value' => $this->options['show_facets'],
    ];
  }

  /**
   * {@inheritdoc}
   */
  public function render() {
    $rows = [];

    // If the Data Entity row plugin is used, this will be an array of entities
    // which will pass through Serializer to one of the registered Normalizers,
    // which will transform it to arrays/scalars. If the Data field row plugin
    // is used, $rows will not contain objects and will pass directly to the
    // Encoder.
    foreach ($this->view->result as $row_index => $row) {

      // Keep track of the current rendered row, like every style plugin has to
      // do.
      // @see \Drupal\views\Plugin\views\style\StylePluginBase::renderFields
      $this->view->row_index = $row_index;
      $rows['search_results'][] = $this->view->rowPlugin
        ->render($row);
    }
    unset($this->view->row_index);

    // Get the content type configured in the display or fallback to the
    // default.
    if (empty($this->view->live_preview)) {
      $content_type = $this->displayHandler
        ->getContentType();
    }
    else {
      $content_type = !empty($this->options['formats']) ? reset($this->options['formats']) : 'json';
    }

    // Processing facets.
    $facetsource_id = "search_api:views_rest__{$this->view->id()}__{$this->view->getDisplay()->display['id']}";
    $facets = $this->facetsManager
      ->getFacetsByFacetSourceId($facetsource_id);
    $this->facetsManager
      ->updateResults($facetsource_id);
    $processed_facets = [];
    $facets_metadata = [];
    foreach ($facets as $facet) {
      $processed_facets[] = $this->facetsManager
        ->build($facet);
      $facets_metadata[$facet
        ->id()] = array(
        'label' => $facet
          ->label(),
        'weight' => $facet
          ->getWeight(),
        'field_id' => $facet
          ->getFieldIdentifier(),
        'url_alias' => $facet
          ->getUrlAlias(),
      );
    }
    uasort($facets_metadata, function ($a, $b) {
      return $a['weight'] > $b['weight'];
    });
    $rows['facets'] = array_values($processed_facets);
    $rows['facets_metadata'] = $facets_metadata;
    if (!$this->options['show_facets']) {
      $rows = $rows['search_results'];
    }
    return $this->serializer
      ->serialize($rows, $content_type, [
      'views_style_plugin' => $this,
    ]);
  }

}

Classes

Namesort descending Description
FacetsSerializer The style plugin for serialized output formats.