You are here

public function RateWidgetField::render in Rate 8.2

Renders the field.

Parameters

\Drupal\views\ResultRow $values: The values retrieved from a single row of a view's query result.

Return value

string|\Drupal\Component\Render\MarkupInterface The rendered output. If the output is safe it will be wrapped in an object that implements MarkupInterface. If it is empty or unsafe it will be a string.

Overrides FieldPluginBase::render

File

src/Plugin/views/field/RateWidgetField.php, line 132

Class

RateWidgetField
Views field handler for the rate widget.

Namespace

Drupal\rate\Plugin\views\field

Code

public function render(ResultRow $row) {
  $column = $this->options['id_column'];
  $widgets = $this->options['widgets'];
  $display_overrides = $this->options['display_overrides'];
  $widget_display = $this->options['widget_display'];
  $widget_storage = \Drupal::service('entity_type.manager')
    ->getStorage('rate_widget');
  $rate_widget_base_service = \Drupal::service('rate.vote_widget_base');

  // Check, if the field is in _entity (base table)
  if (isset($row->_entity->{$column})) {
    $entity_id = $row->_entity
      ->id();
    $entity_type_id = $row->_entity
      ->getEntityTypeId();
    if ($entity_type_id == 'user' || $entity_type_id == 'comment' || $entity_type_id == 'file') {
      $bundle = $entity_type_id;
    }
    elseif ($entity_type_id == 'group') {
      $bundle = $row->_entity
        ->getGroupType()
        ->id();
    }
    elseif ($entity_type_id == 'group_content') {
      $bundle = $row->_entity
        ->getGroupContentType()
        ->id();
    }
    elseif ($entity_type_id == 'taxonomy_term') {
      $bundle = $row->_entity
        ->getVocabularyId();
    }
    else {
      $bundle = $row->_entity
        ->getType();
    }
  }
  elseif (isset($row->_relationship_entities)) {
    $relationship_entity = array_keys($row->_relationship_entities);
    foreach ($relationship_entity as $rel) {
      if (isset($row->_relationship_entities[$rel]->{$column})) {
        $entity_id = $row->_relationship_entities[$rel]
          ->id();
        $entity_type_id = $row->_relationship_entities[$rel]
          ->getEntityTypeId();
        if ($entity_type_id == 'user' || $entity_type_id == 'comment') {
          $bundle = $entity_type_id;
        }
        elseif ($entity_type_id == 'group') {
          $bundle = $row->_relationship_entities[$rel]
            ->getGroupType()
            ->id();
        }
        elseif ($entity_type_id == 'group_content') {
          $bundle = $row->_relationship_entities[$rel]
            ->getGroupContentType()
            ->id();
        }
        elseif ($entity_type_id == 'taxonomy_term') {
          $bundle = $row->_relationship_entities[$rel]
            ->getVocabularyId();
        }
        else {
          $bundle = $row->_relationship_entities[$rel]
            ->getType();
        }
      }
    }
  }
  if (!isset($entity_id) || !isset($entity_type_id) || !isset($bundle)) {
    return;
  }
  else {

    // Get the widgets assigned to this entity.
    $query = \Drupal::entityQuery('rate_widget');
    $query
      ->condition('entity_types.*', [
      $entity_type_id . '.' . $bundle,
    ], 'IN');
    $widget_ids = $query
      ->execute();

    // Exit if this entity:bundle has no rate widgets attached.
    if (!isset($widget_ids) || count($widget_ids) == 0) {
      return;
    }
    if (isset($widget_ids)) {
      if (count($widget_ids) > 1) {

        // Check if we have a widget selected in view field settings.
        $selected_widget = $widgets[$entity_type_id . ':' . $bundle]['widget'];
        if (isset($selected_widget) && in_array($selected_widget, $widget_ids)) {
          $widget = $selected_widget;
        }
        else {

          // Get the first widget.
          $widget = array_shift($widget_ids);
        }
      }
      else {

        // Get the first widget.
        $widget = array_shift($widget_ids);
      }
    }
    if (!isset($widget)) {
      return;
    }
    $widget_name = $widget;
    $widget = $widget_storage
      ->load($widget);
    $widget_template = $widget
      ->get('template');
    $value_type = $widget
      ->get('value_type');

    // Apply overrides from the view field settings.
    $display_settings = $widget
      ->get('display');
    $results_settings = $widget
      ->get('results');
    $display_settings['label_position'] = $display_overrides['hide_label'] === 'hide_label' ? 'hidden' : $display_settings['label_position'];
    $display_settings['description_position'] = $display_overrides['hide_description'] === 'hide_description' ? 'hidden' : $display_settings['description_position'];
    $results_settings['result_position'] = $display_overrides['hide_summary'] === 'hide_summary' ? 'hidden' : $results_settings['result_position'];
    $display_settings['readonly'] = $widget_display == 'readonly' ? 1 : 0;
    $widget
      ->set('display', $display_settings);
    $widget
      ->set('results', $results_settings);

    // Currently using only two vote types - change, if more needed/used.
    $vote_type = $widget_template == 'fivestar' ? $widget_template : 'updown';

    // Get the rate widget rating form.
    $form = $rate_widget_base_service
      ->getForm($entity_type_id, $bundle, $entity_id, $vote_type, $value_type, $widget_name, $widget);
    $form = $widget_display === 'summary' ? $form['#results'] : $form;
    $form_container = [
      'rating' => [
        '#theme' => 'container',
        '#attributes' => [
          'class' => [
            'rate-widget',
            $widget_template,
          ],
        ],
        '#children' => [
          'form' => $form,
        ],
      ],
      '#attached' => [
        'library' => [
          'rate/w-' . $widget_template,
        ],
      ],
    ];
    $build[$widget_name] = $form_container;
    return $build;
  }
}