danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * Defines common base features for the various reference field types.
|
danielebarchiesi@4
|
6 */
|
danielebarchiesi@4
|
7
|
danielebarchiesi@4
|
8 /**
|
danielebarchiesi@4
|
9 * Menu access callback for reference autocomplete paths.
|
danielebarchiesi@4
|
10 *
|
danielebarchiesi@4
|
11 * Check for both 'edit' and 'view' access in the unlikely event
|
danielebarchiesi@4
|
12 * a user has edit but not view access.
|
danielebarchiesi@4
|
13 */
|
danielebarchiesi@4
|
14 function reference_autocomplete_access($entity_type, $bundle, $field_name, $entity = NULL, $account = NULL) {
|
danielebarchiesi@4
|
15 return user_access('access content', $account)
|
danielebarchiesi@4
|
16 && ($field = field_info_field($field_name))
|
danielebarchiesi@4
|
17 && field_info_instance($entity_type, $field_name, $bundle)
|
danielebarchiesi@4
|
18 && field_access('view', $field, $entity_type, $entity, $account)
|
danielebarchiesi@4
|
19 && field_access('edit', $field, $entity_type, $entity, $account);
|
danielebarchiesi@4
|
20 }
|
danielebarchiesi@4
|
21
|
danielebarchiesi@4
|
22 /**
|
danielebarchiesi@4
|
23 * Implements hook_init().
|
danielebarchiesi@4
|
24 */
|
danielebarchiesi@4
|
25 function references_init() {
|
danielebarchiesi@4
|
26 // Include feeds.module integration.
|
danielebarchiesi@4
|
27 if (module_exists('feeds')) {
|
danielebarchiesi@4
|
28 module_load_include('inc','references','references.feeds');
|
danielebarchiesi@4
|
29 }
|
danielebarchiesi@4
|
30 }
|
danielebarchiesi@4
|
31
|
danielebarchiesi@4
|
32 /**
|
danielebarchiesi@4
|
33 * Implements hook_views_api().
|
danielebarchiesi@4
|
34 */
|
danielebarchiesi@4
|
35 function references_views_api() {
|
danielebarchiesi@4
|
36 return array(
|
danielebarchiesi@4
|
37 'api' => 3,
|
danielebarchiesi@4
|
38 'path' => drupal_get_path('module', 'references') . '/views',
|
danielebarchiesi@4
|
39 );
|
danielebarchiesi@4
|
40 }
|
danielebarchiesi@4
|
41
|
danielebarchiesi@4
|
42 /**
|
danielebarchiesi@4
|
43 * Implements hook_views_plugins().
|
danielebarchiesi@4
|
44 *
|
danielebarchiesi@4
|
45 * Defines some plugins used by the Views modes for
|
danielebarchiesi@4
|
46 * user_reference.
|
danielebarchiesi@4
|
47 */
|
danielebarchiesi@4
|
48 function references_views_plugins() {
|
danielebarchiesi@4
|
49 $plugins = array(
|
danielebarchiesi@4
|
50 'display' => array(
|
danielebarchiesi@4
|
51 'references' => array(
|
danielebarchiesi@4
|
52 'title' => t('References'),
|
danielebarchiesi@4
|
53 'admin' => t('References'),
|
danielebarchiesi@4
|
54 'help' => 'Selects referenceable entities for a reference field (node_reference, user_reference...)',
|
danielebarchiesi@4
|
55 'handler' => 'references_plugin_display',
|
danielebarchiesi@4
|
56 'uses hook menu' => FALSE,
|
danielebarchiesi@4
|
57 'use ajax' => FALSE,
|
danielebarchiesi@4
|
58 'use pager' => FALSE,
|
danielebarchiesi@4
|
59 'accept attachments' => FALSE,
|
danielebarchiesi@4
|
60 // Custom property, used with views_get_applicable_views() to retrieve
|
danielebarchiesi@4
|
61 // all views with a 'References' display.
|
danielebarchiesi@4
|
62 'references display' => TRUE,
|
danielebarchiesi@4
|
63 ),
|
danielebarchiesi@4
|
64 ),
|
danielebarchiesi@4
|
65 'style' => array(
|
danielebarchiesi@4
|
66 'references_style' => array(
|
danielebarchiesi@4
|
67 'title' => t('References list'),
|
danielebarchiesi@4
|
68 'help' => 'Returns results as a PHP array of names + rendered rows.',
|
danielebarchiesi@4
|
69 'handler' => 'references_plugin_style',
|
danielebarchiesi@4
|
70 'theme' => 'views_view_unformatted',
|
danielebarchiesi@4
|
71 'uses row plugin' => TRUE,
|
danielebarchiesi@4
|
72 'uses fields' => TRUE,
|
danielebarchiesi@4
|
73 'uses options' => TRUE,
|
danielebarchiesi@4
|
74 'uses grouping' => TRUE,
|
danielebarchiesi@4
|
75 'type' => 'references',
|
danielebarchiesi@4
|
76 'even empty' => TRUE,
|
danielebarchiesi@4
|
77 ),
|
danielebarchiesi@4
|
78 ),
|
danielebarchiesi@4
|
79 'row' => array(
|
danielebarchiesi@4
|
80 'references_fields' => array(
|
danielebarchiesi@4
|
81 'title' => t('Inline fields'),
|
danielebarchiesi@4
|
82 'help' => t('Displays the fields with an optional template.'),
|
danielebarchiesi@4
|
83 'handler' => 'references_plugin_row_fields',
|
danielebarchiesi@4
|
84 'theme' => 'views_view_fields',
|
danielebarchiesi@4
|
85 'theme path' => drupal_get_path('module', 'views') . '/theme',
|
danielebarchiesi@4
|
86 'theme file' => 'theme.inc',
|
danielebarchiesi@4
|
87 'uses fields' => TRUE,
|
danielebarchiesi@4
|
88 'uses options' => TRUE,
|
danielebarchiesi@4
|
89 'type' => 'references',
|
danielebarchiesi@4
|
90 ),
|
danielebarchiesi@4
|
91 ),
|
danielebarchiesi@4
|
92 );
|
danielebarchiesi@4
|
93 return $plugins;
|
danielebarchiesi@4
|
94 }
|
danielebarchiesi@4
|
95
|
danielebarchiesi@4
|
96 /**
|
danielebarchiesi@4
|
97 * Retrieves the list of views with a 'references' display, in a format suitable for a 'select' form element..
|
danielebarchiesi@4
|
98 *
|
danielebarchiesi@4
|
99 * @param $entity_type
|
danielebarchiesi@4
|
100 * The entity type.
|
danielebarchiesi@4
|
101 *
|
danielebarchiesi@4
|
102 * @return
|
danielebarchiesi@4
|
103 * An array of eligible views displays.
|
danielebarchiesi@4
|
104 */
|
danielebarchiesi@4
|
105 function references_get_views_options($entity_type) {
|
danielebarchiesi@4
|
106 // Filter views that contain a 'references' display. This actually returns a
|
danielebarchiesi@4
|
107 // list of displays (the same view appears several times).
|
danielebarchiesi@4
|
108 $displays = views_get_applicable_views('references display');
|
danielebarchiesi@4
|
109
|
danielebarchiesi@4
|
110 // Filter views that list the entity type we want, and group the separate
|
danielebarchiesi@4
|
111 // displays by view.
|
danielebarchiesi@4
|
112 $entity_info = entity_get_info($entity_type);
|
danielebarchiesi@4
|
113 $options = array();
|
danielebarchiesi@4
|
114 foreach ($displays as $data) {
|
danielebarchiesi@4
|
115 list($view, $display_id) = $data;
|
danielebarchiesi@4
|
116 if ($view->base_table == $entity_info['base table']) {
|
danielebarchiesi@4
|
117 $options[$view->name . ':' . $display_id] = $view->name .' - ' . $view->display[$display_id]->display_title;
|
danielebarchiesi@4
|
118 }
|
danielebarchiesi@4
|
119 }
|
danielebarchiesi@4
|
120
|
danielebarchiesi@4
|
121 return $options;
|
danielebarchiesi@4
|
122 }
|
danielebarchiesi@4
|
123
|
danielebarchiesi@4
|
124 /**
|
danielebarchiesi@4
|
125 * Retrieves an array of candidate referenceable entities, defined by a view.
|
danielebarchiesi@4
|
126 *
|
danielebarchiesi@4
|
127 * @param $entity_type
|
danielebarchiesi@4
|
128 * The entity type.
|
danielebarchiesi@4
|
129 * @param $view_name
|
danielebarchiesi@4
|
130 * The name of the view.
|
danielebarchiesi@4
|
131 * @param $display_name
|
danielebarchiesi@4
|
132 * The name of the view's display. This has to be a 'References' display.
|
danielebarchiesi@4
|
133 * @param $args
|
danielebarchiesi@4
|
134 * The array of arguments ("contextual filters") for the view.
|
danielebarchiesi@4
|
135 * @param $options
|
danielebarchiesi@4
|
136 * Array of options to limit the scope of the returned list. This parameter
|
danielebarchiesi@4
|
137 * is similar to the $options parameter for
|
danielebarchiesi@4
|
138 * node_reference_potential_references(). An additional key is required:
|
danielebarchiesi@4
|
139 * - title_field: the name of the column holding entities 'titles' within the
|
danielebarchiesi@4
|
140 * entity base table.
|
danielebarchiesi@4
|
141 *
|
danielebarchiesi@4
|
142 * @return
|
danielebarchiesi@4
|
143 * An array of entities, in the format expected by
|
danielebarchiesi@4
|
144 * node_reference_potential_references().
|
danielebarchiesi@4
|
145 *
|
danielebarchiesi@4
|
146 * @see node_reference_potential_references()
|
danielebarchiesi@4
|
147 * @see _node_reference_potential_references_views()
|
danielebarchiesi@4
|
148 */
|
danielebarchiesi@4
|
149 function references_potential_references_view($entity_type, $view_name, $display_name, $args, $options) {
|
danielebarchiesi@4
|
150 $entity_info = entity_get_info($entity_type);
|
danielebarchiesi@4
|
151
|
danielebarchiesi@4
|
152 // Check that the view is valid and the display still exists.
|
danielebarchiesi@4
|
153 $view = views_get_view($view_name);
|
danielebarchiesi@4
|
154 if (!$view || $view->base_table != $entity_info['base table'] || !isset($view->display[$display_name])) {
|
danielebarchiesi@4
|
155 return FALSE;
|
danielebarchiesi@4
|
156 }
|
danielebarchiesi@4
|
157
|
danielebarchiesi@4
|
158 // If we have no access to the View an empty result should be returned to
|
danielebarchiesi@4
|
159 // avoid triggering the fallback results.
|
danielebarchiesi@4
|
160 if (!$view->access(array($display_name))) {
|
danielebarchiesi@4
|
161 return array();
|
danielebarchiesi@4
|
162 }
|
danielebarchiesi@4
|
163
|
danielebarchiesi@4
|
164 // Temporary backwards compatibility for fields migrated from CCK D6: accept
|
danielebarchiesi@4
|
165 // 'default' display, but dynamically add a 'references' display out of it.
|
danielebarchiesi@4
|
166 if ($display_name == 'default') {
|
danielebarchiesi@4
|
167 $display_name = $view->add_display('references');
|
danielebarchiesi@4
|
168 }
|
danielebarchiesi@4
|
169
|
danielebarchiesi@4
|
170 $view->set_display($display_name);
|
danielebarchiesi@4
|
171
|
danielebarchiesi@4
|
172 // @todo From merlinofchaos on IRC : arguments using summary view can defeat
|
danielebarchiesi@4
|
173 // the style setting.
|
danielebarchiesi@4
|
174 // We might also need to check if there's an argument, and set its
|
danielebarchiesi@4
|
175 // style_plugin as well.
|
danielebarchiesi@4
|
176
|
danielebarchiesi@4
|
177 // Set additional options to let references_plugin_display::query() narrow
|
danielebarchiesi@4
|
178 // the results.
|
danielebarchiesi@4
|
179 $references_options = array(
|
danielebarchiesi@4
|
180 'ids' => $options['ids'],
|
danielebarchiesi@4
|
181 'title_field' => $options['title_field'],
|
danielebarchiesi@4
|
182 'string' => $options['string'],
|
danielebarchiesi@4
|
183 'match' => $options['match'],
|
danielebarchiesi@4
|
184 );
|
danielebarchiesi@4
|
185 $view->display_handler->set_option('references_options', $references_options);
|
danielebarchiesi@4
|
186
|
danielebarchiesi@4
|
187 // We need the title field for autocomplete widgets, so add it (hidden) if not
|
danielebarchiesi@4
|
188 // present.
|
danielebarchiesi@4
|
189 $fields = $view->get_items('field', $display_name);
|
danielebarchiesi@4
|
190 if (!isset($fields[$options['title_field']])) {
|
danielebarchiesi@4
|
191 $label_options = array(
|
danielebarchiesi@4
|
192 'exclude' => 1,
|
danielebarchiesi@4
|
193 );
|
danielebarchiesi@4
|
194 $view->add_item($display_name, 'field', $entity_info['base table'], $options['title_field'], $label_options);
|
danielebarchiesi@4
|
195 }
|
danielebarchiesi@4
|
196
|
danielebarchiesi@4
|
197 // Limit result set size.
|
danielebarchiesi@4
|
198 $limit = !empty($options['limit']) ? $options['limit'] : 0;
|
danielebarchiesi@4
|
199 $view->display_handler->set_option('pager', array('type' => 'some', 'options' => array('items_per_page' => $limit)));
|
danielebarchiesi@4
|
200
|
danielebarchiesi@4
|
201 // Make sure the query is not cached
|
danielebarchiesi@4
|
202 $view->is_cacheable = FALSE;
|
danielebarchiesi@4
|
203
|
danielebarchiesi@4
|
204 // Get the results.
|
danielebarchiesi@4
|
205 $results = $view->execute_display($display_name, $args);
|
danielebarchiesi@4
|
206
|
danielebarchiesi@4
|
207 return $results;
|
danielebarchiesi@4
|
208 }
|