function _hierarchical_select_process_calculate_selections in Hierarchical Select 6.3
Same name and namespace in other branches
- 5.3 hierarchical_select.module \_hierarchical_select_process_calculate_selections()
- 7.3 hierarchical_select.module \_hierarchical_select_process_calculate_selections()
Calculates the flat selections of both the hierarchical select and the dropbox.
Parameters
$element: A hierarchical_select form element.
Return value
An array of the following structure: array( $hierarchical_select_selection = array(), // Flat list of selected ids. $dropbox_selection = array(), ) with both of the subarrays flat lists of selected ids. The _hierarchical_select_hierarchy_generate() and _hierarchical_select_dropbox_generate() functions should be applied on these respective subarrays.
See also
_hierarchical_select_hierarchy_generate()
_hierarchical_select_dropbox_generate()
1 call to _hierarchical_select_process_calculate_selections()
- hierarchical_select_process in ./
hierarchical_select.module - Hierarchical select form element type #process callback.
File
- ./
hierarchical_select.module, line 951 - This module defines the "hierarchical_select" form element, which is a greatly enhanced way for letting the user select items in a hierarchy.
Code
function _hierarchical_select_process_calculate_selections(&$element) {
$hs_selection = array();
// hierarchical select selection
$db_selection = array();
// dropbox selection
$config = _hierarchical_select_inherit_default_config($element['#config']);
$dropbox = (bool) $config['dropbox']['status'];
// When:
// - no data was POSTed
// - or #value is set directly and not by a Hierarchical Select POST (and
// therefor set either manually or by another module),
// then use the value of #default_value, or when available, of #value.
if (!isset($element['#post']) || !isset($element['#value']['hierarchical_select']) && !isset($element['#value']['dropbox'])) {
$value = isset($element['#value']) ? $element['#value'] : $element['#default_value'];
$value = is_array($value) ? $value : array(
$value,
);
if ($dropbox) {
$db_selection = $value;
}
else {
$hs_selection = $value;
}
}
else {
$op = isset($element['#post']['op']) ? $element['#post']['op'] : NULL;
if ($dropbox && $op == t('Add')) {
$hs_selection = _hierarchical_select_process_get_hs_selection($element);
$db_selection = _hierarchical_select_process_get_db_selection($element);
// Add $hs_selection to $db_selection (automatically filters to keep
// only the unique ones).
$db_selection = array_merge($db_selection, $hs_selection);
// Only reset $hs_selection if the user has configured it that way.
if ($config['dropbox']['reset_hs']) {
$hs_selection = array();
}
}
else {
if ($op == t('Create')) {
// This code handles both the creation of a new item in an existing
// level and the creation of an item that also creates a new level.
// TODO: http://drupal.org/node/253868
// TODO: http://drupal.org/node/253869
$label = trim($element['#value']['hierarchical_select']['create_new_item']['input']);
$selects = isset($element['#value']['hierarchical_select']['selects']) ? $element['#value']['hierarchical_select']['selects'] : array();
$depth = count($selects);
$parent = $depth > 0 ? end($selects) : 0;
// Disallow items with empty labels; allow the user again to create a
// (proper) new item.
if (empty($label)) {
$element['#value']['hierarchical_select']['selects'][count($selects)] = 'create_new_item';
}
else {
if ((count(module_invoke($config['module'], 'hierarchical_select_children', $parent, $config['params'])) || $config['editability']['max_levels'] == 0 || $depth < $config['editability']['max_levels']) && _hierarchical_select_create_new_item_is_allowed($config, $depth)) {
// Create the new item in the hierarchy and retrieve its value.
$value = module_invoke($config['module'], 'hierarchical_select_create_item', check_plain($label), $parent, $config['params']);
// Ensure the newly created item will be selected after rendering.
if ($value) {
// Pretend there was a select where the "create new item" section
// was, and assign it the value of the item that was just created.
$element['#value']['hierarchical_select']['selects'][count($selects)] = $value;
}
}
}
$hs_selection = _hierarchical_select_process_get_hs_selection($element);
if ($dropbox) {
$db_selection = _hierarchical_select_process_get_db_selection($element);
}
}
else {
// This handles the cases of:
// - $op == t('Update')
// - $op == t('Cancel') (used when creating a new item or a new level)
// - any other submit button, e.g. the "Preview" button
$hs_selection = _hierarchical_select_process_get_hs_selection($element);
if ($dropbox) {
$db_selection = _hierarchical_select_process_get_db_selection($element);
}
}
}
}
// Prevent doubles in either array.
$hs_selection = array_unique($hs_selection);
$db_selection = array_unique($db_selection);
return array(
$hs_selection,
$db_selection,
);
}