You are here

class SearchApiMultiRowEntityView in Search API Multi-Index Searches 7

Plugin class for displaying Views results with entity_view.

Hierarchy

Expanded class hierarchy of SearchApiMultiRowEntityView

1 string reference to 'SearchApiMultiRowEntityView'
search_api_multi_views_plugins in views/search_api_multi.views.inc
Implements hook_views_plugins().

File

views/row_entity_view.inc, line 10
Contains the SearchApiMultiRowEntityView class.

View source
class SearchApiMultiRowEntityView extends views_plugin_row {

  /**
   * The results of the query, wrapped in metadata wrappers.
   *
   * @var EntityMetadataWrapper[]
   */
  protected $wrappers;

  /**
   * The indexes used in the query.
   *
   * The indexes in this array are grouped by those that contain entities (in
   * the nested "entity_types" array and those that don't ("incompatibles" key).
   *
   * @var array
   */
  protected $indexes = NULL;

  /**
   * {@inheritdoc}
   */
  public function init(&$view, &$display, $options = NULL) {
    parent::init($view, $display, $options);

    // Initialize the query, which will provides us with an access to the
    // indexes used by this view, and thus to the entity types.
    if (is_null($this->view->query)) {
      $this->view
        ->init_query();
    }
    $entity_types = $incompatibles = array();
    foreach ($this->view->query
      ->getIndexes() as $id => $index) {
      $type = $index
        ->getEntityType();
      $label = $index
        ->label();
      if ($type) {
        $entity_types[$type][] = $label;
      }
      else {
        $incompatibles[$id] = $label;
      }
    }
    $this->indexes = array(
      'entity_types' => $entity_types,
      'incompatibles' => $incompatibles,
    );
  }

  /**
   * {@inheritdoc}
   */
  public function option_definition() {
    $options = parent::option_definition();
    $options['view_mode'] = array(
      'default' => array(),
    );
    return $options;
  }

