function multiselect_select_process in Multiselect 6
Process an individual element.
Build the form element. When creating a form using FAPI #process, note that $element['#value'] is already set.
The $fields array is in $form['#field_info'][$element['#field_name']].
1 string reference to 'multiselect_select_process'
- multiselect_elements in ./
multiselect.module - Implementation of FAPI hook_elements().
File
- ./
multiselect.module, line 157 - Allows users to select multiple items in an easier way than the normal node-reference widget.
Code
function multiselect_select_process($element, $edit, &$form_state, $form) {
// Insert Javascript and CSS for this widget.
$path = drupal_get_path('module', 'multiselect');
drupal_add_js($path . '/multiselect.js');
drupal_add_css($path . '/multiselect.css');
$field_name = $element['#field_name'];
$field = $form['#field_info'][$field_name];
$field_key = $element['#columns'][0];
// See if this element is in the database format or the transformed format,
// and transform it if necessary.
if (is_array($element['#value']) && !array_key_exists($field_key, $element['#value'])) {
$element['#value'] = optionwidgets_data2form($element, $element['#default_value'], $field);
}
// Get a list of all options for this field.
$options = optionwidgets_options($field, FALSE);
// For this specific widget, HTML should be filtered out and entities left unencoded.
// See content_allowed_values / content_filter_xss / filter_xss.
content_allowed_values_filter_html($options);
// Create some arrays for use later in the function.
$unselected_options = array();
$selected_options = array();
// Add selected items to the array first
if (is_array($element['#value'][$field_key])) {
foreach ($element['#value'][$field_key] as $key => $value) {
if (isset($options[$value])) {
$selected_options[$value] = html_entity_decode(strip_tags($options[$value]));
}
}
}
// Add the remaining options to the arrays
foreach ($options as $key => $value) {
if (!isset($selected_options[$key])) {
$unselected_options[$key] = $value;
//$selected_options[$key] = $value;
}
}
// Set up useful variables.
$addbutton = $element['#field_name'] . "_add";
$removebutton = $element['#field_name'] . "_remove";
$selfield = $element['#field_name'] . "_sel";
$unselfield = $element['#field_name'] . "_unsel";
// Call methods to create prefix. (ie the non-selected table, etc)
$prefix_pre = '<div class="form-item multiselect"><label for="edit-title">' . t($element['#title']) . ':';
if ($field['required']) {
$prefix_pre .= '<span class="form-required" title="' . t('This field is required.') . '"> * </span>';
}
$prefix_pre .= "</label>\n";
$prefix_pre .= "<div id=\"multiselect_labels" . "_" . $element['#field_name'] . "\" class=\"multiselect_labels\"><div id=\"label_unselected" . "_" . $element['#field_name'] . "\" class=\"label_unselected\">" . t('Available Options') . ":</div>\n";
$prefix_pre .= "<div id=\"label_selected" . "_" . $element['#field_name'] . "\" class=\"label_selected\">" . t('Selected Options') . ":</div>\n</div>\n";
$prefix_pre .= "<div id=\"multiselect_available" . "_" . $element['#field_name'] . "\" class=\"multiselect_available\">";
$prefix_pre .= _multiselect_html_for_unselected_box_start($unselfield, $element['#field_name']);
$prefix_options = _multiselect_html_for_unselected_box_options($unselected_options);
$prefix_post = "</select>\n</div>\n";
$prefix_post .= _html_for_buttons($element['#field_name']);
$element[$field_key] = array(
'#type' => 'select',
'#title' => $element['#title'],
'#description' => $element['#description'],
'#required' => isset($element['#required']) ? $element['#required'] : $field['required'],
'#multiple' => isset($element['#multiple']) ? $element['#multiple'] : $field['multiple'],
'#options' => $selected_options,
'#size' => 10,
'#prefix' => $prefix_pre . $prefix_options . $prefix_post,
'#suffix' => "\n</div>\n",
'#attributes' => array(
'class' => "{$selfield} multiselect_sel",
'id' => $element['#field_name'],
),
'#default_value' => isset($element['#value'][$field_key]) ? $element['#value'][$field_key] : NULL,
);
// Set #element_validate in a way that it will not wipe out other
// validation functions already set by other modules.
if (empty($element['#element_validate'])) {
$element['#element_validate'] = array();
}
array_unshift($element['#element_validate'], 'optionwidgets_validate');
// Make sure field info will be available to the validator which
// does not get the values in $form.
// TODO for some reason putting the $field array into $form_state['storage']
// causes the node's hook_form_alter to be invoked twice, garbling the
// results. Need to investigate why that is happening (a core bug?), but
// in the meantime avoid using $form_state['storage'] to store anything.
$form_state['#field_info'][$field['field_name']] = $field;
return $element;
}