summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfago2011-06-14 19:47:45 (GMT)
committerfago2011-06-15 08:55:43 (GMT)
commitde3f489d9f780e3f8dc7a42562398dffb9e2ff8f (patch)
tree03985377f4d6ac1f0cab77c16967b1fdb756048b
parent7d0730d972a6d5e4cc4e0eb08b3bc937ac7a9721 (diff)
#1077148 patch by fago, becw, bojanz: add a generic entity-view row plugin for views.
-rw-r--r--entity.info1
-rw-r--r--views/entity.views.inc27
-rw-r--r--views/plugins/entity_plugin_row_entity_view.inc110
3 files changed, 138 insertions, 0 deletions
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..fcdbe65
--- /dev/null
+++ b/views/plugins/entity_plugin_row_entity_view.inc
@@ -0,0 +1,110 @@
+<?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 (!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);
+ }
+ }
+}