From 6228873cf9d6471463d2413e7dfd7447f759baf2 Mon Sep 17 00:00:00 2001 From: "christophe.boulain" <> Date: Wed, 3 Dec 2008 14:22:03 +0000 Subject: Merge from trunk --- framework/Web/UI/ActiveControls/TActiveButton.php | 1 - .../UI/ActiveControls/TActiveControlAdapter.php | 9 +- .../UI/ActiveControls/TActiveCustomValidator.php | 1 - .../Web/UI/ActiveControls/TActiveDatePicker.php | 129 ++++++++ .../Web/UI/ActiveControls/TActiveFileUpload.php | 315 +++++++++++++++++++ .../Web/UI/ActiveControls/TActiveHiddenField.php | 1 - framework/Web/UI/ActiveControls/TActiveLabel.php | 10 +- .../Web/UI/ActiveControls/TActiveLinkButton.php | 5 + .../Web/UI/ActiveControls/TActivePageAdapter.php | 9 +- framework/Web/UI/ActiveControls/TActivePager.php | 9 +- framework/Web/UI/ActiveControls/TActivePanel.php | 1 - .../UI/ActiveControls/TActiveRadioButtonList.php | 6 + .../Web/UI/ActiveControls/TActiveRatingList.php | 344 +++----------------- framework/Web/UI/ActiveControls/TActiveTextBox.php | 1 - framework/Web/UI/ActiveControls/TAutoComplete.php | 9 +- .../Web/UI/ActiveControls/TBaseActiveControl.php | 5 +- framework/Web/UI/ActiveControls/TCallback.php | 1 - .../UI/ActiveControls/TCallbackClientScript.php | 1 - .../Web/UI/ActiveControls/TCallbackClientSide.php | 1 - .../UI/ActiveControls/TCallbackEventParameter.php | 1 - .../Web/UI/ActiveControls/TCallbackOptions.php | 1 - framework/Web/UI/ActiveControls/TDraggable.php | 152 +++++++++ framework/Web/UI/ActiveControls/TDropContainer.php | 275 ++++++++++++++++ .../UI/ActiveControls/TEventTriggeredCallback.php | 1 - .../Web/UI/ActiveControls/TInPlaceTextBox.php | 1 - .../UI/ActiveControls/TTimeTriggeredCallback.php | 24 +- .../Web/UI/ActiveControls/TTriggeredCallback.php | 1 - .../UI/ActiveControls/TValueTriggeredCallback.php | 1 - framework/Web/UI/TCachePageStatePersister.php | 1 - framework/Web/UI/TClientScriptManager.php | 10 +- framework/Web/UI/TCompositeControl.php | 1 - framework/Web/UI/TControl.php | 8 + framework/Web/UI/TControlAdapter.php | 1 - framework/Web/UI/TForm.php | 1 - framework/Web/UI/THtmlWriter.php | 1 - framework/Web/UI/TPage.php | 8 +- framework/Web/UI/TPageStatePersister.php | 1 - framework/Web/UI/TSessionPageStatePersister.php | 1 - framework/Web/UI/TTemplateControl.php | 1 - framework/Web/UI/TTemplateManager.php | 9 +- framework/Web/UI/WebControls/TBaseDataList.php | 1 - framework/Web/UI/WebControls/TBaseValidator.php | 15 +- framework/Web/UI/WebControls/TBoundColumn.php | 1 - framework/Web/UI/WebControls/TBulletedList.php | 1 - framework/Web/UI/WebControls/TButton.php | 1 - framework/Web/UI/WebControls/TButtonColumn.php | 1 - framework/Web/UI/WebControls/TCaptcha.php | 1 - framework/Web/UI/WebControls/TCaptchaValidator.php | 1 - framework/Web/UI/WebControls/TCheckBox.php | 18 ++ framework/Web/UI/WebControls/TCheckBoxColumn.php | 1 - framework/Web/UI/WebControls/TCheckBoxList.php | 19 +- framework/Web/UI/WebControls/TClientScript.php | 1 - .../Web/UI/WebControls/TClientScriptLoader.php | 1 - framework/Web/UI/WebControls/TColorPicker.php | 4 +- framework/Web/UI/WebControls/TCompareValidator.php | 1 - framework/Web/UI/WebControls/TConditional.php | 1 - framework/Web/UI/WebControls/TContent.php | 1 - .../Web/UI/WebControls/TContentPlaceHolder.php | 1 - framework/Web/UI/WebControls/TCustomValidator.php | 26 +- framework/Web/UI/WebControls/TDataGrid.php | 1 - framework/Web/UI/WebControls/TDataGridColumn.php | 1 - .../Web/UI/WebControls/TDataGridItemRenderer.php | 1 - .../Web/UI/WebControls/TDataGridPagerStyle.php | 1 - framework/Web/UI/WebControls/TDataList.php | 1 - .../Web/UI/WebControls/TDataListItemRenderer.php | 1 - framework/Web/UI/WebControls/TDataRenderer.php | 1 - .../Web/UI/WebControls/TDataSourceControl.php | 1 - framework/Web/UI/WebControls/TDataSourceView.php | 1 - .../Web/UI/WebControls/TDataTypeValidator.php | 1 - framework/Web/UI/WebControls/TDatePicker.php | 46 ++- framework/Web/UI/WebControls/TDropDownList.php | 19 +- .../Web/UI/WebControls/TDropDownListColumn.php | 1 - .../Web/UI/WebControls/TEditCommandColumn.php | 1 - .../Web/UI/WebControls/TEmailAddressValidator.php | 1 - framework/Web/UI/WebControls/TExpression.php | 1 - framework/Web/UI/WebControls/TFileUpload.php | 20 +- framework/Web/UI/WebControls/TFont.php | 1 - framework/Web/UI/WebControls/THead.php | 21 +- framework/Web/UI/WebControls/THiddenField.php | 19 +- framework/Web/UI/WebControls/THtmlArea.php | 1 - framework/Web/UI/WebControls/THyperLink.php | 1 - framework/Web/UI/WebControls/THyperLinkColumn.php | 1 - framework/Web/UI/WebControls/TImage.php | 1 - framework/Web/UI/WebControls/TImageMap.php | 1 - framework/Web/UI/WebControls/TInlineFrame.php | 1 - framework/Web/UI/WebControls/TItemDataRenderer.php | 1 - framework/Web/UI/WebControls/TJavascriptLogger.php | 1 - framework/Web/UI/WebControls/TKeyboard.php | 1 - framework/Web/UI/WebControls/TLabel.php | 1 - framework/Web/UI/WebControls/TLinkButton.php | 1 - framework/Web/UI/WebControls/TListBox.php | 19 +- .../Web/UI/WebControls/TListControlValidator.php | 1 - framework/Web/UI/WebControls/TListItem.php | 1 - framework/Web/UI/WebControls/TLiteral.php | 1 - framework/Web/UI/WebControls/TLiteralColumn.php | 1 - framework/Web/UI/WebControls/TMarkdown.php | 1 - framework/Web/UI/WebControls/TMultiView.php | 1 - framework/Web/UI/WebControls/TOutputCache.php | 1 - framework/Web/UI/WebControls/TPager.php | 1 - framework/Web/UI/WebControls/TPanel.php | 1 - framework/Web/UI/WebControls/TPanelStyle.php | 1 - framework/Web/UI/WebControls/TPlaceHolder.php | 1 - framework/Web/UI/WebControls/TRadioButton.php | 1 - framework/Web/UI/WebControls/TRadioButtonList.php | 1 - framework/Web/UI/WebControls/TRangeValidator.php | 1 - framework/Web/UI/WebControls/TRatingList.php | 348 ++++++++++++++------- .../UI/WebControls/TRegularExpressionValidator.php | 21 +- framework/Web/UI/WebControls/TRepeatInfo.php | 1 - framework/Web/UI/WebControls/TRepeater.php | 1 - .../Web/UI/WebControls/TRepeaterItemRenderer.php | 1 - .../Web/UI/WebControls/TRequiredFieldValidator.php | 1 - framework/Web/UI/WebControls/TSafeHtml.php | 1 - framework/Web/UI/WebControls/TSlider.php | 7 +- framework/Web/UI/WebControls/TStatements.php | 1 - framework/Web/UI/WebControls/TStyle.php | 1 - framework/Web/UI/WebControls/TTable.php | 1 - framework/Web/UI/WebControls/TTableCell.php | 1 - framework/Web/UI/WebControls/TTableFooterRow.php | 1 - framework/Web/UI/WebControls/TTableHeaderCell.php | 1 - framework/Web/UI/WebControls/TTableHeaderRow.php | 1 - framework/Web/UI/WebControls/TTableRow.php | 1 - framework/Web/UI/WebControls/TTemplateColumn.php | 1 - framework/Web/UI/WebControls/TTextBox.php | 19 +- framework/Web/UI/WebControls/TTextHighlighter.php | 1 - framework/Web/UI/WebControls/TTextProcessor.php | 1 - .../Web/UI/WebControls/TValidationSummary.php | 1 - framework/Web/UI/WebControls/TWebControl.php | 1 - .../Web/UI/WebControls/TWebControlAdapter.php | 1 - framework/Web/UI/WebControls/TWizard.php | 1 - .../WebControls/TWizardNavigationButtonStyle.php | 1 - framework/Web/UI/WebControls/TXmlTransform.php | 1 - framework/Web/UI/WebControls/assets/captcha.php | 1 - 132 files changed, 1478 insertions(+), 578 deletions(-) create mode 100755 framework/Web/UI/ActiveControls/TActiveDatePicker.php create mode 100755 framework/Web/UI/ActiveControls/TActiveFileUpload.php create mode 100755 framework/Web/UI/ActiveControls/TDraggable.php create mode 100755 framework/Web/UI/ActiveControls/TDropContainer.php (limited to 'framework/Web/UI') diff --git a/framework/Web/UI/ActiveControls/TActiveButton.php b/framework/Web/UI/ActiveControls/TActiveButton.php index 992f41e3..0990ff41 100644 --- a/framework/Web/UI/ActiveControls/TActiveButton.php +++ b/framework/Web/UI/ActiveControls/TActiveButton.php @@ -130,4 +130,3 @@ class TActiveButton extends TButton implements ICallbackEventHandler, IActiveCon } } -?> diff --git a/framework/Web/UI/ActiveControls/TActiveControlAdapter.php b/framework/Web/UI/ActiveControls/TActiveControlAdapter.php index 88e4fdfe..34872f98 100644 --- a/framework/Web/UI/ActiveControls/TActiveControlAdapter.php +++ b/framework/Web/UI/ActiveControls/TActiveControlAdapter.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.ActiveControls @@ -97,7 +97,7 @@ class TActiveControlAdapter extends TControlAdapter $data = $this->getPage()->getPostDataLoaders(); if(count($data) > 0) { - $options = TJavascript::encode($data,false); + $options = TJavaScript::encode($data,false); $script = "Prado.CallbackRequest.addPostLoaders({$options});"; $cs->registerEndScript($key, $script); } @@ -146,12 +146,12 @@ class TActiveControlAdapter extends TControlAdapter * Starts viewstate tracking if necessary after when controls has been loaded */ public function onLoad($param) - { + { if($this->getIsTrackingPageState()) { $this->_stateTracker = new TCallbackPageStateTracker($this->getControl()); $this->_stateTracker->trackChanges(); - } + } parent::onLoad($param); } @@ -560,4 +560,3 @@ class TMapCollectionDiff extends TViewStateDiff } } -?> diff --git a/framework/Web/UI/ActiveControls/TActiveCustomValidator.php b/framework/Web/UI/ActiveControls/TActiveCustomValidator.php index 8428c810..6c74aa7d 100644 --- a/framework/Web/UI/ActiveControls/TActiveCustomValidator.php +++ b/framework/Web/UI/ActiveControls/TActiveCustomValidator.php @@ -239,4 +239,3 @@ class TActiveCustomValidatorClientSide extends TCallbackClientSide return is_null($changes) ? true : $changes; } } -?> diff --git a/framework/Web/UI/ActiveControls/TActiveDatePicker.php b/framework/Web/UI/ActiveControls/TActiveDatePicker.php new file mode 100755 index 00000000..052ed199 --- /dev/null +++ b/framework/Web/UI/ActiveControls/TActiveDatePicker.php @@ -0,0 +1,129 @@ + + * @author Christophe Boulain + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005-2008 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Id$ + * @package System.Web.UI.ActiveControls + */ + +/** + * Load active control adapter. + */ +Prado::using('System.Web.UI.ActiveControls.TActiveControlAdapter'); + +/** + * TActiveDatePicker class + * + * The active control counter part to date picker control. + * When the date selection is changed, the {@link onCallback OnCallback} event is + * raised. + * + * @author Bradley Booms + * @author Christophe Boulain + * @version $Id$ + * @package System.Web.UI.ActiveControls + * @since 3.1.3 + */ +class TActiveDatePicker extends TDatePicker implements ICallbackEventHandler, IActiveControl { + + + /** + * Get javascript date picker options. + * @return array date picker client-side options + */ + protected function getDatePickerOptions(){ + $options = parent::getDatePickerOptions(); + $options['EventTarget'] = $this->getUniqueID(); + return $options; + } + + /** + * Creates a new callback control, sets the adapter to + * TActiveControlAdapter. If you override this class, be sure to set the + * adapter appropriately by, for example, by calling this constructor. + */ + public function __construct() + { + parent::__construct(); + $this->setAdapter(new TActiveControlAdapter($this)); + } + + /** + * @return TBaseActiveCallbackControl standard callback control options. + */ + public function getActiveControl(){ + return $this->getAdapter()->getBaseActiveControl(); + } + + /** + * Client-side Text property can only be updated after the OnLoad stage. + * @param string text content for the textbox + */ + public function setText($value){ + parent::setText($value); + if($this->getActiveControl()->canUpdateClientSide() && $this->getHasLoadedPostData()){ + $cb=$this->getPage()->getCallbackClient(); + $cb->setValue($this, $value); + if ($this->getInputMode()==TDatePickerInputMode::DropDownList) + { + $s = Prado::createComponent('System.Util.TDateTimeStamp'); + $date = $s->getDate($this->getTimeStampFromText()); + $id=$this->getClientID(); + $cb->select($id.TControl::CLIENT_ID_SEPARATOR.'day', 'Value', $date['mday'], 'select'); + $cb->select($id.TControl::CLIENT_ID_SEPARATOR.'month', 'Value', $date['mon']-1, 'select'); + $cb->select($id.TControl::CLIENT_ID_SEPARATOR.'year', 'Value', $date['year'], 'select'); + + } + } + } + + /** + * Raises the callback event. This method is required by {@link + * ICallbackEventHandler} interface. + * This method is mainly used by framework and control developers. + * @param TCallbackEventParameter the event parameter + */ + public function raiseCallbackEvent($param){ + $this->onCallback($param); + } + + /** + * This method is invoked when a callback is requested. The method raises + * 'OnCallback' event to fire up the event handlers. If you override this + * method, be sure to call the parent implementation so that the event + * handler can be invoked. + * @param TCallbackEventParameter event parameter to be passed to the event handlers + */ + public function onCallback($param){ + $this->raiseEvent('OnCallback', $this, $param); + } + + /** + * Registers the javascript code to initialize the date picker. + */ + protected function registerCalendarClientScript() + { + if($this->getShowCalendar()) + { + $cs = $this->getPage()->getClientScript(); + $cs->registerPradoScript("activedatepicker"); + + if(!$cs->isEndScriptRegistered('TDatePicker.spacer')) + { + $spacer = $this->getAssetUrl('spacer.gif'); + $code = "Prado.WebUI.TDatePicker.spacer = '$spacer';"; + $cs->registerEndScript('TDatePicker.spacer', $code); + } + + $options = TJavaScript::encode($this->getDatePickerOptions()); + $code = "new Prado.WebUI.TActiveDatePicker($options);"; + $cs->registerEndScript("prado:".$this->getClientID(), $code); + } + } +} +?> diff --git a/framework/Web/UI/ActiveControls/TActiveFileUpload.php b/framework/Web/UI/ActiveControls/TActiveFileUpload.php new file mode 100755 index 00000000..e1b85f0d --- /dev/null +++ b/framework/Web/UI/ActiveControls/TActiveFileUpload.php @@ -0,0 +1,315 @@ + + * @author Christophe Boulain + * @version $Id$ + */ + +/** + * Load TActiveControlAdapter and TFileUpload. + */ +Prado::using('System.Web.UI.ActiveControls.TActiveControlAdapter'); +Prado::using('System.Web.UI.WebControls.TFileUpload'); + +/** + * TActiveFileUpload + * + * TActiveFileUpload displays a file upload field on a page. Upon postback, + * the text entered into the field will be treated as the name of the file + * that will be uploaded to the server. The property {@link getHasFile HasFile} + * indicates whether the file upload is successful. If successful, the file + * may be obtained by calling {@link saveAs} to save it at a specified place. + * You can use {@link getFileName FileName}, {@link getFileType FileType}, + * {@link getFileSize FileSize} to get the original client-side file name, + * the file mime type, and the file size information. If the upload is not + * successful, {@link getErrorCode ErrorCode} contains the error code + * describing the cause of failure. + * + * TActiveFileUpload raises {@link onFileUpload OnFileUpload} event if a file is uploaded + * (whether it succeeds or not). + * + * TActiveFileUpload actually does a postback in a hidden IFrame, and then does a callback. + * This callback then raises the {@link onFileUpload OnFileUpload} event. After the postback + * a status icon is displayed; either a green checkmark if the upload is successful, + * or a red x if there was an error. + * + * @author Bradley Booms + * @author Christophe Boulain + * + * @version $Id$ + */ +class TActiveFileUpload extends TFileUpload implements IActiveControl, ICallbackEventHandler, INamingContainer +{ + + const SCRIPT_PATH = 'prado/activefileupload'; + + /** + * @var THiddenField a flag to tell which component is doing the callback. + */ + private $_flag; + /** + * @var TImage that spins to show that the file is being uploaded. + */ + private $_busy; + /** + * @var TImage that shows a green check mark for completed upload. + */ + private $_success; + /** + * @var TImage that shows a red X for incomplete upload. + */ + private $_error; + /** + * @var TInlineFrame used to submit the data in an "asynchronous" fashion. + */ + private $_target; + + + /** + * Creates a new callback control, sets the adapter to + * TActiveControlAdapter. If you override this class, be sure to set the + * adapter appropriately by, for example, by calling this constructor. + */ + public function __construct(){ + parent::__construct(); + $this->setAdapter(new TActiveControlAdapter($this)); + } + + + /** + * @param string asset file in the self::SCRIPT_PATH directory. + * @return string asset file url. + */ + protected function getAssetUrl($file='') + { + $base = $this->getPage()->getClientScript()->getPradoScriptAssetUrl(); + return $base.'/'.self::SCRIPT_PATH.'/'.$file; + } + + + /** + * This method is invoked when a file is uploaded. + * If you override this method, be sure to call the parent implementation to ensure + * the invocation of the attached event handlers. + * @param TEventParameter event parameter to be passed to the event handlers + */ + public function onFileUpload($param){ + if ($this->_flag->getValue() && $this->getPage()->getIsPostBack()){ + // save the file so that it will persist past the end of this return. + $localName = str_replace('\\', '/', tempnam(Prado::getPathOfNamespace($this->getTempPath()),'')); + parent::saveAs($localName); + + $filename=addslashes($this->getFileName()); + // return some javascript to display a completion status. + echo << + Options = new Object(); + Options.clientID = '{$this->getClientID()}'; + Options.targetID = '{$this->_target->getUniqueID()}'; + Options.localName = '$localName'; + Options.fileName = '{$filename}'; + Options.fileSize = '{$this->getFileSize()}'; + Options.fileType = '{$this->getFileType()}'; + Options.errorCode = '{$this->getErrorCode()}'; + parent.Prado.WebUI.TActiveFileUpload.onFileUpload(Options); + +EOS; + exit(); + } + } + + /** + * @return string the path where the uploaded file will be stored temporarily, in namespace format + * default "Application.runtime.*" + */ + public function getTempPath(){ + return $this->getViewState('TempPath', 'Application.runtime.*'); + } + + /** + * @param string the path where the uploaded file will be stored temporarily in namespace format + * default "Application.runtime.*" + */ + public function setTempPath($value){ + $this->setViewState('TempNamespace',$value,'Application.runtime.*'); + } + + /** + * @throws TInvalidDataValueException if the {@link getTempPath TempPath} is not writable. + */ + public function onInit($sender){ + parent::onInit($sender); + if (!is_writable(Prado::getPathOfNamespace($this->getTempPath()))){ + throw new TInvalidDataValueException("activefileupload_temppath_invalid", $this->getTempPath()); + } + } + + /** + * Raises OnFileUpload event. + * + * This method is required by {@link ICallbackEventHandler} interface. + * This method is mainly used by framework and control developers. + * @param TCallbackEventParameter the event parameter + */ + public function raiseCallbackEvent($param){ + $cp = $param->getCallbackParameter(); + if ($key = $cp->targetID == $this->_target->getUniqueID()){ + $_FILES[$key]['name'] = $cp->fileName; + $_FILES[$key]['size'] = intval($cp->fileSize); + $_FILES[$key]['type'] = $cp->fileType; + $_FILES[$key]['error'] = intval($cp->errorCode); + $_FILES[$key]['tmp_name'] = $cp->localName; + $this->loadPostData($key, null); + + $this->raiseEvent('OnFileUpload', $this, $param); + } + } + + /** + * Publish the javascript + */ + public function onPreRender($param){ + parent::onPreRender($param); + $this->getPage()->getClientScript()->registerPradoScript('activefileupload'); + } + + + public function createChildControls(){ + $this->_flag = Prado::createComponent('THiddenField'); + $this->_flag->setID('Flag'); + $this->getControls()->add($this->_flag); + + $this->_busy = Prado::createComponent('TImage'); + $this->_busy->setID('Busy'); + $this->_busy->setImageUrl($this->getAssetUrl('ActiveFileUploadIndicator.gif')); + $this->_busy->setStyle("display:none"); + $this->getControls()->add($this->_busy); + + $this->_success = Prado::createComponent('TImage'); + $this->_success->setID('Success'); + $this->_success->setImageUrl($this->getAssetUrl('ActiveFileUploadComplete.png')); + $this->_success->setStyle("display:none"); + $this->getControls()->add($this->_success); + + $this->_error = Prado::createComponent('TImage'); + $this->_error->setID('Error'); + $this->_error->setImageUrl($this->getAssetUrl('ActiveFileUploadError.png')); + $this->_error->setStyle("display:none"); + $this->getControls()->add($this->_error); + + $this->_target = Prado::createComponent('TInlineFrame'); + $this->_target->setID('Target'); + $this->_target->setFrameUrl($this->getAssetUrl('ActiveFileUploadBlank.html')); + $this->_target->setStyle("width:0px; height:0px;"); + $this->_target->setShowBorder(false); + $this->getControls()->add($this->_target); + } + + + /** + * Removes localfile on ending of the callback. + */ + public function onUnload($param){ + if ($this->getPage()->getIsCallback() && + $this->getHasFile() && + file_exists($this->getLocalName())){ + unlink($this->getLocalName()); + } + parent::onUnload($param); + } + + /** + * @return TBaseActiveCallbackControl standard callback control options. + */ + public function getActiveControl(){ + return $this->getAdapter()->getBaseActiveControl(); + } + + /** + * Adds ID attribute, and renders the javascript for active component. + * @param THtmlWriter the writer used for the rendering purpose + */ + public function addAttributesToRender($writer){ + parent::addAttributesToRender($writer); + $writer->addAttribute('id',$this->getClientID()); + + $this->getActiveControl()->registerCallbackClientScript($this->getClientClassName(),$this->getClientOptions()); + } + + /** + * @return string corresponding javascript class name for this control. + */ + protected function getClientClassName(){ + return 'Prado.WebUI.TActiveFileUpload'; + } + + /** + * Gets the client side options for this control. + * @return array ( inputID => input client ID, + * flagID => flag client ID, + * targetName => target unique ID, + * formID => form client ID, + * indicatorID => upload indicator client ID, + * completeID => complete client ID, + * errorID => error client ID) + */ + protected function getClientOptions(){ + $options['ID'] = $this->getClientID(); + $options['EventTarget'] = $this->getUniqueID(); + + $options['inputID'] = $this->getClientID(); + $options['flagID'] = $this->_flag->getClientID(); + $options['targetID'] = $this->_target->getUniqueID(); + $options['formID'] = $this->getPage()->getForm()->getClientID(); + $options['indicatorID'] = $this->_busy->getClientID(); + $options['completeID'] = $this->_success->getClientID(); + $options['errorID'] = $this->_error->getClientID(); + return $options; + } + + /** + * Saves the uploaded file. + * @param string the file name used to save the uploaded file + * @param boolean whether to delete the temporary file after saving. + * If true, you will not be able to save the uploaded file again. + * @return boolean true if the file saving is successful + */ + public function saveAs($fileName,$deleteTempFile=true){ + if (($this->getErrorCode()===UPLOAD_ERR_OK) && (file_exists($this->getLocalName()))){ + if ($deleteTempFile) + return rename($this->getLocalName(),$fileName); + else + return copy($this->getLocalName(),$fileName); + } else + return false; + } + + /** + * @return TImage the image displayed when an upload + * completes successfully. + */ + public function getSuccessImage(){ + $this->ensureChildControls(); + return $this->_success; + } + + /** + * @return TImage the image displayed when an upload + * does not complete successfully. + */ + public function getErrorImage(){ + $this->ensureChildControls(); + return $this->_error; + } + + /** + * @return TImage the image displayed when an upload + * is in progress. + */ + public function getBusyImage(){ + $this->ensureChildControls(); + return $this->_busy; + } +} \ No newline at end of file diff --git a/framework/Web/UI/ActiveControls/TActiveHiddenField.php b/framework/Web/UI/ActiveControls/TActiveHiddenField.php index 378fc76f..6d837cb2 100644 --- a/framework/Web/UI/ActiveControls/TActiveHiddenField.php +++ b/framework/Web/UI/ActiveControls/TActiveHiddenField.php @@ -114,4 +114,3 @@ class TActiveHiddenField extends THiddenField implements ICallbackEventHandler, } } -?> diff --git a/framework/Web/UI/ActiveControls/TActiveLabel.php b/framework/Web/UI/ActiveControls/TActiveLabel.php index e4b4bc6f..4105e3dc 100644 --- a/framework/Web/UI/ActiveControls/TActiveLabel.php +++ b/framework/Web/UI/ActiveControls/TActiveLabel.php @@ -77,6 +77,14 @@ class TActiveLabel extends TLabel implements IActiveControl $this->getPage()->getCallbackClient()->setAttribute($this, 'for', $id); } } + + /** + * Adds attribute id to the renderer. + * @param THtmlWriter the writer used for the rendering purpose + */ + protected function addAttributesToRender($writer) { + $writer->addAttribute('id',$this->getClientID()); + parent::addAttributesToRender($writer); + } } -?> diff --git a/framework/Web/UI/ActiveControls/TActiveLinkButton.php b/framework/Web/UI/ActiveControls/TActiveLinkButton.php index 5a863a9d..f1551b40 100644 --- a/framework/Web/UI/ActiveControls/TActiveLinkButton.php +++ b/framework/Web/UI/ActiveControls/TActiveLinkButton.php @@ -10,6 +10,11 @@ * @package System.Web.UI.ActiveControls */ +/** + * Load active control adapter. + */ +Prado::using('System.Web.UI.ActiveControls.TActiveControlAdapter'); + /** * TActiveLinkButton is the active control counter part to TLinkButton. * diff --git a/framework/Web/UI/ActiveControls/TActivePageAdapter.php b/framework/Web/UI/ActiveControls/TActivePageAdapter.php index 684082b8..c52f0775 100644 --- a/framework/Web/UI/ActiveControls/TActivePageAdapter.php +++ b/framework/Web/UI/ActiveControls/TActivePageAdapter.php @@ -155,7 +155,7 @@ class TActivePageAdapter extends TControlAdapter $responseData = $response->getAdapter()->getResponseData(); if(!is_null($responseData)) { - $data = TJavascript::jsonEncode($responseData); + $data = TJavaScript::jsonEncode($responseData); $this->appendContentPart($response, self::CALLBACK_DATA_HEADER, $data); //$response->appendHeader(self::CALLBACK_DATA_HEADER.': '.$data); @@ -186,7 +186,7 @@ class TActivePageAdapter extends TControlAdapter //output the actions $executeJavascript = $this->getCallbackClientHandler()->getClientFunctionsToExecute(); - $actions = TJavascript::jsonEncode($executeJavascript); + $actions = TJavaScript::jsonEncode($executeJavascript); $this->appendContentPart($response, self::CALLBACK_ACTION_HEADER, $actions); //$response->appendHeader(self::CALLBACK_ACTION_HEADER.': '.$actions); } @@ -264,7 +264,7 @@ class TActivePageAdapter extends TControlAdapter { $param = $this->getRequest()->itemAt(TPage::FIELD_CALLBACK_PARAMETER); if(strlen($param) > 0) - $this->_callbackEventParameter=TJavascript::jsonDecode((string)$param); + $this->_callbackEventParameter=TJavaScript::jsonDecode((string)$param); } return $this->_callbackEventParameter; } @@ -315,7 +315,7 @@ class TCallbackErrorHandler extends TErrorHandler if($this->getApplication()->getMode()===TApplication::STATE_DEBUG) { $response = $this->getApplication()->getResponse(); - $trace = TJavascript::jsonEncode($this->getExceptionStackTrace($exception)); + $trace = TJavaScript::jsonEncode($this->getExceptionStackTrace($exception)); $response->appendHeader('HTTP/1.0 500 Internal Error'); $response->appendHeader(TActivePageAdapter::CALLBACK_ERROR_HEADER.': '.$trace); } @@ -367,4 +367,3 @@ class TInvalidCallbackException extends TException { } -?> diff --git a/framework/Web/UI/ActiveControls/TActivePager.php b/framework/Web/UI/ActiveControls/TActivePager.php index 7e5ee33e..9dd856c9 100644 --- a/framework/Web/UI/ActiveControls/TActivePager.php +++ b/framework/Web/UI/ActiveControls/TActivePager.php @@ -176,12 +176,16 @@ class TActivePager extends TPager implements IActiveControl, ICallbackEventHandl // Update all the buttons pagers attached to the same control. // Dropdown pagers doesn't need to be re-rendered. $controlToPaginate=$this->getControlToPaginate(); - foreach ($this->getNamingContainer()->findControlsByType('TActivePager') as $control) + foreach ($this->getNamingContainer()->findControlsByType('TActivePager', false) as $control) { if ($control->getMode() !== TPagerMode::DropDownList && $control->getControlToPaginate()===$controlToPaginate) + { $control->render($param->getNewWriter()); + // FIXME : With some very fast machine, the getNewWriter() consecutive calls are in the same microsecond, resulting + // of getting the same boundaries in ajax response. Wait 1 microsecond to avoid this. + usleep(1); + } } - // Raise callback event $this->onCallback($param); } @@ -202,4 +206,3 @@ class TActivePager extends TPager implements IActiveControl, ICallbackEventHandl } } -?> diff --git a/framework/Web/UI/ActiveControls/TActivePanel.php b/framework/Web/UI/ActiveControls/TActivePanel.php index ef41a1dd..51e9fb08 100644 --- a/framework/Web/UI/ActiveControls/TActivePanel.php +++ b/framework/Web/UI/ActiveControls/TActivePanel.php @@ -89,4 +89,3 @@ class TActivePanel extends TPanel implements IActiveControl } } -?> diff --git a/framework/Web/UI/ActiveControls/TActiveRadioButtonList.php b/framework/Web/UI/ActiveControls/TActiveRadioButtonList.php index 10602427..63ef8ef4 100644 --- a/framework/Web/UI/ActiveControls/TActiveRadioButtonList.php +++ b/framework/Web/UI/ActiveControls/TActiveRadioButtonList.php @@ -10,6 +10,12 @@ * @package System.Web.UI.ActiveControls */ +/** + * Load active control adapter and active radio button. + */ +Prado::using('System.Web.UI.ActiveControls.TActiveListControlAdapter'); +Prado::using('System.Web.UI.ActiveControls.TActiveRadioButton'); + /** * TActiveRadioButtonList class. * diff --git a/framework/Web/UI/ActiveControls/TActiveRatingList.php b/framework/Web/UI/ActiveControls/TActiveRatingList.php index 4ec7b6c3..473ca06a 100644 --- a/framework/Web/UI/ActiveControls/TActiveRatingList.php +++ b/framework/Web/UI/ActiveControls/TActiveRatingList.php @@ -3,8 +3,9 @@ * TActiveRatingList class file. * * @author Wei Zhuo + * @author Bradley Booms * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.ActiveControls @@ -13,107 +14,85 @@ /** * TActiveRatingList Class * - * Displays clickable images that represent a TActiveRadioButtonList + * Displays clickable images that represent a TRadioButtonList * * @author Wei Zhuo + * @author Bradley Booms * @version $Id$ * @package System.Web.UI.ActiveControls * @since 3.1 */ -class TActiveRatingList extends TActiveRadioButtonList +class TActiveRatingList extends TRatingList implements IActiveControl, ICallbackEventHandler { - const SCRIPT_PATH = 'prado/activeratings'; - - /** - * @var array list of published rating images. - */ - private $_ratingImages = array(); - /** - * Sets the default repeat direction to horizontal. + * Creates a new callback control, sets the adapter to + * TActiveListControlAdapter. If you override this class, be sure to set the + * adapter appropriately by, for example, by calling this constructor. */ public function __construct() { + $this->setAdapter(new TActiveListControlAdapter($this)); + $this->setAutoPostBack(true); parent::__construct(); - $this->setRepeatDirection(TRepeatDirection::Horizontal); - } - - /** - * @return boolean whether the items in the column can be edited. Defaults to false. - */ - public function getReadOnly() - { - return $this->getViewState('ReadOnly',false); } /** - * @param boolean whether the items in the column can be edited + * @return TBaseActiveCallbackControl standard callback control options. */ - public function setReadOnly($value) + public function getActiveControl() { - $this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false); + return $this->getAdapter()->getBaseActiveControl(); } /** - * The repeat layout must be Table. - * @param string repeat layout type - * @throws TInvaliddataValueException when repeat layout is not Table. + * @return TCallbackClientSide client side request options. */ - public function setRepeatLayout($value) + public function getClientSide() { - if($value!==TRepeatLayout::Table) - throw new TInvalidDataValueException('ratinglist_table_layout_only'); - else - parent::setRepeatLayout($value); + return $this->getAdapter()->getBaseActiveControl()->getClientSide(); } /** - * @return float rating value. + * Raises the callback event. This method is required by {@link + * ICallbackEventHandler} interface. + * This method is mainly used by framework and control developers. + * @param TCallbackEventParameter the event parameter */ - public function getRating() + public function raiseCallbackEvent($param) { - return $this->getViewState('Rating',0.0); + $this->onCallback($param); } /** - * @param float rating value, also sets the selected Index + * This method is invoked when a callback is requested. The method raises + * 'OnCallback' event to fire up the event handlers. If you override this + * method, be sure to call the parent implementation so that the event + * handler can be invoked. + * @param TCallbackEventParameter event parameter to be passed to the event handlers */ - public function setRating($value) + public function onCallback($param) { - $rating = TPropertyValue::ensureFloat($value); - $this->setViewState('Rating', $rating); - $canUpdate = $this->getActiveControl()->getEnableUpdate(); - $this->getActiveControl()->setEnableUpdate(false); - parent::setSelectedIndex($this->getRatingIndex($rating)); - $this->getActiveControl()->setEnableUpdate($canUpdate); - if($this->getActiveControl()->canUpdateClientSide()) - $this->callClientFunction('setRating',$rating); + $this->raiseEvent('OnCallback', $this, $param); } /** - * @param float rating value - * @return int rating as integer + * @param boolean whether the items in the column can be edited */ - protected function getRatingIndex($rating) + public function setReadOnly($value) { - $interval = $this->getHalfRatingInterval(); - $base = intval($rating)-1; - $remainder = $rating-$base-1; - return $remainder > $interval[1] ? $base+1 : $base; + parent::setReadOnly($value); + $value = $this->getReadOnly(); + $this->callClientFunction('setReadOnly',$value); } /** - * @param int change the rating selection index + * @param float rating value, also sets the selected Index */ - public function setSelectedIndex($value) + public function setRating($value) { - $value = TPropertyValue::ensureInteger($value); - $canUpdate = $this->getActiveControl()->getEnableUpdate(); - $this->getActiveControl()->setEnableUpdate(false); - parent::setSelectedIndex($value); - $this->getActiveControl()->setEnableUpdate($canUpdate); - if($this->getActiveControl()->canUpdateClientSide()) - $this->callClientFunction('setRating',$value+1); + parent::setRating($value); + $value = $this->getRating(); + $this->callClientFunction('setRating',$value); } /** @@ -123,250 +102,22 @@ class TActiveRatingList extends TActiveRadioButtonList */ protected function callClientFunction($func,$value) { - $client = $this->getPage()->getCallbackClient(); - $code = $this->getClientClassName().'.'.$func; - $client->callClientFunction($code,array($this,$value)); - } - - /** - * @return string control or html element ID for displaying a caption. - */ - public function getCaptionID() - { - return $this->getViewState('CaptionID', ''); - } - - /** - * @param string control or html element ID for displaying a caption. - */ - public function setCaptionID($value) - { - $this->setViewState('CaptionID', $value, ''); - } - - protected function getCaptionControl() - { - if(($id=$this->getCaptionID())!=='') - { - if($control=$this->getParent()->findControl($id)) - return $control; - } - throw new TInvalidDataValueException( - 'ratinglist_invalid_caption_id',$id,$this->getID()); - } - - public function setCaption($value) - { - $this->getCaptionControl()->setText($value); - if($this->getActiveControl()->canUpdateClientSide()) - $this->callClientFunction('setCaption',$value); - } - - public function getCaption() - { - return $this->getCaptionControl()->getText(); - } - - /** - * @param boolean true to enable the rating to be changed. - */ - public function setEnabled($value) - { - $value = TPropertyValue::ensureBoolean($value); - parent::setEnabled($value); if($this->getActiveControl()->canUpdateClientSide()) - $this->callClientFunction('setEnabled',$value); - } - - /** - * @param string set the rating style, default is "default" - */ - public function setRatingStyle($value) - { - $this->setViewState('RatingStyle', $value, 'default'); - } - - /** - * @return TActiveRatingListStyle current rating style - */ - public function getRatingStyle() - { - return $this->getViewState('RatingStyle', 'default'); - } - - /** - * Sets the interval such that those rating values within the interval - * will be considered as a half star rating. - * @param array rating display half value interval, default is array(0.3, 0.7); - */ - public function setHalfRatingInterval($value) - { - $this->setViewState('HalfRating', - TPropertyValue::ensureArray($value), array(0.3, 0.7)); - } - - /** - * @return array rating display half value interval, default is array(0.3, 0.7); - */ - public function getHalfRatingInterval() - { - return $this->getViewState('HalfRating', array(0.3, 0.7)); - } - - /** - * @return string rating style css class name. - */ - protected function getRatingStyleCssClass() - { - return 'TActiveRatingList_'.$this->getRatingStyle(); - } - - /** - * @return array list of post back options. - */ - protected function getPostBackOptions() - { - $options = parent::getPostBackOptions(); - $options['Style'] = $this->getRatingStyleCssClass(); - $options['CaptionID'] = $this->getCaptionControlID(); - $options['SelectedIndex'] = $this->getSelectedIndex(); - $options['Rating'] = $this->getRating(); - $options['HalfRating'] = $this->getHalfRatingInterval(); - return $options; - } - - /** - * Registers the javascript code for initializing the active control - * only if {@link setReadOnly ReadOnly} property is false. - */ - protected function renderClientControlScript($writer) - { - if($this->getReadOnly()===false) - parent::renderClientControlScript($writer); - } - - /** - * @return string find the client ID of the caption control. - */ - protected function getCaptionControlID() - { - if(($id=$this->getCaptionID())!=='') { - if($control=$this->getParent()->findControl($id)) - { - if($control->getVisible(true)) - return $control->getClientID(); - } - else - return $id; + $client = $this->getPage()->getCallbackClient(); + $code = parent::getClientClassName().'.'.$func; + $client->callClientFunction($code,array($this,$value)); } - return ''; } /** - * @param string asset file in the self::SCRIPT_PATH directory. - * @return string asset file url. + * @param string caption text */ - protected function getAssetUrl($file='') - { - $base = $this->getPage()->getClientScript()->getPradoScriptAssetUrl(); - return $base.'/'.self::SCRIPT_PATH.'/'.$file; - } - - /** - * @param string rating style name - * @return string URL of the css style file - */ - protected function publishRatingListStyle($style) - { - $cs = $this->getPage()->getClientScript(); - $url = $this->getAssetUrl($style.'.css'); - if(!$cs->isStyleSheetFileRegistered($url)) - $cs->registerStyleSheetFile($url, $url); - return $url; - } - - /** - * @param string rating style name - * @param string rating image file extension, default is '.gif' - * @return array URL of publish the rating images - */ - protected function publishRatingListImages($style, $fileExt='.gif') - { - $types = array('blank', 'selected', 'half', 'combined'); - $files = array(); - foreach($types as $type) - $files[$type] = $this->getAssetUrl("{$style}_{$type}{$fileExt}"); - return $files; - } - - /** - * Add rating style class name to the class attribute - * when {@link setReadOnly ReadOnly} property is true and when the - * {@link setCssClass CssClass} property is empty. - * @param THtmlWriter renderer - */ - public function render($writer) - { - if($this->getReadOnly()) - $writer->addAttribute('class', $this->getRatingStyleCssClass()); - else - { - $writer->addAttribute('id',$this->getClientID()); - $this->getActiveControl()->registerCallbackClientScript( - $this->getClientClassName(), $this->getPostBackOptions()); - } - parent::render($writer); - } - - /** - * Publish the the rating style css file and rating image files. - */ - public function onPreRender($param) - { - parent::onPreRender($param); - - $this->publishRatingListStyle($this->getRatingStyle()); - $this->_ratingImages = $this->publishRatingListImages($this->getRatingStyle()); - } - - /** - * Renders the rating images if {@link setReadOnly ReadOnly} is true - * otherwise render the radio buttons. - */ - public function renderItem($writer,$repeatInfo,$itemType,$index) - { - if($this->getReadOnly()) - $this->renderStaticRating($writer, $repeatInfo, $itemType, $index); - else - parent::renderItem($writer, $repeatInfo, $itemType, $index); - } - - /** - * Renders the static rating images. - */ - protected function renderStaticRating($writer, $repeatInfo, $itemType, $index) - { - $image = new TImage; - $image->setImageUrl($this->_ratingImages[$this->getRatingImageType($index)]); - $image->setAlternateText($this->getRating()); - $image->render($writer); - } - - /** - * @param integer rating image index - * @return string the rating image corresponding to current index to be rendered. - */ - protected function getRatingImageType($index) + public function setCaption($value) { - $rating = floatval($this->getRating()); - $int = intval($rating); - $limit = $this->getHalfRatingInterval(); - if($index < $int || ($rating < $index+1 && $rating > $index+$limit[1])) - return 'selected'; - if($rating >= $index+$limit[0] && $rating <= $index+$limit[1]) - return 'half'; - return 'blank'; + parent::setCaption($value); + // if it's an active control, this should not be needed. + $this->callClientFunction('setCaption',$value); } /** @@ -380,4 +131,3 @@ class TActiveRatingList extends TActiveRadioButtonList } } -?> diff --git a/framework/Web/UI/ActiveControls/TActiveTextBox.php b/framework/Web/UI/ActiveControls/TActiveTextBox.php index f7acfe6a..97efe008 100644 --- a/framework/Web/UI/ActiveControls/TActiveTextBox.php +++ b/framework/Web/UI/ActiveControls/TActiveTextBox.php @@ -123,4 +123,3 @@ class TActiveTextBox extends TTextBox implements ICallbackEventHandler, IActiveC } } -?> diff --git a/framework/Web/UI/ActiveControls/TAutoComplete.php b/framework/Web/UI/ActiveControls/TAutoComplete.php index c1379ac1..5a3633ec 100644 --- a/framework/Web/UI/ActiveControls/TAutoComplete.php +++ b/framework/Web/UI/ActiveControls/TAutoComplete.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.ActiveControls @@ -328,7 +328,7 @@ class TAutoComplete extends TActiveTextBox implements INamingContainer { $string = strtr($string,array('\t'=>"\t",'\n'=>"\n",'\r'=>"\r")); $token = preg_split('//', $string, -1, PREG_SPLIT_NO_EMPTY); - $options['tokens'] = TJavascript::encode($token,false); + $options['tokens'] = TJavaScript::encode($token,false); } if($this->getAutoPostBack()) { @@ -343,8 +343,8 @@ class TAutoComplete extends TActiveTextBox implements INamingContainer if(($minchars=$this->getMinChars())!=='') $options['minChars'] = $minchars; if(($frequency=$this->getFrequency())!=='') - $options['frequency'] = $frequency; - $options['CausesValidation'] = $this->getCausesValidation(); + $options['frequency'] = $frequency; + $options['CausesValidation'] = $this->getCausesValidation(); $options['ValidationGroup'] = $this->getValidationGroup(); return $options; } @@ -438,4 +438,3 @@ class TAutoCompleteTemplate extends TComponent implements ITemplate } } -?> diff --git a/framework/Web/UI/ActiveControls/TBaseActiveControl.php b/framework/Web/UI/ActiveControls/TBaseActiveControl.php index 4ede6ff6..8f55e27b 100644 --- a/framework/Web/UI/ActiveControls/TBaseActiveControl.php +++ b/framework/Web/UI/ActiveControls/TBaseActiveControl.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.ActiveControls @@ -385,8 +385,7 @@ class TBaseActiveCallbackControl extends TBaseActiveControl */ public function getJsCallbackOptions() { - return TJavascript::encode($this->getClientSideOptions()); + return TJavaScript::encode($this->getClientSideOptions()); } } -?> diff --git a/framework/Web/UI/ActiveControls/TCallback.php b/framework/Web/UI/ActiveControls/TCallback.php index 2e0fed69..c1559c1f 100644 --- a/framework/Web/UI/ActiveControls/TCallback.php +++ b/framework/Web/UI/ActiveControls/TCallback.php @@ -99,4 +99,3 @@ class TCallback extends TControl implements ICallbackEventHandler, IActiveContro } } -?> diff --git a/framework/Web/UI/ActiveControls/TCallbackClientScript.php b/framework/Web/UI/ActiveControls/TCallbackClientScript.php index bc02182d..8f275ef8 100644 --- a/framework/Web/UI/ActiveControls/TCallbackClientScript.php +++ b/framework/Web/UI/ActiveControls/TCallbackClientScript.php @@ -670,4 +670,3 @@ class TCallbackClientScript extends TApplicationComponent } } -?> diff --git a/framework/Web/UI/ActiveControls/TCallbackClientSide.php b/framework/Web/UI/ActiveControls/TCallbackClientSide.php index a11204fb..57436278 100644 --- a/framework/Web/UI/ActiveControls/TCallbackClientSide.php +++ b/framework/Web/UI/ActiveControls/TCallbackClientSide.php @@ -322,4 +322,3 @@ class TCallbackClientSide extends TClientSideOptions } } -?> diff --git a/framework/Web/UI/ActiveControls/TCallbackEventParameter.php b/framework/Web/UI/ActiveControls/TCallbackEventParameter.php index 8e33407d..f08d40a9 100644 --- a/framework/Web/UI/ActiveControls/TCallbackEventParameter.php +++ b/framework/Web/UI/ActiveControls/TCallbackEventParameter.php @@ -85,4 +85,3 @@ class TCallbackEventParameter extends TEventParameter } } -?> diff --git a/framework/Web/UI/ActiveControls/TCallbackOptions.php b/framework/Web/UI/ActiveControls/TCallbackOptions.php index 745cef17..7c48b795 100644 --- a/framework/Web/UI/ActiveControls/TCallbackOptions.php +++ b/framework/Web/UI/ActiveControls/TCallbackOptions.php @@ -51,4 +51,3 @@ class TCallbackOptions extends TControl } } -?> diff --git a/framework/Web/UI/ActiveControls/TDraggable.php b/framework/Web/UI/ActiveControls/TDraggable.php new file mode 100755 index 00000000..e4e4c4c4 --- /dev/null +++ b/framework/Web/UI/ActiveControls/TDraggable.php @@ -0,0 +1,152 @@ +setViewState('DragHandle', TPropertyValue::ensureString($value), null); + } + + /** + * Get the handle id or css class + * @return string + */ + public function getHandle () + { + return $this->getViewState('DragHandle', null); + } + + /** + * Determine if draggable element should revert to it orginal position + * upon release in an non-droppable container. + * @return boolean true to revert + */ + public function getRevert() + { + return $this->getViewState('Revert', true); + } + + /** + * Sets whether the draggable element should revert to it orginal position + * upon release in an non-droppable container. + * @param boolean true to revert + */ + public function setRevert($value) + { + $this->setViewState('Revert', TPropertyValue::ensureBoolean($value), true); + } + + /** + * Determine if the element should be cloned when dragged + * If true, Clones the element and drags the clone, leaving the original in place until the clone is dropped. + * Defaults to false + * @return boolean true to clone the element + */ + public function getGhosting () + { + return $this->getViewState('Ghosting', false); + } + + /** + * Sets wether the element should be cloned when dragged + * If true, Clones the element and drags the clone, leaving the original in place until the clone is dropped. + * Defaults to false + * @return boolean true to clone the element + */ + public function setGhosting ($value) + { + $this->setViewState('Ghosting', TPropertyValue::ensureBoolean($value), false); + } + + /** + * Determine if the element should be constrainted in one direction or not + * @return CDraggableConstraint + */ + public function getConstraint() + { + return $this->getViewState('Constraint', TDraggableConstraint::None); + } + + /** + * Set wether the element should be constrainted in one direction + * @param CDraggableConstraint + */ + public function setConstraint($value) + { + $this->setViewState('Constraint', TPropertyValue::ensureEnum($value, 'TDraggableConstraint'), TDraggableConstraint::None); + } + + + /** + * Ensure that the ID attribute is rendered and registers the javascript code + * for initializing the active control. + */ + protected function addAttributesToRender($writer) + { + parent::addAttributesToRender($writer); + $writer->addAttribute('id',$this->getClientID()); + $cs=$this->getPage()->getClientScript(); + $cs->registerPradoScript('dragdrop'); + $options=TJavascript::encode($this->getPostBackOptions()); + $class=$this->getClientClassName(); + $code="new {$class}('{$this->getClientId()}', {$options}) "; + $cs->registerEndScript(sprintf('%08X', crc32($code)), $code); + } + + /** + * Gets the name of the javascript class responsible for performing postback for this control. + * This method overrides the parent implementation. + * @return string the javascript class name + */ + protected function getClientClassName () + { + return 'Draggable'; + } + + /** + * Gets the post back options for this textbox. + * @return array + */ + protected function getPostBackOptions() + { + $options['ID'] = $this->getClientID(); + + if (($handle=$this->getHandle())!== null) $options['handle']=$handle; + $options['revert']=$this->getRevert(); + if (($constraint=$this->getConstraint())!==TDraggableConstraint::None) $options['constraint']=strtolower($constraint); + $options['ghosting']=$this->getGhosting(); + + return $options; + } + +} + +class TDraggableConstraint extends TEnumerable +{ + const None='None'; + const Horizontal='Horizontal'; + const Vertical='Vertical'; +} +?> \ No newline at end of file diff --git a/framework/Web/UI/ActiveControls/TDropContainer.php b/framework/Web/UI/ActiveControls/TDropContainer.php new file mode 100755 index 00000000..5d090d95 --- /dev/null +++ b/framework/Web/UI/ActiveControls/TDropContainer.php @@ -0,0 +1,275 @@ +{@link setAcceptCssClass AcceptCssClass} : a coma delimited classname of elements that the drop container can accept. + * {@link setHoverCssClass HoverCssClass}: CSS classname of the container when a draggable element hovers over the container. + * + * Events: + * + * {@link OnDrop OnDrop} : raised when a TDraggable control is dropped. The dropped control is encapsulated in the event parameter + * + * @author Christophe BOULAIN (Christophe.Boulain@gmail.com) + * @copyright Copyright © 2008, PradoSoft + * @license http://www.pradosoft.com/license + * @version $Id$ + */ +class TDropContainer extends TPanel implements IActiveControl, ICallbackEventHandler +{ + private $_container=null; + + /** + * Creates a new callback control, sets the adapter to + * TActiveControlAdapter. If you override this class, be sure to set the + * adapter appropriately by, for example, by calling this constructor. + */ + public function __construct() + { + parent::__construct(); + $this->setAdapter(new TActiveControlAdapter($this)); + } + + /** + * @return TBaseActiveControl standard active control options. + */ + public function getActiveControl() + { + return $this->getAdapter()->getBaseActiveControl(); + } + + + /** + * Gets the Css class name that this container can accept. + * @return string + */ + public function getAcceptCssClass() + { + return $this->getViewState('Accepts', ''); + } + + /** + * Sets the Css class name that this container can accept. + * @param string comma delimited css class names. + */ + public function setAcceptCssClass($value) + { + $this->setViewState('Accepts', TPropertyValue::ensureArray($value), ''); + } + + /** + * Sets the Css class name used when a draggble element is hovering + * over this container. + * @param string css class name during draggable hover. + */ + public function setHoverCssClass($value) + { + $this->setViewState('HoverClass', $value, ''); + } + + /** + * Gets the Css class name used when a draggble element is hovering + * over this container. + * @return string css class name during draggable hover. + */ + public function getHoverCssClass() + { + return $this->getViewState('HoverClass', ''); + } + + + /** + * Raises callback event. This method is required bu {@link ICallbackEventHandler} + * interface. + * It raises the {@link onDrop OnDrop} event, then, the {@link onCallback OnCallback} event + * This method is mainly used by framework and control developers. + * @param TCallbackEventParameter the parameter associated with the callback event + */ + public function raiseCallbackEvent($param) + { + $this->onDrop($param->getCallbackParameter()); + $this->onCallback($param); + } + + /** + * Raises the onDrop event. + * The dropped control is encapsulated into a {@link TDropContainerEventParameter} + * + * @param string $dropControlId + */ + public function onDrop ($dropControlId) + { + // Find the control + // Warning, this will not work if you have a '_' in your control Id ! + $control=$this->getPage(); + $namingContainers=explode(TControl::CLIENT_ID_SEPARATOR, $dropControlId); + foreach ($namingContainers as $nc) + { + $control=$control->findControl($nc); + } + $this->raiseEvent('OnDrop', $this, new TDropContainerEventParameter ($control)); + + } + + /** + * This method is invoked when a callback is requested. The method raises + * 'OnCallback' event to fire up the event handlers. If you override this + * method, be sure to call the parent implementation so that the event + * handler can be invoked. + * @param TCallbackEventParameter event parameter to be passed to the event handlers + */ + public function onCallback($param) + { + $this->raiseEvent('OnCallback', $this, $param); + } + + /** + * Gets the post back options for this textbox. + * @return array + */ + protected function getPostBackOptions() + { + $options['ID'] = $this->getClientID(); + $options['EventTarget'] = $this->getUniqueID(); + + $options['accept'] = TJavascript::encode($this->getAcceptCssClass()); + $options['hoverclass'] = $this->getHoverCssClass(); + return $options; + } + + /** + * Gets the name of the javascript class responsible for performing postback for this control. + * This method overrides the parent implementation. + * @return string the javascript class name + */ + protected function getClientClassName() + { + return 'Prado.WebUI.DropContainer'; + } + + + /** + * Ensure that the ID attribute is rendered and registers the javascript code + * for initializing the active control. + */ + protected function addAttributesToRender($writer) + { + parent::addAttributesToRender($writer); + $writer->addAttribute('id',$this->getClientID()); + + $this->getPage()->getClientScript()->registerPradoScript('dragdrop'); + + $this->getActiveControl()->registerCallbackClientScript( + $this->getClientClassName(), $this->getPostBackOptions()); + } + + /** + * Creates child control + * Override parent implementation to create a container which will contain all + * child controls. This container will be a TActivePanel, in order to allow user + * to update its content on callback. + */ + public function createChildControls () + { + if ($this->_container===null) + { + $this->_container=Prado::CreateComponent('System.Web.UI.ActiveControls.TActivePanel'); + $this->_container->setId($this->getId().'_content'); + parent::getControls()->add($this->_container); + } + } + + /** + * Override parent implementation to return the container control collection. + * + * @return TControlCollection + */ + public function getControls() + { + $this->ensureChildControls(); + return $this->_container->getControls(); + } + + /** + * Renders and replaces the panel's content on the client-side. + * When render() is called before the OnPreRender event, such as when render() + * is called during a callback event handler, the rendering + * is defered until OnPreRender event is raised. + * @param THtmlWriter html writer + */ + public function render ($writer) + { + if($this->getHasPreRendered()) + { + parent::render($writer); + if($this->getActiveControl()->canUpdateClientSide()) + $this->getPage()->getCallbackClient()->replaceContent($this->_container,$writer); + } + else + { + $this->getPage()->getAdapter()->registerControlToRender($this->_container,$writer); + } + } + +} + +/** + * TDropContainerEventParameter class + * + * TDropContainerEventParameter encapsulate the parameter + * data for OnDrop event of TDropContainer components + * + * @author Christophe BOULAIN (Christophe.Boulain@ceram.fr) + * @copyright Copyright © 2008, PradoSoft + * @license http://www.pradosoft.com/license + * @version $Id$ + */ +class TDropContainerEventParameter extends TEventParameter +{ + /* + * the id of control which has been dropped + * @var string + */ + private $_droppedControl; + + /** + * constructor + * + * @param string the id of control which been dropped + */ + public function __construct ($control) + { + $this->_droppedControl=$control; + } + + /** + * @return TDraggable + */ + public function getDroppedControl () + { + return $this->_droppedControl; + } +} +?> \ No newline at end of file diff --git a/framework/Web/UI/ActiveControls/TEventTriggeredCallback.php b/framework/Web/UI/ActiveControls/TEventTriggeredCallback.php index 735ff926..fe4be8a8 100644 --- a/framework/Web/UI/ActiveControls/TEventTriggeredCallback.php +++ b/framework/Web/UI/ActiveControls/TEventTriggeredCallback.php @@ -93,4 +93,3 @@ class TEventTriggeredCallback extends TTriggeredCallback } } -?> diff --git a/framework/Web/UI/ActiveControls/TInPlaceTextBox.php b/framework/Web/UI/ActiveControls/TInPlaceTextBox.php index 855e78a0..6e1c6b7a 100644 --- a/framework/Web/UI/ActiveControls/TInPlaceTextBox.php +++ b/framework/Web/UI/ActiveControls/TInPlaceTextBox.php @@ -269,4 +269,3 @@ class TInPlaceTextBox extends TActiveTextBox } } -?> diff --git a/framework/Web/UI/ActiveControls/TTimeTriggeredCallback.php b/framework/Web/UI/ActiveControls/TTimeTriggeredCallback.php index a1410364..3dee5c59 100644 --- a/framework/Web/UI/ActiveControls/TTimeTriggeredCallback.php +++ b/framework/Web/UI/ActiveControls/TTimeTriggeredCallback.php @@ -49,6 +49,10 @@ class TTimeTriggeredCallback extends TCallback if($interval <= 0) throw new TConfigurationException('callback_interval_be_positive', $this->getID()); $this->setViewState('Interval', $interval, 1); + if ($this->getActiveControl()->canUpdateClientSide()){ + $client = $this->getPage()->getCallbackClient(); + $client->callClientFunction('Prado.WebUI.TTimeTriggeredCallback.setInterval', array($this, $interval)); + } } /** @@ -56,10 +60,8 @@ class TTimeTriggeredCallback extends TCallback */ public function startTimer() { - $id = $this->getClientID(); - $code = "Prado.WebUI.TTimeTriggeredCallback.start('{$id}');"; - $cs = $this->getPage()->getClientScript(); - $cs->registerEndScript("{$id}:start", $code); + $client = $this->getPage()->getCallbackClient(); + $client->callClientFunction('Prado.WebUI.TTimeTriggeredCallback.start', array($this)); } /** @@ -67,10 +69,8 @@ class TTimeTriggeredCallback extends TCallback */ public function stopTimer() { - $id = $this->getClientID(); - $code = "Prado.WebUI.TTimeTriggeredCallback.stop('{$id}');"; - $cs = $this->getPage()->getClientScript(); - $cs->registerEndScript("{$id}:stop", $code); + $client = $this->getPage()->getCallbackClient(); + $client->callClientFunction('Prado.WebUI.TTimeTriggeredCallback.stop', array($this)); } /** @@ -110,8 +110,12 @@ class TTimeTriggeredCallback extends TCallback parent::render($writer); $this->getActiveControl()->registerCallbackClientScript( $this->getClientClassName(), $this->getTriggerOptions()); - if($this->getStartTimerOnLoad()) - $this->startTimer(); + if($this->getStartTimerOnLoad()){ + $id = $this->getClientID(); + $code = "Prado.WebUI.TTimeTriggeredCallback.start('{$id}');"; + $cs = $this->getPage()->getClientScript(); + $cs->registerEndScript("{$id}:start", $code); + } } /** diff --git a/framework/Web/UI/ActiveControls/TTriggeredCallback.php b/framework/Web/UI/ActiveControls/TTriggeredCallback.php index 18679b4a..6923a53a 100644 --- a/framework/Web/UI/ActiveControls/TTriggeredCallback.php +++ b/framework/Web/UI/ActiveControls/TTriggeredCallback.php @@ -68,4 +68,3 @@ abstract class TTriggeredCallback extends TCallback } } -?> diff --git a/framework/Web/UI/ActiveControls/TValueTriggeredCallback.php b/framework/Web/UI/ActiveControls/TValueTriggeredCallback.php index 5a44f380..305afd70 100644 --- a/framework/Web/UI/ActiveControls/TValueTriggeredCallback.php +++ b/framework/Web/UI/ActiveControls/TValueTriggeredCallback.php @@ -116,4 +116,3 @@ class TValueTriggeredCallback extends TTriggeredCallback return 'Prado.WebUI.TValueTriggeredCallback'; } } -?> diff --git a/framework/Web/UI/TCachePageStatePersister.php b/framework/Web/UI/TCachePageStatePersister.php index 0b201d92..742bd687 100644 --- a/framework/Web/UI/TCachePageStatePersister.php +++ b/framework/Web/UI/TCachePageStatePersister.php @@ -199,4 +199,3 @@ class TCachePageStatePersister extends TComponent implements IPageStatePersister } } -?> diff --git a/framework/Web/UI/TClientScriptManager.php b/framework/Web/UI/TClientScriptManager.php index 83fdf789..f0eb6157 100644 --- a/framework/Web/UI/TClientScriptManager.php +++ b/framework/Web/UI/TClientScriptManager.php @@ -169,7 +169,10 @@ class TClientScriptManager extends TApplicationComponent $scriptLoaderPath = $path.'/'.basename(self::SCRIPT_LOADER); $scriptLoaderSrc = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_LOADER; if(!is_file($scriptLoaderPath)) + { copy($scriptLoaderSrc, $scriptLoaderPath); + chmod($scriptLoaderPath, PRADO_CHMOD); + } $url .= '/'.basename(self::SCRIPT_LOADER).'?js='.implode(',', $packages); if($debug!==false && $this->getApplication()->getMode()===TApplicationMode::Debug) { @@ -230,7 +233,7 @@ class TClientScriptManager extends TApplicationComponent $class = new TReflectionClass($callbackHandler); $clientSide = $callbackHandler->getActiveControl()->getClientSide(); $options = array_merge($options, $clientSide->getOptions()->toArray()); - $optionString = TJavascript::encode($options); + $optionString = TJavaScript::encode($options); $this->registerPradoScriptInternal('ajax'); $id = $callbackHandler->getUniqueID(); return "new Prado.CallbackRequest('{$id}',{$optionString})"; @@ -677,8 +680,8 @@ abstract class TClientSideOptions extends TComponent */ protected function setFunction($name, $code) { - if(!TJavascript::isFunction($code)) - $code = TJavascript::quoteFunction($this->ensureFunction($code)); + if(!TJavaScript::isFunction($code)) + $code = TJavaScript::quoteFunction($this->ensureFunction($code)); $this->setOption($name, $code); } @@ -717,4 +720,3 @@ abstract class TClientSideOptions extends TComponent } } -?> diff --git a/framework/Web/UI/TCompositeControl.php b/framework/Web/UI/TCompositeControl.php index d30756e2..1cf31440 100644 --- a/framework/Web/UI/TCompositeControl.php +++ b/framework/Web/UI/TCompositeControl.php @@ -36,4 +36,3 @@ class TCompositeControl extends TControl implements INamingContainer } } -?> diff --git a/framework/Web/UI/TControl.php b/framework/Web/UI/TControl.php index 576db89b..1c03a04d 100644 --- a/framework/Web/UI/TControl.php +++ b/framework/Web/UI/TControl.php @@ -1997,6 +1997,14 @@ interface IValidatable * @return mixed the value of the property to be validated. */ public function getValidationPropertyValue(); + /** + * @return boolean wether this control's validators validated successfully (must default to true) + */ + public function getIsValid(); + /** + * @return boolean wether this control's validators validated successfully + */ + public function setIsValid($value); } /** diff --git a/framework/Web/UI/TControlAdapter.php b/framework/Web/UI/TControlAdapter.php index a6263f7f..16a8c839 100644 --- a/framework/Web/UI/TControlAdapter.php +++ b/framework/Web/UI/TControlAdapter.php @@ -141,4 +141,3 @@ class TControlAdapter extends TApplicationComponent } } -?> diff --git a/framework/Web/UI/TForm.php b/framework/Web/UI/TForm.php index 436352c5..2356a733 100644 --- a/framework/Web/UI/TForm.php +++ b/framework/Web/UI/TForm.php @@ -165,4 +165,3 @@ class TForm extends TControl } } -?> diff --git a/framework/Web/UI/THtmlWriter.php b/framework/Web/UI/THtmlWriter.php index dd68b828..217b9663 100644 --- a/framework/Web/UI/THtmlWriter.php +++ b/framework/Web/UI/THtmlWriter.php @@ -254,4 +254,3 @@ class THtmlWriter extends TApplicationComponent implements ITextWriter } } -?> diff --git a/framework/Web/UI/TPage.php b/framework/Web/UI/TPage.php index 1a0f04a6..12433715 100644 --- a/framework/Web/UI/TPage.php +++ b/framework/Web/UI/TPage.php @@ -1234,10 +1234,10 @@ class TPageStateFormatter $str=$sm->hashData(Prado::serialize($data)); else $str=Prado::serialize($data); - if($page->getEnableStateEncryption()) - $str=$sm->encrypt($str); if(extension_loaded('zlib')) $str=gzcompress($str); + if($page->getEnableStateEncryption()) + $str=$sm->encrypt($str); return base64_encode($str); } @@ -1251,13 +1251,13 @@ class TPageStateFormatter $str=base64_decode($data); if($str==='') return null; - if(extension_loaded('zlib')) - $str=@gzuncompress($str); if($str!==false) { $sm=$page->getApplication()->getSecurityManager(); if($page->getEnableStateEncryption()) $str=$sm->decrypt($str); + if(extension_loaded('zlib')) + $str=@gzuncompress($str); if($page->getEnableStateValidation()) { if(($str=$sm->validateData($str))!==false) diff --git a/framework/Web/UI/TPageStatePersister.php b/framework/Web/UI/TPageStatePersister.php index e8ea0713..4b217aee 100644 --- a/framework/Web/UI/TPageStatePersister.php +++ b/framework/Web/UI/TPageStatePersister.php @@ -69,4 +69,3 @@ class TPageStatePersister extends TComponent implements IPageStatePersister } } -?> diff --git a/framework/Web/UI/TSessionPageStatePersister.php b/framework/Web/UI/TSessionPageStatePersister.php index 2c93118c..f422dfa8 100644 --- a/framework/Web/UI/TSessionPageStatePersister.php +++ b/framework/Web/UI/TSessionPageStatePersister.php @@ -129,4 +129,3 @@ class TSessionPageStatePersister extends TComponent implements IPageStatePersist } } -?> diff --git a/framework/Web/UI/TTemplateControl.php b/framework/Web/UI/TTemplateControl.php index e8138e30..7da54e6c 100644 --- a/framework/Web/UI/TTemplateControl.php +++ b/framework/Web/UI/TTemplateControl.php @@ -241,4 +241,3 @@ class TTemplateControl extends TCompositeControl } } -?> diff --git a/framework/Web/UI/TTemplateManager.php b/framework/Web/UI/TTemplateManager.php index be2beba6..f44d414c 100644 --- a/framework/Web/UI/TTemplateManager.php +++ b/framework/Web/UI/TTemplateManager.php @@ -4,7 +4,7 @@ * * @author Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI @@ -174,10 +174,10 @@ class TTemplate extends TApplicationComponent implements ITemplate * '<\/?com:([\w\.]+)((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?"|\s*[\w\.]+\s*=\s*<%.*?%>)*)\s*\/?>' - component tags * '<\/?prop:([\w\.]+)\s*>' - property tags * '<%@\s*((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?")*)\s*%>' - directives - * '<%[%#~\\$=\\[](.*?)%>' - expressions + * '<%[%#~\/\\$=\\[](.*?)%>' - expressions * ')*)\s*\/>' - group subproperty tags */ - const REGEX_RULES='/||<\/?com:([\w\.]+)((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?"|\s*[\w\.]+\s*=\s*<%.*?%>)*)\s*\/?>|<\/?prop:([\w\.]+)\s*>|<%@\s*((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?")*)\s*%>|<%[%#~\\$=\\[](.*?)%>|)*)\s*\/>/msS'; + const REGEX_RULES='/||<\/?com:([\w\.]+)((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?"|\s*[\w\.]+\s*=\s*<%.*?%>)*)\s*\/?>|<\/?prop:([\w\.]+)\s*>|<%@\s*((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?")*)\s*%>|<%[%#~\/\\$=\\[](.*?)%>|)*)\s*\/>/msS'; /** * Different configurations of component property/event/attribute @@ -661,6 +661,8 @@ class TTemplate extends TApplicationComponent implements ITemplate $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,"\$this->getApplication()->getParameters()->itemAt('$literal')")); else if($str[2]==='~') $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,"\$this->publishFilePath('$this->_contextPath/$literal')")); + else if($str[2]==='/') + $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,"dirname(\$this->getApplication()->getRequest()->getApplicationUrl()).'/$literal'")); else if($str[2]==='[') { $literal=strtr(trim(substr($literal,0,strlen($literal)-1)),array("'"=>"\'","\\"=>"\\\\")); @@ -1064,4 +1066,3 @@ class TTemplate extends TApplicationComponent implements ITemplate } } -?> diff --git a/framework/Web/UI/WebControls/TBaseDataList.php b/framework/Web/UI/WebControls/TBaseDataList.php index df91a0a6..d202eab8 100644 --- a/framework/Web/UI/WebControls/TBaseDataList.php +++ b/framework/Web/UI/WebControls/TBaseDataList.php @@ -188,4 +188,3 @@ abstract class TBaseDataList extends TDataBoundControl } } -?> diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php index add771cc..b418885c 100644 --- a/framework/Web/UI/WebControls/TBaseValidator.php +++ b/framework/Web/UI/WebControls/TBaseValidator.php @@ -269,8 +269,11 @@ abstract class TBaseValidator extends TLabel implements IValidator { $class = preg_replace ('/ '.preg_quote($cssClass).'/', '',$control->getCssClass()); if(!$this->getIsValid()) + { $class .= ' '.$cssClass; - $control->setCssClass($class); + $control->setCssClass($class); + } elseif ($control->getIsValid()) + $control->setCssClass($class); } } } @@ -493,7 +496,7 @@ abstract class TBaseValidator extends TLabel implements IValidator $this->setIsValid(true); $this->onValidate(); if($this->getVisible(true) && $this->getEnabled(true)) - { + { // if the target is not a disabled web control if(($target=$this->getValidationTarget())!==null && !($target instanceof TWebControl && !$target->getEnabled(true))) { @@ -504,10 +507,17 @@ abstract class TBaseValidator extends TLabel implements IValidator } else { + $target->setIsValid(false); $this->setIsValid(false); $this->onValidationError(); } } + else + { + $this->evaluateIsValid(); + $this->setIsValid(true); + $this->onValidationSuccess(); + } } return $this->getIsValid(); } @@ -721,4 +731,3 @@ class TValidationDataType extends TEnumerable const String='String'; } -?> diff --git a/framework/Web/UI/WebControls/TBoundColumn.php b/framework/Web/UI/WebControls/TBoundColumn.php index 13fb6af8..264bbc6c 100644 --- a/framework/Web/UI/WebControls/TBoundColumn.php +++ b/framework/Web/UI/WebControls/TBoundColumn.php @@ -233,4 +233,3 @@ class TBoundColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TBulletedList.php b/framework/Web/UI/WebControls/TBulletedList.php index f99c7986..60cf743e 100644 --- a/framework/Web/UI/WebControls/TBulletedList.php +++ b/framework/Web/UI/WebControls/TBulletedList.php @@ -485,4 +485,3 @@ class TBulletedListDisplayMode extends TEnumerable const LinkButton='LinkButton'; } -?> diff --git a/framework/Web/UI/WebControls/TButton.php b/framework/Web/UI/WebControls/TButton.php index dc66e9d6..81929a28 100644 --- a/framework/Web/UI/WebControls/TButton.php +++ b/framework/Web/UI/WebControls/TButton.php @@ -366,4 +366,3 @@ class TButtonType extends TEnumerable const Button='Button'; } -?> diff --git a/framework/Web/UI/WebControls/TButtonColumn.php b/framework/Web/UI/WebControls/TButtonColumn.php index 24199ddd..186577e5 100644 --- a/framework/Web/UI/WebControls/TButtonColumn.php +++ b/framework/Web/UI/WebControls/TButtonColumn.php @@ -276,4 +276,3 @@ class TButtonColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TCaptcha.php b/framework/Web/UI/WebControls/TCaptcha.php index 153b1d30..3c51c389 100644 --- a/framework/Web/UI/WebControls/TCaptcha.php +++ b/framework/Web/UI/WebControls/TCaptcha.php @@ -489,4 +489,3 @@ class TCaptcha extends TImage } } -?> diff --git a/framework/Web/UI/WebControls/TCaptchaValidator.php b/framework/Web/UI/WebControls/TCaptchaValidator.php index 770cd514..5477fe54 100644 --- a/framework/Web/UI/WebControls/TCaptchaValidator.php +++ b/framework/Web/UI/WebControls/TCaptchaValidator.php @@ -121,4 +121,3 @@ class TCaptchaValidator extends TBaseValidator } } -?> diff --git a/framework/Web/UI/WebControls/TCheckBox.php b/framework/Web/UI/WebControls/TCheckBox.php index faff5086..d8c2cc0b 100644 --- a/framework/Web/UI/WebControls/TCheckBox.php +++ b/framework/Web/UI/WebControls/TCheckBox.php @@ -43,6 +43,7 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatable, IDataRenderer, ISurroundable { private $_dataChanged=false; + private $_isValid=true; /** * @return string tag name of the button @@ -125,6 +126,23 @@ class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatabl return $this->getChecked(); } + /** + * Returns true if this control validated successfully. + * Defaults to true. + * @return bool wether this control validated successfully. + */ + public function getIsValid() + { + return $this->_isValid; + } + /** + * @param bool wether this control is valid. + */ + public function setIsValid($value) + { + $this->_isValid=TPropertyValue::ensureBoolean($value); + } + /** * @return string the text caption of the checkbox */ diff --git a/framework/Web/UI/WebControls/TCheckBoxColumn.php b/framework/Web/UI/WebControls/TCheckBoxColumn.php index 36217343..71eea97f 100644 --- a/framework/Web/UI/WebControls/TCheckBoxColumn.php +++ b/framework/Web/UI/WebControls/TCheckBoxColumn.php @@ -121,4 +121,3 @@ class TCheckBoxColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TCheckBoxList.php b/framework/Web/UI/WebControls/TCheckBoxList.php index 1e1c3b10..742dd18b 100644 --- a/framework/Web/UI/WebControls/TCheckBoxList.php +++ b/framework/Web/UI/WebControls/TCheckBoxList.php @@ -53,6 +53,7 @@ class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingCont private $_isEnabled; private $_changedEventRaised=false; private $_dataChanged=false; + private $_isValid=true; /** * Constructor. @@ -428,6 +429,23 @@ class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingCont return $this->getSelectedValue(); } + /** + * Returns true if this control validated successfully. + * Defaults to true. + * @return bool wether this control validated successfully. + */ + public function getIsValid() + { + return $this->_isValid; + } + /** + * @param bool wether this control is valid. + */ + public function setIsValid($value) + { + $this->_isValid=TPropertyValue::ensureBoolean($value); + } + /** * Gets the name of the javascript class responsible for performing postback for this control. * This method overrides the parent implementation. @@ -454,4 +472,3 @@ class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingCont } -?> diff --git a/framework/Web/UI/WebControls/TClientScript.php b/framework/Web/UI/WebControls/TClientScript.php index 5369d27d..b5806a57 100644 --- a/framework/Web/UI/WebControls/TClientScript.php +++ b/framework/Web/UI/WebControls/TClientScript.php @@ -129,4 +129,3 @@ class TClientScript extends TControl } } -?> diff --git a/framework/Web/UI/WebControls/TClientScriptLoader.php b/framework/Web/UI/WebControls/TClientScriptLoader.php index c916bcc5..ec763bb3 100644 --- a/framework/Web/UI/WebControls/TClientScriptLoader.php +++ b/framework/Web/UI/WebControls/TClientScriptLoader.php @@ -168,4 +168,3 @@ class TClientScriptLoader extends TWebControl } } -?> diff --git a/framework/Web/UI/WebControls/TColorPicker.php b/framework/Web/UI/WebControls/TColorPicker.php index 5b96723a..67a4ccfe 100644 --- a/framework/Web/UI/WebControls/TColorPicker.php +++ b/framework/Web/UI/WebControls/TColorPicker.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.WebControls @@ -203,6 +203,7 @@ class TColorPicker extends TTextBox $writer->addAttribute('style', "background-color:{$color};"); $writer->addAttribute('width', '20'); $writer->addAttribute('height', '20'); + $writer->addAttribute('alt', ''); $writer->renderBeginTag('img'); $writer->renderEndTag(); $writer->renderEndTag(); @@ -270,4 +271,3 @@ class TColorPickerClientSide extends TClientSideOptions } } -?> diff --git a/framework/Web/UI/WebControls/TCompareValidator.php b/framework/Web/UI/WebControls/TCompareValidator.php index e5723f2a..1261cded 100644 --- a/framework/Web/UI/WebControls/TCompareValidator.php +++ b/framework/Web/UI/WebControls/TCompareValidator.php @@ -263,4 +263,3 @@ class TValidationCompareOperator extends TEnumerable const LessThanEqual='LessThanEqual'; } -?> diff --git a/framework/Web/UI/WebControls/TConditional.php b/framework/Web/UI/WebControls/TConditional.php index 7af6622e..fafe12c9 100644 --- a/framework/Web/UI/WebControls/TConditional.php +++ b/framework/Web/UI/WebControls/TConditional.php @@ -141,4 +141,3 @@ class TConditional extends TControl } } -?> diff --git a/framework/Web/UI/WebControls/TContent.php b/framework/Web/UI/WebControls/TContent.php index ecc2a1b5..b327b440 100644 --- a/framework/Web/UI/WebControls/TContent.php +++ b/framework/Web/UI/WebControls/TContent.php @@ -45,4 +45,3 @@ class TContent extends TControl implements INamingContainer } } -?> diff --git a/framework/Web/UI/WebControls/TContentPlaceHolder.php b/framework/Web/UI/WebControls/TContentPlaceHolder.php index 29e12ab3..90390d9d 100644 --- a/framework/Web/UI/WebControls/TContentPlaceHolder.php +++ b/framework/Web/UI/WebControls/TContentPlaceHolder.php @@ -46,4 +46,3 @@ class TContentPlaceHolder extends TControl } } -?> diff --git a/framework/Web/UI/WebControls/TCustomValidator.php b/framework/Web/UI/WebControls/TCustomValidator.php index e998cef6..0b82ac5c 100644 --- a/framework/Web/UI/WebControls/TCustomValidator.php +++ b/framework/Web/UI/WebControls/TCustomValidator.php @@ -4,7 +4,7 @@ * * @author Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.WebControls @@ -88,7 +88,9 @@ class TCustomValidator extends TBaseValidator */ public function evaluateIsValid() { - $value=$this->getValidationValue($this->getValidationTarget()); + $value = ''; + if($this->getValidationTarget()!==null) + $value=$this->getValidationValue($this->getValidationTarget()); return $this->onServerValidate($value); } @@ -105,9 +107,24 @@ class TCustomValidator extends TBaseValidator { $param=new TServerValidateEventParameter($value,true); $this->raiseEvent('OnServerValidate',$this,$param); - return $param->getIsValid(); + if($this->getValidationTarget()==null) + return true; + else + return $param->getIsValid(); + } + + /** + * @return TControl control to be validated. Null if no control is found. + */ + protected function getValidationTarget() + { + if(($id=$this->getControlToValidate())!=='' && ($control=$this->findControl($id))!==null) + return $control; + else if(($id=$this->getControlToValidate())!=='') + throw new TInvalidDataTypeException('basevalidator_validatable_required',get_class($this)); + else + return null; } - /** * Returns an array of javascript validator options. @@ -191,4 +208,3 @@ class TServerValidateEventParameter extends TEventParameter $this->_isValid=TPropertyValue::ensureBoolean($value); } } -?> diff --git a/framework/Web/UI/WebControls/TDataGrid.php b/framework/Web/UI/WebControls/TDataGrid.php index c8e6c9a8..9551b376 100644 --- a/framework/Web/UI/WebControls/TDataGrid.php +++ b/framework/Web/UI/WebControls/TDataGrid.php @@ -2203,4 +2203,3 @@ class TDataGridPagerPosition extends TEnumerable const TopAndBottom='TopAndBottom'; } -?> diff --git a/framework/Web/UI/WebControls/TDataGridColumn.php b/framework/Web/UI/WebControls/TDataGridColumn.php index e3c2f297..577c0068 100644 --- a/framework/Web/UI/WebControls/TDataGridColumn.php +++ b/framework/Web/UI/WebControls/TDataGridColumn.php @@ -565,4 +565,3 @@ class TButtonColumnType extends TEnumerable const ImageButton='ImageButton'; } -?> diff --git a/framework/Web/UI/WebControls/TDataGridItemRenderer.php b/framework/Web/UI/WebControls/TDataGridItemRenderer.php index 8e0f9e70..62c226f6 100644 --- a/framework/Web/UI/WebControls/TDataGridItemRenderer.php +++ b/framework/Web/UI/WebControls/TDataGridItemRenderer.php @@ -28,4 +28,3 @@ class TDataGridItemRenderer extends TItemDataRenderer { } -?> diff --git a/framework/Web/UI/WebControls/TDataGridPagerStyle.php b/framework/Web/UI/WebControls/TDataGridPagerStyle.php index dcc9d983..e29b9dc9 100644 --- a/framework/Web/UI/WebControls/TDataGridPagerStyle.php +++ b/framework/Web/UI/WebControls/TDataGridPagerStyle.php @@ -219,4 +219,3 @@ class TDataGridPagerStyle extends TPanelStyle } } -?> diff --git a/framework/Web/UI/WebControls/TDataList.php b/framework/Web/UI/WebControls/TDataList.php index 7d0965a2..ca628b21 100644 --- a/framework/Web/UI/WebControls/TDataList.php +++ b/framework/Web/UI/WebControls/TDataList.php @@ -1764,4 +1764,3 @@ class TDataListItemCollection extends TList } } -?> diff --git a/framework/Web/UI/WebControls/TDataListItemRenderer.php b/framework/Web/UI/WebControls/TDataListItemRenderer.php index 5481cad7..1bf2fcb2 100644 --- a/framework/Web/UI/WebControls/TDataListItemRenderer.php +++ b/framework/Web/UI/WebControls/TDataListItemRenderer.php @@ -170,4 +170,3 @@ class TDataListItemRenderer extends TItemDataRenderer implements IStyleable } } -?> diff --git a/framework/Web/UI/WebControls/TDataRenderer.php b/framework/Web/UI/WebControls/TDataRenderer.php index e884afe1..4aaeec0a 100644 --- a/framework/Web/UI/WebControls/TDataRenderer.php +++ b/framework/Web/UI/WebControls/TDataRenderer.php @@ -50,4 +50,3 @@ abstract class TDataRenderer extends TTemplateControl implements IDataRenderer } } -?> diff --git a/framework/Web/UI/WebControls/TDataSourceControl.php b/framework/Web/UI/WebControls/TDataSourceControl.php index e42d7381..1d0823ff 100644 --- a/framework/Web/UI/WebControls/TDataSourceControl.php +++ b/framework/Web/UI/WebControls/TDataSourceControl.php @@ -116,4 +116,3 @@ class TReadOnlyDataSource extends TDataSourceControl } } -?> diff --git a/framework/Web/UI/WebControls/TDataSourceView.php b/framework/Web/UI/WebControls/TDataSourceView.php index 7c0ee2d0..7297fd45 100644 --- a/framework/Web/UI/WebControls/TDataSourceView.php +++ b/framework/Web/UI/WebControls/TDataSourceView.php @@ -204,4 +204,3 @@ class TReadOnlyDataSourceView extends TDataSourceView } } -?> diff --git a/framework/Web/UI/WebControls/TDataTypeValidator.php b/framework/Web/UI/WebControls/TDataTypeValidator.php index d4fa20c3..14017585 100644 --- a/framework/Web/UI/WebControls/TDataTypeValidator.php +++ b/framework/Web/UI/WebControls/TDataTypeValidator.php @@ -139,4 +139,3 @@ class TDataTypeValidator extends TBaseValidator } } -?> diff --git a/framework/Web/UI/WebControls/TDatePicker.php b/framework/Web/UI/WebControls/TDatePicker.php index 84455fee..770099eb 100644 --- a/framework/Web/UI/WebControls/TDatePicker.php +++ b/framework/Web/UI/WebControls/TDatePicker.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.WebControls @@ -59,7 +59,12 @@ Prado::using('System.Web.UI.WebControls.TTextBox'); * In DropDownList mode, in addition to the popup date picker, three * drop down list (day, month and year) are presented to select the date . * + * The PositionMode property can be set to "Top" or "Bottom" with default + * as "Bottom". It specifies the position of the calendar popup, relative to the + * input field. + * * @author Wei Zhuo + * @author Carl G. Mathisen * @version $Id$ * @package System.Web.UI.WebControls * @since 3.0 @@ -263,6 +268,22 @@ class TDatePicker extends TTextBox { return $this->getViewState('UpToYear', intval(@date('Y'))+10); } + + /** + * @param TDatePickerPositionMode calendar UI position + */ + public function setPositionMode($value) + { + $this->setViewState('PositionMode', TPropertyValue::ensureEnum($value, 'TDatePickerPositionMode'), TDatePickerPositionMode::Bottom); + } + + /** + * @return TDatePickerPositionMode current calendar UI position. + */ + public function getPositionMode() + { + return $this->getViewState('PositionMode', TDatePickerPositionMode::Bottom); + } /** * @return integer current selected date from the date picker as timestamp, NULL if timestamp is not set previously. @@ -505,6 +526,7 @@ class TDatePicker extends TTextBox $options['UpToYear'] = $this->getUpToYear(); if($this->getMode()!==TDatePickerMode::Basic) $options['Trigger'] = $this->getDatePickerButtonID(); + $options['PositionMode'] = $this->getPositionMode(); $options = array_merge($options, $this->getCulturalOptions()); if(!is_null($this->_clientScript)) @@ -853,8 +875,8 @@ class TDatePicker extends TTextBox * * The OnDateChanged event is raise when the date picker's date * is changed. - * The formatted date according to {@link TDatePicker::getDateFormat DateFormat} is sent - * as parameter to this event + * The formatted date according to {@link TDatePicker::getDateFormat DateFormat} is sent + * as parameter to this event * * @author Wei Zhuo * @version $Id$ @@ -923,4 +945,20 @@ class TDatePickerMode extends TEnumerable const ImageButton='ImageButton'; } -?> +/** + * TDatePickerPositionMode class. + * TDatePickerPositionMode defines the positions available for the calendar popup, relative to the corresponding input. + * + * The following enumerable values are defined: + * - Top: the date picker is placed above the input field + * - Bottom: the date picker is placed below the input field + * + * @author Carl G. Mathisen + * @package System.Web.UI.WebControls + * @since 3.1.4 + */ +class TDatePickerPositionMode extends TEnumerable +{ + const Top='Top'; + const Bottom='Bottom'; +} \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TDropDownList.php b/framework/Web/UI/WebControls/TDropDownList.php index f00466d5..73be981c 100644 --- a/framework/Web/UI/WebControls/TDropDownList.php +++ b/framework/Web/UI/WebControls/TDropDownList.php @@ -40,6 +40,7 @@ Prado::using('System.Web.UI.WebControls.TListControl'); class TDropDownList extends TListControl implements IPostBackDataHandler, IValidatable { private $_dataChanged=false; + private $_isValid=true; /** * Adds attributes to renderer. @@ -127,5 +128,21 @@ class TDropDownList extends TListControl implements IPostBackDataHandler, IValid { return $this->getSelectedValue(); } + + /** + * Returns true if this control validated successfully. + * Defaults to true. + * @return bool wether this control validated successfully. + */ + public function getIsValid() + { + return $this->_isValid; + } + /** + * @param bool wether this control is valid. + */ + public function setIsValid($value) + { + $this->_isValid=TPropertyValue::ensureBoolean($value); + } } -?> diff --git a/framework/Web/UI/WebControls/TDropDownListColumn.php b/framework/Web/UI/WebControls/TDropDownListColumn.php index cff42cad..a225abac 100644 --- a/framework/Web/UI/WebControls/TDropDownListColumn.php +++ b/framework/Web/UI/WebControls/TDropDownListColumn.php @@ -319,4 +319,3 @@ class TDropDownListColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TEditCommandColumn.php b/framework/Web/UI/WebControls/TEditCommandColumn.php index f9989a4e..1699afa2 100644 --- a/framework/Web/UI/WebControls/TEditCommandColumn.php +++ b/framework/Web/UI/WebControls/TEditCommandColumn.php @@ -263,4 +263,3 @@ class TEditCommandColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TEmailAddressValidator.php b/framework/Web/UI/WebControls/TEmailAddressValidator.php index c5407516..206bd23d 100644 --- a/framework/Web/UI/WebControls/TEmailAddressValidator.php +++ b/framework/Web/UI/WebControls/TEmailAddressValidator.php @@ -95,4 +95,3 @@ class TEmailAddressValidator extends TRegularExpressionValidator } } -?> diff --git a/framework/Web/UI/WebControls/TExpression.php b/framework/Web/UI/WebControls/TExpression.php index 022a0b21..34190473 100644 --- a/framework/Web/UI/WebControls/TExpression.php +++ b/framework/Web/UI/WebControls/TExpression.php @@ -60,4 +60,3 @@ class TExpression extends TControl } } -?> diff --git a/framework/Web/UI/WebControls/TFileUpload.php b/framework/Web/UI/WebControls/TFileUpload.php index 47d49c0c..6658e93d 100644 --- a/framework/Web/UI/WebControls/TFileUpload.php +++ b/framework/Web/UI/WebControls/TFileUpload.php @@ -59,6 +59,7 @@ class TFileUpload extends TWebControl implements IPostBackDataHandler, IValidata */ private $_errorCode=UPLOAD_ERR_NO_FILE; private $_dataChanged=false; + private $_isValid=true; /** * @return string tag name of the file upload control @@ -255,6 +256,23 @@ class TFileUpload extends TWebControl implements IPostBackDataHandler, IValidata { return $this->getFileName(); } + + /** + * Returns true if this control validated successfully. + * Defaults to true. + * @return bool wether this control validated successfully. + */ + public function getIsValid() + { + return $this->_isValid; + } + /** + * @param bool wether this control is valid. + */ + public function setIsValid($value) + { + $this->_isValid=TPropertyValue::ensureBoolean($value); + } + } -?> diff --git a/framework/Web/UI/WebControls/TFont.php b/framework/Web/UI/WebControls/TFont.php index cb0fba93..9ba644f8 100644 --- a/framework/Web/UI/WebControls/TFont.php +++ b/framework/Web/UI/WebControls/TFont.php @@ -316,4 +316,3 @@ class TFont extends TComponent $writer->addStyleAttribute('font-family',$this->_name); } } -?> diff --git a/framework/Web/UI/WebControls/THead.php b/framework/Web/UI/WebControls/THead.php index 1b51f8ae..62ee46d3 100644 --- a/framework/Web/UI/WebControls/THead.php +++ b/framework/Web/UI/WebControls/THead.php @@ -4,7 +4,7 @@ * * @author Marcus Nyeholt and Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI @@ -29,6 +29,13 @@ * * * + * + * A MetaTag for "generator" is added by default if you haven't specified your own generator meta tag. You can override + * the property by adding the following code to your template: + * + * + * + * * * Note, {@link TPage} has a property {@link TPage::getHead Head} that refers to * the THead control currently on the page. A page can have at most once THead @@ -155,14 +162,24 @@ class THead extends TControl if(($icon=$this->getShortcutIcon())!=='') $writer->write('\n"); + $generatorAdded = false; if(($metaTags=$this->getMetaTags())!==null) { foreach($metaTags as $metaTag) { + if(strtolower($metaTag->getName()) == 'generator') + $generatorAdded = true; $metaTag->render($writer); $writer->writeLine(); } } + if(!$generatorAdded) + { + $metaTag = new TMetaTag(); + $metaTag->setName('generator'); + $metaTag->setContent(Prado::metaGenerator()); + $metaTag->render($writer); + } $cs=$page->getClientScript(); $cs->renderStyleSheetFiles($writer); $cs->renderStyleSheets($writer); @@ -374,4 +391,4 @@ class TMetaTagCollection extends TList } } -?> +?> diff --git a/framework/Web/UI/WebControls/THiddenField.php b/framework/Web/UI/WebControls/THiddenField.php index 2fbbcf99..49b1aa39 100644 --- a/framework/Web/UI/WebControls/THiddenField.php +++ b/framework/Web/UI/WebControls/THiddenField.php @@ -26,6 +26,7 @@ class THiddenField extends TControl implements IPostBackDataHandler, IValidatable, IDataRenderer { private $_dataChanged=false; + private $_isValid=true; /** * @return string tag name of the hidden field. @@ -111,6 +112,23 @@ class THiddenField extends TControl implements IPostBackDataHandler, IValidatabl return $this->getValue(); } + /** + * Returns true if this control validated successfully. + * Defaults to true. + * @return bool wether this control validated successfully. + */ + public function getIsValid() + { + return $this->_isValid; + } + /** + * @param bool wether this control is valid. + */ + public function setIsValid($value) + { + $this->_isValid=TPropertyValue::ensureBoolean($value); + } + /** * Raises postdata changed event. * This method calls {@link onValueChanged} method. @@ -204,4 +222,3 @@ class THiddenField extends TControl implements IPostBackDataHandler, IValidatabl } } -?> diff --git a/framework/Web/UI/WebControls/THtmlArea.php b/framework/Web/UI/WebControls/THtmlArea.php index b9245be3..7fea5862 100644 --- a/framework/Web/UI/WebControls/THtmlArea.php +++ b/framework/Web/UI/WebControls/THtmlArea.php @@ -473,4 +473,3 @@ class THtmlArea extends TTextBox } } -?> diff --git a/framework/Web/UI/WebControls/THyperLink.php b/framework/Web/UI/WebControls/THyperLink.php index 3bd92ffd..217fa267 100644 --- a/framework/Web/UI/WebControls/THyperLink.php +++ b/framework/Web/UI/WebControls/THyperLink.php @@ -187,4 +187,3 @@ class THyperLink extends TWebControl implements IDataRenderer } } -?> diff --git a/framework/Web/UI/WebControls/THyperLinkColumn.php b/framework/Web/UI/WebControls/THyperLinkColumn.php index 8ac1177f..7db6eda8 100644 --- a/framework/Web/UI/WebControls/THyperLinkColumn.php +++ b/framework/Web/UI/WebControls/THyperLinkColumn.php @@ -215,4 +215,3 @@ class THyperLinkColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TImage.php b/framework/Web/UI/WebControls/TImage.php index e1ff8535..220fa4a6 100644 --- a/framework/Web/UI/WebControls/TImage.php +++ b/framework/Web/UI/WebControls/TImage.php @@ -155,4 +155,3 @@ class TImage extends TWebControl implements IDataRenderer } } -?> diff --git a/framework/Web/UI/WebControls/TImageMap.php b/framework/Web/UI/WebControls/TImageMap.php index 89daca44..d0cd8a0a 100644 --- a/framework/Web/UI/WebControls/TImageMap.php +++ b/framework/Web/UI/WebControls/TImageMap.php @@ -835,4 +835,3 @@ class THotSpotMode extends TEnumerable const Inactive='Inactive'; } -?> diff --git a/framework/Web/UI/WebControls/TInlineFrame.php b/framework/Web/UI/WebControls/TInlineFrame.php index dae728d3..c47af648 100644 --- a/framework/Web/UI/WebControls/TInlineFrame.php +++ b/framework/Web/UI/WebControls/TInlineFrame.php @@ -274,4 +274,3 @@ class TInlineFrameScrollBars extends TEnumerable const Auto='Auto'; const Both='Both'; } -?> diff --git a/framework/Web/UI/WebControls/TItemDataRenderer.php b/framework/Web/UI/WebControls/TItemDataRenderer.php index a57ff27d..79e0186e 100644 --- a/framework/Web/UI/WebControls/TItemDataRenderer.php +++ b/framework/Web/UI/WebControls/TItemDataRenderer.php @@ -81,4 +81,3 @@ abstract class TItemDataRenderer extends TDataRenderer implements IItemDataRende } } -?> diff --git a/framework/Web/UI/WebControls/TJavascriptLogger.php b/framework/Web/UI/WebControls/TJavascriptLogger.php index 11e64735..6d49f801 100644 --- a/framework/Web/UI/WebControls/TJavascriptLogger.php +++ b/framework/Web/UI/WebControls/TJavascriptLogger.php @@ -91,4 +91,3 @@ class TJavascriptLogger extends TWebControl } } -?> diff --git a/framework/Web/UI/WebControls/TKeyboard.php b/framework/Web/UI/WebControls/TKeyboard.php index 7c9357d7..9c26fab8 100644 --- a/framework/Web/UI/WebControls/TKeyboard.php +++ b/framework/Web/UI/WebControls/TKeyboard.php @@ -186,4 +186,3 @@ class TKeyboard extends TWebControl } } -?> diff --git a/framework/Web/UI/WebControls/TLabel.php b/framework/Web/UI/WebControls/TLabel.php index 3e61eddf..d1595ead 100644 --- a/framework/Web/UI/WebControls/TLabel.php +++ b/framework/Web/UI/WebControls/TLabel.php @@ -152,4 +152,3 @@ class TLabel extends TWebControl implements IDataRenderer } } -?> diff --git a/framework/Web/UI/WebControls/TLinkButton.php b/framework/Web/UI/WebControls/TLinkButton.php index d847f07e..459b98cf 100644 --- a/framework/Web/UI/WebControls/TLinkButton.php +++ b/framework/Web/UI/WebControls/TLinkButton.php @@ -332,4 +332,3 @@ class TLinkButton extends TWebControl implements IPostBackEventHandler, IButtonC } } -?> diff --git a/framework/Web/UI/WebControls/TListBox.php b/framework/Web/UI/WebControls/TListBox.php index 903dbed8..1b4599fc 100644 --- a/framework/Web/UI/WebControls/TListBox.php +++ b/framework/Web/UI/WebControls/TListBox.php @@ -39,6 +39,7 @@ Prado::using('System.Web.UI.WebControls.TListControl'); class TListBox extends TListControl implements IPostBackDataHandler, IValidatable { private $_dataChanged=false; + private $_isValid=true; /** * Adds attribute name-value pairs to renderer. @@ -220,6 +221,23 @@ class TListBox extends TListControl implements IPostBackDataHandler, IValidatabl { return $this->getSelectedValue(); } + + /** + * Returns true if this control validated successfully. + * Defaults to true. + * @return bool wether this control validated successfully. + */ + public function getIsValid() + { + return $this->_isValid; + } + /** + * @param bool wether this control is valid. + */ + public function setIsValid($value) + { + $this->_isValid=TPropertyValue::ensureBoolean($value); + } } @@ -242,4 +260,3 @@ class TListSelectionMode extends TEnumerable const Multiple='Multiple'; } -?> diff --git a/framework/Web/UI/WebControls/TListControlValidator.php b/framework/Web/UI/WebControls/TListControlValidator.php index f468a30e..f547884f 100644 --- a/framework/Web/UI/WebControls/TListControlValidator.php +++ b/framework/Web/UI/WebControls/TListControlValidator.php @@ -223,4 +223,3 @@ class TListControlValidator extends TBaseValidator return $options; } } -?> diff --git a/framework/Web/UI/WebControls/TListItem.php b/framework/Web/UI/WebControls/TListItem.php index 2017b64e..eb72d183 100644 --- a/framework/Web/UI/WebControls/TListItem.php +++ b/framework/Web/UI/WebControls/TListItem.php @@ -182,4 +182,3 @@ class TListItem extends TComponent } } -?> diff --git a/framework/Web/UI/WebControls/TLiteral.php b/framework/Web/UI/WebControls/TLiteral.php index 0c93043a..3a7f4581 100644 --- a/framework/Web/UI/WebControls/TLiteral.php +++ b/framework/Web/UI/WebControls/TLiteral.php @@ -110,4 +110,3 @@ class TLiteral extends TControl implements IDataRenderer } } -?> diff --git a/framework/Web/UI/WebControls/TLiteralColumn.php b/framework/Web/UI/WebControls/TLiteralColumn.php index cb97adb5..8ca87023 100644 --- a/framework/Web/UI/WebControls/TLiteralColumn.php +++ b/framework/Web/UI/WebControls/TLiteralColumn.php @@ -152,4 +152,3 @@ class TLiteralColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TMarkdown.php b/framework/Web/UI/WebControls/TMarkdown.php index dc6bc5e2..d630cd29 100644 --- a/framework/Web/UI/WebControls/TMarkdown.php +++ b/framework/Web/UI/WebControls/TMarkdown.php @@ -73,4 +73,3 @@ class TMarkdown extends TTextHighlighter } } -?> diff --git a/framework/Web/UI/WebControls/TMultiView.php b/framework/Web/UI/WebControls/TMultiView.php index 6adaed5b..1f87b03f 100644 --- a/framework/Web/UI/WebControls/TMultiView.php +++ b/framework/Web/UI/WebControls/TMultiView.php @@ -376,4 +376,3 @@ class TView extends TControl } } -?> diff --git a/framework/Web/UI/WebControls/TOutputCache.php b/framework/Web/UI/WebControls/TOutputCache.php index dd38ae03..c0747a11 100644 --- a/framework/Web/UI/WebControls/TOutputCache.php +++ b/framework/Web/UI/WebControls/TOutputCache.php @@ -582,4 +582,3 @@ class TOutputCacheCalculateKeyEventParameter extends TEventParameter } } -?> diff --git a/framework/Web/UI/WebControls/TPager.php b/framework/Web/UI/WebControls/TPager.php index d1a5db25..51ea2a11 100644 --- a/framework/Web/UI/WebControls/TPager.php +++ b/framework/Web/UI/WebControls/TPager.php @@ -790,4 +790,3 @@ class TPagerButtonType extends TEnumerable const ImageButton='ImageButton'; } -?> diff --git a/framework/Web/UI/WebControls/TPanel.php b/framework/Web/UI/WebControls/TPanel.php index 661795d7..5bbcdcca 100644 --- a/framework/Web/UI/WebControls/TPanel.php +++ b/framework/Web/UI/WebControls/TPanel.php @@ -234,4 +234,3 @@ class TPanel extends TWebControl } } -?> diff --git a/framework/Web/UI/WebControls/TPanelStyle.php b/framework/Web/UI/WebControls/TPanelStyle.php index 08667860..2d6ee824 100644 --- a/framework/Web/UI/WebControls/TPanelStyle.php +++ b/framework/Web/UI/WebControls/TPanelStyle.php @@ -276,4 +276,3 @@ class TScrollBars extends TEnumerable const Vertical='Vertical'; } -?> diff --git a/framework/Web/UI/WebControls/TPlaceHolder.php b/framework/Web/UI/WebControls/TPlaceHolder.php index ae878e2b..cdfd3873 100644 --- a/framework/Web/UI/WebControls/TPlaceHolder.php +++ b/framework/Web/UI/WebControls/TPlaceHolder.php @@ -26,4 +26,3 @@ class TPlaceHolder extends TControl { } -?> diff --git a/framework/Web/UI/WebControls/TRadioButton.php b/framework/Web/UI/WebControls/TRadioButton.php index 20973732..fdaf53a8 100644 --- a/framework/Web/UI/WebControls/TRadioButton.php +++ b/framework/Web/UI/WebControls/TRadioButton.php @@ -318,4 +318,3 @@ class TRadioButton extends TCheckBox } } -?> diff --git a/framework/Web/UI/WebControls/TRadioButtonList.php b/framework/Web/UI/WebControls/TRadioButtonList.php index b225834a..a8c53dee 100644 --- a/framework/Web/UI/WebControls/TRadioButtonList.php +++ b/framework/Web/UI/WebControls/TRadioButtonList.php @@ -99,4 +99,3 @@ class TRadioButtonList extends TCheckBoxList } } -?> diff --git a/framework/Web/UI/WebControls/TRangeValidator.php b/framework/Web/UI/WebControls/TRangeValidator.php index 0f92fb45..d741118f 100644 --- a/framework/Web/UI/WebControls/TRangeValidator.php +++ b/framework/Web/UI/WebControls/TRangeValidator.php @@ -358,4 +358,3 @@ class TRangeValidationDataType extends TValidationDataType { const StringLength='StringLength'; } -?> diff --git a/framework/Web/UI/WebControls/TRatingList.php b/framework/Web/UI/WebControls/TRatingList.php index 22cc0844..aba44fb0 100644 --- a/framework/Web/UI/WebControls/TRatingList.php +++ b/framework/Web/UI/WebControls/TRatingList.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.WebControls @@ -21,191 +21,320 @@ Prado::using('System.Web.UI.WebControls.TRadioButtonList'); * This class is EXPERIMENTAL. * * @author Wei Zhuo + * @author Bradley Booms * @version $Id$ * @package System.Web.UI.WebControls * @since 3.0 */ class TRatingList extends TRadioButtonList { + /** + * Script path relative to the TClientScriptManager::SCRIPT_PATH + */ const SCRIPT_PATH='prado/ratings'; + /** + * @var array list of published rating images. + */ private $_ratingImages = array(); + /** + * Sets the default repeat direction to horizontal. + */ public function __construct() { parent::__construct(); - $this->getRepeatInfo()->setRepeatDirection('Horizontal'); + $this->setRepeatDirection(TRepeatDirection::Horizontal); } + /** + * @return boolean whether the items in the column can be edited. Defaults to false. + */ + public function getReadOnly() + { + return $this->getViewState('ReadOnly',false); + } + + /** + * @param boolean whether the items in the column can be edited + */ + public function setReadOnly($value) + { + $this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false); + } + + /** + * Wrapper for {@link setReadOnly ReadOnly} property. + * @return boolean whether the rating list can be edited. Defaults to true. + */ public function getAllowInput() { - return $this->getViewState('AllowInput', true); + return !$this->getReadOnly(); } + /** + * Wrapper for {@link setReadOnly ReadOnly} property. + * @param boolean whether the rating list can be edited + */ public function setAllowInput($value) { - $this->setViewState('AllowInput', TPropertyValue::ensureBoolean($value), true); + $this->setReadOnly(!TPropertyValue::ensureBoolean($value)); } - public function getRating() + /** + * Wrapper for {@link setReadOnly ReadOnly} property. + * @param boolean whether the rating list can be edited + */ + public function setEnabled($value) { - if($this->getAllowInput()) - return $this->getSelectedIndex(); - else - return $this->getViewState('Rating',0); + $this->setReadOnly(!TPropertyValue::ensureBoolean($value)); } - public function setRating($value) + /** + * The repeat layout must be Table. + * @param string repeat layout type + * @throws TInvaliddataValueException when repeat layout is not Table. + */ + public function setRepeatLayout($value) { - if($this->getAllowInput()) - $this->setSelectedIndex($value); + if($value!==TRepeatLayout::Table) + throw new TInvalidDataValueException('ratinglist_table_layout_only'); else - $this->setViewState('Rating', TPropertyValue::ensureFloat($value),0); + parent::setRepeatLayout($value); } /** - * @param string set the rating style + * @return float rating value. */ - public function setRatingStyle($value) + public function getRating() { - $this->setViewState('RatingStyle', $value, 'default'); + $rating = $this->getViewState('Rating', null); + if ($rating === null) + return $this->getSelectedIndex()+1; + else + return $rating; } /** - * @return TRatingListStyle current rating style + * @param float rating value, also sets the selected Index */ - public function getRatingStyle() + public function setRating($value) { - return $this->getViewState('RatingStyle', 'default'); + $value = TPropertyValue::ensureFloat($value); + $this->setViewState('Rating', $value, null); + $index = $this->getRatingIndex($value); + parent::setSelectedIndex($index); + } + + public function setSelectedIndex($value) + { + $this->setRating($value+1); + parent::setSelectedIndex($value); } /** - * @return string caption text. Default is "Rate It:". + * @param float rating value + * @return int rating as integer */ - public function getCaption() + protected function getRatingIndex($rating) { - return $this->getViewState('Caption', 'Rate It:'); + $interval = $this->getHalfRatingInterval(); + $base = intval($rating)-1; + $remainder = $rating-$base-1; + return $remainder > $interval[1] ? $base+1 : $base; } /** - * @param string caption text + * @param int change the rating selection index */ - public function setCaption($value) + public function onSelectedIndexChanged($param) { - $this->setViewState('Caption', $value, 'Rate It:'); + $value = $this->getRating(); + $value = TPropertyValue::ensureInteger($value); + $this->setRating($value); + parent::onSelectedIndexChanged($param); } + /** + * @return string control or html element ID for displaying a caption. + */ + public function getCaptionID() + { + return $this->getViewState('CaptionID', ''); + } - public function setHalfRatingLimit($value) + /** + * @param string control or html element ID for displaying a caption. + */ + public function setCaptionID($value) { - $this->setViewState('HalfRating', - TPropertyValue::ensureArray($value), array(0.3, 0.7)); + $this->setViewState('CaptionID', $value, ''); } - public function getHalfRatingLimit() + protected function getCaptionControl() { - return $this->getViewState('HalfRating', array(0.3, 0.7)); + if(($id=$this->getCaptionID())!=='') + { + if($control=$this->getParent()->findControl($id)) + return $control; + } + throw new TInvalidDataValueException( + 'ratinglist_invalid_caption_id',$id,$this->getID()); } /** - * @param string asset file in the self::SCRIPT_PATH directory. - * @return string asset file url. + * @return string caption text. Default is "Rate It:". */ - protected function getAssetUrl($file='') + public function getCaption() { - $base = $this->getPage()->getClientScript()->getPradoScriptAssetUrl(); - return $base.'/'.self::SCRIPT_PATH.'/'.$file; + return $this->getCaptionControl()->getText(); } - public function getRatingClientOptions() - { - $options['cssClass'] = 'TRatingList_'.$this->getRatingStyle(); - $options['ID'] = $this->getClientID(); - $options['caption'] = $this->getCaption(); - $options['field'] = $this->getUniqueID(); - $options['selectedIndex'] = $this->getSelectedIndex(); + /** + * @return TRatingListStyle current rating style + */ + public function setCaption($value) + { + $this->getCaptionControl()->setText($value); + } + + /** + * @param string set the rating style, default is "default" + */ + public function setRatingStyle($value) + { + $this->setViewState('RatingStyle', $value, 'default'); + } + + /** + * @return TRatingListStyle current rating style + */ + public function getRatingStyle() + { + return $this->getViewState('RatingStyle', 'default'); + } + + /** + * @return string rating style css class name. + */ + protected function getRatingStyleCssClass() + { + return 'TRatingList_'.$this->getRatingStyle(); + } + + /** + * Sets the interval such that those rating values within the interval + * will be considered as a half star rating. + * @param array rating display half value interval, default is array(0.3, 0.7); + */ + public function setHalfRatingInterval($value) + { + $this->setViewState('HalfRating', + TPropertyValue::ensureArray($value), array(0.3, 0.7)); + } + + /** + * @return array rating display half value interval, default is array(0.3, 0.7); + */ + public function getHalfRatingInterval() + { + return $this->getViewState('HalfRating', array(0.3, 0.7)); + } + + /** + * @return array list of post back options. + */ + protected function getPostBackOptions() + { + $options = parent::getPostBackOptions(); + $options['AutoPostBack'] = $this->getAutoPostBack(); + $options['ReadOnly'] = $this->getReadOnly(); + $options['Style'] = $this->getRatingStyleCssClass(); + $options['CaptionID'] = $this->getCaptionControlID(); + $options['SelectedIndex'] = $this->getSelectedIndex(); + $options['Rating'] = $this->getRating(); + $options['HalfRating'] = $this->getHalfRatingInterval(); return $options; - } + } - protected function publishRatingListStyle($style) - { + /** + * @return string find the client ID of the caption control. + */ + protected function getCaptionControlID() + { + if(($id=$this->getCaptionID())!=='') + { + if($control=$this->getParent()->findControl($id)) + { + if($control->getVisible(true)) + return $control->getClientID(); + } + else + return $id; + } + return ''; + } + + /** + * Publish the the rating style css file and rating image files. + */ + public function onPreRender($param) + { + parent::onPreRender($param); + $this->publishStyle($this->getRatingStyle()); + $this->_ratingImages = $this->publishImages($this->getRatingStyle()); + } + + /** + * @param string rating style name + * @return string URL of the css style file + */ + protected function publishStyle($style) + { $cs = $this->getPage()->getClientScript(); $url = $this->getAssetUrl($style.'.css'); if(!$cs->isStyleSheetFileRegistered($url)) $cs->registerStyleSheetFile($url, $url); return $url; - } + } - protected function publishRatingListImages($style, $fileExt='.gif') - { - $images = array('blank', 'hover', 'selected', 'half'); + /** + * @param string rating style name + * @param string rating image file extension, default is '.gif' + * @return array URL of publish the rating images + */ + protected function publishImages($style, $fileExt='.gif') + { + $types = array('blank', 'selected', 'half', 'combined'); $files = array(); - foreach($images as $type) + foreach($types as $type) $files[$type] = $this->getAssetUrl("{$style}_{$type}{$fileExt}"); return $files; - } + } /** - * @param THtmlWriter writer + * @param string asset file in the self::SCRIPT_PATH directory. + * @return string asset file url. */ - public function onPreRender($param) - { - parent::onPreRender($param); - - $this->publishRatingListStyle($this->getRatingStyle()); - $this->_ratingImages = $this->publishRatingListImages($this->getRatingStyle()); - - if($this->getAllowInput()) - $this->registerRatingListClientScript(); - else - { - $this->getRepeatInfo()->setCaption($this->getCaption()); - $this->setAttribute('title', $this->getRating()); - } - } - - protected function registerRatingListClientScript() - { - $id = $this->getClientID(); - $scripts = $this->getPage()->getClientScript(); - $scripts->registerPradoScript('prado'); - $options = TJavaScript::encode($this->getRatingClientOptions()); - $code = "new Prado.WebUI.TRatingList($options);"; - $scripts->registerEndScript("prado:$id", $code); - } - - public function renderItem($writer,$repeatInfo,$itemType,$index) - { - if($this->getAllowInput()) - parent::renderItem($writer, $repeatInfo, $itemType, $index); - else - $this->renderRatingListItem($writer, $repeatInfo, $itemType, $index); - } - - protected function renderRatingListItem($writer, $repeatInfo, $itemType, $index) - { - $image = new TImage; - $image->setImageUrl($this->_ratingImages[$this->getRatingImageType($index)]); - $image->setAlternateText($this->getRating()); - $image->render($writer); - } - - protected function getRatingImageType($index) - { - $rating = floatval($this->getRating()); - $int = intval($rating); - $limit = $this->getHalfRatingLimit(); - if($index < $int || ($rating < $index + 1 && $rating > $index +$limit[1])) - return 'selected'; - if($rating >= $index+$limit[0] && $rating <= $index+$limit[1]) - return 'half'; - return 'blank'; - } + protected function getAssetUrl($file='') + { + $base = $this->getPage()->getClientScript()->getPradoScriptAssetUrl(); + return $base.'/'.self::SCRIPT_PATH.'/'.$file; + } - public function generateItemStyle($itemType,$index) - { - return new TStyle; - } + /** + * Add rating style class name to the class attribute + * when {@link setReadOnly ReadOnly} property is true and when the + * {@link setCssClass CssClass} property is empty. + * @param THtmlWriter renderer + */ + public function render($writer) + { + $writer->addAttribute('id',$this->getClientID()); + $this->getPage()->getClientScript()->registerPostBackControl( + $this->getClientClassName(), $this->getPostBackOptions()); + parent::render($writer); + } /** * Gets the name of the javascript class responsible for performing postback for this control. @@ -218,4 +347,3 @@ class TRatingList extends TRadioButtonList } } -?> diff --git a/framework/Web/UI/WebControls/TRegularExpressionValidator.php b/framework/Web/UI/WebControls/TRegularExpressionValidator.php index f0c645a4..be861e45 100644 --- a/framework/Web/UI/WebControls/TRegularExpressionValidator.php +++ b/framework/Web/UI/WebControls/TRegularExpressionValidator.php @@ -96,7 +96,7 @@ class TRegularExpressionValidator extends TBaseValidator } /** - * @param string pattern modifiers, + * @param string pattern modifiers for server side validation, * see http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php */ public function setPatternModifiers($value) @@ -112,6 +112,23 @@ class TRegularExpressionValidator extends TBaseValidator return $this->getViewState('PatternModifiers', ''); } + /** + * @param string pattern modifiers for clientside. + * (Only 'g','i' and 'm' are available.) + */ + public function setClientSidePatternModifiers($value) + { + $this->setViewState('ClientSidePatternModifiers', $value); + } + + /** + * @return string clientside pattern modifiers, no modifiers by default. + */ + public function getClientSidePatternModifiers() + { + return $this->getViewState('ClientSidePatternModifiers', ''); + } + /** * Returns an array of javascript validator options. * @return array javascript validator options. @@ -120,8 +137,8 @@ class TRegularExpressionValidator extends TBaseValidator { $options = parent::getClientScriptOptions(); $options['ValidationExpression']=$this->getRegularExpression(); + $options['PatternModifiers']=$this->getClientSidePatternModifiers(); return $options; } } -?> diff --git a/framework/Web/UI/WebControls/TRepeatInfo.php b/framework/Web/UI/WebControls/TRepeatInfo.php index ecf0ebf7..30c85f14 100644 --- a/framework/Web/UI/WebControls/TRepeatInfo.php +++ b/framework/Web/UI/WebControls/TRepeatInfo.php @@ -558,4 +558,3 @@ class TRepeatLayout extends TEnumerable const Raw='Raw'; } -?> diff --git a/framework/Web/UI/WebControls/TRepeater.php b/framework/Web/UI/WebControls/TRepeater.php index 6b9c08c1..a6c9903d 100644 --- a/framework/Web/UI/WebControls/TRepeater.php +++ b/framework/Web/UI/WebControls/TRepeater.php @@ -1023,4 +1023,3 @@ class TRepeaterItemCollection extends TList } } -?> diff --git a/framework/Web/UI/WebControls/TRepeaterItemRenderer.php b/framework/Web/UI/WebControls/TRepeaterItemRenderer.php index d99da302..79ff9087 100644 --- a/framework/Web/UI/WebControls/TRepeaterItemRenderer.php +++ b/framework/Web/UI/WebControls/TRepeaterItemRenderer.php @@ -48,4 +48,3 @@ class TRepeaterItemRenderer extends TItemDataRenderer } } -?> diff --git a/framework/Web/UI/WebControls/TRequiredFieldValidator.php b/framework/Web/UI/WebControls/TRequiredFieldValidator.php index 8d0eaec2..e6ddd6d3 100644 --- a/framework/Web/UI/WebControls/TRequiredFieldValidator.php +++ b/framework/Web/UI/WebControls/TRequiredFieldValidator.php @@ -136,4 +136,3 @@ class TRequiredFieldValidator extends TBaseValidator } } -?> diff --git a/framework/Web/UI/WebControls/TSafeHtml.php b/framework/Web/UI/WebControls/TSafeHtml.php index 0f4de2cb..d6829f8b 100644 --- a/framework/Web/UI/WebControls/TSafeHtml.php +++ b/framework/Web/UI/WebControls/TSafeHtml.php @@ -62,4 +62,3 @@ class TSafeHtml extends TControl } } -?> diff --git a/framework/Web/UI/WebControls/TSlider.php b/framework/Web/UI/WebControls/TSlider.php index 3fd8e244..ee725e99 100644 --- a/framework/Web/UI/WebControls/TSlider.php +++ b/framework/Web/UI/WebControls/TSlider.php @@ -4,7 +4,7 @@ * * @author Christophe Boulain * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.WebControls @@ -218,7 +218,7 @@ class TSlider extends TWebControl implements IPostBackDataHandler, IDataRenderer public function setValues($value) { $this->setViewState('Values', TPropertyValue::ensureArray($value), array()); - } + } /** * @return boolean a value indicating whether an automatic postback to the server @@ -488,7 +488,7 @@ class TSlider extends TWebControl implements IPostBackDataHandler, IDataRenderer // Add max if it's not in the array because of step if (!in_array($maxValue, $values)) $values[]=$maxValue; } - $options['values'] = TJavascript::Encode($values,false); + $options['values'] = TJavaScript::Encode($values,false); if($this->_clientScript!==null) $options = array_merge($options,$this->_clientScript->getOptions()->toArray()); return $options; @@ -572,4 +572,3 @@ class TSliderDirection extends TEnumerable } -?> diff --git a/framework/Web/UI/WebControls/TStatements.php b/framework/Web/UI/WebControls/TStatements.php index 09c03cb9..d07e68a1 100644 --- a/framework/Web/UI/WebControls/TStatements.php +++ b/framework/Web/UI/WebControls/TStatements.php @@ -61,4 +61,3 @@ class TStatements extends TControl } } -?> diff --git a/framework/Web/UI/WebControls/TStyle.php b/framework/Web/UI/WebControls/TStyle.php index c81a6db9..7cb1d8c8 100644 --- a/framework/Web/UI/WebControls/TStyle.php +++ b/framework/Web/UI/WebControls/TStyle.php @@ -891,4 +891,3 @@ class TTableGridLines extends TEnumerable const Both='Both'; } -?> diff --git a/framework/Web/UI/WebControls/TTable.php b/framework/Web/UI/WebControls/TTable.php index 9fa9130d..57efa7f7 100644 --- a/framework/Web/UI/WebControls/TTable.php +++ b/framework/Web/UI/WebControls/TTable.php @@ -408,4 +408,3 @@ class TTableCaptionAlign extends TEnumerable const Right='Right'; } -?> diff --git a/framework/Web/UI/WebControls/TTableCell.php b/framework/Web/UI/WebControls/TTableCell.php index 10d4f457..8bc83c52 100644 --- a/framework/Web/UI/WebControls/TTableCell.php +++ b/framework/Web/UI/WebControls/TTableCell.php @@ -220,4 +220,3 @@ class TTableCell extends TWebControl implements IDataRenderer } } -?> diff --git a/framework/Web/UI/WebControls/TTableFooterRow.php b/framework/Web/UI/WebControls/TTableFooterRow.php index f3c35dc3..dd0de143 100644 --- a/framework/Web/UI/WebControls/TTableFooterRow.php +++ b/framework/Web/UI/WebControls/TTableFooterRow.php @@ -45,4 +45,3 @@ class TTableFooterRow extends TTableRow } } -?> diff --git a/framework/Web/UI/WebControls/TTableHeaderCell.php b/framework/Web/UI/WebControls/TTableHeaderCell.php index a1a8919a..1e18cee3 100644 --- a/framework/Web/UI/WebControls/TTableHeaderCell.php +++ b/framework/Web/UI/WebControls/TTableHeaderCell.php @@ -122,4 +122,3 @@ class TTableHeaderScope extends TEnumerable const Column='Column'; } -?> diff --git a/framework/Web/UI/WebControls/TTableHeaderRow.php b/framework/Web/UI/WebControls/TTableHeaderRow.php index fa7e4515..7b8488bd 100644 --- a/framework/Web/UI/WebControls/TTableHeaderRow.php +++ b/framework/Web/UI/WebControls/TTableHeaderRow.php @@ -45,4 +45,3 @@ class TTableHeaderRow extends TTableRow } } -?> diff --git a/framework/Web/UI/WebControls/TTableRow.php b/framework/Web/UI/WebControls/TTableRow.php index be93529e..c70f28dd 100644 --- a/framework/Web/UI/WebControls/TTableRow.php +++ b/framework/Web/UI/WebControls/TTableRow.php @@ -206,4 +206,3 @@ class TTableRowSection extends TEnumerable const Footer='Footer'; } -?> diff --git a/framework/Web/UI/WebControls/TTemplateColumn.php b/framework/Web/UI/WebControls/TTemplateColumn.php index de4bc2ef..21190f23 100644 --- a/framework/Web/UI/WebControls/TTemplateColumn.php +++ b/framework/Web/UI/WebControls/TTemplateColumn.php @@ -254,4 +254,3 @@ class TTemplateColumn extends TDataGridColumn } } -?> diff --git a/framework/Web/UI/WebControls/TTextBox.php b/framework/Web/UI/WebControls/TTextBox.php index 3c3e6d0e..4e6a66e9 100644 --- a/framework/Web/UI/WebControls/TTextBox.php +++ b/framework/Web/UI/WebControls/TTextBox.php @@ -67,6 +67,7 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable */ private $_safeText; private $_dataChanged=false; + private $_isValid=true; /** * @return string tag name of the textbox @@ -243,6 +244,23 @@ class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable return $this->getText(); } + /** + * Returns true if this control validated successfully. + * Defaults to true. + * @return bool wether this control validated successfully. + */ + public function getIsValid() + { + return $this->_isValid; + } + /** + * @param bool wether this control is valid. + */ + public function setIsValid($value) + { + $this->_isValid=TPropertyValue::ensureBoolean($value); + } + /** * Raises OnTextChanged event. * This method is invoked when the value of the {@link getText Text} @@ -618,4 +636,3 @@ class TTextBoxAutoCompleteType extends TEnumerable const Search='Search'; } -?> diff --git a/framework/Web/UI/WebControls/TTextHighlighter.php b/framework/Web/UI/WebControls/TTextHighlighter.php index 0356c4e7..890deb05 100644 --- a/framework/Web/UI/WebControls/TTextHighlighter.php +++ b/framework/Web/UI/WebControls/TTextHighlighter.php @@ -198,4 +198,3 @@ class TTextHighlighterLineNumberStyle extends TEnumerable const Li='Li'; const Table='Table'; } -?> diff --git a/framework/Web/UI/WebControls/TTextProcessor.php b/framework/Web/UI/WebControls/TTextProcessor.php index ccb78196..26dab754 100644 --- a/framework/Web/UI/WebControls/TTextProcessor.php +++ b/framework/Web/UI/WebControls/TTextProcessor.php @@ -84,4 +84,3 @@ abstract class TTextProcessor extends TWebControl } } -?> diff --git a/framework/Web/UI/WebControls/TValidationSummary.php b/framework/Web/UI/WebControls/TValidationSummary.php index 4e0e0e50..95679e15 100644 --- a/framework/Web/UI/WebControls/TValidationSummary.php +++ b/framework/Web/UI/WebControls/TValidationSummary.php @@ -504,4 +504,3 @@ class TValidationSummaryDisplayStyle extends TEnumerable const Fixed='Fixed'; } -?> diff --git a/framework/Web/UI/WebControls/TWebControl.php b/framework/Web/UI/WebControls/TWebControl.php index 829a9d03..2e1899ad 100644 --- a/framework/Web/UI/WebControls/TWebControl.php +++ b/framework/Web/UI/WebControls/TWebControl.php @@ -432,4 +432,3 @@ class TWebControl extends TControl implements IStyleable } } -?> diff --git a/framework/Web/UI/WebControls/TWebControlAdapter.php b/framework/Web/UI/WebControls/TWebControlAdapter.php index 35e157af..a99afe7f 100644 --- a/framework/Web/UI/WebControls/TWebControlAdapter.php +++ b/framework/Web/UI/WebControls/TWebControlAdapter.php @@ -69,4 +69,3 @@ class TWebControlAdapter extends TControlAdapter } } -?> diff --git a/framework/Web/UI/WebControls/TWizard.php b/framework/Web/UI/WebControls/TWizard.php index 1f9e886b..774096f7 100644 --- a/framework/Web/UI/WebControls/TWizard.php +++ b/framework/Web/UI/WebControls/TWizard.php @@ -2153,4 +2153,3 @@ class TWizardStepType extends TEnumerable const Finish='Finish'; } -?> diff --git a/framework/Web/UI/WebControls/TWizardNavigationButtonStyle.php b/framework/Web/UI/WebControls/TWizardNavigationButtonStyle.php index 6eebce74..54d585c4 100644 --- a/framework/Web/UI/WebControls/TWizardNavigationButtonStyle.php +++ b/framework/Web/UI/WebControls/TWizardNavigationButtonStyle.php @@ -153,4 +153,3 @@ class TWizardNavigationButtonStyle extends TStyle } } -?> diff --git a/framework/Web/UI/WebControls/TXmlTransform.php b/framework/Web/UI/WebControls/TXmlTransform.php index ab49ae61..991aed39 100644 --- a/framework/Web/UI/WebControls/TXmlTransform.php +++ b/framework/Web/UI/WebControls/TXmlTransform.php @@ -191,4 +191,3 @@ class TXmlTransform extends TControl { } } -?> diff --git a/framework/Web/UI/WebControls/assets/captcha.php b/framework/Web/UI/WebControls/assets/captcha.php index bff2f61a..8c9ff0a3 100644 --- a/framework/Web/UI/WebControls/assets/captcha.php +++ b/framework/Web/UI/WebControls/assets/captcha.php @@ -221,4 +221,3 @@ function morphImage($image,$width,$height) } } -?> -- cgit v1.2.3