public function testConstructorLoadsOnlyFieldsOfTheRightForm() { $dom = $this->createTestMultipleForm(); $nodes = $dom->getElementsByTagName('form'); $buttonElements = $dom->getElementsByTagName('button'); $form = new Form($nodes->item(0), 'http://example.com'); $this->assertCount(3, $form->all()); $form = new Form($buttonElements->item(1), 'http://example.com'); $this->assertCount(5, $form->all()); }
/** * Returns an array of name => value pairs for the passed form. * * For form fields containing a name ending in [], an array is * created out of all field values with the given name. * * @param \Symfony\Component\DomCrawler\Form the form * @return array an array of name => value pairs */ protected function getFormValuesFor(Form $form) { $values = []; $fields = $form->all(); foreach ($fields as $field) { if ($field->isDisabled() || !$field->hasValue() || $field instanceof FileFormField) { continue; } $fieldName = $this->getSubmissionFormFieldName($field->getName()); if (substr($field->getName(), -2) === '[]') { if (!isset($values[$fieldName])) { $values[$fieldName] = []; } $values[$fieldName][] = $field->getValue(); } else { $values[$fieldName] = $field->getValue(); } } return $values; }
/** * Merges second form values into first one. * * @param Form $to merging target * @param Form $from merging source */ private function mergeForms(Form $to, Form $from) { foreach ($from->all() as $name => $field) { $fieldReflection = new \ReflectionObject($field); $nodeReflection = $fieldReflection->getProperty('node'); $valueReflection = $fieldReflection->getProperty('value'); $nodeReflection->setAccessible(true); $valueReflection->setAccessible(true); $isIgnoredField = $field instanceof InputFormField && in_array($nodeReflection->getValue($field)->getAttribute('type'), array('submit', 'button', 'image'), true); if (!$isIgnoredField) { $valueReflection->setValue($to[$name], $valueReflection->getValue($field)); } } }
/** * Returns an array of name => value pairs for the passed form. * * The function calls getPhpValues on the passed form object, then * resets numeric array indexes for array field names without array * keys specified (i.e. 'fieldname[]' but not 'fieldname[keyname]') * as expected by setCheckboxBoolValues. * * @param \Symfony\Component\DomCrawler\Form the form * @return array an array of name => value pairs */ protected function getFormValuesFor(Form $form) { $values = $form->getPhpValues(); $fields = $form->all(); foreach ($fields as $field) { $name = $this->getSubmissionFormFieldName($field->getName()); if (!empty($values[$name]) && substr($field->getName(), -2) === '[]') { $values[$name] = array_values($values[$name]); } } return $values; }
/** * Edits the data of a form * * @param Client $client * @param Form $form * @param array $data */ protected function submitEditForm(Client $client, Form $form, array $data = array()) { $originalData = array(); foreach ($form->all() as $fieldName => $formField) { $originalData[$fieldName] = $formField->getValue(); } $data = array_merge($originalData, $data); $this->submitForm($client, $form, $data); }