Merge pull request #147 from ajshort/pull-1

Minor Form Changes
This commit is contained in:
Ingo Schommer 2011-12-28 23:49:58 -08:00
commit 749d908e95
4 changed files with 65 additions and 19 deletions

View File

@ -110,7 +110,7 @@ class CheckboxSetField extends OptionsetField {
}
if($source) foreach($source as $index => $item) {
if(is_a($item, 'DataObject')) {
if($item instanceof DataObject) {
$key = $item->ID;
$value = $item->Title;
} else {

View File

@ -156,11 +156,11 @@ class FileField extends FormField {
$record->{$this->name . 'ID'} = $file->ID;
}
}
public function Value() {
return $_FILES[$this->getName()];
return isset($_FILES[$this->getName()]) ? $_FILES[$this->getName()] : null;
}
/**
* Get custom validator for this field
*

View File

@ -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 @@ class Form extends RequestHandler {
$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 @@ class Form extends RequestHandler {
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 File

@ -324,7 +324,22 @@ class FormTest extends FunctionalTest {
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(),