From 550ba06593b467b643862d41a00ca2dd12ee704b Mon Sep 17 00:00:00 2001 From: xue <> Date: Wed, 2 Aug 2006 02:24:29 +0000 Subject: merge from 3.0 branch till 1320. --- framework/Collections/TDummyDataSource.php | 12 +++- framework/Collections/TList.php | 15 ++++- framework/Collections/TMap.php | 15 ++++- framework/Collections/TPagedDataSource.php | 12 +++- framework/Collections/TStack.php | 12 +++- framework/Exceptions/messages.txt | 2 + framework/I18N/core/MessageFormat.php | 4 ++ framework/I18N/core/NumberFormat.php | 13 ++++- framework/PradoBase.php | 86 +++------------------------- framework/Security/TAuthManager.php | 8 +-- framework/Util/TSimpleDateFormatter.php | 5 +- framework/Web/THttpRequest.php | 53 +++++++++++------ framework/Web/THttpSession.php | 15 ++++- framework/Web/UI/TTemplateControl.php | 2 +- framework/Web/UI/WebControls/TDatePicker.php | 33 +++++++++-- 15 files changed, 166 insertions(+), 121 deletions(-) (limited to 'framework') diff --git a/framework/Collections/TDummyDataSource.php b/framework/Collections/TDummyDataSource.php index 46e625ab..d7fee4a9 100644 --- a/framework/Collections/TDummyDataSource.php +++ b/framework/Collections/TDummyDataSource.php @@ -26,7 +26,7 @@ * @package System.Collections * @since 3.0 */ -class TDummyDataSource extends TComponent implements IteratorAggregate +class TDummyDataSource extends TComponent implements IteratorAggregate, Countable { private $_count; @@ -54,6 +54,16 @@ class TDummyDataSource extends TComponent implements IteratorAggregate { return new TDummyDataSourceIterator($this->_count); } + + /** + * Returns the number of (virtual) items in the data source. + * This method is required by Countable interface. + * @return integer number of (virtual) items in the data source. + */ + public function count() + { + return $this->getCount(); + } } /** diff --git a/framework/Collections/TList.php b/framework/Collections/TList.php index 015781cb..1104ec47 100644 --- a/framework/Collections/TList.php +++ b/framework/Collections/TList.php @@ -25,9 +25,8 @@ * unset($list[$index]); // remove the item at $index * if(isset($list[$index])) // if the list has an item at $index * foreach($list as $index=>$item) // traverse each item in the list + * $n=count($list); // returns the number of items in the list * - * Note, count($list) will always return 1. You should use {@link getCount()} - * to determine the number of items in the list. * * To extend TList by doing additional operations with each addition or removal * operation, override {@link insertAt()}, and {@link removeAt()}. @@ -37,7 +36,7 @@ * @package System.Collections * @since 3.0 */ -class TList extends TComponent implements IteratorAggregate,ArrayAccess +class TList extends TComponent implements IteratorAggregate,ArrayAccess,Countable { /** * internal data storage @@ -94,6 +93,16 @@ class TList extends TComponent implements IteratorAggregate,ArrayAccess return new TListIterator($this->_d); } + /** + * Returns the number of items in the list. + * This method is required by Countable interface. + * @return integer number of items in the list. + */ + public function count() + { + return $this->getCount(); + } + /** * @return integer the number of items in the list */ diff --git a/framework/Collections/TMap.php b/framework/Collections/TMap.php index e3a26e5f..ef393866 100644 --- a/framework/Collections/TMap.php +++ b/framework/Collections/TMap.php @@ -24,16 +24,15 @@ * unset($map[$key]); // remove the value with the specified key * if(isset($map[$key])) // if the map contains the key * foreach($map as $key=>$value) // traverse the items in the map + * $n=count($map); // returns the number of items in the map * - * Note, count($map) will always return 1. You should use {@link getCount()} - * to determine the number of items in the map. * * @author Qiang Xue * @version $Revision: $ $Date: $ * @package System.Collections * @since 3.0 */ -class TMap extends TComponent implements IteratorAggregate,ArrayAccess +class TMap extends TComponent implements IteratorAggregate,ArrayAccess,Countable { /** * @var array internal data storage @@ -84,6 +83,16 @@ class TMap extends TComponent implements IteratorAggregate,ArrayAccess return new TMapIterator($this->_d); } + /** + * Returns the number of items in the map. + * This method is required by Countable interface. + * @return integer number of items in the map. + */ + public function count() + { + return $this->getCount(); + } + /** * @return integer the number of items in the map */ diff --git a/framework/Collections/TPagedDataSource.php b/framework/Collections/TPagedDataSource.php index 6192b1f7..a2bce9e3 100644 --- a/framework/Collections/TPagedDataSource.php +++ b/framework/Collections/TPagedDataSource.php @@ -28,7 +28,7 @@ * @package System.Collections * @since 3.0 */ -class TPagedDataSource extends TComponent implements IteratorAggregate +class TPagedDataSource extends TComponent implements IteratorAggregate,Countable { /** * @var mixed original data source @@ -182,6 +182,16 @@ class TPagedDataSource extends TComponent implements IteratorAggregate return $this->_pageSize; } + /** + * Returns the number of items in the current page. + * This method is required by Countable interface. + * @return integer number of items in the current page. + */ + public function count() + { + return $this->getCount(); + } + /** * @return integer number of pages */ diff --git a/framework/Collections/TStack.php b/framework/Collections/TStack.php index 79d17902..f1118d90 100644 --- a/framework/Collections/TStack.php +++ b/framework/Collections/TStack.php @@ -31,7 +31,7 @@ * @package System.Collections * @since 3.0 */ -class TStack extends TComponent implements IteratorAggregate +class TStack extends TComponent implements IteratorAggregate,Countable { /** * internal data storage @@ -160,6 +160,16 @@ class TStack extends TComponent implements IteratorAggregate { return $this->_c; } + + /** + * Returns the number of items in the stack. + * This method is required by Countable interface. + * @return integer number of items in the stack. + */ + public function count() + { + return $this->getCount(); + } } /** diff --git a/framework/Exceptions/messages.txt b/framework/Exceptions/messages.txt index ff9ab1f3..630f7b50 100644 --- a/framework/Exceptions/messages.txt +++ b/framework/Exceptions/messages.txt @@ -322,6 +322,8 @@ databoundcontrol_datamember_invalid = databoundcontrol_datamember_invalid clientscript_invalid_file_position = Invalid file position '{1}' for TClientScript control '{0}', must be 'Head', 'Here' or 'Begin'. +tdatepicker_autopostback_unsupported = '{0}' does not support AutoPostBack. + callback_not_support_no_priority_state_update = Callback request does not support unprioritized pagestate update. callback_invalid_callback_options = '{1}' is not a valid TCallbackOptions control for Callback control '{0}'. callback_invalid_clientside_options = Callback ClientSide property must be either a string that is the ID of a TCallbackOptions control or an instance of TCallbackClientSideOptions.======= diff --git a/framework/I18N/core/MessageFormat.php b/framework/I18N/core/MessageFormat.php index dab7434c..3faa663d 100644 --- a/framework/I18N/core/MessageFormat.php +++ b/framework/I18N/core/MessageFormat.php @@ -161,6 +161,10 @@ class MessageFormat public function format($string,$args=array(), $catalogue=null, $charset=null) { if(empty($charset)) $charset = $this->getCharset(); + + //force args as UTF-8 + foreach($args as $k => $v) + $args[$k] = I18N_toUTF8($v, $charset); $s = $this->formatString(I18N_toUTF8($string, $charset),$args,$catalogue); return I18N_toEncoding($s, $charset); } diff --git a/framework/I18N/core/NumberFormat.php b/framework/I18N/core/NumberFormat.php index 8e715f15..b30e615b 100644 --- a/framework/I18N/core/NumberFormat.php +++ b/framework/I18N/core/NumberFormat.php @@ -161,9 +161,14 @@ class NumberFormat $string = (string)$string; $dp = strpos($string, '.'); + $decimalDigits = $this->formatInfo->DecimalDigits; +// var_dump($decimalDigits); + //if not decimal digits, assume 0 decimal points. + if(is_int($decimalDigits) && $decimalDigits > 0) + $string = (string)round(floatval($string),$decimalDigits); if(is_int($dp)) - $string = substr($string, 0, $dp); - + $string = substr($string, 0, $dp); + $integer = ''; $digitSize = $this->formatInfo->getDigitSize(); @@ -233,7 +238,9 @@ class NumberFormat $decimalDigits = $this->formatInfo->DecimalDigits; $decimalSeparator = $this->formatInfo->DecimalSeparator; - + + //do the correct rounding here + //$string = round(floatval($string), $decimalDigits); if(is_int($dp)) { if($decimalDigits == -1) diff --git a/framework/PradoBase.php b/framework/PradoBase.php index 608784e9..50e4ac82 100644 --- a/framework/PradoBase.php +++ b/framework/PradoBase.php @@ -563,86 +563,16 @@ class PradoBase } /** - * The following code is meant to fill the gaps between different PHP versions. + * TReflectionClass class. + * This class was originally written to cope with the incompatibility between different PHP versions. + * It is equivalent to ReflectionClass for PHP version >= 5.1.0 + * @author Qiang Xue + * @version $Revision: $ $Date: $ + * @package System + * @since 3.0 */ -if(version_compare(phpversion(),'5.1.0','>=')) +class TReflectionClass extends ReflectionClass { - /** - * TReflectionClass class. - * This class is written to cope with the incompatibility between different PHP versions. - * It is equivalent to ReflectionClass if PHP version >= 5.1.0 - * @author Qiang Xue - * @version $Revision: $ $Date: $ - * @package System - * @since 3.0 - */ - class TReflectionClass extends ReflectionClass - { - } -} -else // PHP < 5.1.0 -{ - /** - * TReflectionClass class. - * This class is written to cope with the incompatibility between different PHP versions. - * It mainly provides a way to detect if a method exists for a given class name. - * - * @author Qiang Xue - * @version $Revision: $ $Date: $ - * @package System - * @since 3.0 - */ - class TReflectionClass extends ReflectionClass - { - /** - * @param string method name - * @return boolean whether the method exists - */ - public function hasMethod($method) - { - try - { - return $this->getMethod($method)!==null; - } - catch(Exception $e) - { - return false; - } - } - - /** - * @param string property name - * @return boolean whether the property exists - */ - public function hasProperty($property) - { - try - { - return $this->getProperty($property)!==null; - } - catch(Exception $e) - { - return false; - } - } - } - - if(!function_exists('property_exists')) - { - /** - * Detects whether an object contains the specified member variable. - * @param object - * @param string member variable (property) name - * @return boolean - */ - function property_exists($object, $property) - { - if(is_object($object)) - return array_key_exists($property, get_object_vars($object)); - else - return false; - } - } } ?> diff --git a/framework/Security/TAuthManager.php b/framework/Security/TAuthManager.php index ee01d5f3..e378b51e 100644 --- a/framework/Security/TAuthManager.php +++ b/framework/Security/TAuthManager.php @@ -195,10 +195,6 @@ class TAuthManager extends TModule public function onAuthenticate($param) { $application=$this->getApplication(); - if($this->hasEventHandler('OnAuthenticate')) - $this->raiseEvent('OnAuthenticate',$this,$application); - if($application->getUser()!==null) - return; if(($session=$application->getSession())===null) throw new TConfigurationException('authmanager_session_required'); @@ -206,6 +202,10 @@ class TAuthManager extends TModule $sessionInfo=$session->itemAt($this->generateUserSessionKey()); $user=$this->_userManager->getUser(null)->loadFromString($sessionInfo); $application->setUser($user); + + // event handler gets a chance to do further auth work + if($this->hasEventHandler('OnAuthenticate')) + $this->raiseEvent('OnAuthenticate',$this,$application); } /** diff --git a/framework/Util/TSimpleDateFormatter.php b/framework/Util/TSimpleDateFormatter.php index 2a3da63a..971225b5 100644 --- a/framework/Util/TSimpleDateFormatter.php +++ b/framework/Util/TSimpleDateFormatter.php @@ -294,11 +294,14 @@ class TSimpleDateFormatter } if ($i_val != $this->length($value)) throw new TInvalidDataValueException("Pattern '{$this->pattern}' mismatch", $value); - + //var_dump('month is '.$month); if(!$defaultToCurrentTime && (is_null($month) || is_null($day) || is_null($year))) return null; else + { + $day = intval($day) <= 0 ? 1 : intval($day); return @mktime(0, 0, 0, $month, $day, $year); + } } /** diff --git a/framework/Web/THttpRequest.php b/framework/Web/THttpRequest.php index 01827f33..130dc3cf 100644 --- a/framework/Web/THttpRequest.php +++ b/framework/Web/THttpRequest.php @@ -57,13 +57,12 @@ * @package System.Web * @since 3.0 */ -class THttpRequest extends TApplicationComponent implements IteratorAggregate,ArrayAccess,IModule +class THttpRequest extends TApplicationComponent implements IteratorAggregate,ArrayAccess,Countable,IModule { /** * Separator used to separate GET variable name and value when URL format is Path. */ - const URL_PARAM_SEPARATOR=','; - + private $_separator=','; /** * @var boolean whether the module is initialized */ @@ -226,6 +225,26 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar $this->_urlFormat=TPropertyValue::ensureEnum($value,'Path','Get'); } + /** + * @return string separator used to separate GET variable name and value when URL format is Path. Defaults to comma ','. + */ + public function getUrlParamSeparator() + { + return $this->_separator; + } + + /** + * @param string separator used to separate GET variable name and value when URL format is Path. + * @throws TInvalidDataValueException if the separator is not a single character + */ + public function setUrlParamSeparator($value) + { + if(strlen($value)===1) + $this->_separator=$value; + else + throw new TInvalidDataValueException('httprequest_separator_invalid'); + } + /** * @return string request type, can be GET, POST, HEAD, or PUT */ @@ -460,10 +479,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar */ public function constructUrl($serviceID,$serviceParam,$getItems=null,$encodeAmpersand=false,$encodeGetItems=true) { - if($this->getUrlFormat()==='Path') - $url=$serviceID.'/'.$serviceParam; - else - $url=$serviceID.'='.$serviceParam; + $url=$serviceID.'='.$serviceParam; $amp=$encodeAmpersand?'&':'&'; if(is_array($getItems) || $getItems instanceof Traversable) { @@ -497,7 +513,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar } if($this->getUrlFormat()==='Path') { - $url=strtr($url,array($amp=>'/','?'=>'/','='=>self::URL_PARAM_SEPARATOR)); + $url=strtr($url,array($amp=>'/','?'=>'/','='=>$this->_separator)); if(defined('SID') && SID != '' && !((int)ini_get('session.use_cookies')===1 && ((int)ini_get('session.use_only_cookies')===1))) $url.='?'.SID; return $this->getApplicationUrl().'/'.$url; @@ -523,13 +539,12 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar { $paths=explode('/',$this->_pathInfo); $getVariables=$_GET; - $index=0; $serviceID=null; foreach($paths as $path) { if(($path=trim($path))!=='') { - if(($pos=strpos($path,','))!==false) + if(($pos=strpos($path,$this->_separator))!==false) { $name=substr($path,0,$pos); $value=substr($path,$pos+1); @@ -538,16 +553,8 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar else $getVariables[$name]=$value; } - else if($index===0) - { - $serviceID=$path; - $getVariables[$serviceID]=''; - } - else if($index===1 && $serviceID!==null) - $getVariables[$serviceID]=$path; else $getVariables[$path]=''; - $index++; } } return $getVariables; @@ -653,6 +660,16 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar return count($this->_items); } + /** + * Returns the number of items in the request. + * This method is required by Countable interface. + * @return integer number of items in the request. + */ + public function count() + { + return $this->getCount(); + } + /** * @return array the key list */ diff --git a/framework/Web/THttpSession.php b/framework/Web/THttpSession.php index 4439cf57..19473cda 100644 --- a/framework/Web/THttpSession.php +++ b/framework/Web/THttpSession.php @@ -61,7 +61,7 @@ * @package System.Web * @since 3.0 */ -class THttpSession extends TApplicationComponent implements IteratorAggregate,ArrayAccess,IModule +class THttpSession extends TApplicationComponent implements IteratorAggregate,ArrayAccess,Countable,IModule { /** * @var boolean whether this module has been initialized @@ -139,7 +139,8 @@ class THttpSession extends TApplicationComponent implements IteratorAggregate,Ar session_set_save_handler(array($this,'_open'),array($this,'_close'),array($this,'_read'),array($this,'_write'),array($this,'_destroy'),array($this,'_gc')); if($this->_cookie!==null) session_set_cookie_params($this->_cookie->getExpire(),$this->_cookie->getPath(),$this->_cookie->getDomain(),$this->_cookie->getSecure()); - session_start(); + if(ini_get('session.auto_start')!=='1') + session_start(); $this->_started=true; } } @@ -486,6 +487,16 @@ class THttpSession extends TApplicationComponent implements IteratorAggregate,Ar return count($_SESSION); } + /** + * Returns the number of items in the session. + * This method is required by Countable interface. + * @return integer number of items in the session. + */ + public function count() + { + return $this->getCount(); + } + /** * @return array the list of session variable names */ diff --git a/framework/Web/UI/TTemplateControl.php b/framework/Web/UI/TTemplateControl.php index c7364d4b..3bbe52c5 100644 --- a/framework/Web/UI/TTemplateControl.php +++ b/framework/Web/UI/TTemplateControl.php @@ -129,7 +129,7 @@ class TTemplateControl extends TCompositeControl */ public function createChildControls() { - if($tpl=$this->getTemplate(true)) + if($tpl=$this->getTemplate()) { foreach($tpl->getDirective() as $name=>$value) { diff --git a/framework/Web/UI/WebControls/TDatePicker.php b/framework/Web/UI/WebControls/TDatePicker.php index 27d080c6..42cb305e 100644 --- a/framework/Web/UI/WebControls/TDatePicker.php +++ b/framework/Web/UI/WebControls/TDatePicker.php @@ -68,6 +68,15 @@ Prado::using('System.Web.UI.WebControls.TTextBox'); */ class TDatePicker extends TTextBox { + /** + * AutoPostBack is not supported. + */ + public function setAutoPostBack($value) + { + throw new TNotSupportedException('tdatepicker_autopostback_unsupported', + get_class($this)); + } + /** * @return string the format of the date string */ @@ -328,7 +337,7 @@ class TDatePicker extends TTextBox */ protected function renderDatePickerButtons($writer) { - if($this->getShowCalendar()) + if($this->getShowCalendar() && $this->getEnabled(true)) { switch ($this->getMode()) { @@ -384,7 +393,9 @@ class TDatePicker extends TTextBox $year = intval($values[$key.'$year']); else $year = $date['year']; + $date = @mktime(0, 0, 0, $month, $day, $year); + $pattern = $this->getDateFormat(); $pattern = str_replace(array('MMMM', 'MMM'), array('MM','MM'), $pattern); $formatter = Prado::createComponent('System.Util.TSimpleDateFormatter', $pattern); @@ -497,12 +508,13 @@ class TDatePicker extends TTextBox { $formatter = Prado::createComponent('System.Util.TSimpleDateFormatter', $this->getDateFormat()); + foreach($formatter->getDayMonthYearOrdering() as $type) { if($type == 'day') $this->renderCalendarDayOptions($writer,$date['mday']); elseif($type == 'month') - $this->renderCalendarMonthOptions($writer,$date['mon']-1); + $this->renderCalendarMonthOptions($writer,$date['mon']); elseif($type == 'year') $this->renderCalendarYearOptions($writer,$date['year']); } @@ -550,6 +562,8 @@ class TDatePicker extends TTextBox $writer->addAttribute('id', $this->getClientID().'_day'); $writer->addAttribute('name', $this->getUniqueID().'$day'); $writer->addAttribute('class', 'datepicker_day_options'); + if($this->getReadOnly() || !$this->getEnabled(true)) + $writer->addAttribute('disabled', 'disabled'); $writer->renderBeginTag('select'); $this->renderDropDownListOptions($writer, $days, $selected); $writer->renderEndTag(); @@ -562,13 +576,16 @@ class TDatePicker extends TTextBox */ 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'); + if($this->getReadOnly() || !$this->getEnabled(true)) + $writer->addAttribute('disabled', 'disabled'); $writer->renderBeginTag('select'); $this->renderDropDownListOptions($writer, - $this->getLocalizedMonthNames($info), $selected); + $this->getLocalizedMonthNames($info), $selected-1); $writer->renderEndTag(); } @@ -585,8 +602,12 @@ class TDatePicker extends TTextBox $this->getDateFormat()); switch($formatter->getMonthPattern()) { - case 'MMM': - case 'MM': return $info->getAbbreviatedMonthNames(); + case 'MMM': return $info->getAbbreviatedMonthNames(); + case 'MM': + $array = array(); + for($i=1;$i<=12;$i++) + $array[$i-1] = $i < 10 ? '0'.$i : $i; + return $array; case 'M': $array = array(); for($i=1;$i<=12;$i++) $array[$i-1] = $i; return $array; @@ -606,6 +627,8 @@ class TDatePicker extends TTextBox $years[$i] = $i; $writer->addAttribute('id', $this->getClientID().'_year'); $writer->addAttribute('name', $this->getUniqueID().'$year'); + if($this->getReadOnly() || !$this->getEnabled(true)) + $writer->addAttribute('disabled', 'disabled'); $writer->renderBeginTag('select'); $writer->addAttribute('class', 'datepicker_year_options'); $this->renderDropDownListOptions($writer, $years, $selected); -- cgit v1.2.3