From c6b4190fab88201f4efaa0d00a6aa823b180f482 Mon Sep 17 00:00:00 2001 From: xue <> Date: Sat, 10 Jun 2006 11:28:30 +0000 Subject: Merge from 3.0 branch till 1148. --- COPYRIGHT | 12 +++--- HISTORY | 5 +++ UPGRADE | 6 ++- demos/blog/protected/Pages/Admin/UserMan.page | 2 +- demos/blog/protected/Portlets/CommentPortlet.php | 3 +- .../quickstart/protected/comments/CommentList.php | 1 - .../protected/pages/Controls/NewControl.page | 2 +- framework/PradoBase.php | 4 +- framework/Security/TAuthorizationRule.php | 2 +- framework/Web/Javascripts/datepicker/datepicker.js | 28 +++++-------- framework/Web/Javascripts/js/datepicker.js | 7 ++-- framework/Web/Javascripts/prado/controls.js | 1 + framework/Web/Services/TPageService.php | 4 +- framework/Web/UI/TControl.php | 2 +- framework/Web/UI/WebControls/TLinkButton.php | 10 ++--- index.html | 2 +- requirements/messages-bg.txt | 48 +++++++++++++--------- requirements/template-bg.html | 4 +- requirements/template-zh.html | 2 +- requirements/template.html | 2 +- .../quickstart/Controls/Wizard1TestCase.php | 2 +- .../quickstart/Controls/Wizard2TestCase.php | 2 +- .../quickstart/Controls/Wizard3TestCase.php | 10 ++--- .../quickstart/Controls/Wizard5TestCase.php | 6 +-- 24 files changed, 90 insertions(+), 77 deletions(-) diff --git a/COPYRIGHT b/COPYRIGHT index 72fe0bfe..f44d0d05 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,7 +1,7 @@ -PRADO is free software released under the terms of the following BSD license. +The PRADO framework and the included demos are freeware. +They are released under the terms of the following BSD License. -PRADO is released under the BSD License. -Copyright 2004-2006, PradoSoft (http://www.pradosoft.com) +Copyright 2004-2006, The PRADO Group (http://www.pradosoft.com) All rights reserved. Redistribution and use in source and binary forms, with or without @@ -14,9 +14,9 @@ this list of conditions and the following disclaimer. this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -- Neither the name of the developer nor the names of its contributors may -be used to endorse or promote products derived from this software without -specific prior written permission. +- Neither the name of the PRADO Group nor the names of its contributors +may be used to endorse or promote products derived from this software +without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" diff --git a/HISTORY b/HISTORY index 3d01115c..0431b8bb 100644 --- a/HISTORY +++ b/HISTORY @@ -7,6 +7,11 @@ NEW: TQueue (Qiang) NEW: TSessionPageStatePersister (Qiang) NEW: SQLMap (Wei) +Version 3.0.2 July 2, 2006 +========================== +BUG: Ticket#213 - PRADO Requirements Checker charset error (Qiang) +CHG: ensureChildControls() is now invoked in TControl::initRecursive (Qiang) + Version 3.0.1 June 4, 2006 ========================== BUG: Ticket#28 - OnClick does not work with Safari/KHTML (Wei) diff --git a/UPGRADE b/UPGRADE index 66770c10..79282500 100644 --- a/UPGRADE +++ b/UPGRADE @@ -14,6 +14,10 @@ version B between A and C, you need to following the instructions for both A and B. +Upgrading from v3.0.1 +--------------------- + + Upgrading from v3.0.0 --------------------- - URL format is modified when THttpRequest.UrlFormat=='Path'. @@ -67,4 +71,4 @@ All event names must start with 'On'. Upgrading from v2.x and v1.x ---------------------------- -PRADO v3.x is not backward compatible with v2.x and v1.x. \ No newline at end of file +PRADO v3.x is not backward compatible with v2.x and v1.x. diff --git a/demos/blog/protected/Pages/Admin/UserMan.page b/demos/blog/protected/Pages/Admin/UserMan.page index 02b1a069..98c1b6ff 100644 --- a/demos/blog/protected/Pages/Admin/UserMan.page +++ b/demos/blog/protected/Pages/Admin/UserMan.page @@ -35,7 +35,7 @@ HeaderText="Role" ItemStyle.HorizontalAlign="Center" ItemStyle.Wrap="false" - ItemStyle.Width="7px" > + ItemStyle.Width="50px" > <%# $this->Parent->DataItem->Role===0 ? 'User' : 'Admin' %> diff --git a/demos/blog/protected/Portlets/CommentPortlet.php b/demos/blog/protected/Portlets/CommentPortlet.php index 4147d6d3..711059ff 100644 --- a/demos/blog/protected/Portlets/CommentPortlet.php +++ b/demos/blog/protected/Portlets/CommentPortlet.php @@ -24,7 +24,8 @@ class CommentPortlet extends Portlet public function onLoad($param) { parent::onLoad($param); - $comments=$this->Application->getModule('data')->queryComments('','ORDER BY create_time DESC','LIMIT 10'); + $commentLimit=TPropertyValue::ensureInteger($this->Application->Parameters['RecentComments']); + $comments=$this->Application->getModule('data')->queryComments('','ORDER BY create_time DESC',"LIMIT $commentLimit"); foreach($comments as $comment) { $comment->ID=$this->Service->constructUrl('Posts.ViewPost',array('id'=>$comment->PostID)).'#c'.$comment->ID; diff --git a/demos/quickstart/protected/comments/CommentList.php b/demos/quickstart/protected/comments/CommentList.php index 4328991f..3bfb7239 100644 --- a/demos/quickstart/protected/comments/CommentList.php +++ b/demos/quickstart/protected/comments/CommentList.php @@ -43,7 +43,6 @@ class CommentList extends TTemplateControl $this->_quickstart->addNewComment($page, $this->email->getText(), $this->content->getText()); $this->multiView1->setActiveViewIndex(1); - $this->listComments($page); } public function setVisible($value) diff --git a/demos/quickstart/protected/pages/Controls/NewControl.page b/demos/quickstart/protected/pages/Controls/NewControl.page index c2640a33..54465ff7 100644 --- a/demos/quickstart/protected/pages/Controls/NewControl.page +++ b/demos/quickstart/protected/pages/Controls/NewControl.page @@ -122,7 +122,7 @@ Other important properties and methods include:
  • Attributes - collection of custom attributes. This is useful for allowing users to specify attributes of the output HTML elements that are not covered by control properties.
  • getViewState() and setViewState() - these methods are commonly used for defining properties that are stored in viewstate.
  • saveState() and loadState() - these two methods can be overriden to provide last step state saving and loading.
  • -
  • Control lifecycles - Life page lifecycles, controls also have lifecycles. Each control undergoes the following lifecycles in order: constructor, onInit(), onLoad(), onPreRender(), render(), and onUnload. More details can be found in the page section.
  • +
  • Control lifecycles - Like pages, controls also have lifecycles. Each control undergoes the following lifecycles in order: constructor, onInit(), onLoad(), onPreRender(), render(), and onUnload. More details can be found in the page section.
  • Extending TWebControl

    diff --git a/framework/PradoBase.php b/framework/PradoBase.php index 9c6ef96b..608784e9 100644 --- a/framework/PradoBase.php +++ b/framework/PradoBase.php @@ -90,7 +90,7 @@ class PradoBase /** * Class autoload loader. - * This method is provided to be invoked within an __auload() magic method. + * This method is provided to be invoked within an __autoload() magic method. * @param string class name */ public static function autoload($className) @@ -645,4 +645,4 @@ else // PHP < 5.1.0 } } -?> \ No newline at end of file +?> diff --git a/framework/Security/TAuthorizationRule.php b/framework/Security/TAuthorizationRule.php index 8248a45a..5c8f0f9b 100644 --- a/framework/Security/TAuthorizationRule.php +++ b/framework/Security/TAuthorizationRule.php @@ -137,7 +137,7 @@ class TAuthorizationRule extends TComponent } /** - * @var boolean if this rule applies to everyone + * @return boolean if this rule applies to everyone */ public function getEveryoneApplied() { diff --git a/framework/Web/Javascripts/datepicker/datepicker.js b/framework/Web/Javascripts/datepicker/datepicker.js index e704e950..11bee07e 100644 --- a/framework/Web/Javascripts/datepicker/datepicker.js +++ b/framework/Web/Javascripts/datepicker/datepicker.js @@ -239,13 +239,6 @@ Prado.WebUI.TDatePicker.prototype = var buttonText = today.SimpleFormat(this.Format,this); todayButton.value = buttonText; div.appendChild(todayButton); - - /*var clearButton = document.createElement("button"); - clearButton.className = "clearButton"; - buttonText = "Clear"; - clearButton.appendChild(document.createTextNode(buttonText)); - div.appendChild(clearButton); - */ if(Prado.Browser().ie) { @@ -283,10 +276,9 @@ Prado.WebUI.TDatePicker.prototype = Event.observe(calendarBody, "click", this.selectDate.bindEvent(this)); - Event.observe(this.control, "blur", this.hide.bind(this)); Prado.Element.focus(this.control); - },A + }, ieHack : function(cleanup) { @@ -308,7 +300,7 @@ Prado.WebUI.TDatePicker.prototype = if (!ev) ev = document.parentWindow.event; var kc = ev.keyCode != null ? ev.keyCode : ev.charCode; - if(kc == Event.KEY_RETURN || kc == Event.KEY_SPACEBAR) + if(kc == Event.KEY_RETURN || kc == Event.KEY_SPACEBAR || kc == Event.KEY_TAB) { this.setSelectedDate(this.selectedDate); Event.stop(ev); @@ -318,8 +310,7 @@ Prado.WebUI.TDatePicker.prototype = { Event.stop(ev); this.hide(); } - - + var getDaysPerMonth = function (nMonth, nYear) { nMonth = (nMonth + 12) % 12; @@ -600,6 +591,7 @@ Prado.WebUI.TDatePicker.prototype = if(!within) this.hide(); }, + hide : function() { if(this.showing) @@ -667,11 +659,13 @@ Prado.WebUI.TDatePicker.prototype = hover : function(ev) { - //conditionally add the hover class to the event target element. - if(ev.type == "mouseover") - Event.element(ev).addClassName("hover"); - else - Event.element(ev).removeClassName("hover"); + if(Event.element(ev).tagName) + { + if(ev.type == "mouseover") + Event.element(ev).addClassName("hover"); + else + Event.element(ev).removeClassName("hover"); + } }, updateHeader : function () { diff --git a/framework/Web/Javascripts/js/datepicker.js b/framework/Web/Javascripts/js/datepicker.js index e0bba502..090f3cbd 100644 --- a/framework/Web/Javascripts/js/datepicker.js +++ b/framework/Web/Javascripts/js/datepicker.js @@ -23,10 +23,10 @@ div=document.createElement("div");div.className="calendarFooter";this._calDiv.ap this.iePopUp.scrolling="no" this.iePopUp.frameBorder="0" document.body.appendChild(this.iePopUp);} -document.body.appendChild(this._calDiv);this.update();this.updateHeader();this.ieHack(true);previousMonth.hideFocus=true;nextMonth.hideFocus=true;todayButton.hideFocus=true;Event.observe(previousMonth,"click",this.prevMonth.bindEvent(this));Event.observe(nextMonth,"click",this.nextMonth.bindEvent(this));Event.observe(todayButton,"click",this.selectToday.bindEvent(this));Event.observe(this._monthSelect,"change",this.monthSelect.bindEvent(this));Event.observe(this._yearSelect,"change",this.yearSelect.bindEvent(this));Event.observe(this._calDiv,"mousewheel",this.mouseWheelChange.bindEvent(this));Event.observe(calendarBody,"click",this.selectDate.bindEvent(this));Event.observe(this.control,"blur",this.hide.bind(this));Prado.Element.focus(this.control);},ieHack:function(cleanup) +document.body.appendChild(this._calDiv);this.update();this.updateHeader();this.ieHack(true);previousMonth.hideFocus=true;nextMonth.hideFocus=true;todayButton.hideFocus=true;Event.observe(previousMonth,"click",this.prevMonth.bindEvent(this));Event.observe(nextMonth,"click",this.nextMonth.bindEvent(this));Event.observe(todayButton,"click",this.selectToday.bindEvent(this));Event.observe(this._monthSelect,"change",this.monthSelect.bindEvent(this));Event.observe(this._yearSelect,"change",this.yearSelect.bindEvent(this));Event.observe(this._calDiv,"mousewheel",this.mouseWheelChange.bindEvent(this));Event.observe(calendarBody,"click",this.selectDate.bindEvent(this));Prado.Element.focus(this.control);},ieHack:function(cleanup) {if(this.iePopUp) {this.iePopUp.style.display="block";this.iePopUp.style.top=(this._calDiv.offsetTop-1)+"px";this.iePopUp.style.left=(this._calDiv.offsetLeft-1)+"px";this.iePopUp.style.width=Math.abs(this._calDiv.offsetWidth-2)+"px";this.iePopUp.style.height=(this._calDiv.offsetHeight+1)+"px";if(cleanup)this.iePopUp.style.display="none";}},keyPressed:function(ev) -{if(!this.showing)return;if(!ev)ev=document.parentWindow.event;var kc=ev.keyCode!=null?ev.keyCode:ev.charCode;if(kc==Event.KEY_RETURN||kc==Event.KEY_SPACEBAR) +{if(!this.showing)return;if(!ev)ev=document.parentWindow.event;var kc=ev.keyCode!=null?ev.keyCode:ev.charCode;if(kc==Event.KEY_RETURN||kc==Event.KEY_SPACEBAR||kc==Event.KEY_TAB) {this.setSelectedDate(this.selectedDate);Event.stop(ev);this.hide();} if(kc==Event.KEY_ESC) {Event.stop(ev);this.hide();} @@ -110,7 +110,8 @@ for(i=1;i<=monthLength;i++,index++){var slot=this.dateSlot[index];var slotNode=s if(d1.toISODate()==selected){slotNode.className+=" selected";} d1=new Date(d1.getFullYear(),d1.getMonth(),d1.getDate()+1);} var lastDateIndex=index;while(index<42){this.dateSlot[index].value=-1;this.dateSlot[index].data.data=String.fromCharCode(160);this.dateSlot[index].data.parentNode.className="empty";++index;}},hover:function(ev) +{if(Event.element(ev).tagName) {if(ev.type=="mouseover") Event.element(ev).addClassName("hover");else -Event.element(ev).removeClassName("hover");},updateHeader:function(){var options=this._monthSelect.options;var m=this.selectedDate.getMonth();for(var i=0;igetAttributes(); if(($id=$properties->itemAt('id'))===null) throw new TConfigurationException('pageserviceconf_page_invalid',$configPath); - if($id===$page) + if(strcasecmp($id,$page)===0) $this->_properties=array_merge($this->_properties,$properties->toArray()); } } diff --git a/framework/Web/UI/TControl.php b/framework/Web/UI/TControl.php index eced51ea..d5079382 100644 --- a/framework/Web/UI/TControl.php +++ b/framework/Web/UI/TControl.php @@ -1165,6 +1165,7 @@ class TControl extends TApplicationComponent implements IRenderable, IBindable */ protected function initRecursive($namingContainer=null) { + $this->ensureChildControls(); if($this->getHasControls()) { if($this instanceof INamingContainer) @@ -1235,7 +1236,6 @@ class TControl extends TApplicationComponent implements IRenderable, IBindable if($this->getVisible(false)) { - $this->ensureChildControls(); if(isset($this->_rf[self::RF_ADAPTER])) $this->_rf[self::RF_ADAPTER]->onPreRender(null); else diff --git a/framework/Web/UI/WebControls/TLinkButton.php b/framework/Web/UI/WebControls/TLinkButton.php index 7f9baab8..7487b37a 100644 --- a/framework/Web/UI/WebControls/TLinkButton.php +++ b/framework/Web/UI/WebControls/TLinkButton.php @@ -85,18 +85,18 @@ class TLinkButton extends TWebControl implements IPostBackEventHandler, IButtonC else if($this->getEnabled()) // in this case, parent will not render 'disabled' $writer->addAttribute('disabled','disabled'); } - + /** * Renders the client-script code. */ protected function renderClientControlScript($writer) { //create unique no-op url references - $nop = "#".$this->getClientID(); + $nop = "javascript:;//".$this->getClientID(); $writer->addAttribute('href', $nop); - $cs = $this->getPage()->getClientScript(); + $cs = $this->getPage()->getClientScript(); $cs->registerPostBackControl(get_class($this),$this->getPostBackOptions()); - } + } /** * Returns postback specifications for the button. @@ -252,4 +252,4 @@ class TLinkButton extends TWebControl implements IPostBackEventHandler, IButtonC } } -?> \ No newline at end of file +?> diff --git a/index.html b/index.html index f1513ff1..edd88b3e 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@

    PRADO Framework for PHP 5

    -

    Version 3.0.1, June 4, 2006
    +

    Version 3.0.2, July 2, 2006
    Copyright© 2004-2006 by PradoSoft
    All Rights Reserved.

    diff --git a/requirements/messages-bg.txt b/requirements/messages-bg.txt index 62387ee8..ea54f02c 100644 --- a/requirements/messages-bg.txt +++ b/requirements/messages-bg.txt @@ -1,20 +1,28 @@ -all passed = Поздравления! Конфигурацията на вашия сървър удовлетворява всички изисквания на PRADO. -passed with warnings = Конфигурацията на вашия сървър удовлетворява минималните изисквания на PRADO. Моля, обърнете внимание на предупрежденията по-долу. -failed = За съжаление, вашият сървър не удовлетворява изискванията на PRADO. -PHP version check = Проверка за версията на PHP -PHP 5.0.4 or higher required = Изисква се PHP 5.0.4 или по-висока версия. -PHP 5.1.0 or higher preferred = Препоръчва се PHP 5.1.0 или по-висока версия. Това ще предотврати грешката предизвикана от рекурсивните __get/__set извиквания. -SQLite extension check = Проверка за SQLite -SQLite extension optional = SQLite разширението е незадължително. Ако не е заредено, няма да можете да ползвате TSqliteCache. -Memcache extension check = Проверка за Memcache -Memcache extension optional = Memcache разширението е незадължително. Ако не е заредено, няма да можете да ползвате TMemCache. -APC extension check = Проверка за APC cache -APC extension optional = APC разширението е незадължително. Ако не е заредено, няма да можете да ползвате TAPCCache. -Zlib extension check = Проверка за Zlib -Zlib extension optional = Zlib разширението е незадължително. Ако не е заредено, състоянието на страницата няма да бъде компресирано и размера на страницата може да се увеличи. -DOM extension check = Проверка за DOM разширението -DOM extension required = DOM разширението е задължително за PRADO. Използва се в TXmlDocument за анализ на XML-базирани конфигурации. -ICONV extension check = Проверка за ICONV функцията -ICONV extension optional = ICONV разширението е незадължително. Ако не е заредено, е възможно някои компоненти свързани с интернационализацията да не работят коректно. -Mcrypt extension check = Проверка за Mcrypt -Mcrypt extension optional = Mcrypt разширението е незадължително. Ако не е заредено, чувствителни данни като viewstate, няма да могат да бъдат криптирани. \ No newline at end of file +all passed = Поздравления! Конфигурацията на вашия сървър удовлетворява всички изисквания на PRADO. +passed with warnings = Конфигурацията на вашия сървър удовлетворява минималните изисквания на PRADO. Моля, обърнете внимание на предупрежденията по-долу. +failed = За съжаление, вашият сървър не удовлетворява изискванията на PRADO. +PHP version check = Проверка за версията на PHP +PHP 5.0.4 or higher required = Изисква се PHP 5.0.4 или по-висока версия. +PHP 5.1.0 or higher preferred = Препоръчва се PHP 5.1.0 или по-висока версия. Това ще предотврати грешката предизвикана от рекурсивните __get/__set извиквания. +SQLite extension check = Проверка за SQLite +SQLite extension optional = SQLite разширението е незадължително. Ако не е заредено, няма да можете да ползвате TSqliteCache. +Memcache extension check = Проверка за Memcache +Memcache extension optional = Memcache разширението е незадължително. Ако не е заредено, няма да можете да ползвате TMemCache. +APC extension check = Проверка за APC cache +APC extension optional = APC разширението е незадължително. Ако не е заредено, няма да можете да ползвате TAPCCache. +Zlib extension check = Проверка за Zlib +Zlib extension optional = Zlib разширението е незадължително. Ако не е заредено, състоянието на страницата няма да бъде компресирано и размера на страницата може да се увеличи. +DOM extension check = Проверка за DOM разширението +DOM extension required = DOM разширението е задължително за PRADO. Използва се в TXmlDocument за анализ на XML-базирани конфигурации. +ICONV extension check = Проверка за ICONV разширението +ICONV extension optional = ICONV разширението е незадължително. Ако не е заредено, е възможно някои компоненти свързани с интернационализацията да не работят коректно. +Mcrypt extension check = Проверка за Mcrypt +Mcrypt extension optional = Mcrypt разширението е незадължително. Ако не е заредено, чувствителни данни като viewstate, няма да могат да бъдат криптирани. +$_SERVER["HTTP_ACCEPT"] check = Проверка за $_SERVER["HTTP_ACCEPT"] +HTTP_ACCEPT required = $_SERVER["HTTP_ACCEPT"] е задължително за многоезиковата поддръжка. +$_SERVER["SCRIPT_FILENAME"] check = Проверка за $_SERVER["SCRIPT_FILENAME"] +SCRIPT_FILENAME required = $_SERVER["SCRIPT_FILENAME"] трябва да указва файловия път до този проверовъчен скрипт. +$_SERVER["REQUEST_URI"] check = Проверка за $_SERVER["REQUEST_URI"] +REQUEST_URI required = $_SERVER["REQUEST_URI"] или $_SERVER["QUERY_STRING"] трябва да е достъпен за да е възможно анализирането на потребителските заявки. +$_SERVER["PATH_INFO"] check = Проверка за $_SERVER["PATH_INFO"] +PATH_INFO required = $_SERVER["PATH_INFO"] или $_SERVER["PHP_SELF"] и $_SERVER["SCRIPT_NAME"] се изискват за да се определи URL информацията за пътя. \ No newline at end of file diff --git a/requirements/template-bg.html b/requirements/template-bg.html index b6ac5889..a12934b3 100644 --- a/requirements/template-bg.html +++ b/requirements/template-bg.html @@ -1,6 +1,6 @@ - + - + Проверка за изискванията на PRADO