Blame | Letzte Änderung | Log anzeigen | RSS feed
<?php/*** TDateFromat formatting component.** @author Wei Zhuo <weizhuo[at]gmail[dot]com>* @link http://www.pradosoft.com/* @copyright Copyright © 2005-2008 PradoSoft* @license http://www.pradosoft.com/license/* @version $Id: TDateFormat.php 2510 2008-10-13 10:28:33Z carl $* @package System.I18N*//*** Get the DateFormat class.*/Prado::using('System.I18N.core.DateFormat');/*** Get the parent control class.*/Prado::using('System.I18N.TI18NControl');/*** To format dates and/or time according to the current locale use* <code>* <com:TDateFormat Pattern="dd:MMM:yyyy" Value="01/01/2001" />*</code>* The date will be formatted according to the current locale (or culture)* using the format specified by 'Pattern' attribute.** To format date and/or time for a locale (e.g. de_DE) include a Culture* attribute, for example:* <code>* <com:TDateFormat Culture="de_DE" Value="01/01/2001 12:00" />* </code>* The date will be formatted according to this format.** If no Pattern was specified then the date will be formatted with the* default format (both date and time). If no value for the date is specified* then the current date will be used. E.g.: <code><com:TDateFormat /></code>* will result in the current date, formatted with default localized pattern.** Namespace: System.I18N** Properties* - <b>Value</b>, date,* <br>Gets or sets the date to format. The tag content is used as Value* if the Value property is not specified.* - <b>Pattern</b>, string,* <br>Gets or sets the formatting pattern. The predefined patterns are* 'fulldate', 'longdate', 'mediumdate', 'shortdate', 'fulltime',* 'longtime', 'mediumtime', and 'shorttime'. Custom patterns can specified* when the Pattern property does not match the predefined patterns.* - <b>DefaultText</b>, string,* <br>Gets or sets the default text. If Value is not set, DefaultText will be* shown instead of todays date and time.** @author Xiang Wei Zhuo <weizhuo[at]gmail[dot]com>* @version v1.0, last update on Sat Dec 11 15:25:11 EST 2004* @package System.I18N*/class TDateFormat extends TI18NControl implements IDataRenderer{/*** Default DateFormat, set to the application culture.* @var DateFormat*/protected static $formatter;/*** A set of pattern presets and their respective formatting shorthand.* @var array*/static private $_patternPresets = array('fulldate'=>'P','full'=>'P','longdate'=>'D','long'=>'d','mediumdate'=>'p','medium'=>'p','shortdate'=>'d','short'=>'d','fulltime'=>'Q', 'longtime'=>'T','mediumtime'=>'q', 'shorttime'=>'t');/*** Sets the date time formatting pattern.* @param string format pattern.*/public function setPattern($value){$this->setViewState('Pattern',$value,'');}/*** Gets the date time format pattern.* @return string format pattern.*/public function getPattern(){$string = $this->getViewState('Pattern','');$pattern = null;//try the subpattern of "date time" presets$subpatterns = explode(' ',$string,2);$datetime = array();if(count($subpatterns)==2){$datetime[] = $this->getPreset($subpatterns[0]);$datetime[] = $this->getPreset($subpatterns[1]);}//we have a good subpatternif(count($datetime) == 2&& strlen($datetime[0]) == 1&& strlen($datetime[1]) == 1){$pattern = $datetime;}else //no subpattern, try the presets$pattern = $this->getPreset($string);//no presets found, use the string as the pattern//and let the DateFormat handle it.if(is_null($pattern))$pattern = $string;if (!is_array($pattern) && strlen($pattern) == 0)$pattern = null;return $pattern;}/*** For a given string, try and find a preset pattern.* @param string the preset pattern name* @return string a preset pattern if found, null otherwise.*/protected function getPreset($string){$string = strtolower($string);foreach(self::$_patternPresets as $pattern => $preset){if($string == $pattern)return $preset;}}/*** Get the date-time value for this control.* @return string date time value.*/public function getValue(){$value = $this->getViewState('Value','');if(empty($value)){$defaultText = $this->getDefaultText();if(empty($defaultText))return time();}return $value;}/*** Set the date-time value for this control.* @param string the date-time value.*/public function setValue($value){$this->setViewState('Value',$value,'');}/*** Get the default text value for this control.* @return string default text value*/public function getDefaultText(){return $this->getViewState('DefaultText','');}/*** Set the default text value for this control.* @param string default text value*/public function setDefaultText($value){$this->setViewState('DefaultText',$value,'');}/*** Get the date-time value for this control.* This method is required by {@link IDataRenderer}.* It is the same as {@link getValue()}.* @return string date time value.* @see getValue* @since 3.1.2*/public function getData(){return $this->getValue();}/*** Set the date-time value for this control.* This method is required by {@link IDataRenderer}.* It is the same as {@link setValue()}.* @param string the date-time value.* @see setValue* @since 3.1.2*/public function setData($value){$this->setValue($value);}/*** Renders the localized version of the date-time value.* If the culture is not specified, the default application* culture will be used.* This method overrides parent's implementation.*/protected function getFormattedDate(){$value = $this->getValue();$defaultText = $this->getDefaultText();if(empty($value) && !empty($defaultText))return $this->getDefaultText();$app = $this->getApplication()->getGlobalization();//initialized the default class wide formatterif(is_null(self::$formatter))self::$formatter = new DateFormat($app->getCulture());$culture = $this->getCulture();//return the specific cultural formatted date timeif(strlen($culture) && $app->getCulture() !== $culture){$formatter = new DateFormat($culture);return $formatter->format($value,$this->getPattern(),$this->getCharset());}//return the application wide culture formatted date time.$result = self::$formatter->format($value,$this->getPattern(),$this->getCharset());return $result;}public function render($writer){$writer->write($this->getFormattedDate());}}