commit ea0c65b0e69498d66213c90c3742c67886ac3afd
Author: fago <nuppla@zites.net>
Date:   Mon Sep 26 18:41:46 2011 +0200

    updated views entity-view row plugin to make use of recent views improvements and added a field for adding the rendered entity.

diff --git a/entity.info b/entity.info
index 958e28c..e94b444 100644
--- a/entity.info
+++ b/entity.info
@@ -1,7 +1,8 @@
 name = Entity API
 description = Enables modules to work with any entity type and to provide entities.
 core = 7.x
-files[] = views/plugins/entity_plugin_row_entity_view.inc
+files[] = views/plugins/entity_views_plugin_row_entity_view.inc
+files[] = views/plugins/entity_views_field_entity_view.inc
 files[] = includes/entity.controller.inc
 files[] = includes/entity.inc
 files[] = includes/entity.ui.inc
diff --git a/views/entity.views.inc b/views/entity.views.inc
index d40a401..42749db 100644
--- a/views/entity.views.inc
+++ b/views/entity.views.inc
@@ -35,6 +35,20 @@ function entity_views_data() {
     }
   }
 
+  // Expose generally usable entity-related fields.
+  foreach (entity_get_info() as $entity_type => $info) {
+    if (entity_type_supports($entity_type, 'view')) {
+      // Expose a field allowing to display the rendered entity.
+      $data['views_entity_' . $entity_type]['rendered_entity'] = array(
+        'title' => t('Rendered @entity-type', array('@entity-type' => $info['label'])),
+        'help' => t('The @entity-type of the current relationship rendered using a view mode.', array('@entity-type' => $info['label'])),
+        'field' => array(
+          'handler' => 'entity_views_field_entity_view',
+        ),
+      );
+    }
+  }
+
   return $data;
 }
 
