/[drupal]/contributions/modules/viewfield/viewfield.module
ViewVC logotype

Contents of /contributions/modules/viewfield/viewfield.module

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.20 - (show annotations) (download) (as text)
Wed Jun 17 02:56:40 2009 UTC (5 months, 1 week ago) by darrenoh
Branch: MAIN
CVS Tags: HEAD
Changes since 1.19: +2 -2 lines
File MIME type: text/x-php
#480432 by Darren Oh: Improved original fix to prevent error on line 276.
1 <?php
2 // $Id: viewfield.module,v 1.19 2009/06/17 01:40:19 jerdavis Exp $
3
4 /**
5 * @file
6 * Core functions.
7 */
8
9 /**
10 * Implementation of hook_field_info().
11 */
12 function viewfield_field_info() {
13 return array(
14 'viewfield' => array(
15 'label' => t('View field'),
16 'description' => t('Defines a field type that displays the contents of a view in a node.'),
17 'callbacks' => array(
18 'tables' => CONTENT_CALLBACK_NONE,
19 'arguments' => CONTENT_CALLBACK_NONE,
20 ),
21 ),
22 );
23 }
24
25 /**
26 * Implementation of hook_field_settings().
27 */
28 function viewfield_field_settings($op, $field) {
29 switch ($op) {
30 case 'form':
31 $form['allowed_views'] = array(
32 '#type' => 'checkboxes',
33 '#title' => t('Allowed views'),
34 '#default_value' => is_array($field['allowed_views']) ? $field['allowed_views'] : array(),
35 '#options' => drupal_map_assoc(array_keys(views_get_all_views())),
36 '#description' => t('Only allow users to select from the specified views. If no views are selected, all will be available.'),
37 );
38 $form['super_default'] = array(
39 '#type' => 'checkbox',
40 '#title' => t('Use a common default value for all nodes if the user does not override it on the node form.'),
41 '#default_value' => $field['super_default'],
42 );
43 if (module_exists('token')) {
44 $form['token_enabled'] = array(
45 '#type' => 'checkbox',
46 '#title' => t('Enable token replacements.'),
47 '#description' => t('Token replacements will affect the site performance if using a Viewfield inside a View that has <em>field</em> row style.'),
48 '#default_value' => $field['token_enabled'],
49 );
50 }
51 $form_state = NULL;
52 $form['#node'] = (object) array('type' => $field['type_name']);
53 module_load_include('inc', 'content', 'includes/content.node_form');
54 $field_form = content_field_form($form, $form_state, $field, 0);
55 $form['super_default_widget'] = &$field_form[$field['field_name']][0];
56 $form['super_default_widget']['#tree'] = TRUE;
57 unset($form['super_default_widget']['#weight']);
58 return $form;
59 case 'validate':
60 if ($field['force_default'] && $field['multiple']) {
61 form_set_error('multiple', t('Multiple views are not supported if force default is enabled.'));
62 }
63 break;
64 case 'save':
65 return array('allowed_views', 'super_default', 'token_enabled', 'super_default_widget');
66 case 'database columns':
67 return array(
68 'vname' => array('type' => 'varchar', 'not null' => FALSE, 'length' => 32),
69 'vargs' => array('type' => 'varchar', 'not null' => FALSE, 'length' => 255),
70 );
71 }
72 }
73
74 /**
75 * Implementation of hook_field().
76 */
77 function viewfield_field($op, &$node, $field, &$items, $teaser, $page) {
78 switch ($op) {
79 case 'presave':
80 foreach ($items as $delta => $item) {
81 if ($field['super_default'] && empty($item['override_default']) || $field['widget']['force_default']) {
82 $items[$delta] = array('vname' => NULL, 'vargs' => NULL);
83 }
84 elseif (empty($item['vname'])) {
85 unset($items[$delta]);
86 }
87 }
88 break;
89 case 'sanitize':
90 foreach ($items as $delta => $item) {
91 $item = empty($item['vname']) || $field['widget']['force_default'] ? $field['super_default_widget'] : $item;
92 if ($field['super_default']) {
93 $item['override_default'] = !empty($item['vname']);
94 }
95 $item['token_enabled'] = _viewfield_token_enabled($field);
96 $items[$delta] = $item;
97 }
98 return array($field['field_name'] => $items);
99 }
100 }
101
102 /**
103 * Implementation of hook_content_is_empty().
104 */
105 function viewfield_content_is_empty($item, $field) {
106 return empty($item['vname']);
107 }
108
109 /**
110 * Implementation of hook_field_formatter_info().
111 */
112 function viewfield_field_formatter_info() {
113 return array(
114 'default' => array(
115 'label' => t('Default'),
116 'field types' => array('viewfield')
117 ),
118 );
119 }
120
121 /**
122 * Implementation of hook_widget_info().
123 */
124 function viewfield_widget_info() {
125 return array(
126 'viewfield_select' => array(
127 'label' => 'Select List',
128 'field types' => array('viewfield'),
129 'multiple_values' => CONTENT_HANDLE_CORE,
130 'callbacks' => array(
131 'default value' => CONTENT_CALLBACK_NONE,
132 ),
133 ),
134 );
135 }
136
137 /**
138 * Implementation of hook_widget_settings().
139 */
140 function viewfield_widget_settings($op, $widget) {
141 switch ($op) {
142 case 'form':
143 $form['force_default'] = array(
144 '#type' => 'checkbox',
145 '#title' => t('Force default'),
146 '#default_value' => $widget['force_default'],
147 '#description' => t('If checked, the user will not be able to change anything about the view at all. It will not even be shown on the edit node page. The default value will be used instead.'),
148 );
149 return $form;
150 case 'save':
151 return array('force_default');
152 }
153 }
154
155 /**
156 * Implementation of hook_widget().
157 */
158 function viewfield_widget(&$form, &$form_state, $field, $items, $delta = 0) {
159 // Since tabledrag.js currently cannot handle nested tables, if we are
160 // adding/editing a node we have to show the token help just below the
161 // viewfield select widget.
162 if ($delta == 0 && $field['multiple'] && !$field['widget']['force_default'] && _viewfield_token_enabled($field)) {
163 $form['token_help'] = _viewfield_get_token_help();
164 $form['token_help']['#weight'] = $field['widget']['weight'] + 1;
165 }
166 $element = array(
167 '#type' => $field['widget']['type'],
168 '#default_value' => isset($items[$delta]) ? $items[$delta] : $field['super_default_widget'],
169 );
170 return $element;
171 }
172
173 /**
174 * Implementation of FAPI hook_elements().
175 */
176 function viewfield_elements() {
177 return array(
178 'viewfield_select' => array(
179 '#input' => TRUE,
180 '#columns' => array('vname', 'vargs'),
181 '#delta' => 0,
182 '#process' => array('viewfield_select_process'),
183 ),
184 );
185 }
186
187 function viewfield_select_process($element, $edit, $form_state, $form) {
188 if (isset($form['#field'])) {
189 $field = $form['#field'];
190 }
191 else {
192 $field = $form['#field_info'][$element['#field_name']];
193 }
194 $node = isset($form['#node']) ? $form['#node'] : (object) array('type' => $field['type_name']);
195 $field_settings = !isset($node->uid);
196 // This form is used for both the default value field in the admin as well as
197 // the node edit form, so we have to make sure we show the default value field
198 // always.
199 if ($field['widget']['force_default'] && !$field_settings) {
200 $element['vname'] = array(
201 '#type' => 'value',
202 '#value' => $element['#default_value']['vname'],
203 );
204 $element['vargs'] = array(
205 '#type' => 'value',
206 '#value' => $element['#default_value']['vargs'], // All views share args (for now).
207 );
208 }
209 else {
210 // Display the form to let the user pick a view.
211 $options = _viewfield_potential_references($field_settings, $field, $element['#delta']);
212 // Provide our own overriding of defaults.
213 if ($field['super_default'] && !$field_settings) {
214 $element['override_default'] = array(
215 '#type' => 'checkbox',
216 '#title' => t('Override default'),
217 '#default_value' => $element['#value']['override_default'],
218 );
219 }
220 if (count($options) > 1) {
221 $element['vname'] = array(
222 '#type' => 'select',
223 '#options' => $options,
224 '#default_value' => $element['#default_value']['vname'],
225 '#title' => $element['#title'],
226 '#required' => $element['#required'],
227 '#description' => $element['#description'],
228 '#field_name' => $element['#field_name'],
229 '#type_name' => $element['#type_name'],
230 '#delta' => $element['#delta'],
231 '#columns' => $element['#columns'],
232 );
233 $args_title = t('Arguments');
234 }
235 else {
236 // There's only the one view, so only show the arguments.
237 list($key, $label) = each($options);
238 $element['vname'] = array(
239 '#type' => 'value',
240 '#value' => $key,
241 );
242 $args_title = $field_settings ? t('Arguments') : $field['widget']['label'] ." ($label) ". t('arguments');
243 }
244 $element['vargs'] = array(
245 '#type' => 'textfield',
246 '#title' => $args_title,
247 '#default_value' => $element['#default_value']['vargs'],
248 '#required' => FALSE,
249 '#description' => t('Provide a comma separated list of arguments to pass to the view. These arguments will be passed to EACH selected view. If an argument contains commas or double quotes, enclose it in double quotes. Replace double quotes that are part of the argument with pairs of double quotes.'),
250 '#field_name' => $element['#field_name'] .' '. t('arguments'),
251 '#type_name' => 'text',
252 '#delta' => $element['#delta'],
253 '#columns' => $element['#columns'],
254 );
255 $token_desc = ($token_enabled = _viewfield_token_enabled($field)) ?
256 t('Use the syntax [token] if you want to insert a replacement pattern.') :
257 t('You may use %nid for the node id of the current node. %author for the node author and %viewer for user viewing the node.');
258 $element['vargs']['#description'] .= "<br/>\n$token_desc";
259 // Since tabledrag.js currently cannot handle nested tables, we show the
260 // token help inside the fieldset only in the field settings form or in
261 // single-value mode.
262 if ($token_enabled && ($field_settings || !$field['multiple'])) {
263 $element['token_help'] = _viewfield_get_token_help();
264 }
265 }
266 return $element;
267 }
268
269 /**
270 * Prepare a list of views for selection.
271 */
272 function _viewfield_potential_references($field_settings = TRUE, $field = array(), $delta = 0) {
273 $options = array();
274 $field['allowed_views'] = isset($field['allowed_views']) ? array_filter($field['allowed_views']) : array();
275 $field['allowed_views'] = empty($field['allowed_views']) ? array_keys(views_get_all_views()) : $field['allowed_views'];
276 foreach ($field['allowed_views'] as $view_name) {
277 $view = views_get_view($view_name);
278 foreach ($view->display as $display) {
279 $options[$view->name .'|'. $display->id] = $view->name .' - '. $display->display_title;
280 }
281 }
282 // Add a null option for non-required or multiple fields: handle multiple
283 // views by adding an empty option, otherwise at each submit the user would
284 // add a new view. If the field is required AND multiple the first widget has
285 // no empty choice.
286 if (!$field_settings && (!$field['required'] || ($field['multiple'] && $delta > 0))) {
287 array_unshift($options, '<'. t('none') .'>');
288 }
289 return $options;
290 }
291
292 /**
293 * Return the token replacement help
294 */
295 function _viewfield_get_token_help() {
296 // TODO: Token support right now is a bit hacked on, needs better integration,
297 // eventually a checkbox to enable/disable use of token-module here.
298 $token_help = array(
299 '#title' => t('Token replacement patterns'),
300 '#type' => 'fieldset',
301 '#collapsible' => TRUE,
302 '#collapsed' => TRUE,
303 '#weight' => $field['widget']['weight']
304 );
305 $token_help['help'] = array(
306 '#value' => theme('token_help', 'node'),
307 );
308 return $token_help;
309 }
310
311 /**
312 * Implementation of hook_theme().
313 */
314 function viewfield_theme() {
315 return array(
316 'viewfield_select' => array(
317 'arguments' => array('element' => NULL),
318 'file' => 'theme/viewfield.theme.inc',
319 ),
320 'viewfield_formatter_default' => array(
321 'arguments' => array('element' => NULL),
322 'file' => 'theme/viewfield.theme.inc',
323 ),
324 );
325 }
326
327 /**
328 * Implementation of hook_views_api().
329 */
330 function viewfield_views_api() {
331 return array(
332 'api' => 2.0,
333 'path' => drupal_get_path('module', 'viewfield') .'/includes',
334 );
335 }
336
337 /**
338 * If the super defaults are enabled return them, otherwise return blank values
339 */
340 function _viewfield_get_super_defaults($field) {
341 return $field['super_default'] ? $field['super_default_widget'] : array('vname' => NULL, 'vargs' => NULL);
342 }
343
344 /**
345 * Check if the token replacements are enabled
346 */
347 function _viewfield_token_enabled($field) {
348 return $field['token_enabled'] && module_exists('token');
349 }

  ViewVC Help
Powered by ViewVC 1.1.2