Index: theme/viewfield.theme.inc =================================================================== --- theme/viewfield.theme.inc (revision 89) +++ theme/viewfield.theme.inc (working copy) @@ -111,7 +111,7 @@ function _viewfield_nodestack_pop() { function theme_viewfield_select($element) { if (!empty($element['#children'])) { - $field = $element['#field_info'][$element['#field_name']]; + $field = $element['#field']; if ($field['multiple'] && $element['#delta'] == 0) { // This is needed only for multiple viewfields. drupal_add_css(drupal_get_path('module', 'viewfield') .'/theme/viewfield.css'); Index: viewfield.module =================================================================== --- viewfield.module (revision 89) +++ viewfield.module (working copy) @@ -4,6 +4,11 @@ /** * @file * Core functions. + * + * @todo $field['token_enabled'] is needless, as we can replace both legacy tokens + * and Token module tokens without conflicts. Also consider to add a hard + * dependency on Token. Double-check potential performance issues mentioned in + * code comments. */ /** @@ -12,8 +17,10 @@ function viewfield_field_info() { return array( 'viewfield' => array( - 'label' => t('View field'), - 'description' => t('Defines a field type that displays the contents of a view in a node.'), + // Should be "View", but that would translate into "view" (show) for many + // languages due to missing string translation contexts. + 'label' => t('Views'), + 'description' => t('Displays a selected view in a node.'), 'callbacks' => array( 'tables' => CONTENT_CALLBACK_NONE, 'arguments' => CONTENT_CALLBACK_NONE, @@ -30,41 +37,28 @@ function viewfield_field_settings($op, $ case 'form': $form['allowed_views'] = array( '#type' => 'checkboxes', - '#title' => t('Allowed views'), + '#title' => t('Allowed values'), '#default_value' => is_array($field['allowed_views']) ? $field['allowed_views'] : array(), '#options' => drupal_map_assoc(array_keys(views_get_all_views())), - '#description' => t('Only allow users to select from the specified views. If no views are selected, all will be available.'), + '#description' => t('Only selected views will be available for content authors. Leave empty to allow all.'), ); - $form['super_default'] = array( + $form['token_enabled'] = array( '#type' => 'checkbox', - '#title' => t('Use a common default value for all nodes if the user does not override it on the node form.'), - '#default_value' => $field['super_default'], + '#title' => t('Replace token placeholders'), + '#description' => t('Negatively affects site performance in combination with %fields row style.', array('%fields' => t('Fields'))), + '#default_value' => $field['token_enabled'], + '#access' => module_exists('token'), ); - if (module_exists('token')) { - $form['token_enabled'] = array( - '#type' => 'checkbox', - '#title' => t('Enable token replacements.'), - '#description' => t('Token replacements will affect the site performance if using a Viewfield inside a View that has field row style.'), - '#default_value' => $field['token_enabled'], - ); - } - $form_state = NULL; - $form['#node'] = (object) array('type' => $field['type_name']); - module_load_include('inc', 'content', 'includes/content.node_form'); - $field_form = content_field_form($form, $form_state, $field, 0); - $form['super_default_widget'] = &$field_form[$field['field_name']][0]; - $form['super_default_widget']['#tree'] = TRUE; - unset($form['super_default_widget']['#weight']); return $form; case 'validate': - if ($field['force_default'] && $field['multiple']) { + if ($field['multiple'] && $field['widget']['force_default']) { form_set_error('multiple', t('Multiple views are not supported if force default is enabled.')); } break; case 'save': - return array('allowed_views', 'super_default', 'token_enabled', 'super_default_widget'); + return array('allowed_views', 'token_enabled'); case 'database columns': return array( @@ -81,25 +75,11 @@ function viewfield_field($op, &$node, $f switch ($op) { case 'presave': foreach ($items as $delta => $item) { - if ($field['super_default'] && empty($item['override_default']) || $field['widget']['force_default']) { - $items[$delta] = array('vname' => NULL, 'vargs' => NULL); - } - elseif (empty($item['vname'])) { + if (empty($item['vname'])) { unset($items[$delta]); } } break; - - case 'sanitize': - foreach ($items as $delta => $item) { - $item = empty($item['vname']) || $field['widget']['force_default'] ? $field['super_default_widget'] : $item; - if ($field['super_default']) { - $item['override_default'] = !empty($item['vname']); - } - $item['token_enabled'] = _viewfield_token_enabled($field); - $items[$delta] = $item; - } - return array($field['field_name'] => $items); } } @@ -132,7 +112,7 @@ function viewfield_widget_info() { 'field types' => array('viewfield'), 'multiple_values' => CONTENT_HANDLE_CORE, 'callbacks' => array( - 'default value' => CONTENT_CALLBACK_NONE, + 'default value' => CONTENT_CALLBACK_DEFAULT, ), ), ); @@ -146,13 +126,16 @@ function viewfield_widget_settings($op, case 'form': $form['force_default'] = array( '#type' => 'checkbox', - '#title' => t('Force default'), + '#title' => t('Always use default value'), '#default_value' => $widget['force_default'], - '#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.'), + '#description' => t('Hides this field in forms and forces the default value defined below.'), ); return $form; + case 'save': - return array('force_default'); + return array( + 'force_default', + ); } } @@ -160,16 +143,9 @@ function viewfield_widget_settings($op, * Implementation of hook_widget(). */ function viewfield_widget(&$form, &$form_state, $field, $items, $delta = 0) { - // Since tabledrag.js currently cannot handle nested tables, if we are - // adding/editing a node we have to show the token help just below the - // viewfield select widget. - if ($delta == 0 && $field['multiple'] && !$field['widget']['force_default'] && _viewfield_token_enabled($field)) { - $form['token_help'] = _viewfield_get_token_help($field); - $form['token_help']['#weight'] = $field['widget']['weight'] + 1; - } $element = array( '#type' => $field['widget']['type'], - '#default_value' => isset($items[$delta]) ? $items[$delta] : $field['super_default_widget'], + '#default_value' => isset($items[$delta]) ? $items[$delta] : NULL, ); return $element; } @@ -189,81 +165,60 @@ function viewfield_elements() { } function viewfield_select_process($element, $edit, $form_state, $form) { - $field = $form['#field_info'][$element['#field_name']]; - $element['#field_info'] = $form['#field_info']; // This form is used for both the default value field in the admin as well as // the node edit form, so we have to make sure we show the default value field // always. - $node = isset($form['#node']) ? $form['#node'] : (object) array('type' => $field['type_name']); - $field_settings = !isset($node->uid); + $is_field_settings_form = !isset($form['#node']); + + $field = $form['#field_info'][$element['#field_name']]; + $element['#field'] = $field; - if ($field['widget']['force_default'] && !$field_settings) { - $element['vname'] = array( - '#type' => 'value', - '#value' => $element['#default_value']['vname'], - ); - $element['vargs'] = array( - '#type' => 'value', - '#value' => $element['#default_value']['vargs'], // All views share args (for now). - ); + // Display the form to let the user pick a view. + $options = _viewfield_potential_references($field, $element['#delta']); + $element['vname'] = array( + '#type' => 'select', + '#title' => $element['#title'], + '#options' => $options, + '#default_value' => $element['#default_value']['vname'], + '#required' => $element['#required'], + '#access' => $is_field_settings_form || !$field['widget']['force_default'], + '#description' => $element['#description'], + ); + // If there is only one option, only show arguments. + if (count($options) == 1 && !$is_field_settings_form) { + list($key, $label) = each($options); + $element['vname']['#access'] = FALSE; + $element['vname']['#default_value'] = $key; } - else { - // Display the form to let the user pick a view. - $options = _viewfield_potential_references($field, $element['#delta']); - // Provide our own overriding of defaults. - if ($field['super_default'] && !$field_settings) { - $element['override_default'] = array( - '#type' => 'checkbox', - '#title' => t('Override default'), - '#default_value' => $element['#value']['override_default'], - ); - } - if (count($options) > 1) { - $element['vname'] = array( - '#type' => 'select', - '#options' => $options, - '#default_value' => $element['#default_value']['vname'], - '#title' => $element['#title'], - '#required' => $element['#required'], - '#description' => $element['#description'], - '#field_name' => $element['#field_name'], - '#type_name' => $element['#type_name'], - '#delta' => $element['#delta'], - '#columns' => $element['#columns'], + + $element['vargs'] = array( + '#type' => 'textfield', + '#title' => !isset($label) ? t('Arguments') : t('%field (@value) arguments', array( + '%field' => $field['widget']['label'], + '@value' => $label, + )), + '#default_value' => $element['#default_value']['vargs'], + '#access' => $is_field_settings_form || !$field['widget']['force_default'], + '#description' => t('A comma separated list of arguments to pass to the selected view. Wrap arguments containing commas in double quotes. Replace double quotes in arguments with two double quotes.'), + ); + if (module_exists('token') && ($is_field_settings_form || $field['token_enabled'])) { + // Only show token help for first value or in field settings form. + if ($element['#delta'] == 0 && !$field['widget']['force_default']) { + $element['token_help'] = array( + '#type' => 'fieldset', + '#title' => t('Placeholder tokens'), + '#collapsible' => TRUE, + '#collapsed' => TRUE, ); - $args_title = t('Arguments'); - } - else { - // There's only the one view, so only show the arguments. - list($key, $label) = each($options); - $element['vname'] = array( - '#type' => 'value', - '#value' => $key, + $element['token_help']['tokens'] = array( + '#value' => theme('token_help', 'node'), ); - $args_title = $field_settings ? t('Arguments') : $field['widget']['label'] ." ($label) ". t('arguments'); - } - $element['vargs'] = array( - '#type' => 'textfield', - '#title' => $args_title, - '#default_value' => $element['#default_value']['vargs'], - '#required' => FALSE, - '#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.'), - '#field_name' => $element['#field_name'] .' '. t('arguments'), - '#type_name' => 'text', - '#delta' => $element['#delta'], - '#columns' => $element['#columns'], - ); - $token_desc = ($token_enabled = _viewfield_token_enabled($field)) ? - t('Use the syntax [token] if you want to insert a replacement pattern.') : - 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.'); - $element['vargs']['#description'] .= "
\n$token_desc"; - // Since tabledrag.js currently cannot handle nested tables, we show the - // token help inside the fieldset only in the field settings form or in - // single-value mode. - if ($token_enabled && ($field_settings || !$field['multiple'])) { - $element['token_help'] = _viewfield_get_token_help($field); } } + else { + $element['vargs']['#description'] .= '
' . t('Available tokens: %nid for the id of the current node, %author for the node author, and %viewer for viewing user.'); + } + return $element; } @@ -288,25 +243,6 @@ function _viewfield_potential_references } /** - * Return the token replacement help - */ -function _viewfield_get_token_help($field) { - // TODO: Token support right now is a bit hacked on, needs better integration, - // eventually a checkbox to enable/disable use of token-module here. - $token_help = array( - '#title' => t('Token replacement patterns'), - '#type' => 'fieldset', - '#collapsible' => TRUE, - '#collapsed' => TRUE, - '#weight' => $field['widget']['weight'] - ); - $token_help['help'] = array( - '#value' => theme('token_help', 'node'), - ); - return $token_help; -} - -/** * Implementation of hook_theme(). */ function viewfield_theme() { @@ -332,16 +268,3 @@ function viewfield_views_api() { ); } -/** - * If the super defaults are enabled return them, otherwise return blank values - */ -function _viewfield_get_super_defaults($field) { - return $field['super_default'] ? $field['super_default_widget'] : array('vname' => NULL, 'vargs' => NULL); -} - -/** - * Check if the token replacements are enabled - */ -function _viewfield_token_enabled($field) { - return $field['token_enabled'] && module_exists('token'); -} Index: viewfield.install =================================================================== --- viewfield.install (revision 89) +++ viewfield.install (working copy) @@ -78,3 +78,16 @@ function viewfield_update_6000() { } return $ret; } + +/** + * Major module clean-up. + * + * - $field['super_default'] is gone, which previously allowed to save nodes + * without any viewfield value, but use the field's configured default value + * automatically. Doesn't make sense, because the configured default value is + * preselected in the form already, and CCK/Field API always stores a value, + * even if it is the same as the default value. + * - $field['super_default_widget'] is equally gone, without replacement, as it + * merely completed aforementioned functionality. + * - $field['widget']['override_default'] is also gone, ditto. + */