summaryrefslogtreecommitdiff
path: root/framework/Web/UI
diff options
context:
space:
mode:
authorwei <>2006-02-18 23:41:16 +0000
committerwei <>2006-02-18 23:41:16 +0000
commit270282e3a26b21184a2051995cb5b9a2755b823d (patch)
tree761d82ad761996f329d63acc770fc5a0bce9d5a2 /framework/Web/UI
parentf1cc3c880b564362e7f00b18326e116884879231 (diff)
Update some javascript code.
Diffstat (limited to 'framework/Web/UI')
-rw-r--r--framework/Web/UI/THtmlWriter.php12
-rw-r--r--framework/Web/UI/WebControls/TCompareValidator.php2
-rw-r--r--framework/Web/UI/WebControls/TDatePicker.php276
-rw-r--r--framework/Web/UI/WebControls/TValidationSummary.php29
-rw-r--r--framework/Web/UI/WebControls/TValueTypeValidator.php2
5 files changed, 292 insertions, 29 deletions
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. <b>CalendarStyle</b> property sets the packages
* styles available. E.g. <b>default</b>.
*
+ * The <b>InputMode</b> property can be set to "TextBox" or "DropDownList" with
+ * default as "TextBox".
+ * In <tt>DropDownList</tt> 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 <weizhuo[at]gmail[dot]com>
* @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"
*/
@@ -221,11 +236,104 @@ class TDatePicker extends TTextBox
}
/**
+ * @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,46 +353,152 @@ 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
@@ -37,6 +37,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
*/
public function getHeaderText()
@@ -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