danielebarchiesi@4: 3, danielebarchiesi@4: 'path' => drupal_get_path('module', 'references') . '/views', danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_views_plugins(). danielebarchiesi@4: * danielebarchiesi@4: * Defines some plugins used by the Views modes for danielebarchiesi@4: * user_reference. danielebarchiesi@4: */ danielebarchiesi@4: function references_views_plugins() { danielebarchiesi@4: $plugins = array( danielebarchiesi@4: 'display' => array( danielebarchiesi@4: 'references' => array( danielebarchiesi@4: 'title' => t('References'), danielebarchiesi@4: 'admin' => t('References'), danielebarchiesi@4: 'help' => 'Selects referenceable entities for a reference field (node_reference, user_reference...)', danielebarchiesi@4: 'handler' => 'references_plugin_display', danielebarchiesi@4: 'uses hook menu' => FALSE, danielebarchiesi@4: 'use ajax' => FALSE, danielebarchiesi@4: 'use pager' => FALSE, danielebarchiesi@4: 'accept attachments' => FALSE, danielebarchiesi@4: // Custom property, used with views_get_applicable_views() to retrieve danielebarchiesi@4: // all views with a 'References' display. danielebarchiesi@4: 'references display' => TRUE, danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'style' => array( danielebarchiesi@4: 'references_style' => array( danielebarchiesi@4: 'title' => t('References list'), danielebarchiesi@4: 'help' => 'Returns results as a PHP array of names + rendered rows.', danielebarchiesi@4: 'handler' => 'references_plugin_style', danielebarchiesi@4: 'theme' => 'views_view_unformatted', danielebarchiesi@4: 'uses row plugin' => TRUE, danielebarchiesi@4: 'uses fields' => TRUE, danielebarchiesi@4: 'uses options' => TRUE, danielebarchiesi@4: 'uses grouping' => TRUE, danielebarchiesi@4: 'type' => 'references', danielebarchiesi@4: 'even empty' => TRUE, danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: 'row' => array( danielebarchiesi@4: 'references_fields' => array( danielebarchiesi@4: 'title' => t('Inline fields'), danielebarchiesi@4: 'help' => t('Displays the fields with an optional template.'), danielebarchiesi@4: 'handler' => 'references_plugin_row_fields', danielebarchiesi@4: 'theme' => 'views_view_fields', danielebarchiesi@4: 'theme path' => drupal_get_path('module', 'views') . '/theme', danielebarchiesi@4: 'theme file' => 'theme.inc', danielebarchiesi@4: 'uses fields' => TRUE, danielebarchiesi@4: 'uses options' => TRUE, danielebarchiesi@4: 'type' => 'references', danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: return $plugins; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Retrieves the list of views with a 'references' display, in a format suitable for a 'select' form element.. danielebarchiesi@4: * danielebarchiesi@4: * @param $entity_type danielebarchiesi@4: * The entity type. danielebarchiesi@4: * danielebarchiesi@4: * @return danielebarchiesi@4: * An array of eligible views displays. danielebarchiesi@4: */ danielebarchiesi@4: function references_get_views_options($entity_type) { danielebarchiesi@4: // Filter views that contain a 'references' display. This actually returns a danielebarchiesi@4: // list of displays (the same view appears several times). danielebarchiesi@4: $displays = views_get_applicable_views('references display'); danielebarchiesi@4: danielebarchiesi@4: // Filter views that list the entity type we want, and group the separate danielebarchiesi@4: // displays by view. danielebarchiesi@4: $entity_info = entity_get_info($entity_type); danielebarchiesi@4: $options = array(); danielebarchiesi@4: foreach ($displays as $data) { danielebarchiesi@4: list($view, $display_id) = $data; danielebarchiesi@4: if ($view->base_table == $entity_info['base table']) { danielebarchiesi@4: $options[$view->name . ':' . $display_id] = $view->name .' - ' . $view->display[$display_id]->display_title; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: return $options; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Retrieves an array of candidate referenceable entities, defined by a view. danielebarchiesi@4: * danielebarchiesi@4: * @param $entity_type danielebarchiesi@4: * The entity type. danielebarchiesi@4: * @param $view_name danielebarchiesi@4: * The name of the view. danielebarchiesi@4: * @param $display_name danielebarchiesi@4: * The name of the view's display. This has to be a 'References' display. danielebarchiesi@4: * @param $args danielebarchiesi@4: * The array of arguments ("contextual filters") for the view. danielebarchiesi@4: * @param $options danielebarchiesi@4: * Array of options to limit the scope of the returned list. This parameter danielebarchiesi@4: * is similar to the $options parameter for danielebarchiesi@4: * node_reference_potential_references(). An additional key is required: danielebarchiesi@4: * - title_field: the name of the column holding entities 'titles' within the danielebarchiesi@4: * entity base table. danielebarchiesi@4: * danielebarchiesi@4: * @return danielebarchiesi@4: * An array of entities, in the format expected by danielebarchiesi@4: * node_reference_potential_references(). danielebarchiesi@4: * danielebarchiesi@4: * @see node_reference_potential_references() danielebarchiesi@4: * @see _node_reference_potential_references_views() danielebarchiesi@4: */ danielebarchiesi@4: function references_potential_references_view($entity_type, $view_name, $display_name, $args, $options) { danielebarchiesi@4: $entity_info = entity_get_info($entity_type); danielebarchiesi@4: danielebarchiesi@4: // Check that the view is valid and the display still exists. danielebarchiesi@4: $view = views_get_view($view_name); danielebarchiesi@4: if (!$view || $view->base_table != $entity_info['base table'] || !isset($view->display[$display_name])) { danielebarchiesi@4: return FALSE; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // If we have no access to the View an empty result should be returned to danielebarchiesi@4: // avoid triggering the fallback results. danielebarchiesi@4: if (!$view->access(array($display_name))) { danielebarchiesi@4: return array(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Temporary backwards compatibility for fields migrated from CCK D6: accept danielebarchiesi@4: // 'default' display, but dynamically add a 'references' display out of it. danielebarchiesi@4: if ($display_name == 'default') { danielebarchiesi@4: $display_name = $view->add_display('references'); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $view->set_display($display_name); danielebarchiesi@4: danielebarchiesi@4: // @todo From merlinofchaos on IRC : arguments using summary view can defeat danielebarchiesi@4: // the style setting. danielebarchiesi@4: // We might also need to check if there's an argument, and set its danielebarchiesi@4: // style_plugin as well. danielebarchiesi@4: danielebarchiesi@4: // Set additional options to let references_plugin_display::query() narrow danielebarchiesi@4: // the results. danielebarchiesi@4: $references_options = array( danielebarchiesi@4: 'ids' => $options['ids'], danielebarchiesi@4: 'title_field' => $options['title_field'], danielebarchiesi@4: 'string' => $options['string'], danielebarchiesi@4: 'match' => $options['match'], danielebarchiesi@4: ); danielebarchiesi@4: $view->display_handler->set_option('references_options', $references_options); danielebarchiesi@4: danielebarchiesi@4: // We need the title field for autocomplete widgets, so add it (hidden) if not danielebarchiesi@4: // present. danielebarchiesi@4: $fields = $view->get_items('field', $display_name); danielebarchiesi@4: if (!isset($fields[$options['title_field']])) { danielebarchiesi@4: $label_options = array( danielebarchiesi@4: 'exclude' => 1, danielebarchiesi@4: ); danielebarchiesi@4: $view->add_item($display_name, 'field', $entity_info['base table'], $options['title_field'], $label_options); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: // Limit result set size. danielebarchiesi@4: $limit = !empty($options['limit']) ? $options['limit'] : 0; danielebarchiesi@4: $view->display_handler->set_option('pager', array('type' => 'some', 'options' => array('items_per_page' => $limit))); danielebarchiesi@4: danielebarchiesi@4: // Make sure the query is not cached danielebarchiesi@4: $view->is_cacheable = FALSE; danielebarchiesi@4: danielebarchiesi@4: // Get the results. danielebarchiesi@4: $results = $view->execute_display($display_name, $args); danielebarchiesi@4: danielebarchiesi@4: return $results; danielebarchiesi@4: }