diff --git theme/viewfield.theme.inc theme/viewfield.theme.inc
index 4de252a..966d217 100644
--- theme/viewfield.theme.inc
+++ theme/viewfield.theme.inc
@@ -16,7 +16,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) {
@@ -49,7 +49,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.
@@ -83,7 +83,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:
@@ -106,7 +107,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 viewfield.install viewfield.install
index ecbf56d..aa4c745 100644
--- viewfield.install
+++ viewfield.install
@@ -78,3 +78,20 @@ 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.
+ * - $field['token_enabled'] is also gone, as we can replace both legacy tokens
+ * and Token module tokens without conflicts. Form descriptions have been adapted
+ * to disclose potential performance degradation when Token module tokens
+ * are used.
+ */
diff --git viewfield.module viewfield.module
index aabd20e..c3f753f 100755
--- viewfield.module
+++ viewfield.module
@@ -4,6 +4,10 @@
/**
* @file
* Core functions.
+ *
+ * @todo Consider to add a hard dependency on Token.
+ * Double-check potential performance issues mentioned in
+ * code comments.
*/
/**
@@ -37,25 +41,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':
@@ -65,7 +50,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(
@@ -82,25 +69,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);
}
}
@@ -133,7 +106,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,
),
),
);
@@ -154,7 +127,9 @@ function viewfield_widget_settings($op, $widget) {
return $form;
case 'save':
- return array('force_default');
+ return array(
+ 'force_default',
+ );
}
}
@@ -162,16 +137,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;
}
@@ -191,74 +159,63 @@ 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']);
- 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 = $form['#field_info'][$element['#field_name']];
+ $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' => $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'],
+
+ $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.'),
+ );
+ $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' => $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.'),
- );
- $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;
}
@@ -287,25 +244,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() {
@@ -330,17 +268,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');
-}