2007-07-19 12:40:28 +02:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* Dropdown field, created from a <select> tag.
|
2010-10-15 05:55:22 +02:00
|
|
|
*
|
|
|
|
* <b>Setting a $has_one relation</b>
|
|
|
|
*
|
|
|
|
* Using here an example of an art gallery, with Exhibition pages,
|
|
|
|
* each of which has a Gallery they belong to. The Gallery class is also user-defined.
|
|
|
|
* <code>
|
|
|
|
* static $has_one = array(
|
|
|
|
* 'Gallery' => 'Gallery',
|
|
|
|
* );
|
|
|
|
*
|
|
|
|
* public function getCMSFields() {
|
|
|
|
* $fields = parent::getCMSFields();
|
|
|
|
* $galleries = DataObject::get('Gallery');
|
|
|
|
* if ($galleries) {
|
|
|
|
* $galleries = $galleries->toDropdownMap('ID', 'Title', '(Select one)', true);
|
|
|
|
* }
|
2011-04-15 06:36:22 +02:00
|
|
|
* $fields->addFieldToTab('Root.Content', new DropdownField('GalleryID', 'Gallery', $galleries), 'Content');
|
2010-10-15 05:55:22 +02:00
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* As you see, you need to put "GalleryID", rather than "Gallery" here.
|
|
|
|
*
|
|
|
|
* <b>Populate with Array</b>
|
|
|
|
*
|
|
|
|
* Example model defintion:
|
|
|
|
* <code>
|
|
|
|
* class MyObject extends DataObject {
|
|
|
|
* static $db = array(
|
|
|
|
* 'Country' => "Varchar(100)"
|
|
|
|
* );
|
|
|
|
* }
|
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* Exampe instantiation:
|
|
|
|
* <code>
|
|
|
|
* new DropdownField(
|
|
|
|
* 'Country',
|
|
|
|
* 'Country',
|
|
|
|
* array(
|
|
|
|
* 'NZ' => 'New Zealand',
|
|
|
|
* 'US' => 'United States'
|
|
|
|
* 'GEM'=> 'Germany'
|
|
|
|
* )
|
|
|
|
* );
|
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* <b>Populate with Enum-Values</b>
|
|
|
|
*
|
|
|
|
* You can automatically create a map of possible values from an {@link Enum} database column.
|
|
|
|
*
|
|
|
|
* Example model definition:
|
|
|
|
* <code>
|
|
|
|
* class MyObject extends DataObject {
|
|
|
|
* static $db = array(
|
|
|
|
* 'Country' => "Enum('New Zealand,United States,Germany','New Zealand')"
|
|
|
|
* );
|
|
|
|
* }
|
|
|
|
* </code>
|
|
|
|
*
|
|
|
|
* Field construction:
|
|
|
|
* <code>
|
|
|
|
* new DropdownField(
|
|
|
|
* 'Country',
|
|
|
|
* 'Country',
|
|
|
|
* singleton('MyObject')->dbObject('Country')->enumValues()
|
|
|
|
* );
|
|
|
|
* </code>
|
|
|
|
*
|
2010-10-19 00:50:48 +02:00
|
|
|
* @see CheckboxSetField for multiple selections through checkboxes instead.
|
|
|
|
* @see ListboxField for a single <select> box (with single or multiple selections).
|
|
|
|
* @see TreeDropdownField for a rich and customizeable UI that can visualize a tree of selectable elements
|
|
|
|
*
|
2008-01-09 05:18:36 +01:00
|
|
|
* @package forms
|
|
|
|
* @subpackage fields-basic
|
2007-07-19 12:40:28 +02:00
|
|
|
*/
|
|
|
|
class DropdownField extends FormField {
|
2008-10-15 14:39:09 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @var boolean $source Associative or numeric array of all dropdown items,
|
|
|
|
* with array key as the submitted field value, and the array value as a
|
|
|
|
* natural language description shown in the interface element.
|
|
|
|
*/
|
2007-07-19 12:40:28 +02:00
|
|
|
protected $source;
|
2008-10-15 14:39:09 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @var boolean $isSelected Determines if the field was selected
|
|
|
|
* at the time it was rendered, so if {@link $value} matches on of the array
|
|
|
|
* values specified in {@link $source}
|
|
|
|
*/
|
|
|
|
protected $isSelected;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var boolean $disabled
|
|
|
|
*/
|
|
|
|
protected $disabled;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var boolean $hasEmptyDefault Show the first <option> element as
|
|
|
|
* empty (not having a value), with an optional label defined through
|
|
|
|
* {@link $emptyString}. By default, the <select> element will be
|
|
|
|
* rendered with the first option from {@link $source} selected.
|
|
|
|
*/
|
|
|
|
protected $hasEmptyDefault = false;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @var string $emptyString The title shown for an empty default selection,
|
|
|
|
* e.g. "Select...".
|
|
|
|
*/
|
|
|
|
protected $emptyString = '';
|
2007-07-19 12:40:28 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a new dropdown field.
|
2007-08-27 07:13:43 +02:00
|
|
|
* @param $name The field name
|
|
|
|
* @param $title The field title
|
|
|
|
* @param $source An map of the dropdown items
|
|
|
|
* @param $value The current value
|
|
|
|
* @param $form The parent form
|
2008-10-15 14:39:09 +02:00
|
|
|
* @param $emptyString mixed Add an empty selection on to of the {@link $source}-Array
|
2007-07-19 12:40:28 +02:00
|
|
|
* (can also be boolean, which results in an empty string)
|
2008-10-15 14:39:09 +02:00
|
|
|
* Argument is deprecated in 2.3, please use {@link setHasEmptyDefault()} and {@link setEmptyString()} instead.
|
2007-07-19 12:40:28 +02:00
|
|
|
*/
|
2008-08-06 05:43:48 +02:00
|
|
|
function __construct($name, $title = null, $source = array(), $value = "", $form = null, $emptyString = null) {
|
2011-08-29 14:31:03 +02:00
|
|
|
$this->setSource($source);
|
2008-10-15 14:39:09 +02:00
|
|
|
|
|
|
|
if($emptyString) $this->setHasEmptyDefault(true);
|
|
|
|
if(is_string($emptyString)) $this->setEmptyString($emptyString);
|
2007-07-19 12:40:28 +02:00
|
|
|
|
2008-08-06 05:43:48 +02:00
|
|
|
parent::__construct($name, ($title===null) ? $name : $title, $value, $form);
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-09-29 12:31:06 +02:00
|
|
|
* Returns a <select> tag containing all the appropriate <option> tags.
|
|
|
|
* Makes use of {@link FormField->createTag()} to generate the <select>
|
|
|
|
* tag and option elements inside is as the content of the <select>.
|
|
|
|
*
|
|
|
|
* @return string HTML tag for this dropdown field
|
2007-07-19 12:40:28 +02:00
|
|
|
*/
|
|
|
|
function Field() {
|
|
|
|
$options = '';
|
2008-09-29 12:31:06 +02:00
|
|
|
|
2008-10-15 14:39:09 +02:00
|
|
|
$source = $this->getSource();
|
2008-10-16 01:25:55 +02:00
|
|
|
if($source) {
|
2009-01-05 07:19:48 +01:00
|
|
|
// For SQLMap sources, the empty string needs to be added specially
|
|
|
|
if(is_object($source) && $this->emptyString) {
|
|
|
|
$options .= $this->createTag('option', array('value' => ''), $this->emptyString);
|
|
|
|
}
|
|
|
|
|
2008-10-16 01:25:55 +02:00
|
|
|
foreach($source as $value => $title) {
|
2009-04-29 03:20:24 +02:00
|
|
|
|
|
|
|
// Blank value of field and source (e.g. "" => "(Any)")
|
|
|
|
if($value === '' && ($this->value === '' || $this->value === null)) {
|
|
|
|
$selected = 'selected';
|
|
|
|
} else {
|
|
|
|
// Normal value from the source
|
|
|
|
if($value) {
|
|
|
|
$selected = ($value == $this->value) ? 'selected' : null;
|
|
|
|
} else {
|
|
|
|
// Do a type check comparison, we might have an array key of 0
|
|
|
|
$selected = ($value === $this->value) ? 'selected' : null;
|
|
|
|
}
|
|
|
|
|
|
|
|
$this->isSelected = ($selected) ? true : false;
|
2008-10-16 01:25:55 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
$options .= $this->createTag(
|
|
|
|
'option',
|
|
|
|
array(
|
|
|
|
'selected' => $selected,
|
|
|
|
'value' => $value
|
|
|
|
),
|
2010-04-12 05:28:40 +02:00
|
|
|
Convert::raw2xml($title)
|
2008-10-16 01:25:55 +02:00
|
|
|
);
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
|
|
|
}
|
2009-04-29 03:20:24 +02:00
|
|
|
|
2008-09-29 12:31:06 +02:00
|
|
|
$attributes = array(
|
2008-10-21 22:58:11 +02:00
|
|
|
'class' => ($this->extraClass() ? $this->extraClass() : ''),
|
2008-09-29 12:31:06 +02:00
|
|
|
'id' => $this->id(),
|
|
|
|
'name' => $this->name,
|
|
|
|
'tabindex' => $this->getTabIndex()
|
|
|
|
);
|
2008-10-20 12:52:47 +02:00
|
|
|
|
|
|
|
if($this->disabled) $attributes['disabled'] = 'disabled';
|
2008-10-15 23:44:38 +02:00
|
|
|
|
2008-09-29 12:31:06 +02:00
|
|
|
return $this->createTag('select', $attributes, $options);
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
|
|
|
|
2008-10-15 14:39:09 +02:00
|
|
|
/**
|
|
|
|
* @return boolean
|
|
|
|
*/
|
2007-07-19 12:40:28 +02:00
|
|
|
function isSelected(){
|
|
|
|
return $this->isSelected;
|
|
|
|
}
|
|
|
|
|
2008-10-15 14:39:09 +02:00
|
|
|
/**
|
|
|
|
* Gets the source array including any empty default values.
|
|
|
|
*
|
|
|
|
* @return array
|
|
|
|
*/
|
2007-07-19 12:40:28 +02:00
|
|
|
function getSource() {
|
2008-10-15 23:44:38 +02:00
|
|
|
if(is_array($this->source) && $this->getHasEmptyDefault()) {
|
2008-10-15 14:39:09 +02:00
|
|
|
return array(""=>$this->emptyString) + (array)$this->source;
|
|
|
|
} else {
|
2008-10-15 23:44:38 +02:00
|
|
|
return $this->source;
|
2008-10-15 14:39:09 +02:00
|
|
|
}
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|
|
|
|
|
2008-10-15 14:39:09 +02:00
|
|
|
/**
|
|
|
|
* @param array $source
|
|
|
|
*/
|
2007-07-19 12:40:28 +02:00
|
|
|
function setSource($source) {
|
|
|
|
$this->source = $source;
|
|
|
|
}
|
2008-10-15 14:39:09 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @param boolean $bool
|
|
|
|
*/
|
|
|
|
function setHasEmptyDefault($bool) {
|
|
|
|
$this->hasEmptyDefault = $bool;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return boolean
|
|
|
|
*/
|
|
|
|
function getHasEmptyDefault() {
|
|
|
|
return $this->hasEmptyDefault;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the default selection label, e.g. "select...".
|
|
|
|
* Defaults to an empty string. Automatically sets
|
|
|
|
* {@link $hasEmptyDefault} to true.
|
|
|
|
*
|
|
|
|
* @param string $str
|
|
|
|
*/
|
|
|
|
function setEmptyString($str) {
|
|
|
|
$this->setHasEmptyDefault(true);
|
|
|
|
$this->emptyString = $str;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string
|
|
|
|
*/
|
|
|
|
function getEmptyString() {
|
|
|
|
return $this->emptyString;
|
|
|
|
}
|
2007-07-19 12:40:28 +02:00
|
|
|
|
|
|
|
function performReadonlyTransformation() {
|
|
|
|
$field = new LookupField($this->name, $this->title, $this->source);
|
|
|
|
$field->setValue($this->value);
|
|
|
|
$field->setForm($this->form);
|
2008-08-12 04:58:48 +02:00
|
|
|
$field->setReadonly(true);
|
2007-07-19 12:40:28 +02:00
|
|
|
return $field;
|
|
|
|
}
|
|
|
|
|
|
|
|
function extraClass(){
|
|
|
|
$ret = parent::extraClass();
|
|
|
|
if($this->extraClass) $ret .= " $this->extraClass";
|
|
|
|
return $ret;
|
|
|
|
}
|
2010-10-15 05:08:09 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set form being disabled
|
|
|
|
*/
|
|
|
|
function setDisabled($disabled = true) {
|
|
|
|
$this->disabled = $disabled;
|
|
|
|
}
|
|
|
|
}
|