| 1 |
<?php |
<?php |
| 2 |
// $Id: viewfield.module,v 1.15 2009/04/07 18:42:31 darrenoh Exp $ |
// $Id: viewfield.module,v 1.16 2009/04/07 19:03:41 darrenoh Exp $ |
| 3 |
|
|
| 4 |
/** |
/** |
| 5 |
* @file |
* @file |
| 6 |
* Core functions. |
* Core functions. |
| 7 |
*/ |
*/ |
| 8 |
|
|
|
define('VIEWFIELD_DEFAULT_VNAME', '<default>'); |
|
|
|
|
| 9 |
/** |
/** |
| 10 |
* Implementation of hook_field_info(). |
* Implementation of hook_field_info(). |
| 11 |
*/ |
*/ |
| 28 |
function viewfield_field_settings($op, $field) { |
function viewfield_field_settings($op, $field) { |
| 29 |
switch ($op) { |
switch ($op) { |
| 30 |
case 'form': |
case 'form': |
|
$view_options = array(); |
|
|
$all_views = views_get_all_views(); |
|
|
foreach ($all_views as $view) { |
|
|
$view_options[$view->name] = $view->name; |
|
|
} |
|
| 31 |
$form['allowed_views'] = array( |
$form['allowed_views'] = array( |
| 32 |
'#type' => 'checkboxes', |
'#type' => 'checkboxes', |
| 33 |
'#title' => t('Allowed views'), |
'#title' => t('Allowed views'), |
| 34 |
'#default_value' => is_array($field['allowed_views']) ? $field['allowed_views'] : array(), |
'#default_value' => is_array($field['allowed_views']) ? $field['allowed_views'] : array(), |
| 35 |
'#options' => $view_options, |
'#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. If only one is selected, the user will only be able to specify the arguments.'), |
'#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( |
$form['super_default'] = array( |
| 39 |
'#type' => 'checkbox', |
'#type' => 'checkbox', |
| 49 |
); |
); |
| 50 |
} |
} |
| 51 |
$form_state = NULL; |
$form_state = NULL; |
|
$form['super_default_widget'] = array('#tree' => TRUE); |
|
| 52 |
$form['#node'] = (object) array('type' => $field['type_name']); |
$form['#node'] = (object) array('type' => $field['type_name']); |
| 53 |
$field_form = content_field_form($form, $form_state, $field); |
module_load_include('inc', 'content', 'includes/content.node_form'); |
| 54 |
$form['super_default_widget'][0] = &$field_form[$field['field_name']][0]; |
$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; |
return $form; |
| 59 |
case 'validate': |
case 'validate': |
| 60 |
if ($field['force_default'] && $field['multiple']) { |
if ($field['force_default'] && $field['multiple']) { |
| 75 |
* Implementation of hook_field(). |
* Implementation of hook_field(). |
| 76 |
*/ |
*/ |
| 77 |
function viewfield_field($op, &$node, $field, &$items, $teaser, $page) { |
function viewfield_field($op, &$node, $field, &$items, $teaser, $page) { |
|
list($field_key_vname, $field_key_vargs) = array_keys($field['columns']); |
|
| 78 |
switch ($op) { |
switch ($op) { |
| 79 |
case 'presave': |
case 'presave': |
|
$super_defaults = array($field_key_vname => VIEWFIELD_DEFAULT_VNAME, $field_key_vargs => NULL); |
|
| 80 |
foreach ($items as $delta => $item) { |
foreach ($items as $delta => $item) { |
| 81 |
if (empty($item) || (!$field['super_default'] && empty($item[$field_key_vname]))) { |
if ($field['super_default'] && empty($item['override_default']) || $field['widget']['force_default']) { |
| 82 |
unset($items[$delta]); |
$items[$delta] = array('vname' => NULL, 'vargs' => NULL); |
| 83 |
} |
} |
| 84 |
elseif ($field['super_default'] && empty($item['override_default'])) { |
elseif (empty($item['vname'])) { |
| 85 |
$items[$delta] = $super_defaults; |
unset($items[$delta]); |
|
$items[$delta]['default'] = TRUE; |
|
| 86 |
} |
} |
| 87 |
} |
} |
| 88 |
break; |
break; |
| 89 |
case 'load': |
case 'load': |
|
$additions = array(); |
|
| 90 |
foreach ($items as $delta => $item) { |
foreach ($items as $delta => $item) { |
| 91 |
if ($item[$field_key_vname] == VIEWFIELD_DEFAULT_VNAME) { |
$item = empty($item['vname']) || $field['widget']['force_default'] ? $field['super_default_widget'] : $item; |
| 92 |
// If the field has been set as default, load the defaults accordingly. |
if ($field['super_default']) { |
| 93 |
$items[$delta] = _viewfield_get_super_defaults($field); |
$item['override_default'] = !empty($item['vname']); |
|
$items[$delta]['default'] = TRUE; |
|
| 94 |
} |
} |
| 95 |
$items[$delta]['token_enabled'] = _viewfield_token_enabled($field); |
$item['token_enabled'] = _viewfield_token_enabled($field); |
| 96 |
$additions[$field['field_name']][$delta] = $items[$delta]; |
$items[$delta] = $item; |
| 97 |
} |
} |
| 98 |
return $additions; |
return array($field['field_name'] => $items); |
| 99 |
} |
} |
| 100 |
} |
} |
| 101 |
|
|
| 110 |
* Implementation of hook_field_formatter_info(). |
* Implementation of hook_field_formatter_info(). |
| 111 |
*/ |
*/ |
| 112 |
function viewfield_field_formatter_info() { |
function viewfield_field_formatter_info() { |
| 113 |
$formatters = array(); |
return array( |
| 114 |
$displays = views_fetch_plugin_data('display'); |
'default' => array( |
| 115 |
foreach ($displays as $type => $details) { |
'label' => t('Default'), |
|
$title = isset($details['title']) ? $details['title'] : $type; |
|
|
$formatters[$type] = array( |
|
|
'label' => $title, |
|
| 116 |
'field types' => array('viewfield') |
'field types' => array('viewfield') |
| 117 |
); |
), |
| 118 |
} |
); |
|
return $formatters; |
|
| 119 |
} |
} |
| 120 |
|
|
| 121 |
/** |
/** |
| 128 |
'field types' => array('viewfield'), |
'field types' => array('viewfield'), |
| 129 |
'multiple_values' => CONTENT_HANDLE_CORE, |
'multiple_values' => CONTENT_HANDLE_CORE, |
| 130 |
'callbacks' => array( |
'callbacks' => array( |
| 131 |
'default_value' => CONTENT_CALLBACK_DEFAULT, |
'default value' => CONTENT_CALLBACK_NONE, |
| 132 |
), |
), |
| 133 |
), |
), |
| 134 |
); |
); |
| 165 |
} |
} |
| 166 |
$element = array( |
$element = array( |
| 167 |
'#type' => $field['widget']['type'], |
'#type' => $field['widget']['type'], |
| 168 |
'#default_value' => isset($items[$delta]) ? $items[$delta] : '', |
'#default_value' => isset($items[$delta]) ? $items[$delta] : $field['super_default_widget'], |
| 169 |
); |
); |
| 170 |
return $element; |
return $element; |
| 171 |
} |
} |
| 185 |
} |
} |
| 186 |
|
|
| 187 |
function viewfield_select_process($element, $edit, $form_state, $form) { |
function viewfield_select_process($element, $edit, $form_state, $form) { |
| 188 |
$field_name = $element['#field_name']; |
if (isset($form['#field'])) { |
| 189 |
$field = $form['#field_info'][$field_name]; |
$field = $form['#field']; |
| 190 |
$field_key_vname = $element['#columns'][0]; |
} |
| 191 |
$field_key_vargs = $element['#columns'][1]; |
else { |
| 192 |
$element['#field_info'] = &$form['#field_info']; |
$field = $form['#field_info'][$element['#field_name']]; |
| 193 |
|
} |
| 194 |
$node = isset($form['#node']) ? $form['#node'] : (object) array('type' => $field['type_name']); |
$node = isset($form['#node']) ? $form['#node'] : (object) array('type' => $field['type_name']); |
|
// If the super default is enabled, populate the field form accordingly. |
|
|
$super_defaults = _viewfield_get_super_defaults($form['#field_info'][$field_name]); |
|
| 195 |
$field_settings = !isset($node->uid); |
$field_settings = !isset($node->uid); |
| 196 |
// This form is used for both the default value field in the admin as well as |
// 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 |
// the node edit form, so we have to make sure we show the default value field |
| 198 |
// always. |
// always. |
| 199 |
if ($field['widget']['force_default'] && !$field_settings) { |
if ($field['widget']['force_default'] && !$field_settings) { |
| 200 |
$element[$field_key_vname] = array( |
$element['vname'] = array( |
| 201 |
'#type' => 'value', |
'#type' => 'value', |
| 202 |
'#value' => $super_defaults[$field_key_vname], |
'#value' => $element['#default_value']['vname'], |
| 203 |
); |
); |
| 204 |
$element[$field_key_vargs] = array( |
$element['vargs'] = array( |
| 205 |
'#type' => 'value', |
'#type' => 'value', |
| 206 |
'#value' => $super_defaults[$field_key_vargs], // All views share args (for now). |
'#value' => $element['#default_value']['vargs'], // All views share args (for now). |
| 207 |
); |
); |
| 208 |
} |
} |
| 209 |
else { |
else { |
| 214 |
$element['override_default'] = array( |
$element['override_default'] = array( |
| 215 |
'#type' => 'checkbox', |
'#type' => 'checkbox', |
| 216 |
'#title' => t('Override default'), |
'#title' => t('Override default'), |
| 217 |
'#default_value' => empty($element['#value']['default']), |
'#default_value' => $element['#value']['override_default'], |
| 218 |
); |
); |
| 219 |
} |
} |
| 220 |
if (count($options) > 1) { |
if (count($options) > 1) { |
| 221 |
$element[$field_key_vname] = array( |
$element['vname'] = array( |
| 222 |
'#type' => 'select', |
'#type' => 'select', |
| 223 |
'#options' => $options, |
'#options' => $options, |
| 224 |
'#default_value' => isset($element['#value'][$field_key_vname]) ? $element['#value'][$field_key_vname] : ($field_settings ? $super_defaults[$field_key_vname] : NULL), |
'#default_value' => $element['#default_value']['vname'], |
| 225 |
'#title' => $element['#title'], |
'#title' => $element['#title'], |
| 226 |
'#required' => $element['#required'], |
'#required' => $element['#required'], |
| 227 |
'#description' => $element['#description'], |
'#description' => $element['#description'], |
| 235 |
else { |
else { |
| 236 |
// There's only the one view, so only show the arguments. |
// There's only the one view, so only show the arguments. |
| 237 |
list($key, $label) = each($options); |
list($key, $label) = each($options); |
| 238 |
$element[$field_key_vname] = array( |
$element['vname'] = array( |
| 239 |
'#type' => 'value', |
'#type' => 'value', |
| 240 |
'#value' => $key, |
'#value' => $key, |
| 241 |
); |
); |
| 242 |
$args_title = $field_settings ? t('Arguments') : $field['widget']['label'] ." ($label) ". t('arguments'); |
$args_title = $field_settings ? t('Arguments') : $field['widget']['label'] ." ($label) ". t('arguments'); |
| 243 |
} |
} |
| 244 |
$element[$field_key_vargs] = array( |
$element['vargs'] = array( |
| 245 |
'#type' => 'textfield', |
'#type' => 'textfield', |
| 246 |
'#title' => $args_title, |
'#title' => $args_title, |
| 247 |
'#default_value' => !empty($element['#value'][$field_key_vargs]) ? $element['#value'][$field_key_vargs] : ($field_settings ? $super_defaults[$field_key_vargs] : ''), |
'#default_value' => $element['#default_value']['vargs'], |
| 248 |
'#required' => FALSE, |
'#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.'), |
'#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'), |
'#field_name' => $element['#field_name'] .' '. t('arguments'), |
| 255 |
$token_desc = ($token_enabled = _viewfield_token_enabled($field)) ? |
$token_desc = ($token_enabled = _viewfield_token_enabled($field)) ? |
| 256 |
t('Use the syntax [token] if you want to insert a replacement pattern.') : |
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.'); |
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[$field_key_vargs]['#description'] .= "<br/>\n$token_desc"; |
$element['vargs']['#description'] .= "<br/>\n$token_desc"; |
| 259 |
// Since tabledrag.js currently cannot handle nested tables, we show the |
// 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 |
// token help inside the fieldset only in the field settings form or in |
| 261 |
// single-value mode. |
// single-value mode. |
| 271 |
*/ |
*/ |
| 272 |
function _viewfield_potential_references($field_settings = TRUE, $field = array(), $delta = 0) { |
function _viewfield_potential_references($field_settings = TRUE, $field = array(), $delta = 0) { |
| 273 |
$options = array(); |
$options = array(); |
| 274 |
foreach (views_get_all_views() as $view_name => $view_info) { |
$field['allowed_views'] = array_filter($field['allowed_views']); |
| 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); |
$view = views_get_view($view_name); |
| 278 |
if (isset($field['allowed_views'][$view_name]) && $field['allowed_views'][$view_name]) { |
foreach ($view->display as $display) { |
| 279 |
foreach ($view->display as $display) { |
$options[$view->name .'|'. $display->id] = $view->name .' - '. $display->display_title; |
|
$options[$view->name .'|'. $display->id] = $view->name .' - '. $display->display_title; |
|
|
} |
|
|
} |
|
|
else { |
|
|
$field['allowed_views'][$view_name] = $view_name; |
|
|
} |
|
|
} |
|
|
// If no allowed views are selected, allow all views. |
|
|
if (empty($options)) { |
|
|
foreach (views_get_all_views() as $view_name => $view_info) { |
|
|
$view = views_get_view($view_name); |
|
|
foreach ($view->display as $display) { |
|
|
$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 |
// Add a null option for non-required or multiple fields: handle multiple |
| 312 |
* Implementation of hook_theme(). |
* Implementation of hook_theme(). |
| 313 |
*/ |
*/ |
| 314 |
function viewfield_theme() { |
function viewfield_theme() { |
| 315 |
$theme_info = array( |
return array( |
| 316 |
'viewfield_select' => array( |
'viewfield_select' => array( |
| 317 |
'arguments' => array('element' => NULL), |
'arguments' => array('element' => NULL), |
| 318 |
'file' => 'theme/viewfield.theme.inc', |
'file' => 'theme/viewfield.theme.inc', |
| 319 |
) |
), |
| 320 |
); |
'viewfield_formatter_default' => array( |
|
$displays = views_fetch_plugin_data('display'); |
|
|
foreach ($displays as $type => $details) { |
|
|
$theme_info['viewfield_formatter_'. $type] = array( |
|
| 321 |
'arguments' => array('element' => NULL), |
'arguments' => array('element' => NULL), |
|
'function' => 'theme_viewfield_formatter', |
|
| 322 |
'file' => 'theme/viewfield.theme.inc', |
'file' => 'theme/viewfield.theme.inc', |
| 323 |
); |
), |
| 324 |
} |
); |
|
return $theme_info; |
|
| 325 |
} |
} |
| 326 |
|
|
| 327 |
/** |
/** |
| 338 |
* If the super defaults are enabled return them, otherwise return blank values |
* If the super defaults are enabled return them, otherwise return blank values |
| 339 |
*/ |
*/ |
| 340 |
function _viewfield_get_super_defaults($field) { |
function _viewfield_get_super_defaults($field) { |
| 341 |
return $field['super_default'] ? $field['super_default_widget'][0] : array('vname' => NULL, 'vargs' => NULL); |
return $field['super_default'] ? $field['super_default_widget'] : array('vname' => NULL, 'vargs' => NULL); |
| 342 |
} |
} |
| 343 |
|
|
| 344 |
/** |
/** |