diff --git hierarchical_select-rtl.css hierarchical_select-rtl.css
index e929bd8..e48b619 100644
diff --git hierarchical_select.admin.inc hierarchical_select.admin.inc
index 337a243..79cc834 100644
--- hierarchical_select.admin.inc
+++ hierarchical_select.admin.inc
@@ -98,7 +98,6 @@ function hierarchical_select_admin_configs() {
)),
);
}
-
return theme('table', $header, $rows, array(), t('Overview of all Hierarchical Select configurations.'));
}
diff --git hierarchical_select.module hierarchical_select.module
index d80434e..a6dea15 100644
--- hierarchical_select.module
+++ hierarchical_select.module
@@ -302,6 +302,10 @@ function hierarchical_select_json() {
if (!empty($storage['file'])) {
require_once($storage['file']);
}
+ if (!function_exists($form_id) && preg_match('/^.*_node_form$/', $form_id)) {
+ require_once(drupal_get_path('module', 'node') .'/node.pages.inc');
+ }
+
$form = call_user_func_array('drupal_retrieve_form', $storage['parameters']);
drupal_prepare_form($form_id, $form, $form_state);
$form['#post'] = $_POST;
diff --git js/jquery.ui/effects.core.js js/jquery.ui/effects.core.js
index f634533..efd60ee 100644
diff --git js/jquery.ui/effects.drop.js js/jquery.ui/effects.drop.js
index 466bb55..e45bc9b 100644
diff --git modules/hs_content_taxonomy.admin.inc modules/hs_content_taxonomy.admin.inc
new file mode 100644
index 0000000..e56a0a1
--- /dev/null
+++ modules/hs_content_taxonomy.admin.inc
@@ -0,0 +1,85 @@
+
+/**
+ * Form definition; configuration form for Hierarchical Select as the widget
+ * for a content_taxonomy field.
+ *
+ * @param $content_type_name
+ * Name of a content type. Provides necessary context.
+ * @param $field_name
+ * Name of a field. Provides necessary context.
+ */
+function hs_content_taxonomy_config_form($form_state, $content_type_name, $field_name) {
+ require_once(drupal_get_path('module', 'hierarchical_select') .'/includes/common.inc');
+
+ drupal_add_css(drupal_get_path('module', 'hs_content_taxonomy') .'/hs_content_taxonomy.css');
+
+ $content_type = content_types($content_type_name);
+
+ $field = $content_type['fields'][$field_name];
+
+ // Extract the necessary context from the $field array.
+ $vid = $field['vid'];
+ $tid = $field['tid'];
+ $depth = (empty($field['depth'])) ? 0 : $field['depth'];
+
+ // Add the Hierarchical Select config form.
+ $module = 'hs_content_taxonomy';
+ $params = array(
+ 'vid' => $vid,
+ 'tid' => $tid,
+ 'depth' => $depth,
+ );
+ $config_id = "content-taxonomy-$field_name";
+ $vocabulary = taxonomy_vocabulary_load($vid);
+ $defaults = array(
+ // Enable the save_lineage setting by default if the multiple parents
+ // vocabulary option is enabled.
+ 'save_lineage' => (int) ($vocabulary->hierarchy == 2),
+ 'editability' => array(
+ 'max_levels' => min($depth, _hs_taxonomy_hierarchical_select_get_depth($vid)),
+ ),
+ );
+ // If this config is being created (not edited), then enable the dropbox if
+ // this is a "multiple values" field. This allows for an intuitive
+ // transition to a Hierarchical Select widget.
+ if (variable_get('hs_config_'. $config_id, FALSE) === FALSE) {
+ $defaults['dropbox']['status'] = $field['multiple'];
+ }
+ $strings = array(
+ 'hierarchy' => t('vocabulary'),
+ 'hierarchies' => t('vocabularies'),
+ 'item' => t('term'),
+ 'items' => t('terms'),
+ 'item_type' => t('term type'),
+ 'entity' => t('node'),
+ 'entities' => t('nodes'),
+ );
+ $max_hierarchy_depth = min(($depth == 0) ? 9 : $depth, _hs_taxonomy_hierarchical_select_get_depth($vid));
+ $preview_is_required = $field['required'];
+ $form['hierarchical_select_config'] = hierarchical_select_common_config_form($module, $params, $config_id, $defaults, $strings, $max_hierarchy_depth, $preview_is_required);
+
+ $form['link'] = array(
+ '#value' => l('Back to the field configuration', 'admin/content/node-type/'. $content_type['type'] .'/fields/'. $field_name),
+ '#prefix' => '
',
+ '#suffix' => '
',
+ '#weight' => -5,
+ );
+
+ $form['save'] = array(
+ '#type' => 'submit',
+ '#value' => t('Save'),
+ );
+ $form['#content_type_name'] = $content_type_name;
+ $form['#field_name'] = $field_name;
+
+ // Add the the submit handler for the Hierarchical Select config form.
+ //$parents = array('hierarchical_select_config');
+ $parents = array('hierarchical_select_config');
+ $form['#submit'][] = 'hierarchical_select_common_config_form_submit';
+ $form['#hs_common_config_form_parents'] = $parents;
+
+ $form['#submit'][]='hs_content_taxonomy_common_config_form_submit';
+ // = array($content_type_name, $field_name);
+
+ return $form;
+}
diff --git modules/hs_content_taxonomy.info modules/hs_content_taxonomy.info
index 532a294..1bfdde4 100644
--- modules/hs_content_taxonomy.info
+++ modules/hs_content_taxonomy.info
@@ -1,7 +1,9 @@
; $Id: hs_content_taxonomy.info,v 1.2 2008/06/28 18:25:28 wimleers Exp $
name = Hierarchical Select Content Taxonomy
description = Use Hierarchical Select as the widget for Content Taxonomy CCK fields.
-dependencies = hierarchical_select content_taxonomy hs_taxonomy
+dependencies[] = hierarchical_select
+dependencies[] = content_taxonomy
+dependencies[] = hs_taxonomy
package = Form Elements
; Information added by drupal.org packaging script on 2009-04-07
diff --git modules/hs_content_taxonomy.module modules/hs_content_taxonomy.module
index bebfe92..51983f2 100644
--- modules/hs_content_taxonomy.module
+++ modules/hs_content_taxonomy.module
@@ -16,160 +16,99 @@
* - etc.
*/
-
-define('HS_CONTENT_TAXONOMY_SEPARATOR', '›');
-
-
//----------------------------------------------------------------------------
// Core hooks.
/**
* Implementation of hook_menu().
*/
-function hs_content_taxonomy_menu($may_cache) {
- $items = array();
-
- if (!$may_cache) {
- $context = _hs_content_taxonomy_parse_context_from_url();
- if (is_array($context)) {
- list($content_type_name, $field_name) = $context;
+function hs_content_taxonomy_menu() {
+ $items['admin/content/node-type/%/fields/%/hs_config'] = array(
+ 'title' => t('HS config'),
+ 'access arguments' => array('administer site configuration'),
+ 'page callback' => 'drupal_get_form',
+ 'page arguments' => array('hs_content_taxonomy_config_form', 3, 5),
+ 'type' => MENU_NORMAL_ITEM,
+ 'file' => 'hs_content_taxonomy.admin.inc',
+ );
+ return $items;
+}
- $content_type = content_types($content_type_name);
- $items[] = array(
- 'path' => 'admin/content/types/'. $content_type['url_str'] .'/fields/'. $field_name .'/hs_config',
- 'title' => t('Hierarchical Select configuration for !field', array('!field' => $content_type['fields'][$field_name]['widget']['label'])),
- 'callback' => 'drupal_get_form',
- 'callback arguments' => array('hs_content_taxonomy_config_form', $content_type['type'], $field_name),
- 'access' => user_access('administer content types'),
- 'type' => MENU_CALLBACK,
+function hs_content_taxonomy_form_submit(&$form, &$form_state){
+
+ foreach ($form['#field_info'] as $field_name => $field_info) { // what's this: => &$field_info
+ if ($field_info['widget']['type'] == 'content_taxonomy_hs') {
+
+ /*
+ @todo: Loze: the majority of my edits are here in this function.
+ there is probably a more elegant way of doing this,
+ but the array of tids we not being set to the content_taxonomy module it the format it expected.
+
+ // i think this is right, now.
+
+ [field_name]
+ [0] = array('value' => $tid)
+ [1] = array('value' => $tid)
+ [2] = array('value' => $tid)
+ [tids] = array(
+ [0] = array('value' => $tid)
+ [1] = array('value' => $tid)
+ [2] = array('value' => $tid)
);
+
+ */
+
+
+
+ if (is_array($form_state['values'][$field_name]['tids'])) {
+ $values = array();
+ foreach($form_state['values'][$field_name]['tids'] as $tid) {
+ $values[] = array('value' => $tid);
+ array_unshift($form_state['values'][$field_name], array('value' => $tid));
+ }
+ $form_state['values'][$field_name]['tids'] = $values;
+
+ } else {
+ $values[] = array('value' => $form_state['values'][$field_name]['tids']);
+ array_unshift($form_state['values'][$field_name],array('value' => $form_state['values'][$field_name]['tids']));
+ $form_state['values'][$field_name]['tids'] = $values;
+ }
}
}
- return $items;
-}
+}
/**
* Implementation of hook_form_alter().
*/
-function hs_content_taxonomy_form_alter($form_id, &$form) {
- if ($form_id == '_content_admin_field') {
- if ($form['widget']['widget_type']['#default_value'] == 'content_taxonomy_hs') {
- // Hide the "multiple values" setting, so the user can't change it.
- $form['field']['multiple']['#type'] = 'hidden';
-
- // Add a fake checkbox form item to indicate the current state of this
- // setting. Because this checkbox is disabled, it won't be submitted,
- // and that's why we have to add a fake form item.
- $split = array_search('multiple', array_keys($form['field'])) + 1;
- $first_part = array_slice($form['field'], 0, $split);
- $second_part = array_slice($form['field'], $split);
- $form['field'] = $first_part;
- $form['field']['fake_multiple'] = $form['field']['multiple'];
- $form['field']['fake_multiple']['#type'] = 'checkbox';
- $form['field']['fake_multiple']['#attributes'] = array('disabled' => 'disabled');
- $form['field']['fake_multiple']['#description'] = t(
- 'This setting is now managed by the Hierarchical Select widget
- configuration!'
- );
- $form['field'] += $second_part;
- }
- }
+function hs_content_taxonomy_form_alter(&$form, &$form_state, $form_id) {
+ if (isset($form['type']) && $form['type']['#value'] .'_node_form' == $form_id){
+ if (sizeof($form['#field_info']) > 0){
+ foreach ($form['#field_info'] as $field_name=>&$field_info){
+ if ($field_info['widget']['type'] == 'content_taxonomy_hs'){
+ $form['#submit'][] = 'hs_content_taxonomy_form_submit';
+ break;
+ }
+ }
+ }
+ }
}
//----------------------------------------------------------------------------
// Forms API callbacks.
-/**
- * Form definition; configuration form for Hierarchical Select as the widget
- * for a content_taxonomy field.
- *
- * @param $content_type_name
- * Name of a content type. Provides necessary context.
- * @param $field_name
- * Name of a field. Provides necessary context.
- */
-function hs_content_taxonomy_config_form($content_type_name, $field_name) {
- require_once(drupal_get_path('module', 'hierarchical_select') .'/includes/common.inc');
-
- drupal_add_css(drupal_get_path('module', 'hs_content_taxonomy') .'/hs_content_taxonomy.css');
-
- $content_type = content_types($content_type_name);
- $field = $content_type['fields'][$field_name];
-
- // Extract the necessary context from the $field array.
- $vid = $field['vid'];
- $tid = $field['tid'];
- $depth = (empty($field['depth'])) ? 0 : $field['depth'];
-
- // Add the Hierarchical Select config form.
- $module = 'hs_content_taxonomy';
- $params = array(
- 'vid' => $vid,
- 'tid' => $tid,
- 'depth' => $depth,
- );
- $config_id = "content-taxonomy-$field_name";
- $vocabulary = taxonomy_get_vocabulary($vid);
- $defaults = array(
- // Enable the save_lineage setting by default if the multiple parents
- // vocabulary option is enabled.
- 'save_lineage' => (int) ($vocabulary->hierarchy == 2),
- 'editability' => array(
- 'max_levels' => min($depth, _hs_taxonomy_hierarchical_select_get_depth($vid)),
- ),
- );
- // If this config is being created (not edited), then enable the dropbox if
- // this is a "multiple values" field. This allows for an intuitive
- // transition to a Hierarchical Select widget.
- if (variable_get('hs_config_'. $config_id, FALSE) === FALSE) {
- $defaults['dropbox']['status'] = $field['multiple'];
- }
- $strings = array(
- 'hierarchy' => t('vocabulary'),
- 'hierarchies' => t('vocabularies'),
- 'item' => t('term'),
- 'items' => t('terms'),
- 'item_type' => t('term type'),
- 'entity' => t('node'),
- 'entities' => t('nodes'),
- );
- $max_hierarchy_depth = min(($depth == 0) ? 9 : $depth, _hs_taxonomy_hierarchical_select_get_depth($vid));
- $preview_is_required = $field['required'];
- $form['hierarchical_select_config'] = hierarchical_select_common_config_form($module, $params, $config_id, $defaults, $strings, $max_hierarchy_depth, $preview_is_required);
-
- $form['link'] = array(
- '#value' => l('Back to the field configuration', 'admin/content/types/'. $content_type['url_str'] .'/fields/'. $field_name),
- '#prefix' => '',
- '#suffix' => '
',
- '#weight' => -5,
- );
-
- $form['save'] = array(
- '#type' => 'submit',
- '#value' => t('Save'),
- );
-
- // Add the the submit handler for the Hierarchical Select config form.
- $parents = array('hierarchical_select_config');
- $form['#submit']['hierarchical_select_common_config_form_submit'] = array($parents);
-
- $form['#submit']['hs_content_taxonomy_common_config_form_submit'] = array($content_type_name, $field_name);
-
- return $form;
-}
/**
* Additional submit callback to update the multiple values field setting.
*/
-function hs_content_taxonomy_common_config_form_submit($form_id, $form_state['values'], $content_type_name, $field_name) {
+function hs_content_taxonomy_common_config_form_submit( &$form, &$form_state) {
$config = $form_state['values']['hierarchical_select_config'];
$multiple_values = ($config['save_lineage'] | $config['dropbox']['status']);
- $content_type = content_types($content_type_name);
- $field = $content_type['fields'][$field_name];
+ $content_type = content_types($form['#content_type_name']);
+ $field = $content_type['fields'][$form['#field_name']];
$form_state['values'] = array(
'widget_type' => 'content_taxonomy_hs',
@@ -185,13 +124,14 @@ function hs_content_taxonomy_common_config_form_submit($form_id, $form_state['va
'op' => t('Save field settings'),
'submit' => t('Save field settings'),
'type_name' => $field['type_name'],
- 'field_name' => $field_name,
+ 'field_name' => $form['#field_name'],
'field_type' => 'content_taxonomy',
- 'module' => 'content_taxonomy, hs_content_taxonomy',
- 'form_id' => '_content_admin_field',
+ 'module' => 'content_taxonomy, hs_content_taxonomy, content',
+ 'form_id' => 'content_field_edit_form',
);
- drupal_execute('_content_admin_field', $form_state['values'], $field['type_name'], $field_name);
+ require_once(drupal_get_path('module', 'content') .'/includes/content.admin.inc');
+ drupal_execute('content_field_edit_form', $form_state['values'], $field['type_name'], $form['#field_name']);
}
@@ -199,17 +139,22 @@ function hs_content_taxonomy_common_config_form_submit($form_id, $form_state['va
// CCK hooks.
/**
- * Implementation of hook_widget_info().
+ * Implementation of hook_field_info().
*/
function hs_content_taxonomy_widget_info() {
return array(
'content_taxonomy_hs' => array( // 'content_taxonomy_hs' instead of 'content_taxonomy_hierarchical_select' due to CCK limitations.
'label' => 'Hierarchical Select',
'field types' => array('content_taxonomy'),
+ 'multiple values' => CONTENT_HANDLE_MODULE,
+ 'callbacks' => array(
+ 'default value' => CONTENT_CALLBACK_NONE,
+ ),
),
);
}
+
/**
* Implementation of hook_widget_settings().
*/
@@ -217,28 +162,24 @@ function hs_content_taxonomy_widget_settings($op, $widget) {
switch ($op) {
case 'form':
drupal_add_css(drupal_get_path('module', 'hs_content_taxonomy') .'/hs_content_taxonomy.css');
-
$context = _hs_content_taxonomy_parse_context_from_url();
list($content_type_name, $field_name) = $context;
- $content_type = content_types($content_type_name);
- $url = 'admin/content/types/'. $content_type['url_str'] .'/fields/'. $field_name .'/hs_config';
+ $url = 'admin/content/node-type/'. $content_type_name .'/fields/'. $field_name .'/hs_config';
$items[] = t(
"Due to limitations of CCK, there is a separate form to
configure this Hierarchical Select widget's
- settings.",
- array('!url' => url($url))
- );
+ settings.",array('!url' => url($url)));
$items[] = t(
'The %multiple_values field setting is now managed by the Hierarchical
Select module: it will be enabled when either the %enable_the_dropbox
or %save_term_lineage settings (or both) are enabled.',
- array(
+ array(
'%multiple_values' => t('Multiple values'),
'%enable_the_dropbox' => t('Enable the dropbox'),
'%save_term_lineage' => t('Save term lineage'),
- )
+ )
);
$form['hs_config'] = array(
@@ -256,25 +197,30 @@ function hs_content_taxonomy_widget_settings($op, $widget) {
return array(
'default value' => CONTENT_CALLBACK_NONE,
);
- }
+ }
}
/**
* Implementation of hook_widget().
*/
-function hs_content_taxonomy_widget($op, &$node, $field, &$node_field) {
- if ($field['widget']['type'] == 'content_taxonomy_hs') {
- $field_name = $field['field_name'];
- $vid = $field['vid'];
- $tid = $field['tid'];
- $depth = (empty($field['depth'])) ? 0 : $field['depth'];
-
- switch ($op) {
- case 'form':
- require_once(drupal_get_path('module', 'hierarchical_select') .'/includes/common.inc');
-
- $form[$field_name]['#tree'] = TRUE;
- $form[$field_name]['tids'] = array(
+function hs_content_taxonomy_widget(&$form, &$form_state, $field, $items, $delta = 0) {
+ $field_name = $field['field_name'];
+ $vid = $field['vid'];
+ //$tid = $field['tid'];
+ $tid = (empty($field['tid'])) ? 0 : $field['tid'];
+ $depth = (empty($field['depth'])) ? 0 : $field['depth'];
+ require_once(drupal_get_path('module', 'hierarchical_select') .'/includes/common.inc');
+ $node = &$form['#node'];
+ //dsm($node);
+ foreach($items as $item){
+ $selected_items[] = $item['value'];
+ }
+
+ $node_field = &$node->$field_name;
+ $form[$field_name]['#tree'] = TRUE;
+ $form[$field_name]['#weight'] = $field['widget']['weight'];
+
+ $form[$field_name]['tids'] = array(
'#title' => $field['widget']['label'],
'#type' => 'hierarchical_select',
'#weight' => $field['widget']['weight'],
@@ -288,47 +234,39 @@ function hs_content_taxonomy_widget($op, &$node, $field, &$node_field) {
),
'#required' => $field['required'],
'#description' => t($field['widget']['description']),
- // The default value comes from $node_field (thus from the CCK
- // storage), unless it's empty, then we check if $node->taxonomy
- // (thus 'normal' Taxonomy storage) contains a value, and use that
- // instead, unless that's empty too.
- // The latter will only work reliably if only one content_taxonomy
- // field is being used, because when you have multiple
- // content_taxonomy fields that use the same vocabulary, there's no
- // way to distinguish.
- '#default_value' => ((is_array($node_field[$tid])) ? array_keys($node_field[$tid]) : ((is_array($node->taxonomy)) ? array_keys($node->taxonomy) : array())),
- );
- hierarchical_select_common_config_apply($form[$field_name]['tids'], "content-taxonomy-$field_name");
- return $form;
-
- case 'process form values':
- // TRICKY: this piece of utterly ugly, crappy and dysfunctional code
- // is here thanks to the ugly internal works of the content_taxonomy
- // module that don't make any sense at all. It's necessary to support
- // the 'both' (and 'cck') "save option" of content_taxonomy.
- if (isset($field['save']) && $field['save'] != 'tag') {
- if ($field['multiple'] && is_array($node_field['tids'])) {
- foreach ($node_field['tids'] as $key => $tid) {
- if ($tid != 0) {
- $keys[$tid] = $tid;
- }
- }
- }
- else {
- $keys[$node_field['tids']] = $node_field['tids'];
- }
- $node_field = content_transpose_array_rows_cols(array('value' => $keys));
- }
- else {
- if (!$field['multiple']) {
- $value = $node_field['tids'];
- $node_field['tids'] = array();
- $node_field['tids'][0] = $value;
- }
- }
- break;
- }
- }
+ '#default_value' => !empty($selected_items) ? array_values($selected_items) : array(),
+ );
+
+
+
+ unset($form[$field_name]['#options']); // Unset to prevent passing around of possibly huge HTML.
+ unset($form[$field_name]['#theme']); // Unset to prevent theme_taxonomy_term_select() from running.
+
+ hierarchical_select_common_config_apply($form[$field_name]['tids'], "content-taxonomy-$field_name");
+ return $form;
+
+}
+
+//-------------------------------------------------------------------------------------------------------
+// HS Content Taxonomy CCK formatters
+
+/**
+ * Implementation of hook_theme().
+ */
+function hs_content_taxonomy_theme() {
+ return array(
+ 'hs_content_taxonomy_formatter_hierarchical_text' => array(
+ 'arguments' => array('element' => NULL),
+ 'function' => 'theme_hs_content_taxonomy_formatter_hierarchical',
+ ),
+ 'hs_content_taxonomy_formatter_hierarchical_links' => array(
+ 'arguments' => array('element' => NULL),
+ 'function' => 'theme_hs_content_taxonomy_formatter_hierarchical',
+ ),
+ 'hs_content_taxonomy_row' => array(
+ 'arguments' => array('row' => NULL, 'type' => NULL),
+ ),
+ );
}
/**
@@ -337,33 +275,65 @@ function hs_content_taxonomy_widget($op, &$node, $field, &$node_field) {
function hs_content_taxonomy_field_formatter_info() {
return array(
'hierarchical_text' => array(
- 'label' => 'As hierarchical text',
+ 'label' => t('As hierarchical text'),
'field types' => array('content_taxonomy'),
+ 'multiple values' => CONTENT_HANDLE_MODULE,
),
'hierarchical_links' => array(
- 'label' => 'As hierarchical links',
+ 'label' => t('As hierarchical links'),
'field types' => array('content_taxonomy'),
+ 'multiple values' => CONTENT_HANDLE_MODULE,
),
);
}
/**
- * Implemenation of hook_field_formatter().
+ * Theme function to output single row (lineage) of CT field
+ * Giving levels different classes so some funny theming is possible:
+ * for example, different font size depending on level (like tagadelic)
*/
-function hs_content_taxonomy_field_formatter($field, $item, $formatter, $node) {
+function theme_hs_content_taxonomy_row($row, $type) {
+ $separator = '›';
$output = '';
-
- if (!is_array($item)) {
+ if (empty($row)) {
return $output;
}
+ $items = array();
+ foreach ($row as $level => $item ) {
+ $term = taxonomy_get_term($item['value']);
+ $line = '';
+ // Depending on which formatter is active, create links or use labels.
+ switch ($type) {
+ case 'hierarchical_links':
+ $line .= l($term->name, taxonomy_term_path($term), array('rel' => 'tag', 'title' => $term->description));
+ break;
+ case 'hierarchical_text':
+ $line .= $item['label'];
+ break;
+ }
+ $line .= '';
+ $items[] = $line;
+ }
+ $output = implode($separator , $items);
+ return $output;
+}
+/**
+ * Theme function for HS Content Taxonomy formatters.
+ *
+ */
+function theme_hs_content_taxonomy_formatter_hierarchical($element) {
+ $output = '';
+
// Extract required field information.
+ // $element contains only field name so we use cck function to get more info
+ $field = content_fields($element['#field_name'], $element['#type_name']);
$field_name = $field['field_name'];
$vid = $field['vid'];
- $tid = $field['tid'];
- $depth = (empty($field['depth'])) ? 0 : $field['depth'];
+ $tid = (empty($field['tid'])) ? 0 : $field['tid'];
+ $depth = (empty($field['depth'])) ? 0 : $field['depth'];
- // Get the config for this field.
+ // Get the config for this field
require_once(drupal_get_path('module', 'hierarchical_select') .'/includes/common.inc');
$config_id = "content-taxonomy-$field_name";
$config = hierarchical_select_common_config_get($config_id);
@@ -375,36 +345,51 @@ function hs_content_taxonomy_field_formatter($field, $item, $formatter, $node) {
'depth' => $depth,
),
);
+
+ $selection = array();
+
+ // Cycle through elements
+ foreach (element_children($element) as $key) {
+ if (isset($element[$key]['#item']['value'])) {
+ $selection[] = $element[$key]['#item']['value'];
+ }
+ }
+ // It is said that formatter theme function is called even if field is empty
+ if (empty($selection)) {
+ return $output;
+ }
// Generate a dropbox out of the selection. This will automatically
// calculate all lineages for us.
- $selection = array_keys($item);
$dropbox = _hierarchical_select_dropbox_generate($config, $selection);
// Actual formatting.
- $separator = HS_CONTENT_TAXONOMY_SEPARATOR;
- foreach ($dropbox->lineages as $id => $lineage) {
- if ($id > 0) {
- $output .= '
';
+ // In 6.x formatter is fully themable
+ // We theme each lineage using additional theme function
+ $num_items = count($dropbox->lineages);
+ $flip = array('even' => 'odd', 'odd' => 'even');
+ $class = 'even';
+
+ $output = '';
+ foreach ($dropbox->lineages as $i => $lineage) {
+ $class = $flip[$class];
+ $classes = ' '. $class;
+ if ($i == 0) {
+ $classes .= ' first';
}
-
- $items = array();
- foreach ($lineage as $level => $item) {
- // Depending on which formatter is active, create links or use labels.
- if ($formatter == 'hierarchical_links') {
- $term = taxonomy_get_term($item['value']);
- $items[] = l($term->name, taxonomy_term_path($term), array('rel' => 'tag', 'title' => $term->description));
- }
- else {
- $items[] = $item['label'];
- }
+ if ($i == $num_items - 1) {
+ $classes .= ' last';
}
- $output .= implode($separator, $items);
+
+ $output .= '- ';
+ $output .= theme('hs_content_taxonomy_row', $lineage, $element['#formatter']);
+ $output .= '
';
}
-
+ $output .= '
';
+
// Add the CSS.
drupal_add_css(drupal_get_path('module', 'hierarchical_select') .'/hierarchical_select.css');
-
+
return $output;
}
@@ -428,7 +413,9 @@ function hs_content_taxonomy_hierarchical_select_params() {
* Implementation of hook_hierarchical_select_root_level().
*/
function hs_content_taxonomy_hierarchical_select_root_level($params) {
- $terms = _hs_taxonomy_hierarchical_select_get_tree($params['vid'], $params['tid'], -1, 1);
+ //$tid = $params['tid']? $params['tid']: 0;
+ $tid = $params['tid'];
+ $terms = _hs_taxonomy_hierarchical_select_get_tree($params['vid'], $tid, -1, 1);
return _hs_taxonomy_hierarchical_select_terms_to_options($terms);
}
@@ -437,9 +424,9 @@ function hs_content_taxonomy_hierarchical_select_root_level($params) {
*/
function hs_content_taxonomy_hierarchical_select_children($parent, $params) {
static $tree;
-
- $vid = $params['vid'];
- $tid = $params['tid'];
+ $vid = $params['vid'];
+ //$tid = $params['tid']? $params['tid']: 0;
+ $tid = $params['tid'];
$depth = $params['depth'];
// Keep a static cache of the entire tree, this allows us to quickly look up
@@ -452,6 +439,7 @@ function hs_content_taxonomy_hierarchical_select_children($parent, $params) {
}
}
$terms = ($depth > 0 && $tree[$vid][$tid][$parent] + 1 >= $depth) ? array() : _hs_taxonomy_hierarchical_select_get_tree($vid, $parent, -1, 1);
+ //$terms = _hs_taxonomy_hierarchical_select_get_tree($vid, $parent, -1, 1);
return _hs_taxonomy_hierarchical_select_terms_to_options($terms);
}
@@ -492,6 +480,8 @@ function hs_content_taxonomy_hierarchical_select_valid_item($item, $params) {
return FALSE;
}
$term = taxonomy_get_term($item);
+ // Bug: tid isn't set to zero for some reason when root term is not set, so we make workaround for this
+ //$params['tid'] = $params['tid'] ? $params['tid']: 0;
return ($term->vid == $params['vid'] && _hs_content_taxonomy_term_within_allowed_depth($term->tid, $term->vid, $params['tid'], $params['depth']));
}
@@ -544,7 +534,7 @@ function hs_content_taxonomy_hierarchical_select_config_info() {
if ($field['type'] == 'content_taxonomy') {
foreach ($content_types as $content_type_name => $content_type) {
if (isset($content_type['fields'][$field_name]) && $content_type['fields'][$field_name]['widget']['type'] == 'content_taxonomy_hs') {
- $vocabulary = taxonomy_get_vocabulary($field['vid']);
+ $vocabulary = taxonomy_vocabulary_load($field['vid']);
$config_id = "content-taxonomy-$field_name";
$config_info["$config_id|$content_type_name"] = array(
@@ -555,7 +545,7 @@ function hs_content_taxonomy_hierarchical_select_config_info() {
'entity' => t($content_type['name']),
'context type' => t('Node form'),
'context' => '',
- 'edit link' => "admin/content/types/$content_type_name/fields/$field_name/hs_config",
+ 'edit link' => "admin/content/node-type/$content_type_name/fields/$field_name/hs_config",
);
}
}
@@ -570,6 +560,7 @@ function hs_content_taxonomy_hierarchical_select_config_info() {
//----------------------------------------------------------------------------
// Private functions.
+
/**
* Parse the context (the content type and the field name) from the URL.
*
@@ -578,9 +569,8 @@ function hs_content_taxonomy_hierarchical_select_config_info() {
* - array($content_type_name, $field_name) otherwise
*/
function _hs_content_taxonomy_parse_context_from_url() {
- if (arg(0) == 'admin' && arg(1) == 'content' && arg(2) == 'types') {
+ if (arg(0) == 'admin' && arg(1) == 'content' && arg(2) == 'node-type') {
$content_type = content_types(arg(3));
- $type = node_get_types('types', $content_type['type']);
$field_name = arg(5);