TRUE,
'#process' => array('expand_file_upload_combo'),
'#element_validate' => array('file_upload_combo_validate'),
);
$type['sequence_combo'] = array(
'#input' => TRUE,
'#process' => array('expand_sequence_combo'),
'#element_validate' => array('sequence_combo_validate'),
);
return $type;
}
/**
* Upload File and keep track of previously uploaded files
* Form element description
*/
function expand_file_upload_combo($element, $edit, $form_state, $complete_form) {
// set the default values for each field
if (empty($element['#value'])) {
$element['#value'] = array(
'items' => '',
'items_file' => '',
'file_path' => '',
);
}
$element['#tree'] = TRUE;
// add items text area element
$parents = $element['#parents'];
$parents[] = 'items';
$element['items'] = array(
'#type' => 'textarea',
'#default_value' => $element['#value']['items'],
);
// add file upload element
$parents = $element['#parents'];
$parents[] = 'items_file';
$element['items_file'] = array(
'#type' => 'file',
'#title' => 'File upload',
'#default_value' => $element['#value']['items_file'],
);
// add hidden elelment
$parents = $element['#parents'];
$parents[] = 'file_path';
$element['file_path'] = array(
'#type' => 'hidden',
'#default_value' => $element['#value']['file_path'],
);
return $element;
}
/**
* Theme the file upload combo form element
*/
function theme_file_upload_combo($element) {
return theme('form_element', $element, '
' . $element['#children'] . '
');
}
/**
* Validate all content passed into the file upload combo form element
*/
function file_upload_combo_validate($element, &$form) {
$values = array();
// get the items in the textbox
$items = $form['values'][$element['#name']]['items'];
if ($items) {
// split on new line or comma
$vals = preg_split("/[\n,]+/", $items);
// iterate through the values and trim surrounding space
foreach ($vals as $i => $value) {
$values[] = trim($value);
}
}
// merge any items from the file upload
$file = file_save_upload($element['#name'], array());
if ($file) {
$file_path = $file->filepath;
$form['values'][$element['#name']]['file_path'] = $file_path;
// we need to add our file path to the $_GET element as if it were
// submitted along with the rest of the form
$_GET[$element['#name']]['file_path'] = $file_path;
$fh = fopen($file_path, 'r');
while ($line = fgets($fh)) {
$items = trim($line);
// split on new line or comma
$vals = preg_split("/[\n,]+/", $items);
// iterate through the values and trim surrounding space
foreach ($vals as $i => $value) {
$values[] = trim($value);
}
}
fclose($fh);
}
// add a new 'items_array' element that contains the array of
// submitted items from both the textbox and the input file
$form['values'][$element['#name']]['items_array'] = $values;
}
/**
* Form element description
*/
function expand_sequence_combo($element, $edit, $form_state, $complete_form) {
// set the default values for each field
if (empty($element['#value'])) {
$element['#value'] = array(
'upstream' => '',
'downstream' => '',
);
}
$element['#tree'] = TRUE;
// add the upstream box
$parents = $element['#parents'];
$parents[] = 'upstream';
$element['upstream'] = array(
'#type' => 'textfield',
'#title' => t('Get Upstream Bases'),
'#description' => t('Specify the number of upstream bases to include in the sequnce'),
'#default_value' => $element['#value']['upstream'],
);
// add the downstream box
$parents = $element['#parents'];
$parents[] = 'downstream';
$element['downstream'] = array(
'#type' => 'textfield',
'#prefix' => '
',
'#title' => t('Get Downstream Bases'),
'#description' => t('Specify the number of downstream bases to include in the sequnce'),
'#default_value' => $element['#value']['downstream'],
);
return $element;
}
/**
* Validate all content passed into the sequence combo form element
*/
function sequence_combo_validate($element, &$form) {
$upstream = $form['values'][$element['#name']]['upstream'];
$downstream = $form['values'][$element['#name']]['downstream'];
if ($upstream < 0) {
form_set_error($element['#name'], 'Please provide a positive number for upstream bases');
}
if ($upstream and !preg_match('/^\d+$/', $upstream)) {
form_set_error($element['#name'], 'Please provide a decimal number for upstream bases');
}
if ($downstream < 0) {
form_set_error($element['#name'], 'Please provide a positive number for downstream bases');
}
if ($downstream and !preg_match('/^\d+$/', $downstream)) {
form_set_error($element['#name'], 'Please provide a decimal number for downstream bases');
}
}
/**
* Theme the file sequence form element
*/
function theme_sequence_combo($element) {
return theme('form_element', $element, '' . $element['#children'] . '
');
}