  /**
   * {@inheritdoc}
   */
  public function options_form(&$form, &$form_state) {
    parent::options_form($form, $form_state);
    $entity_info = entity_get_info();
    $options = array();
    foreach ($this->indexes['entity_types'] as $type => $indexes) {
      foreach ($entity_info[$type]['view modes'] as $view_mode => $view_mode_info) {
        $options[$type][$view_mode] = $view_mode_info['label'];
      }
    }
    $form['view_mode'] = array(
      '#tree' => TRUE,
    );
    foreach ($options as $entity_type => $modes) {
      if (count($modes) > 1) {
        $form['view_mode'][$entity_type] = array(
          '#type' => 'select',
          '#options' => $modes,
          '#title' => t('View mode for @entity_name entities', array(
            '@entity_name' => $entity_info[$entity_type]['label'],
          )),
          '#description' => format_plural(count($this->indexes['entity_types'][$entity_type]), 'This view mode will be used to render entities from the following index: %indexes', 'This view mode will be used to render entities from the following indexes: %indexes', array(
            '%indexes' => implode(', ', $this->indexes['entity_types'][$entity_type]),
          )),
        );
        if (!empty($this->options['view_mode'][$entity_type])) {
          $form['view_mode'][$entity_type]['#default_value'] = $this->options['view_mode'][$entity_type];
        }
      }
      else {

        // For entity types that only have one view mode, there's no meaningful
        // choice to make, so just expose it to let the user know about it.
        $form['view_mode']["{$entity_type}__description"] = array(
          '#type' => 'item',
          '#title' => t('View mode for @entity_name entities', array(
            '@entity_name' => $entity_info[$entity_type]['label'],
          )),
          '#description' => reset($modes),
        );
        $form['view_mode'][$entity_type] = array(
          '#type' => 'value',
          '#value' => key($modes),
        );
      }
    }
    if (count($this->indexes['incompatibles'])) {
      $form['incompatibles'] = array(
        '#type' => 'item',
        '#title' => 'Incompatible indexes',
        '#description' => t("The following indexes are not based on entities, and can't be used with this row style: %indexes. Items from those indexes will be skipped during rendering.", array(
          '%indexes' => implode(', ', $this->indexes['incompatibles']),
        )),
      );
    }
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function pre_render($values) {
    if (!empty($values)) {
      list(, $this->wrappers) = $this->view->query
        ->get_result_wrappers($values);
    }
  }

  /**
   * Returns a metadata wrapper for a returned row.
   *
   * @param object $values
   *   The values of the returned row.
   *
   * @return EntityMetadataWrapper|null
   *   A wrapper for that row, or NULL if the row doesn't represent an entity.
   */
  public function get_wrapper($values) {
    $index = $values->_entity_properties['search_api_multi_index'];
    if (isset($this->indexes['incompatibles'][$index])) {
      return NULL;
    }
    if (empty($this->wrappers[$this->view->row_index]->{$index})) {
      return NULL;
    }
    return $this->wrappers[$this->view->row_index]->{$index};
  }

  /**
   * {@inheritdoc}
   */
  public function render($values) {
    if ($wrapper = $this
      ->get_wrapper($values)) {
      $render = $wrapper
        ->view($this->options['view_mode'][$wrapper
        ->type()]);
      return drupal_render($render);
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
SearchApiMultiRowEntityView::$indexes protected property The indexes used in the query.
SearchApiMultiRowEntityView::$wrappers protected property The results of the query, wrapped in metadata wrappers.
SearchApiMultiRowEntityView::get_wrapper public function Returns a metadata wrapper for a returned row.
SearchApiMultiRowEntityView::init public function Overrides views_plugin_row::init
SearchApiMultiRowEntityView::options_form public function Provide a form for setting options. Overrides views_plugin_row::options_form
SearchApiMultiRowEntityView::option_definition public function Information about options for all kinds of purposes will be held here. Overrides views_plugin_row::option_definition
SearchApiMultiRowEntityView::pre_render public function Allow the style to do stuff before each row is rendered. Overrides views_plugin_row::pre_render
SearchApiMultiRowEntityView::render public function Render a row object. This usually passes through to a theme template of some form, but not always. Overrides views_plugin_row::render
views_object::$definition public property Handler's definition.
views_object::$options public property Except for displays, options for the object will be held here. 1
views_object::altered_option_definition function Collect this handler's option definition and alter them, ready for use.
views_object::construct public function Views handlers use a special construct function. 4
views_object::destroy public function Destructor. 2
views_object::export_option public function 1
views_object::export_options public function
views_object::export_option_always public function Always exports the option, regardless of the default value.
views_object::options Deprecated public function Set default options on this object. 1
views_object::set_default_options public function Set default options.
views_object::set_definition public function Let the handler know what its full definition is.
views_object::unpack_options public function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away.
views_object::unpack_translatable public function Unpack a single option definition.
views_object::unpack_translatables public function Unpacks each handler to store translatable texts.
views_object::_set_option_defaults public function
views_plugin::$display public property The current used views display.
views_plugin::$plugin_name public property The plugin name of this plugin, for example table or full.
views_plugin::$plugin_type public property The plugin type of this plugin, for example style or query.
views_plugin::$view public property The top object of a view. Overrides views_object::$view 1
views_plugin::additional_theme_functions public function Provide a list of additional theme functions for the theme info page.
views_plugin::plugin_title public function Return the human readable name of the display.
views_plugin::summary_title public function Returns the summary of the settings in the display. 8
views_plugin::theme_functions public function Provide a full list of possible theme templates used by this style.
views_plugin::validate public function Validate that the plugin is correct and can be saved. 3
views_plugin_row::options_submit public function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data. Overrides views_plugin::options_submit 1
views_plugin_row::options_validate public function Validate the options form. Overrides views_plugin::options_validate
views_plugin_row::query public function Add anything to the query that we might need to. Overrides views_plugin::query
views_plugin_row::uses_fields public function