private $baseHref;
/**
- * Constructor.
- *
* @param \DOMElement $node A \DOMElement instance
* @param string $currentUri The URI of the page where the form is embedded
* @param string $method The method to use for the link (if null, it defaults to the method defined by the form)
*/
public function getFiles()
{
- if (!in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH'))) {
+ if (!\in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH'))) {
return array();
}
$qs = http_build_query(array($name => $value), '', '&');
if (!empty($qs)) {
parse_str($qs, $expandedValue);
- $varName = substr($name, 0, strlen(key($expandedValue)));
+ $varName = substr($name, 0, \strlen(key($expandedValue)));
$values = array_replace_recursive($values, array($varName => current($expandedValue)));
}
}
$qs = http_build_query(array($name => $value), '', '&');
if (!empty($qs)) {
parse_str($qs, $expandedValue);
- $varName = substr($name, 0, strlen(key($expandedValue)));
+ $varName = substr($name, 0, \strlen(key($expandedValue)));
+
+ array_walk_recursive(
+ $expandedValue,
+ function (&$value, $key) {
+ if (ctype_digit($value) && ('size' === $key || 'error' === $key)) {
+ $value = (int) $value;
+ }
+ }
+ );
+
+ reset($expandedValue);
+
$values = array_replace_recursive($values, array($varName => current($expandedValue)));
}
}
{
$uri = parent::getUri();
- if (!in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH'))) {
+ if (!\in_array($this->getMethod(), array('POST', 'PUT', 'DELETE', 'PATCH'))) {
$query = parse_url($uri, PHP_URL_QUERY);
$currentParameters = array();
if ($query) {
parse_str($query, $currentParameters);
}
- $queryString = http_build_query(array_merge($currentParameters, $this->getValues()), null, '&');
+ $queryString = http_build_query(array_merge($currentParameters, $this->getValues()), '', '&');
$pos = strpos($uri, '?');
$base = false === $pos ? $uri : substr($uri, 0, $pos);
protected function getRawUri()
{
+ // If the form was created from a button rather than the form node, check for HTML5 action overrides
+ if ($this->button !== $this->node && $this->button->getAttribute('formaction')) {
+ return $this->button->getAttribute('formaction');
+ }
+
return $this->node->getAttribute('action');
}
return $this->method;
}
+ // If the form was created from a button rather than the form node, check for HTML5 method override
+ if ($this->button !== $this->node && $this->button->getAttribute('formmethod')) {
+ return strtoupper($this->button->getAttribute('formmethod'));
+ }
+
return $this->node->getAttribute('method') ? strtoupper($this->node->getAttribute('method')) : 'GET';
}
/**
* Sets a named field.
- *
- * @param FormField $field The field
*/
public function set(FormField $field)
{
*
* Expects a 'submit' button \DOMElement and finds the corresponding form element, or the form element itself.
*
- * @param \DOMElement $node A \DOMElement instance
- *
* @throws \LogicException If given node is not a button or input or does not have a form ancestor
*/
protected function setNode(\DOMElement $node)
{
$this->button = $node;
- if ('button' === $node->nodeName || ('input' === $node->nodeName && in_array(strtolower($node->getAttribute('type')), array('submit', 'button', 'image')))) {
+ if ('button' === $node->nodeName || ('input' === $node->nodeName && \in_array(strtolower($node->getAttribute('type')), array('submit', 'button', 'image')))) {
if ($node->hasAttribute('form')) {
// if the node has the HTML5-compliant 'form' attribute, use it
$formId = $node->getAttribute('form');
// corresponding elements are either descendants or have a matching HTML5 form attribute
$formId = Crawler::xpathLiteral($this->node->getAttribute('id'));
- $fieldNodes = $xpath->query(sprintf('descendant::input[@form=%s] | descendant::button[@form=%s] | descendant::textarea[@form=%s] | descendant::select[@form=%s] | //form[@id=%s]//input[not(@form)] | //form[@id=%s]//button[not(@form)] | //form[@id=%s]//textarea[not(@form)] | //form[@id=%s]//select[not(@form)]', $formId, $formId, $formId, $formId, $formId, $formId, $formId, $formId));
+ $fieldNodes = $xpath->query(sprintf('descendant::input[@form=%s] | descendant::button[@form=%1$s] | descendant::textarea[@form=%1$s] | descendant::select[@form=%1$s] | //form[@id=%1$s]//input[not(@form)] | //form[@id=%1$s]//button[not(@form)] | //form[@id=%1$s]//textarea[not(@form)] | //form[@id=%1$s]//select[not(@form)]', $formId));
foreach ($fieldNodes as $node) {
$this->addField($node);
}
}
} elseif ('input' == $nodeName && 'file' == strtolower($node->getAttribute('type'))) {
$this->set(new Field\FileFormField($node));
- } elseif ('input' == $nodeName && !in_array(strtolower($node->getAttribute('type')), array('submit', 'button', 'image'))) {
+ } elseif ('input' == $nodeName && !\in_array(strtolower($node->getAttribute('type')), array('submit', 'button', 'image'))) {
$this->set(new Field\InputFormField($node));
} elseif ('textarea' == $nodeName) {
$this->set(new Field\TextareaFormField($node));