@@ -43,17 +57,18 @@ function entity_views_data() {
  */
 function entity_views_plugins() {
   foreach (views_fetch_data() as $table => $data) {
-    if (!empty($data['table']['entity type'])) {
+    if (!empty($data['table']['entity type']) && !empty($data['table']['base'])) {
       $base_tables[] = $table;
     }
   }
   if (!empty($base_tables)) {
     return array(
+      'module' => 'entity',
       'row' => array(
         'entity' => array(
-          'title' => t('Entity'),
+          'title' => t('Entity view'),
           'help' => t('Displays a single entity in a specific view mode (e.g. teaser).'),
-          'handler' => 'entity_plugin_row_entity_view',
+          'handler' => 'entity_views_plugin_row_entity_view',
           'uses fields' => FALSE,
           'uses options' => TRUE,
           'type' => 'normal',
diff --git a/views/plugins/entity_plugin_row_entity_view.inc b/views/plugins/entity_plugin_row_entity_view.inc
deleted file mode 100644
index d0cc743..0000000
--- a/views/plugins/entity_plugin_row_entity_view.inc
+++ /dev/null
@@ -1,110 +0,0 @@
-<?php
-
-/**
- * @file
- * Row style plugin for displaying the results as entities.
- */
-
-/**
- * Plugin class for displaying Views results with entity_view.
- */
-class entity_plugin_row_entity_view extends views_plugin_row {
-  /**
-   * The entity type of the entity being displayed.
-   */
-  protected $entity_type, $skip_load, $entities = array();
-
-  public function init(&$view, &$display, $options = NULL) {
-    parent::init($view, $display, $options);
-
-    $table_data = views_fetch_data($this->view->base_table);
-    $this->entity_type = $table_data['table']['entity type'];
-    $this->skip_load = !empty($table_data['table']['skip entity load']);
-
-    // Set base table and field information as used by views_plugin_row to
-    // select the entity id if used with default query class.
-    $info = entity_get_info($this->entity_type);
-    if (!empty($info['base table']) && $info['base table'] == $this->view->base_table) {
-      $this->base_table = $info['base table'];
-      $this->base_field = $info['entity keys']['id'];
-    }
-  }
-
-  public function option_definition() {
-    $options = parent::option_definition();
-    $options['view_mode'] = array('default' => 'full');
-    return $options;
-  }
-
-  public function options_form(&$form, &$form_state) {
-    parent::options_form($form, $form_state);
-
-    $entity_info = entity_get_info($this->entity_type);
-    $options = array();
-    if (!empty($entity_info['view modes'])) {
-      foreach ($entity_info['view modes'] as $mode => $settings) {
-        $options[$mode] = $settings['label'];
-      }
-    }
-
-    if (count($options) > 1) {
-      $form['view_mode'] = array(
-        '#type' => 'select',
-        '#options' => $options,
-        '#title' => t('View mode'),
-        '#default_value' => $this->options['view_mode'],
-      );
-    }
-    else {
-      $form['view_mode_info'] = array(
-        '#type' => 'item',
-        '#title' => t('View mode'),
-        '#description' => t('Only one view mode is available for this entity type.'),
-        '#markup' => $options ? current($options) : t('Default'),
-      );
-      $form['view_mode'] = array(
-        '#type' => 'value',
-        '#value' => $options ? key($options) : 'default',
-      );
-    }
-
-    return $form;
-  }
-
-  /**
-   * Use entity_load() to load all entities at once if they aren't loaded yet.
-   */
-  public function pre_render($results) {
-    $this->entities = array();
-    foreach ($results as $result) {
-      if (!isset($result->entity)) {
-        $id = entity_id($this->entity_type, $result);
-        $this->entities[$id] = $result;
-      }
-      else {
-        $id = (is_object($result->entity) ? entity_id($this->entity_type, $result->entity) : $result->entity);
-        $this->entities[$id] = $result->entity;
-      }
-      // Force loading in case there is no object at all.
-      if (!empty($id) && $id == $this->entities[$id]) {
-        $this->skip_load = FALSE;
-      }
-    }
-    if (!$this->skip_load) {
-      $this->entities = entity_load($this->entity_type, array_keys($this->entities));
-    }
-  }
-
-  public function render($result) {
-    if (!isset($result->entity)) {
-      $id = entity_id($this->entity_type, $result);
-    }
-    else {
-      $id = (is_object($result->entity) ? entity_id($this->entity_type, $result->entity) : $result->entity);
-    }
-    if (isset($id)) {
-      $content = entity_view($this->entity_type, array($id => $this->entities[$id]), $this->options['view_mode']);
-      return drupal_render($content);
-    }
-  }
-}
diff --git a/views/plugins/entity_views_field_entity_view.inc b/views/plugins/entity_views_field_entity_view.inc
new file mode 100644
index 0000000..98455b2
--- /dev/null
+++ b/views/plugins/entity_views_field_entity_view.inc
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * A field handler that displays an entity in a given view mode.
+ */
+
+class entity_views_field_entity_view extends views_handler_field_entity {
+
+  protected $rendered_content = array();
+
+  public function option_definition() {
+    $options = parent::option_definition();
+    $options['view_mode'] = array('default' => 'full');
+    return $options;
+  }
+
+  public function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    $entity_info = entity_get_info($this->entity_type);
+    $options = array();
+    if (!empty($entity_info['view modes'])) {
+      foreach ($entity_info['view modes'] as $mode => $settings) {
+        $options[$mode] = $settings['label'];
+      }
+    }
+
+    if (count($options) > 1) {
+      $form['view_mode'] = array(
+        '#type' => 'select',
+        '#options' => $options,
+        '#title' => t('View mode'),
+        '#default_value' => $this->options['view_mode'],
+      );
+    }
+    else {
+      $form['view_mode_info'] = array(
+        '#type' => 'item',
+        '#title' => t('View mode'),
+        '#description' => t('Only one view mode is available for this entity type.'),
+        '#markup' => $options ? current($options) : t('Default'),
+      );
+      $form['view_mode'] = array(
+        '#type' => 'value',
+        '#value' => $options ? key($options) : 'default',
+      );
+    }
+
+    return $form;
+  }
+
+  public function pre_render(&$values) {
+    parent::pre_render($values);
+    // Render the entities.
+    if ($this->entities) {
+      $render = entity_view($this->entity_type, $this->entities, $this->options['view_mode']);
+      // Remove the first level of the render array.
+      $this->rendered_content = reset($render);
+    }
+  }
+
+  public function render($values) {
+    if ($entity = $this->get_value($values)) {
+      return $this->rendered_content[entity_id($this->entity_type, $entity)];
+    }
+  }
+}
diff --git a/views/plugins/entity_views_plugin_row_entity_view.inc b/views/plugins/entity_views_plugin_row_entity_view.inc
new file mode 100644
index 0000000..8d01b2e
--- /dev/null
+++ b/views/plugins/entity_views_plugin_row_entity_view.inc
@@ -0,0 +1,95 @@
+<?php
+
+/**
+ * @file
+ * Row style plugin for displaying the results as entities.
+ */
+
+/**
+ * Plugin class for displaying Views results with entity_view.
+ */
+class entity_views_plugin_row_entity_view extends views_plugin_row {
+
+  protected $entity_type, $entities;
+
+  public function init(&$view, &$display, $options = NULL) {
+    parent::init($view, $display, $options);
+
+    // Initialize the entity-type used.
+    $table_data = views_fetch_data($this->view->base_table);
+    $this->entity_type = $table_data['table']['entity type'];
+    // Set base table and field information as used by views_plugin_row to
+    // select the entity id if used with default query class.
+    $info = entity_get_info($this->entity_type);
+    if (!empty($info['base table']) && $info['base table'] == $this->view->base_table) {
+      $this->base_table = $info['base table'];
+      $this->base_field = $info['entity keys']['id'];
+    }
+  }
+
+  public function option_definition() {
+    $options = parent::option_definition();
+    $options['view_mode'] = array('default' => 'full');
+    return $options;
+  }
+
+  public function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+
+    $entity_info = entity_get_info($this->entity_type);
+    $options = array();
+    if (!empty($entity_info['view modes'])) {
+      foreach ($entity_info['view modes'] as $mode => $settings) {
+        $options[$mode] = $settings['label'];
+      }
+    }
+
+    if (count($options) > 1) {
+      $form['view_mode'] = array(
+        '#type' => 'select',
+        '#options' => $options,
+        '#title' => t('View mode'),
+        '#default_value' => $this->options['view_mode'],
+      );
+    }
+    else {
+      $form['view_mode_info'] = array(
+        '#type' => 'item',
+        '#title' => t('View mode'),
+        '#description' => t('Only one view mode is available for this entity type.'),
+        '#markup' => $options ? current($options) : t('Default'),
+      );
+      $form['view_mode'] = array(
+        '#type' => 'value',
+        '#value' => $options ? key($options) : 'default',
+      );
+    }
+    return $form;
+  }
+
+  public function pre_render(&$values) {
+    if (!empty($values)) {
+      list($this->entity_type, $this->entities) = $this->view->query->get_result_entities($values, !empty($this->relationship) ? $this->relationship : NULL, $this->field_alias);
+    }
+    // Render the entities.
+    if ($this->entities) {
+      $render = entity_view($this->entity_type, $this->entities, $this->options['view_mode']);
+      // Remove the first level of the render array.
+      $this->rendered_content = reset($render);
+    }
+  }
+
+  /**
+   * Overridden to return the entity object.
+   */
+  function get_value($values, $field = NULL) {
+    return isset($this->entities[$this->view->row_index]) ? $this->entities[$this->view->row_index] : FALSE;
+  }
+
+  public function render($values) {
+    if ($entity = $this->get_value($values)) {
+      $render = $this->rendered_content[entity_id($this->entity_type, $entity)];
+      return drupal_render($render);
+    }
+  }
+}
