commit add33fb33c59ef029fa52c33060d05a9fed2cef7
Author: fago <nuppla@zites.net>
Date:   Tue Jun 14 21:47:45 2011 +0200

    entity row style

diff --git a/entity.info b/entity.info
index 3fce9ed..958e28c 100644
--- a/entity.info
+++ b/entity.info
@@ -1,6 +1,7 @@
 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[] = 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 30bfedd..e0bd30b 100644
--- a/views/entity.views.inc
+++ b/views/entity.views.inc
@@ -31,6 +31,32 @@ function entity_views_data() {
 }
 
 /**
+ * Implements hook_views_plugins().
+ */
+function entity_views_plugins() {
+  foreach (views_fetch_data() as $table => $data) {
+    if (!empty($data['table']['base']['entity type'])) {
+      $base_tables[] = $table;
+    }
+  }
+  if (!empty($base_tables)) {
+    return array(
+      'row' => array(
+        'entity' => array(
+          'title' => t('Entity'),
+          'help' => t('Displays a single entity in a specific view mode (e.g. teaser).'),
+          'handler' => 'entity_plugin_row_entity_view',
+          'uses fields' => FALSE,
+          'uses options' => TRUE,
+          'type' => 'normal',
+          'base' => $base_tables,
+        ),
+      ),
+    );
+  }
+}
+
+/**
  * Default controller for generating basic views integration.
  *
  * The controller tries to generate suiting views integration for the entity
@@ -67,6 +93,7 @@ class EntityDefaultViewsController {
         'title' => drupal_ucfirst($this->info['label']),
         // @todo: Support an entity info description key or such?
         'help' => '',
+        'entity type' => $this->type,
       );
       $data[$table] += $this->schema_fields();
 
diff --git a/views/plugins/entity_plugin_row_entity_view.inc b/views/plugins/entity_plugin_row_entity_view.inc
new file mode 100644
index 0000000..a5115a8
--- /dev/null
+++ b/views/plugins/entity_plugin_row_entity_view.inc
@@ -0,0 +1,117 @@
+<?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']['base']['entity type'];
+    $this->skip_load = !empty($table_data['table']['base']['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 (is_object($result) && !isset($result->entity)) {
+        $id = entity_id($this->entity_type, $result);
+        $this->entities[$id] = $result;
+      }
+      elseif (is_object($result) && isset($result->entity)) {
+        $id = (is_object($result->entity) ? entity_id($this->entity_type, $result->entity) : $result->entity);
+        $this->entities[$id] = $result->entity;
+      }
+      elseif (is_array($result) && isset($result['entity'])) {
+        $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 (is_object($result) && !isset($result->entity)) {
+      $id = entity_id($this->entity_type, $result);
+    }
+    elseif (is_object($result) && isset($result->entity)) {
+      $id = (is_object($result->entity) ? entity_id($this->entity_type, $result->entity) : $result->entity);
+    }
+    elseif (is_array($result) && isset($result['entity'])) {
+      $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);
+    }
+  }
+}
