Permalink
Browse files

ENHANCEMENT: Made the form enctype configurable via a method Form->se…

…tEncType().

API CHANGE: Deprecated Form->FormEncType() in favour of Form->getEncType().
MINOR: Added enctypes as constants to the Form class.
  • Loading branch information...
1 parent 6aa90e6 commit 3478e4f9e65323e2a151137aac52495cd86098d9 @ajshort ajshort committed Dec 26, 2011
Showing with 61 additions and 15 deletions.
  1. +45 −14 forms/Form.php
  2. +16 −1 tests/forms/FormTest.php
View
@@ -43,7 +43,10 @@
* @subpackage core
*/
class Form extends RequestHandler {
-
+
+ const ENC_TYPE_URLENCODED = 'application/x-www-form-urlencoded';
+ const ENC_TYPE_MULTIPART = 'multipart/form-data';
+
/**
* @var boolean $includeFormTag Accessed by Form.ss; modified by {@link formHtmlContent()}.
* A performance enhancement over the generate-the-form-tag-and-then-remove-it code that was there previously
@@ -137,6 +140,11 @@ class Form extends RequestHandler {
*/
protected $extraClasses = array();
+ /**
+ * @var string
+ */
+ protected $encType;
+
/**
* Create a new form, with the given fields an action buttons.
*
@@ -600,7 +608,7 @@ function FormAttributes() {
$attributes['id'] = $this->FormName();
$attributes['action'] = $this->FormAction();
$attributes['method'] = $this->FormMethod();
- $attributes['enctype'] = $this->FormEncType();
+ $attributes['enctype'] = $this->getEncType();
if($this->target) $attributes['target'] = $this->target;
if($this->extraClass()) $attributes['class'] = $this->extraClass();
if($this->validator && $this->validator->getErrors()) {
@@ -656,23 +664,46 @@ function getTemplate() {
if($this->template) return $this->template;
else return $this->class;
}
-
+
/**
- * Returns the encoding type of the form.
- * This will be either "multipart/form-data"" if there are any {@link FileField} instances,
- * otherwise "application/x-www-form-urlencoded"
- *
- * @return string The encoding mime type
+ * Returns the encoding type for the form.
+ *
+ * By default this will be URL encoded, unless there is a file field present
+ * in which case multipart is used. You can also set the enc type using
+ * {@link setEncType}.
*/
- function FormEncType() {
- if(is_array($this->fields->dataFields())){
- foreach($this->fields->dataFields() as $field) {
- if(is_a($field, "FileField")) return "multipart/form-data";
+ public function getEncType() {
+ if ($this->encType) {
+ return $this->encType;
+ }
+
+ if ($fields = $this->fields->dataFields()) {
+ foreach ($fields as $field) {
+ if ($field instanceof FileField) return self::ENC_TYPE_MULTIPART;
}
}
- return "application/x-www-form-urlencoded";
+
+ return self::ENC_TYPE_URLENCODED;
}
-
+
+ /**
+ * Sets the form encoding type. The most common encoding types are defined
+ * in {@link ENC_TYPE_URLENCODED} and {@link ENC_TYPE_MULTIPART}.
+ *
+ * @param string $enctype
+ */
+ public function setEncType($encType) {
+ $this->encType = $encType;
+ }
+
+ /**
+ * @deprecated 3.0 Please use {@link getEncType}.
+ */
+ public function FormEncType() {
+ Deprecation::notice('3.0', 'Please use Form->getEncType() instead.');
+ return $this->getEncType();
+ }
+
/**
* Returns the real HTTP method for the form:
* GET, POST, PUT, DELETE or HEAD.
View
@@ -324,7 +324,22 @@ function testDisableSecurityToken() {
SecurityToken::disable(); // restore original
}
-
+
+ public function testEncType() {
+ $form = $this->getStubForm();
+ $this->assertEquals('application/x-www-form-urlencoded', $form->getEncType());
+
+ $form->setEncType(Form::ENC_TYPE_MULTIPART);
+ $this->assertEquals('multipart/form-data', $form->getEncType());
+
+ $form = $this->getStubForm();
+ $form->Fields()->push(new FileField(null));
+ $this->assertEquals('multipart/form-data', $form->getEncType());
+
+ $form->setEncType(Form::ENC_TYPE_URLENCODED);
+ $this->assertEquals('application/x-www-form-urlencoded', $form->getEncType());
+ }
+
protected function getStubForm() {
return new Form(
new Controller(),

0 comments on commit 3478e4f

Please sign in to comment.