From 270282e3a26b21184a2051995cb5b9a2755b823d Mon Sep 17 00:00:00 2001 From: wei <> Date: Sat, 18 Feb 2006 23:41:16 +0000 Subject: Update some javascript code. --- framework/Web/UI/THtmlWriter.php | 12 + framework/Web/UI/WebControls/TCompareValidator.php | 2 +- framework/Web/UI/WebControls/TDatePicker.php | 276 +++++++++++++++++++-- .../Web/UI/WebControls/TValidationSummary.php | 29 +++ .../Web/UI/WebControls/TValueTypeValidator.php | 2 +- 5 files changed, 292 insertions(+), 29 deletions(-) (limited to 'framework/Web/UI') diff --git a/framework/Web/UI/THtmlWriter.php b/framework/Web/UI/THtmlWriter.php index 2f1f8c1a..613d58dc 100644 --- a/framework/Web/UI/THtmlWriter.php +++ b/framework/Web/UI/THtmlWriter.php @@ -175,11 +175,23 @@ class THtmlWriter extends TApplicationComponent implements ITextWriter $this->_attributes[$name]=isset(self::$_attrEncode[$name])?THttpUtility::htmlEncode($value):$value; } + public function removeAttribute($name) + { + if(isset($this->_attributes[$name])) + unset($this->_attributes[$name]); + } + public function addStyleAttribute($name,$value) { $this->_styles[$name]=isset(self::$_styleEncode[$name])?THttpUtility::htmlEncode($value):$value; } + public function removeStyleAttribute($name) + { + if(isset($this->_styles[$name])) + unset($this->_styles[$name]); + } + public function flush() { $this->_writer->flush(); diff --git a/framework/Web/UI/WebControls/TCompareValidator.php b/framework/Web/UI/WebControls/TCompareValidator.php index 39086b48..853cff17 100644 --- a/framework/Web/UI/WebControls/TCompareValidator.php +++ b/framework/Web/UI/WebControls/TCompareValidator.php @@ -208,7 +208,7 @@ class TCompareValidator extends TBaseValidator $dateFormat = $this->getDateFormat(); if (strlen($dateFormat)) { - $formatter = Prado::createComponent('System.Data.TDateTimeSimpleFormatter', $dateFormat); + $formatter = Prado::createComponent('System.Data.TSimpleDateFormatter', $dateFormat); return array($formatter->parse($value1), $formatter->parse($value2)); } else diff --git a/framework/Web/UI/WebControls/TDatePicker.php b/framework/Web/UI/WebControls/TDatePicker.php index a70e25b3..f563e36e 100644 --- a/framework/Web/UI/WebControls/TDatePicker.php +++ b/framework/Web/UI/WebControls/TDatePicker.php @@ -49,6 +49,11 @@ * for the date picker panel. CalendarStyle property sets the packages * styles available. E.g. default. * + * The InputMode property can be set to "TextBox" or "DropDownList" with + * default as "TextBox". + * In DropDownList mode, in addition to the popup date picker, three + * drop down list (day, month and year) are presented to select the date . + * * @author Wei Zhuo * @version $Revision: $ $Date: $ * @package System.Web.UI.WebControls @@ -108,6 +113,16 @@ class TDatePicker extends TTextBox $this->setViewState('Culture', $value, ''); } + public function setInputMode($value) + { + $this->setViewState('InputMode', TPropertyValue::ensureEnum($value, 'TextBox', 'DropDownList'), 'TextBox'); + } + + public function getInputMode() + { + return $this->getViewState('InputMode', 'TextBox'); + } + /** * @param string calendar UI mode, "Basic", "Button" or "ImageButton" */ @@ -220,12 +235,105 @@ class TDatePicker extends TTextBox return $this->getViewState('UpToYear', intval(@date('Y'))+10); } + /** + * @return integer current selected date from the date picker as timestamp. + */ + public function getDate() + { + $date = $this->getDateFromText(); + return $date[0]; + } + + /** + * Sets the date for the date picker using timestamp. + * @param integer time stamp for the date picker + */ + public function setDate($value) + { + $date = TPropertyValue::ensureInteger($value); + $formatter = Prado::createComponent('System.Data.TSimpleDateFormatter', + $this->getDateFormat()); + $this->setText($formatter->format($date)); + } + + /** + * Publish the date picker Css asset files. + */ + public function onPreRender($param) + { + parent::onPreRender($param); + $this->publishCalendarStyle(); + } + + /** + * Renders body content. + * This method overrides parent implementation by adding + * additional date picker button if Mode is "Button" or "ImageButton". + * @param THtmlWriter writer + */ + public function render($writer) + { + if($this->getInputMode() == 'TextBox') + parent::render($writer); + else + $this->renderDropDownListCalendar($writer); + + if($this->getShowCalendar()) + { + switch ($this->getMode()) + { + case 'Button': $this->renderButtonDatePicker($writer); break; + case 'ImageButton' : $this->renderImageButtonDatePicker($writer); break; + } + } + } + + /** + * Loads user input data. Override parent implementation, when InputMode + * is DropDownList call getDateFromPostData to get date 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->getInputMode() == "TextBox") + return parent::loadPostData($key, $values); + $value = $this->getDateFromPostData($key, $values); + if(!$this->getReadOnly() && $this->getText()!==$value) + { + $this->setText($value); + return true; + } + else + return false; + } + + /** + * Loads date from drop down list data. + * @param string the key that can be used to retrieve data from the input data collection + * @param array the input data collection + * @return array the date selected + */ + protected function getDateFromPostData($key, $values) + { + $day = $values[$key.'$day']; + $month = $values[$key.'$month']; + $year = $values[$key.'$year']; + $date = @mktime(0, 0, 0, $month+1, $day, $year); + $formatter = Prado::createComponent('System.Data.TSimpleDateFormatter', + $this->getDateFormat()); + return $formatter->format($date); + } + /** * Get javascript date picker options. * @return array date picker client-side options */ protected function getDatePickerOptions() { + $options['ID'] = $this->getClientID(); + $options['InputMode'] = $this->getInputMode(); $options['Format'] = $this->getDateFormat(); $options['FirstDayOfWeek'] = $this->getFirstDayOfWeek(); if(($cssClass=$this->getCssClass())!=='') @@ -245,45 +353,151 @@ class TDatePicker extends TTextBox */ protected function getCulturalOptions() { - $app = $this->getApplication()->getGlobalization(); - $culture = $this->getCulture() == '' ? $app->getCulture() : $this->getCulture(); - if($culture == 'en') return array(); + if($this->getCurrentCulture() == 'en') + return array(); - //expensive operations - Prado::using('System.I18N.core.DateTimeFormatInfo'); - $info = Prado::createComponent('System.I18N.core.CultureInfo', $culture); - $date = $info->getDateTimeFormat(); + $date = $this->getLocalizedCalendarInfo(); $options['MonthNames'] = TJavaScript::encode($date->getMonthNames(),false); $options['ShortWeekDayNames'] = TJavaScript::encode($date->getAbbreviatedDayNames(),false); + return $options; } /** - * Publish the date picker Css asset files. + * @return string the current culture, falls back to application if culture is not set. */ - public function onPreRender($param) + protected function getCurrentCulture() { - parent::onPreRender($param); - $this->publishCalendarStyle(); + $app = $this->getApplication()->getGlobalization(); + return $this->getCulture() == '' ? $app->getCulture() : $this->getCulture(); } /** - * Renders body content. - * This method overrides parent implementation by adding - * additional date picker button if Mode is "Button" or "ImageButton". - * @param THtmlWriter writer + * @return DateTimeFormatInfo date time format information for the current culture. */ - public function render($writer) + protected function getLocalizedCalendarInfo() { - parent::render($writer); - switch ($this->getMode()) - { - case 'Button': $this->renderButtonDatePicker($writer); break; - case 'ImageButton' : $this->renderImageButtonDatePicker($writer); break; + //expensive operations + $culture = $this->getCurrentCulture(); + Prado::using('System.I18N.core.DateTimeFormatInfo'); + $info = Prado::createComponent('System.I18N.core.CultureInfo', $culture); + return $info->getDateTimeFormat(); + } + + /** + * Renders the drop down list date picker. + */ + protected function renderDropDownListCalendar($writer) + { + if($this->getMode() == 'Basic') + $this->setMode('ImageButton'); + parent::addAttributesToRender($writer); + $writer->removeAttribute('name'); + $writer->removeAttribute('type'); + $writer->addAttribute('id', $this->getClientID()); + + if(strlen($class = $this->getCssClass()) > 0) + $writer->addAttribute('class', $class); + $writer->renderBeginTag('span'); + + $date = $this->getDateFromText(); + + //renders the 3 drop down lists + $this->renderCalendarDayOptions($writer,$date['mday']); + $this->renderCalendarMonthOptions($writer,$date['mon']-1); + $this->renderCalendarYearOptions($writer,$date['year']); + + //render a hidden input field + $writer->addAttribute('name', $this->getUniqueID()); + $writer->addAttribute('type', 'hidden'); + $writer->addAttribute('value', $this->getText()); + $writer->renderBeginTag('input'); + + $this->registerCalendarClientScript(); + $writer->renderEndTag(); + } + + /** + * Gets the date from the text input using TSimpleDateFormatter + * @return array current selected date + */ + protected function getDateFromText() + { + $formatter = Prado::createComponent('System.Data.TSimpleDateFormatter', + $this->getDateFormat()); + return $formatter->parse($this->getText()); + } + /** + * Renders a drop down lists. + * @param THtmlWriter the writer used for the rendering purpose + * @param array list of selection options + * @param mixed selected key. + */ + private function renderDropDownListOptions($writer,$options,$selected=null) + { + foreach($options as $k => $v) + { + $writer->addAttribute('value', $k); + if($k == $selected) + $writer->addAttribute('selected', 'selected'); + $writer->renderBeginTag('option'); + $writer->write($v); + $writer->renderEndTag(); } } + /** + * Renders the day drop down list options. + * @param THtmlWriter the writer used for the rendering purpose + * @param mixed selected day. + */ + protected function renderCalendarDayOptions($writer, $selected=null) + { + $days = array(); for($i=1;$i<=31;$i++) $days[$i] = $i; + $writer->addAttribute('id', $this->getClientID().'_day'); + $writer->addAttribute('name', $this->getUniqueID().'$day'); + $writer->addAttribute('class', 'datepicker_day_options'); + $writer->renderBeginTag('select'); + $this->renderDropDownListOptions($writer, $days, $selected); + $writer->renderEndTag(); + } + + /** + * Renders the month drop down list options. + * @param THtmlWriter the writer used for the rendering purpose + * @param mixed selected month. + */ + protected function renderCalendarMonthOptions($writer, $selected=null) + { + $info = $this->getLocalizedCalendarInfo(); + $writer->addAttribute('id', $this->getClientID().'_month'); + $writer->addAttribute('name', $this->getUniqueID().'$month'); + $writer->addAttribute('class', 'datepicker_month_options'); + $writer->renderBeginTag('select'); + $this->renderDropDownListOptions($writer, + $info->getMonthNames(), $selected); + $writer->renderEndTag(); + } + + /** + * Renders the year drop down list options. + * @param THtmlWriter the writer used for the rendering purpose + * @param mixed selected year. + */ + protected function renderCalendarYearOptions($writer, $selected=null) + { + $years = array(); + for($i = $this->getFromYear(); $i <= $this->getUpToYear(); $i++) + $years[$i] = $i; + $writer->addAttribute('id', $this->getClientID().'_year'); + $writer->addAttribute('name', $this->getUniqueID().'$year'); + $writer->renderBeginTag('select'); + $writer->addAttribute('class', 'datepicker_year_options'); + $this->renderDropDownListOptions($writer, $years, $selected); + $writer->renderEndTag(); + } + /** * Gets the ID for the date picker trigger button. * @return string unique button ID @@ -354,23 +568,31 @@ class TDatePicker extends TTextBox } /** - * Registers the javascript code to initialize the date picker. - * Must use "Event.OnLoad" to initialize the date picker when the - * full page is loaded, otherwise IE will throw an error. + * Add the client id to the input textbox, and register the client scripts. * @param THtmlWriter writer */ protected function addAttributesToRender($writer) { parent::addAttributesToRender($writer); $writer->addAttribute('id',$this->getClientID()); + $this->registerCalendarClientScript(); + } + + + /** + * Registers the javascript code to initialize the date picker. + * Must use "Event.OnLoad" to initialize the date picker when the + * full page is loaded, otherwise IE will throw an error. + */ + protected function registerCalendarClientScript() + { if($this->getShowCalendar()) { $scripts = $this->getPage()->getClientScript(); $scripts->registerPradoScript("datepicker"); $options = TJavaScript::encode($this->getDatePickerOptions()); - $id = $this->getClientID(); - $code = "Event.OnLoad(function(){ new Prado.WebUI.TDatePicker('$id', $options); });"; - $scripts->registerEndScript("prado:$id", $code); + $code = "Event.OnLoad(function(){ new Prado.WebUI.TDatePicker($options); });"; + $scripts->registerEndScript("prado:".$this->getClientID(), $code); } } } diff --git a/framework/Web/UI/WebControls/TValidationSummary.php b/framework/Web/UI/WebControls/TValidationSummary.php index e7115c99..61a4415c 100644 --- a/framework/Web/UI/WebControls/TValidationSummary.php +++ b/framework/Web/UI/WebControls/TValidationSummary.php @@ -36,6 +36,25 @@ */ class TValidationSummary extends TWebControl { + /** + * @return string the display behavior (None, Static, Dynamic) of the error message in a validation summary component. + */ + public function getDisplay() + { + return $this->getViewState('Display','Static'); + } + + /** + * Sets the display behavior (None, Static, Dynamic) of the error message in a validation summary component. + * @param string the display behavior (None, Static, Dynamic) + */ + public function setDisplay($value) + { + if($value!='None' && $value!='Dynamic') + $value='Static'; + $this->setViewState('Display',$value,'Static'); + } + /** * @return string the header text displayed at the top of the summary */ @@ -170,6 +189,15 @@ class TValidationSummary extends TWebControl protected function addAttributesToRender($writer) { + $display=$this->getDisplay(); + $visible=$this->getEnabled(true) && count($this->getErrorMessages()) > 0; + if(!$visible) + { + if($display==='None' || $display==='Dynamic') + $writer->addStyleAttribute('display','none'); + else + $writer->addStyleAttribute('visibility','hidden'); + } $writer->addAttribute('id',$this->getClientID()); parent::addAttributesToRender($writer); } @@ -205,6 +233,7 @@ class TValidationSummary extends TWebControl $options['refresh'] = $this->getAutoUpdate(); $options['validationgroup'] = $this->getValidationGroup(); + $options['display'] = $this->getDisplay(); return $options; } diff --git a/framework/Web/UI/WebControls/TValueTypeValidator.php b/framework/Web/UI/WebControls/TValueTypeValidator.php index f0f61d52..ca4a01ca 100644 --- a/framework/Web/UI/WebControls/TValueTypeValidator.php +++ b/framework/Web/UI/WebControls/TValueTypeValidator.php @@ -65,7 +65,7 @@ class TValueTypeValidator $dateFormat = $this->getDateFormat(); if(strlen($dateFormat)) { - $formatter = Prado::createComponent('System.Data.TDateTimeSimpleFormatter',$dateFormat); + $formatter = Prado::createComponent('System.Data.TSimpleDateFormatter',$dateFormat); return $formatter->isValidDate($value); } else -- cgit v1.2.3