diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 72583c7..9feb020 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,22 @@ Viewfield x.x-x.x, xxxx-xx-xx ----------------------------- +Viewfield 6.x-2.x, xxxx-xx-xx +----------------------------- +#489908 by sun, keithm: Change default value settings to field instance level. + - $field['super_default'] is gone, which previously allowed saving nodes + with no viewfield value, but then to use the field's configured default + values automatically. This had an effect only for nodes that were created + before the viewfield was created, because viewfields in nodes created after + any field is created receive the configured default value preselected in the + node edit form, 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. + - $field['token_enabled'] is also gone, as we can replace both legacy tokens + and Token module tokens without conflicts. + - Global default values are migrated to the instance level. Viewfield 6.x-1.x, xxxx-xx-xx ----------------------------- diff --git a/theme/viewfield.theme.inc b/theme/viewfield.theme.inc index 2c1c3f3..edb418c 100644 --- a/theme/viewfield.theme.inc +++ b/theme/viewfield.theme.inc @@ -15,7 +15,7 @@ function theme_viewfield_formatter_default($element) { // For safety's sake, we can only display 2 levels of viewfields. if (!isset($_viewfield_stack[$node->nid]) && count($_viewfield_stack) <= 2) { list($view_name, $display) = explode('|', $element['#item']['vname'], 2); - $view_args = _viewfield_get_view_args($element['#item']['token_enabled'], $element['#item']['vargs'], $element['#node']); + $view_args = _viewfield_get_view_args($element['#item']['vargs'], $element['#node']); // Prevent infinite recursion. if ($node->nid) { @@ -48,7 +48,7 @@ function theme_viewfield_formatter_default($element) { /** * Perform argument replacement */ -function _viewfield_get_view_args($token_enabled, $vargs, $node) { +function _viewfield_get_view_args($vargs, $node) { $args = array(); // Prevent token_replace() from running this function a second time // before it completes the first time. @@ -82,7 +82,8 @@ function _viewfield_get_view_args($token_enabled, $vargs, $node) { $pos = strlen($vargs); } } - if ($token_enabled) { + // Try to replace tokens if $args might contain one. + if (strpos($vargs, '[') !== FALSE && module_exists('token')) { $tokens = FALSE; // If the view field is being loaded as a "view field" of "view row", // instead of a simple "node field", the node object is not fully populated: @@ -105,7 +106,7 @@ function _viewfield_get_view_args($token_enabled, $vargs, $node) { 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'); diff --git a/viewfield.install b/viewfield.install index cb94c1d..67c45ee 100644 --- a/viewfield.install +++ b/viewfield.install @@ -112,3 +112,35 @@ function viewfield_update_6001() { } return $ret; } + +/** + * Migrate global default_value settings to instance level. + */ +function viewfield_update_6002() { + if ($abort = content_check_update('viewfield')) { + return $abort; + } + $ret = array(); + $settings_updates = array(); + $instance_table = content_instance_tablename(); + $field_table = content_field_tablename(); + $result = db_query("SELECT * FROM {". $instance_table ."} it LEFT JOIN {". $field_table ."} ft ON ft.field_name = it.field_name WHERE ft.type = 'viewfield'"); + while ($field = db_fetch_array($result)) { + $global_settings = unserialize($field['global_settings']); + $widget_settings = unserialize($field['widget_settings']); + if (isset($global_settings['super_default_widget']['vname']) && !isset($widget_settings['default_value'][0]['vname'])) { + $widget_settings['default_value'][0]['vname'] = $global_settings['super_default_widget']['vname']; + $widget_settings['default_value'][0]['vargs'] = $global_settings['super_default_widget']['vargs']; + $settings_updates[] = array( + 'field_name' => $field['field_name'], + 'type_name' => $field['type_name'], + 'widget_settings' => serialize($widget_settings), + ); + } + } + foreach ($settings_updates as $settings_update) { + $sql = sprintf("UPDATE {" . $instance_table . "} SET widget_settings = '%s' WHERE field_name = '%s' AND type_name = '%s'", $settings_update['widget_settings'], $settings_update['field_name'], $settings_update['type_name']); + $ret[] = update_sql($sql); + } + return $ret; +} diff --git a/viewfield.module b/viewfield.module index 7c88380..5a647db 100755 --- a/viewfield.module +++ b/viewfield.module @@ -3,6 +3,8 @@ /** * @file * Core functions. + * + * @todo Double-check potential performance issues mentioned in code comments. */ /** @@ -36,25 +38,6 @@ function viewfield_field_settings($op, $field) { '#options' => drupal_map_assoc(array_keys(views_get_all_views())), '#description' => t('Only selected views will be available for content authors. Leave empty to allow all.'), ); - $form['super_default'] = 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'], - ); - $form['token_enabled'] = array( - '#type' => 'checkbox', - '#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'), - ); - $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': @@ -64,7 +47,9 @@ function viewfield_field_settings($op, $field) { break; case 'save': - return array('allowed_views', 'super_default', 'token_enabled', 'super_default_widget'); + return array( + 'allowed_views', + ); case 'database columns': return array( @@ -83,25 +68,11 @@ function viewfield_field($op, &$node, $field, &$items, $teaser, $page) { 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); } } @@ -134,7 +105,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, ), ), ); @@ -155,7 +126,9 @@ function viewfield_widget_settings($op, $widget) { return $form; case 'save': - return array('force_default'); + return array( + 'force_default', + ); } } @@ -163,16 +136,9 @@ function viewfield_widget_settings($op, $widget) { * 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; } @@ -192,74 +158,63 @@ function viewfield_elements() { } function viewfield_select_process($element, $edit, $form_state, $form) { - $field = isset($form['#field_info'][$element['#field_name']]) ? $form['#field_info'][$element['#field_name']] : NULL; - $element['#field_info'] = isset($form['#field_info']) ? $form['#field_info'] : NULL; // 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']); - 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). - ); + $field = isset($form['#field_info'][$element['#field_name']]) ? $form['#field_info'][$element['#field_name']] : NULL; + $element['#field'] = $field; + // 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' => isset($field['widget']['default_value']) ? $field['widget']['default_value'][$element['#delta']]['vname'] : NULL, + '#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' => isset($element['#default_value']['vname']) ? $element['#default_value']['vname'] : NULL, - '#title' => $element['#title'], - '#required' => $element['#required'], - '#description' => $element['#description'], + + $element['vargs'] = array( + '#type' => 'textfield', + '#title' => !isset($label) ? t('Arguments') : t('%field (@value) arguments', array( + '%field' => $field['widget']['label'], + '@value' => $label, + )), + '#default_value' => isset($field['widget']['default_value']) ? $field['widget']['default_value'][$element['#delta']]['vargs'] : NULL, + '#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.'), + ); + $token_description = t('Available tokens: %nid for the id of the current node; %author for the node author; %viewer for the viewing user'); + if (module_exists('token')) { + $element['vargs']['#description'] .= + '
' . $token_description . '; ' . t('or any token from the placeholder token list.') + . '
' . t('Note: Using placeholder tokens in combination with the %fields row style may negatively affect site performance.', array('%fields' => t('Fields'))); + // 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, ); - } - 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'), ); } - $element['vargs'] = array( - '#type' => 'textfield', - '#title' => !isset($label) ? t('Arguments') : t('%field (@value) arguments', array( - '%field' => $field['widget']['label'], - '@value' => $label, - )), - '#default_value' => isset($element['#default_value']['vargs']) ? $element['#default_value']['vargs'] : NULL, - '#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.'), - ); - $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'] .= '
' . $token_description . '.'; + } + return $element; } @@ -288,25 +243,6 @@ function _viewfield_potential_references($field, $delta = 0) { } /** - * 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() { @@ -331,17 +267,3 @@ function viewfield_views_api() { 'path' => drupal_get_path('module', 'viewfield') .'/includes', ); } - -/** - * 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'); -}