TRUE,
'#tree' => TRUE,
'#title' => t('Icon'),
'#collapsible' => TRUE,
'#collapsed' => FALSE,
'#default_bundle' => '',
'#default_icon' => '',
'#default_wrapper' => '',
'#default_wrapper_class' => '',
'#process' => array('form_process_fieldset', 'form_process_icon_selector'),
'#pre_render' => array('form_pre_render_fieldset'),
'#theme_wrappers' => array('fieldset'),
'#attached' => array('library' => array(array('icon', 'icon_selector'))),
);
return $types;
}
/**
* Generates a #states selector to be used.
*
* @param string $key
* The target element.
* @param array $element
* The relevant element, if any.
*
* @return string
* A constructed #states selector.
*/
function _icon_states_selector($key, array $element = NULL) {
if (isset($element) && ($keys = isset($element['#parents']) ? $element['#parents'] : array())) {
$keys[] = $key;
$first = array_shift($keys);
return ':input[name="' . $first. '[' . implode('][', $keys) . ']' . '"]';
}
return ':input[name="' . $key . '"]';
}
/**
* Processes an icon select list form element.
*/
function form_process_icon_selector($element) {
// Get default values.
$default_bundle = isset($element['#default_bundle']) ? $element['#default_bundle'] : icon_bundle_defaults();
if (!is_array($default_bundle)) {
$default_bundle = icon_bundle_load($default_bundle);
}
$default_icon = isset($element['#default_icon']) ? $element['#default_icon'] : '';
$default_value = '';
if ($default_bundle && !empty($default_bundle['name']) && !empty($default_icon)) {
$default_value = $default_bundle['name'] . '|' . $default_icon;
}
// Build the options array for available icons per bundle.
$options = array();
foreach (icon_bundles() as $bundle_name => $bundle) {
if (!$bundle['status']) {
continue;
}
foreach ($bundle['icons'] as $icon_key => $icon_value) {
$icon_name = is_string($icon_key) ? $icon_key : $icon_value;
if (is_array($icon_value) && isset($icon_value['name'])) {
$icon_name = $icon_value['name'];
}
$icon_title = is_string($icon_value) ? $icon_value : $icon_name;
if (is_array($icon_value) && isset($icon_value['title'])) {
$icon_title = $icon_value['title'];
}
$options[$bundle['title']][$bundle['name'] . '|' . $icon_name] = $icon_title;
}
}
if (!count($options)) {
$element['#description'] = t('There are no icons available to choose from. They either do not exist or are disabled. As a result, this icon selector has also been disable.');
$element['#description'] .= '
' . l(t('Manage icon bundles'), ICON_ADMIN_PATH);
$element['#disabled'] = TRUE;
// Set the default value.
if (!empty($default_value)) {
$options = array($default_value => $default_icon);
}
}
$element['icon'] = array(
'#title' => t('Select Icon'),
'#type' => 'select',
'#options' => $options,
'#default_value' => isset($element['#default_value']) ? $element['#default_value'] : $default_value,
'#empty_option' => '- No Icon -',
'#required' => !empty($element['#required']),
'#weight' => -10,
);
$default_wrapper = isset($element['#default_wrapper']) ? $element['#default_wrapper'] : '';
$element['wrapper'] = array(
'#type' => 'select',
'#title' => t('Icon Wrapper'),
'#description' => t('Choose an HTML element to wrap the icon with.'),
'#options' => icon_wrapper_options(),
'#default_value' => $default_wrapper,
'#states' => array(
'invisible' => array(
_icon_states_selector('icon', $element) => array('value' => ''),
),
),
'#weight' => -9,
);
$default_wrapper_class = isset($element['#default_wrapper_class']) ? $element['#default_wrapper_class'] : '';
$element['wrapper_class'] = array(
'#type' => 'textfield',
'#title' => t('Icon Wrapper Classes'),
'#description' => t('A space separated list of CSS classes. Token replacement patterns are allowed.'),
'#default_value' => $default_wrapper_class,
'#size' => 60,
'#maxlength' => 128,
'#states' => array(
'invisible' => array(
array(_icon_states_selector('icon', $element) => array('value' => '')),
array(_icon_states_selector('wrapper', $element) => array('value' => '')),
),
),
'#weight' => -8,
);
$element['wrapper_class_token'] = array(
'#type' => 'container',
'#states' => array(
'invisible' => array(
array(_icon_states_selector('icon', $element) => array('value' => '')),
array(_icon_states_selector('wrapper', $element) => array('value' => '')),
),
),
'#weight' => -7,
);
if (module_exists('token')) {
$element['wrapper_class_token']['help'] = array(
'#theme' => 'token_tree',
'#token_types' => isset($element['#token_types']) ? $element['#token_types'] : 'all',
'#global_types' => FALSE,
'#dialog' => TRUE,
);
}
else {
$element['wrapper_class_token']['help'] = array(
'#type' => 'item',
'#markup' => t('Install the Token module to view available replacement patterns.'),
);
}
return $element;
}
/**
* Implements form_type_ELEMENT_value().
*
* Value callback for the 'icon_selector' element.
*/
function form_type_icon_selector_value(&$element, $input = FALSE, &$form_state = array()) {
if ($input !== FALSE && isset($input['icon']) && strpos($input['icon'], '|') !== FALSE) {
list($bundle, $icon) = explode('|', $input['icon']);
$wrapper = !empty($input['wrapper']) && in_array($input['wrapper'], array_keys(icon_wrapper_options())) ? $input['wrapper'] : '';
$wrapper_class = !empty($input['wrapper_class']) ? filter_xss_admin($input['wrapper_class']) : '';
drupal_array_set_nested_value($form_state['values'], array_merge($element['#parents'], array('bundle')), $bundle, TRUE);
drupal_array_set_nested_value($form_state['values'], array_merge($element['#parents'], array('icon')), $icon, TRUE);
drupal_array_set_nested_value($form_state['values'], array_merge($element['#parents'], array('wrapper')), $wrapper, TRUE);
drupal_array_set_nested_value($form_state['values'], array_merge($element['#parents'], array('wrapper_class')), $wrapper_class, TRUE);
}
}