danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * Prepopulate entity reference values from URL.
|
danielebarchiesi@4
|
6 */
|
danielebarchiesi@4
|
7
|
danielebarchiesi@4
|
8 /**
|
danielebarchiesi@4
|
9 * Implements hook_ctools_plugin_directory().
|
danielebarchiesi@4
|
10 */
|
danielebarchiesi@4
|
11 function entityreference_prepopulate_ctools_plugin_directory($module, $plugin) {
|
danielebarchiesi@4
|
12 if ($module == 'entityreference' || $module == 'ctools') {
|
danielebarchiesi@4
|
13 return 'plugins/' . $plugin;
|
danielebarchiesi@4
|
14 }
|
danielebarchiesi@4
|
15 }
|
danielebarchiesi@4
|
16
|
danielebarchiesi@4
|
17 /**
|
danielebarchiesi@4
|
18 * Implements hook_field_create_instance().
|
danielebarchiesi@4
|
19 *
|
danielebarchiesi@4
|
20 * Add "default value function" setting to the field instance.
|
danielebarchiesi@4
|
21 * We have to do it from this hook, as we don't have another chance of setting
|
danielebarchiesi@4
|
22 * this option via the hook_field_info().
|
danielebarchiesi@4
|
23 */
|
danielebarchiesi@4
|
24 function entityreference_prepopulate_field_create_instance($instance) {
|
danielebarchiesi@4
|
25 if (empty($instance['settings']['behaviors']['prepopulate']['status'])) {
|
danielebarchiesi@4
|
26 return;
|
danielebarchiesi@4
|
27 }
|
danielebarchiesi@4
|
28
|
danielebarchiesi@4
|
29 $instance['default_value_function'] = 'entityreference_prepopulate_field_default_value';
|
danielebarchiesi@4
|
30 field_update_instance($instance);
|
danielebarchiesi@4
|
31 }
|
danielebarchiesi@4
|
32
|
danielebarchiesi@4
|
33 /**
|
danielebarchiesi@4
|
34 * Implements hook_field_update_instance().
|
danielebarchiesi@4
|
35 */
|
danielebarchiesi@4
|
36 function entityreference_prepopulate_field_update_instance($instance, $prior_instance) {
|
danielebarchiesi@4
|
37 if (empty($instance['settings']['behaviors']['prepopulate'])) {
|
danielebarchiesi@4
|
38 return;
|
danielebarchiesi@4
|
39 }
|
danielebarchiesi@4
|
40 if (isset($prior_instance['settings']['behaviors']['prepopulate']['status']) && $instance['settings']['behaviors']['prepopulate']['status'] == $prior_instance['settings']['behaviors']['prepopulate']['status']) {
|
danielebarchiesi@4
|
41 // Nothing changed.
|
danielebarchiesi@4
|
42 return;
|
danielebarchiesi@4
|
43 }
|
danielebarchiesi@4
|
44
|
danielebarchiesi@4
|
45 $instance['default_value_function'] = !empty($instance['settings']['behaviors']['prepopulate']['status']) ? 'entityreference_prepopulate_field_default_value' : '';
|
danielebarchiesi@4
|
46 field_update_instance($instance);
|
danielebarchiesi@4
|
47 }
|
danielebarchiesi@4
|
48
|
danielebarchiesi@4
|
49
|
danielebarchiesi@4
|
50 /**
|
danielebarchiesi@4
|
51 * Implements hook_field_attach_form().
|
danielebarchiesi@4
|
52 */
|
danielebarchiesi@4
|
53 function entityreference_prepopulate_field_attach_form($entity_type, $entity, &$form, &$form_state, $langcode) {
|
danielebarchiesi@4
|
54 list($id,,$bundle) = entity_extract_ids($entity_type, $entity);
|
danielebarchiesi@4
|
55
|
danielebarchiesi@4
|
56 if (!empty($form_state['triggering_element']['#ajax'])) {
|
danielebarchiesi@4
|
57 // We are inside AJAX, so values can't be taken from URL at the
|
danielebarchiesi@4
|
58 // moment.
|
danielebarchiesi@4
|
59 return;
|
danielebarchiesi@4
|
60 }
|
danielebarchiesi@4
|
61
|
danielebarchiesi@4
|
62 // Check if there is a field that needs to be prepopulated attached to the
|
danielebarchiesi@4
|
63 // given entity.
|
danielebarchiesi@4
|
64 $found = FALSE;
|
danielebarchiesi@4
|
65 foreach (field_info_instances($entity_type, $bundle) as $instance) {
|
danielebarchiesi@4
|
66 if (!empty($instance['settings']['behaviors']['prepopulate']['status'])) {
|
danielebarchiesi@4
|
67 $found = TRUE;
|
danielebarchiesi@4
|
68 break;
|
danielebarchiesi@4
|
69 }
|
danielebarchiesi@4
|
70 }
|
danielebarchiesi@4
|
71
|
danielebarchiesi@4
|
72 if (!$found) {
|
danielebarchiesi@4
|
73 return;
|
danielebarchiesi@4
|
74 }
|
danielebarchiesi@4
|
75
|
danielebarchiesi@4
|
76 foreach (element_children($form_state['field']) as $field_name) {
|
danielebarchiesi@4
|
77 foreach ($form_state['field'][$field_name] as $lang => $value) {
|
danielebarchiesi@4
|
78 $instance = $value['instance'];
|
danielebarchiesi@4
|
79 if (empty($instance['settings']['behaviors']['prepopulate']['status'])) {
|
danielebarchiesi@4
|
80 continue;
|
danielebarchiesi@4
|
81 }
|
danielebarchiesi@4
|
82 $settings = $instance['settings']['behaviors']['prepopulate'];
|
danielebarchiesi@4
|
83
|
danielebarchiesi@4
|
84 if ((!empty($settings['skip_perm']) && user_access($settings['skip_perm'])) || ($id && empty($settings['action_on_edit']))) {
|
danielebarchiesi@4
|
85 // User has access to skip the action, or the entity is already
|
danielebarchiesi@4
|
86 // saved, but "Apply action on edit", is disabled.
|
danielebarchiesi@4
|
87 continue;
|
danielebarchiesi@4
|
88 }
|
danielebarchiesi@4
|
89
|
danielebarchiesi@4
|
90 $field = $value['field'];
|
danielebarchiesi@4
|
91
|
danielebarchiesi@4
|
92 // Store prepopulated values in the form state to make them persistent,
|
danielebarchiesi@4
|
93 // in case the form is rebuilt by AJAX requests.
|
danielebarchiesi@4
|
94 $field_name = $field['field_name'];
|
danielebarchiesi@4
|
95
|
danielebarchiesi@4
|
96 if ($ids = entityreference_prepopulate_get_values($field, $instance)) {
|
danielebarchiesi@4
|
97 $form_state['entityreference_prepopulate'][$instance['entity_type']][$instance['bundle']][$field_name] = $ids;
|
danielebarchiesi@4
|
98 }
|
danielebarchiesi@4
|
99
|
danielebarchiesi@4
|
100 if ($ids || ($id && !empty($settings['action_on_edit']))) {
|
danielebarchiesi@4
|
101 // New entity with prepopualte values, or an existing entity,
|
danielebarchiesi@4
|
102 // we might need to disable/ hide the group-audience field.
|
danielebarchiesi@4
|
103 if ($settings['action'] == 'disable') {
|
danielebarchiesi@4
|
104 $form[$field_name][$lang]['#disabled'] = TRUE;
|
danielebarchiesi@4
|
105 }
|
danielebarchiesi@4
|
106 elseif ($settings['action'] == 'hide') {
|
danielebarchiesi@4
|
107 // We don't hide the field via hook_field_access(), as the
|
danielebarchiesi@4
|
108 // default value won't be set.
|
danielebarchiesi@4
|
109 $form[$field_name]['#access'] = FALSE;
|
danielebarchiesi@4
|
110 }
|
danielebarchiesi@4
|
111 }
|
danielebarchiesi@4
|
112 elseif (in_array($settings['fallback'], array('form_error', 'redirect'))) {
|
danielebarchiesi@4
|
113 $message = t('Field @label must be populated via URL.', array('@label' => $instance['label']));
|
danielebarchiesi@4
|
114 if ($settings['fallback'] == 'form_error') {
|
danielebarchiesi@4
|
115 form_error($form, $message);
|
danielebarchiesi@4
|
116 }
|
danielebarchiesi@4
|
117 elseif ($settings['fallback'] == 'redirect') {
|
danielebarchiesi@4
|
118 drupal_set_message($message, 'notice');
|
danielebarchiesi@4
|
119 drupal_goto();
|
danielebarchiesi@4
|
120 }
|
danielebarchiesi@4
|
121 }
|
danielebarchiesi@4
|
122 }
|
danielebarchiesi@4
|
123 }
|
danielebarchiesi@4
|
124 }
|
danielebarchiesi@4
|
125
|
danielebarchiesi@4
|
126 /**
|
danielebarchiesi@4
|
127 * Implements hook_field_access().
|
danielebarchiesi@4
|
128 */
|
danielebarchiesi@4
|
129 function entityreference_prepopulate_field_access($op, $field, $entity_type, $entity, $account) {
|
danielebarchiesi@4
|
130 if ($op != 'edit' || $field['type'] != 'entityreference') {
|
danielebarchiesi@4
|
131 return;
|
danielebarchiesi@4
|
132 }
|
danielebarchiesi@4
|
133
|
danielebarchiesi@4
|
134 if (empty($entity)) {
|
danielebarchiesi@4
|
135 // $entity might be NULL, so return early.
|
danielebarchiesi@4
|
136 // @see field_access().
|
danielebarchiesi@4
|
137 return;
|
danielebarchiesi@4
|
138 }
|
danielebarchiesi@4
|
139
|
danielebarchiesi@4
|
140 list($id,,$bundle) = entity_extract_ids($entity_type, $entity);
|
danielebarchiesi@4
|
141 if ($id) {
|
danielebarchiesi@4
|
142 // Entity is already saved.
|
danielebarchiesi@4
|
143 return;
|
danielebarchiesi@4
|
144 }
|
danielebarchiesi@4
|
145
|
danielebarchiesi@4
|
146 $instance = field_info_instance($entity_type, $field['field_name'], $bundle);
|
danielebarchiesi@4
|
147 if (empty($instance['settings']['behaviors']['prepopulate']['status'])) {
|
danielebarchiesi@4
|
148 return;
|
danielebarchiesi@4
|
149 }
|
danielebarchiesi@4
|
150
|
danielebarchiesi@4
|
151 $settings = $instance['settings']['behaviors']['prepopulate'];
|
danielebarchiesi@4
|
152 if (!empty($settings['skip_perm']) && user_access($settings['skip_perm'])) {
|
danielebarchiesi@4
|
153 return;
|
danielebarchiesi@4
|
154 }
|
danielebarchiesi@4
|
155 $ids = entityreference_prepopulate_get_values($field, $instance);
|
danielebarchiesi@4
|
156
|
danielebarchiesi@4
|
157 if (!$ids && $settings['fallback'] == 'hide') {
|
danielebarchiesi@4
|
158 return FALSE;
|
danielebarchiesi@4
|
159 }
|
danielebarchiesi@4
|
160 }
|
danielebarchiesi@4
|
161
|
danielebarchiesi@4
|
162 /**
|
danielebarchiesi@4
|
163 * Field default value callback.
|
danielebarchiesi@4
|
164 *
|
danielebarchiesi@4
|
165 * Set the default from the URL context. This works even if the widget is
|
danielebarchiesi@4
|
166 * not shown, e.g. due to restricted field access.
|
danielebarchiesi@4
|
167 *
|
danielebarchiesi@4
|
168 * @todo Check field cardinality.
|
danielebarchiesi@4
|
169 */
|
danielebarchiesi@4
|
170 function entityreference_prepopulate_field_default_value($entity_type, $entity, $field, $instance, $langcode) {
|
danielebarchiesi@4
|
171 $items = array();
|
danielebarchiesi@4
|
172 if ($ids = entityreference_prepopulate_get_values($field, $instance)) {
|
danielebarchiesi@4
|
173 $items = array();
|
danielebarchiesi@4
|
174 foreach ($ids as $id) {
|
danielebarchiesi@4
|
175 $items[] = array('target_id' => $id);
|
danielebarchiesi@4
|
176 }
|
danielebarchiesi@4
|
177 }
|
danielebarchiesi@4
|
178 return $items;
|
danielebarchiesi@4
|
179 }
|
danielebarchiesi@4
|
180
|
danielebarchiesi@4
|
181 /**
|
danielebarchiesi@4
|
182 * Wrapper function to get context (e.g. from URL or OG-context).
|
danielebarchiesi@4
|
183 *
|
danielebarchiesi@4
|
184 * @param $entity_type
|
danielebarchiesi@4
|
185 * The entity type the entity.
|
danielebarchiesi@4
|
186 * @param $entity
|
danielebarchiesi@4
|
187 * The entity object that is being checked.
|
danielebarchiesi@4
|
188 * @param $field
|
danielebarchiesi@4
|
189 * The field info array.
|
danielebarchiesi@4
|
190 * @param $instance
|
danielebarchiesi@4
|
191 * The instance info array.
|
danielebarchiesi@4
|
192 * @param $validate
|
danielebarchiesi@4
|
193 * Determine if access validation should be performed. Defaults to TRUE.
|
danielebarchiesi@4
|
194 *
|
danielebarchiesi@4
|
195 * @return
|
danielebarchiesi@4
|
196 * Array of IDs a user may view.
|
danielebarchiesi@4
|
197 */
|
danielebarchiesi@4
|
198 function entityreference_prepopulate_get_values($field, $instance, $validate = TRUE) {
|
danielebarchiesi@4
|
199 if (!$instance['settings']['behaviors']['prepopulate']['status']) {
|
danielebarchiesi@4
|
200 // Do nothing when prepopulate is disabled for this field.
|
danielebarchiesi@4
|
201 return;
|
danielebarchiesi@4
|
202 }
|
danielebarchiesi@4
|
203
|
danielebarchiesi@4
|
204 $field_name = $field['field_name'];
|
danielebarchiesi@4
|
205
|
danielebarchiesi@4
|
206 $cache = &drupal_static(__FUNCTION__, array());
|
danielebarchiesi@4
|
207 $identifier = array(
|
danielebarchiesi@4
|
208 $instance['entity_type'],
|
danielebarchiesi@4
|
209 $instance['bundle'],
|
danielebarchiesi@4
|
210 $field_name,
|
danielebarchiesi@4
|
211 $validate,
|
danielebarchiesi@4
|
212 );
|
danielebarchiesi@4
|
213
|
danielebarchiesi@4
|
214 if (module_exists('og') && og_is_group_audience_field($field_name)) {
|
danielebarchiesi@4
|
215 if (empty($instance['field_mode'])) {
|
danielebarchiesi@4
|
216 // Group audience field, but no field-mode provided.
|
danielebarchiesi@4
|
217 // So we iterate over the "default" and possibly "admin" field-modes,
|
danielebarchiesi@4
|
218 // and return those values together.
|
danielebarchiesi@4
|
219 $ids = array();
|
danielebarchiesi@4
|
220 $field_modes = !user_access('administer group') ? array('default') : array('default', 'admin');
|
danielebarchiesi@4
|
221 foreach ($field_modes as $field_mode) {
|
danielebarchiesi@4
|
222 $instance['field_mode'] = $field_mode;
|
danielebarchiesi@4
|
223 if ($og_ids = entityreference_prepopulate_get_values($field, $instance)) {
|
danielebarchiesi@4
|
224 $ids = array_merge($ids, $og_ids);
|
danielebarchiesi@4
|
225 }
|
danielebarchiesi@4
|
226 }
|
danielebarchiesi@4
|
227
|
danielebarchiesi@4
|
228 // Return the values.
|
danielebarchiesi@4
|
229 return $ids;
|
danielebarchiesi@4
|
230 }
|
danielebarchiesi@4
|
231
|
danielebarchiesi@4
|
232 $identifier[] = $instance['field_mode'];
|
danielebarchiesi@4
|
233 }
|
danielebarchiesi@4
|
234
|
danielebarchiesi@4
|
235 $identifier = implode(':', $identifier);
|
danielebarchiesi@4
|
236
|
danielebarchiesi@4
|
237 if (isset($cache[$identifier])) {
|
danielebarchiesi@4
|
238 return $cache[$identifier];
|
danielebarchiesi@4
|
239 }
|
danielebarchiesi@4
|
240
|
danielebarchiesi@4
|
241 $cache[$identifier] = $ids = array();
|
danielebarchiesi@4
|
242
|
danielebarchiesi@4
|
243 // Check if we have cached values.
|
danielebarchiesi@4
|
244 if (!$ids) {
|
danielebarchiesi@4
|
245 $ids = entityreference_prepopulate_get_values_from_cache($field, $instance);
|
danielebarchiesi@4
|
246 }
|
danielebarchiesi@4
|
247
|
danielebarchiesi@4
|
248 // Check if we have OG-context integration.
|
danielebarchiesi@4
|
249 if (!$ids) {
|
danielebarchiesi@4
|
250 $ids = entityreference_prepopulate_get_values_from_og_context($field, $instance);
|
danielebarchiesi@4
|
251 }
|
danielebarchiesi@4
|
252
|
danielebarchiesi@4
|
253 // Check if there are values in the URL.
|
danielebarchiesi@4
|
254 if (!$ids) {
|
danielebarchiesi@4
|
255 $ids = entityreference_prepopulate_get_values_from_url($field, $instance);
|
danielebarchiesi@4
|
256 }
|
danielebarchiesi@4
|
257
|
danielebarchiesi@4
|
258 if (!$ids || !$validate) {
|
danielebarchiesi@4
|
259 // No IDs found, or no validation is needed.
|
danielebarchiesi@4
|
260 $cache[$identifier] = $ids;
|
danielebarchiesi@4
|
261 return $ids;
|
danielebarchiesi@4
|
262 }
|
danielebarchiesi@4
|
263
|
danielebarchiesi@4
|
264 $handler = entityreference_get_selection_handler($field, $instance);
|
danielebarchiesi@4
|
265 if (!$ids = $handler->validateReferencableEntities($ids)) {
|
danielebarchiesi@4
|
266 $cache[$identifier] = FALSE;
|
danielebarchiesi@4
|
267 return;
|
danielebarchiesi@4
|
268 }
|
danielebarchiesi@4
|
269
|
danielebarchiesi@4
|
270 // Check access to the provided entities.
|
danielebarchiesi@4
|
271 $target_type = $field['settings']['target_type'];
|
danielebarchiesi@4
|
272 entity_load($target_type, $ids);
|
danielebarchiesi@4
|
273 foreach ($ids as $delta => $id) {
|
danielebarchiesi@4
|
274 $entity = entity_load_single($target_type, $id);
|
danielebarchiesi@4
|
275 if (!$entity || !entity_access('view', $target_type, $entity)) {
|
danielebarchiesi@4
|
276 unset($ids[$delta]);
|
danielebarchiesi@4
|
277 }
|
danielebarchiesi@4
|
278 }
|
danielebarchiesi@4
|
279
|
danielebarchiesi@4
|
280 $cache[$identifier] = $ids;
|
danielebarchiesi@4
|
281 return $ids;
|
danielebarchiesi@4
|
282 }
|
danielebarchiesi@4
|
283
|
danielebarchiesi@4
|
284 /**
|
danielebarchiesi@4
|
285 * Get the values from the cached form.
|
danielebarchiesi@4
|
286 *
|
danielebarchiesi@4
|
287 * @param $field
|
danielebarchiesi@4
|
288 * The field info array.
|
danielebarchiesi@4
|
289 * @param $instance
|
danielebarchiesi@4
|
290 * The instance info array.
|
danielebarchiesi@4
|
291 *
|
danielebarchiesi@4
|
292 * @see
|
danielebarchiesi@4
|
293 * entityreference_prepopulate_get_values()
|
danielebarchiesi@4
|
294 */
|
danielebarchiesi@4
|
295 function entityreference_prepopulate_get_values_from_cache($field, $instance) {
|
danielebarchiesi@4
|
296 // Try to get the form out of cache.
|
danielebarchiesi@4
|
297 if (!$form_build_id = isset($_GET['form_build_id']) ? $_GET['form_build_id'] : isset($_POST['form_build_id']) ? $_POST['form_build_id'] : NULL) {
|
danielebarchiesi@4
|
298 return;
|
danielebarchiesi@4
|
299 }
|
danielebarchiesi@4
|
300
|
danielebarchiesi@4
|
301 $field_name = $field['field_name'];
|
danielebarchiesi@4
|
302
|
danielebarchiesi@4
|
303 $form_state = array();
|
danielebarchiesi@4
|
304 form_get_cache($form_build_id, $form_state);
|
danielebarchiesi@4
|
305
|
danielebarchiesi@4
|
306 // If successful, get the value from the form_state.
|
danielebarchiesi@4
|
307 return isset($form_state['entityreference_prepopulate'][$instance['entity_type']][$instance['bundle']][$field_name]) ? $form_state['entityreference_prepopulate'][$instance['entity_type']][$instance['bundle']][$field_name] : FALSE;
|
danielebarchiesi@4
|
308 }
|
danielebarchiesi@4
|
309
|
danielebarchiesi@4
|
310 /**
|
danielebarchiesi@4
|
311 * Get values for prepopulating fields via URL.
|
danielebarchiesi@4
|
312 *
|
danielebarchiesi@4
|
313 * @param $field
|
danielebarchiesi@4
|
314 * The field info array.
|
danielebarchiesi@4
|
315 * @param $instance
|
danielebarchiesi@4
|
316 * The instance info array.
|
danielebarchiesi@4
|
317 *
|
danielebarchiesi@4
|
318 * @see
|
danielebarchiesi@4
|
319 * entityreference_prepopulate_get_values()
|
danielebarchiesi@4
|
320 */
|
danielebarchiesi@4
|
321 function entityreference_prepopulate_get_values_from_url($field, $instance) {
|
danielebarchiesi@4
|
322 $field_name = $field['field_name'];
|
danielebarchiesi@4
|
323 if (!empty($_GET[$field_name]) && is_string($_GET[$field_name])) {
|
danielebarchiesi@4
|
324 return explode(',', $_GET[$field_name]);
|
danielebarchiesi@4
|
325 }
|
danielebarchiesi@4
|
326 }
|
danielebarchiesi@4
|
327
|
danielebarchiesi@4
|
328
|
danielebarchiesi@4
|
329 /**
|
danielebarchiesi@4
|
330 * Get values for prepopulating fields OG-context.
|
danielebarchiesi@4
|
331 *
|
danielebarchiesi@4
|
332 * @param $field
|
danielebarchiesi@4
|
333 * The field info array.
|
danielebarchiesi@4
|
334 * @param $instance
|
danielebarchiesi@4
|
335 * The instance info array.
|
danielebarchiesi@4
|
336 *
|
danielebarchiesi@4
|
337 * @see
|
danielebarchiesi@4
|
338 * entityreference_prepopulate_get_values()
|
danielebarchiesi@4
|
339 */
|
danielebarchiesi@4
|
340 function entityreference_prepopulate_get_values_from_og_context($field, $instance) {
|
danielebarchiesi@4
|
341 $field_name = $field['field_name'];
|
danielebarchiesi@4
|
342
|
danielebarchiesi@4
|
343 if (!module_exists('og_context') || !og_is_group_audience_field($field_name) || !$og_context = og_context()) {
|
danielebarchiesi@4
|
344 return;
|
danielebarchiesi@4
|
345 }
|
danielebarchiesi@4
|
346
|
danielebarchiesi@4
|
347 if ($og_context['group_type'] != $field['settings']['target_type']) {
|
danielebarchiesi@4
|
348 // Context is of invalid group-type.
|
danielebarchiesi@4
|
349 return;
|
danielebarchiesi@4
|
350 }
|
danielebarchiesi@4
|
351
|
danielebarchiesi@4
|
352 return array($og_context['gid']);
|
danielebarchiesi@4
|
353 }
|
danielebarchiesi@4
|
354
|
danielebarchiesi@4
|
355
|
danielebarchiesi@4
|
356 /**
|
danielebarchiesi@4
|
357 * Return a form element with crafted links to create nodes for a group.
|
danielebarchiesi@4
|
358 *
|
danielebarchiesi@4
|
359 * @param $entity_type
|
danielebarchiesi@4
|
360 * The entity type of the referenced entity.
|
danielebarchiesi@4
|
361 * @param $entity_id
|
danielebarchiesi@4
|
362 * The entity ID of the referenced entity.
|
danielebarchiesi@4
|
363 * @param $destination
|
danielebarchiesi@4
|
364 * Optional; The destination after a node is created. Defaults to the
|
danielebarchiesi@4
|
365 * destination passed in the URL if exists, otherwise back to the current
|
danielebarchiesi@4
|
366 * page.
|
danielebarchiesi@4
|
367 * @param $types
|
danielebarchiesi@4
|
368 * Optional; An array of type names. Restrict the created links to the given
|
danielebarchiesi@4
|
369 * types.
|
danielebarchiesi@4
|
370 */
|
danielebarchiesi@4
|
371 function entityreference_prepopulate_create_node_links($entity_type, $entity_id, $field_name, $destination = NULL, $types = NULL) {
|
danielebarchiesi@4
|
372 $wrapper = entity_metadata_wrapper($entity_type, $entity_id);
|
danielebarchiesi@4
|
373 $field = field_info_field($field_name);
|
danielebarchiesi@4
|
374
|
danielebarchiesi@4
|
375 $entity = entity_load_single($entity_type, $entity_id);
|
danielebarchiesi@4
|
376 list(,, $bundle) = entity_extract_ids($entity_type, $entity);
|
danielebarchiesi@4
|
377
|
danielebarchiesi@4
|
378 $types = isset($types) ? $types : array_keys(node_type_get_types());
|
danielebarchiesi@4
|
379 $names = array();
|
danielebarchiesi@4
|
380 foreach ($types as $type_name) {
|
danielebarchiesi@4
|
381 if ($field['settings']['target_type'] != $entity_type) {
|
danielebarchiesi@4
|
382 // The entity type isn't referenced by the field.
|
danielebarchiesi@4
|
383 continue;
|
danielebarchiesi@4
|
384 }
|
danielebarchiesi@4
|
385
|
danielebarchiesi@4
|
386 if (!empty($field['settings']['handler_settings']['target_bundles']) && !in_array($bundle, $field['settings']['handler_settings']['target_bundles'])) {
|
danielebarchiesi@4
|
387 // The entity bundle isn't referenced by the field.
|
danielebarchiesi@4
|
388 continue;
|
danielebarchiesi@4
|
389 }
|
danielebarchiesi@4
|
390
|
danielebarchiesi@4
|
391 $instance = field_info_instance('node', $field_name, $type_name);
|
danielebarchiesi@4
|
392 if (empty($instance['settings']['behaviors']['prepopulate']['status'])) {
|
danielebarchiesi@4
|
393 // The field doesn't exist on the node type, or doesn't have prepopulate
|
danielebarchiesi@4
|
394 // enabled.
|
danielebarchiesi@4
|
395 continue;
|
danielebarchiesi@4
|
396 }
|
danielebarchiesi@4
|
397
|
danielebarchiesi@4
|
398 if (!node_access('create', $type_name)) {
|
danielebarchiesi@4
|
399 continue;
|
danielebarchiesi@4
|
400 }
|
danielebarchiesi@4
|
401
|
danielebarchiesi@4
|
402 $names[$type_name] = node_type_get_name($type_name);
|
danielebarchiesi@4
|
403 }
|
danielebarchiesi@4
|
404
|
danielebarchiesi@4
|
405 if (empty($names)) {
|
danielebarchiesi@4
|
406 return;
|
danielebarchiesi@4
|
407 }
|
danielebarchiesi@4
|
408
|
danielebarchiesi@4
|
409 // Sort names.
|
danielebarchiesi@4
|
410 asort($names);
|
danielebarchiesi@4
|
411
|
danielebarchiesi@4
|
412 // Build links.
|
danielebarchiesi@4
|
413 $options = array(
|
danielebarchiesi@4
|
414 'query' => array($field_name => $entity_id) + drupal_get_destination(),
|
danielebarchiesi@4
|
415 );
|
danielebarchiesi@4
|
416
|
danielebarchiesi@4
|
417 $items = array();
|
danielebarchiesi@4
|
418 foreach ($names as $type => $name) {
|
danielebarchiesi@4
|
419 $items[] = array('data' => l($name, 'node/add/' . str_replace('_', '-', $type), $options));
|
danielebarchiesi@4
|
420 }
|
danielebarchiesi@4
|
421
|
danielebarchiesi@4
|
422 $element = array();
|
danielebarchiesi@4
|
423 $element['entityreference_prepopulate'] = array(
|
danielebarchiesi@4
|
424 '#theme' => 'item_list',
|
danielebarchiesi@4
|
425 '#items' => $items,
|
danielebarchiesi@4
|
426 );
|
danielebarchiesi@4
|
427
|
danielebarchiesi@4
|
428 return $element;
|
danielebarchiesi@4
|
429 }
|