diff --git a/entity.info b/entity.info index 3fce9ed0ad0c158279d02e8cb07bd891faf75207..958e28cd772eb9db4c549774f90221c602ae8ce6 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 30bfedd5b23aeb49aab3ef18cf08c3ec3082e4a7..e0bd30b47840000e56b16a18cc4563aa051a245f 100644 --- a/views/entity.views.inc +++ b/views/entity.views.inc @@ -30,6 +30,32 @@ function entity_views_data() { return $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. * @@ -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 0000000000000000000000000000000000000000..fcdbe654cdce97df6c0ec1db24e1ce2379a523ad --- /dev/null +++ b/views/plugins/entity_plugin_row_entity_view.inc @@ -0,0 +1,110 @@ +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); + } + } +}