protected function WebTestBase::handleForm in SimpleTest 8.3
Handles form input related to drupalPostForm().
Ensure that the specified fields exist and attempt to create POST data in the correct manner for the particular field type.
Parameters
$post: Reference to array of post values.
$edit: Reference to array of edit values to be checked against the form.
$submit: Form submit button value.
$form: Array of form elements.
Return value
Submit value matches a valid submit input in the form.
1 call to WebTestBase::handleForm()
- WebTestBase::drupalPostForm in src/
WebTestBase.php - Executes a form submission.
File
- src/
WebTestBase.php, line 1535
Class
- WebTestBase
- Test case for typical Drupal tests.
Namespace
Drupal\simpletestCode
protected function handleForm(&$post, &$edit, &$upload, $submit, $form) {
// Retrieve the form elements.
$elements = $form
->xpath('.//input[not(@disabled)]|.//textarea[not(@disabled)]|.//select[not(@disabled)]');
$submit_matches = FALSE;
foreach ($elements as $element) {
// SimpleXML objects need string casting all the time.
$name = (string) $element['name'];
// This can either be the type of <input> or the name of the tag itself
// for <select> or <textarea>.
$type = isset($element['type']) ? (string) $element['type'] : $element
->getName();
$value = isset($element['value']) ? (string) $element['value'] : '';
$done = FALSE;
if (isset($edit[$name])) {
switch ($type) {
case 'text':
case 'tel':
case 'textarea':
case 'url':
case 'number':
case 'range':
case 'color':
case 'hidden':
case 'password':
case 'email':
case 'search':
case 'date':
case 'time':
case 'datetime':
case 'datetime-local':
$post[$name] = $edit[$name];
unset($edit[$name]);
break;
case 'radio':
if ($edit[$name] == $value) {
$post[$name] = $edit[$name];
unset($edit[$name]);
}
break;
case 'checkbox':
// To prevent checkbox from being checked.pass in a FALSE,
// otherwise the checkbox will be set to its value regardless
// of $edit.
if ($edit[$name] === FALSE) {
unset($edit[$name]);
continue 2;
}
else {
unset($edit[$name]);
$post[$name] = $value;
}
break;
case 'select':
$new_value = $edit[$name];
$options = $this
->getAllOptions($element);
if (is_array($new_value)) {
// Multiple select box.
if (!empty($new_value)) {
$index = 0;
$key = preg_replace('/\\[\\]$/', '', $name);
foreach ($options as $option) {
$option_value = (string) $option['value'];
if (in_array($option_value, $new_value)) {
$post[$key . '[' . $index++ . ']'] = $option_value;
$done = TRUE;
unset($edit[$name]);
}
}
}
else {
// No options selected: do not include any POST data for the
// element.
$done = TRUE;
unset($edit[$name]);
}
}
else {
// Single select box.
foreach ($options as $option) {
if ($new_value == $option['value']) {
$post[$name] = $new_value;
unset($edit[$name]);
$done = TRUE;
break;
}
}
}
break;
case 'file':
$upload[$name] = $edit[$name];
unset($edit[$name]);
break;
}
}
if (!isset($post[$name]) && !$done) {
switch ($type) {
case 'textarea':
$post[$name] = (string) $element;
break;
case 'select':
$single = empty($element['multiple']);
$first = TRUE;
$index = 0;
$key = preg_replace('/\\[\\]$/', '', $name);
$options = $this
->getAllOptions($element);
foreach ($options as $option) {
// For single select, we load the first option, if there is a
// selected option that will overwrite it later.
if ($option['selected'] || $first && $single) {
$first = FALSE;
if ($single) {
$post[$name] = (string) $option['value'];
}
else {
$post[$key . '[' . $index++ . ']'] = (string) $option['value'];
}
}
}
break;
case 'file':
break;
case 'submit':
case 'image':
if (isset($submit) && $submit == $value) {
$post[$name] = $value;
$submit_matches = TRUE;
}
break;
case 'radio':
case 'checkbox':
if (!isset($element['checked'])) {
break;
}
// Deliberate no break.
default:
$post[$name] = $value;
}
}
}
// An empty name means the value is not sent.
unset($post['']);
return $submit_matches;
}