* @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2014 PradoSoft * @license http://www.pradosoft.com/license/ * @package Prado\Web\UI\WebControls */ namespace Prado\Web\UI\WebControls; use Prado\TPropertyValue; /** * TDropDownList class * * TDropDownList displays a dropdown list on a Web page. * It inherits all properties and events from {@link TListControl}. * * Since v3.0.3, TDropDownList starts to support optgroup. To specify an option group for * a list item, set a Group attribute with it, * * $listitem->Attributes->Group="Group Name"; * // or in template * * * Since v3.1.1, TDropDownList starts to support prompt text. That is, a prompt item can be * displayed as the first list item by specifying either {@link setPromptText PromptText} or * {@link setPromptValue PromptValue}, or both. Choosing the prompt item will unselect the TDropDownList. * * When a prompt item is set, its index in the list is set to -1. So, the {@link getSelectedIndex SelectedIndex} * property is not affected by a prompt item: the items list will still be zero-based. * * The {@link clearSelection clearSelection} method will select the prompt item if existing, otherway the first * available item in the dropdown list will be selected. * * @author Qiang Xue * @package Prado\Web\UI\WebControls * @since 3.0 */ class TDropDownList extends TListControl implements \Prado\Web\UI\IPostBackDataHandler, \Prado\Web\UI\IValidatable { private $_dataChanged=false; private $_isValid=true; /** * Adds attributes to renderer. * @param THtmlWriter the renderer */ protected function addAttributesToRender($writer) { $writer->addAttribute('name',$this->getUniqueID()); parent::addAttributesToRender($writer); } /** * Gets the name of the javascript class responsible for performing postback for this control. * This method overrides the parent implementation. * @return string the javascript class name */ protected function getClientClassName() { return 'Prado.WebUI.TDropDownList'; } /** * Loads user input data. * This method is primarly used by framework developers. * @param string the key that can be used to retrieve data from the input data collection * @param array the input data collection * @return boolean whether the data of the component has been changed */ public function loadPostData($key,$values) { if(!$this->getEnabled(true)) return false; $this->ensureDataBound(); $selection=isset($values[$key])?$values[$key]:null; if($selection!==null) { $index=$this->getItems()->findIndexByValue($selection,false); if($this->getSelectedIndex()!==$index) { $this->setSelectedIndex($index); return $this->_dataChanged=true; } } return false; } /** * Raises postdata changed event. * This method is required by {@link \Prado\Web\UI\IPostBackDataHandler} interface. * It is invoked by the framework when {@link getSelectedIndex SelectedIndex} property * is changed on postback. * This method is primarly used by framework developers. */ public function raisePostDataChangedEvent() { if($this->getAutoPostBack() && $this->getCausesValidation()) $this->getPage()->validate($this->getValidationGroup()); $this->onSelectedIndexChanged(null); } /** * Returns a value indicating whether postback has caused the control data change. * This method is required by the \Prado\Web\UI\IPostBackDataHandler interface. * @return boolean whether postback has caused the control data change. False if the page is not in postback mode. */ public function getDataChanged() { return $this->_dataChanged; } /** * @throws TNotSupportedException if this method is invoked */ public function setSelectedIndices($indices) { throw new TNotSupportedException('dropdownlist_selectedindices_unsupported'); } /** * Returns the value to be validated. * This methid is required by \Prado\Web\UI\IValidatable interface. * @return mixed the value of the property to be validated. */ public function getValidationPropertyValue() { return $this->getSelectedValue(); } /** * Returns true if this control validated successfully. * Defaults to true. * @return bool wether this control validated successfully. */ public function getIsValid() { return $this->_isValid; } /** * @param bool wether this control is valid. */ public function setIsValid($value) { $this->_isValid=TPropertyValue::ensureBoolean($value); } }