From 1fb46fbf9f6c5e1454e0873939e1acc4887bd795 Mon Sep 17 00:00:00 2001 From: Jens Klaer Date: Fri, 30 Oct 2015 10:25:32 +0100 Subject: allow (anonymous) functions for TJuiControlOptions, changed TJuiDatepicker widget events to options --- framework/Web/UI/JuiControls/TJuiControlAdapter.php | 2 ++ framework/Web/UI/JuiControls/TJuiDatePicker.php | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'framework/Web/UI') diff --git a/framework/Web/UI/JuiControls/TJuiControlAdapter.php b/framework/Web/UI/JuiControls/TJuiControlAdapter.php index 638f60f1..6c326739 100644 --- a/framework/Web/UI/JuiControls/TJuiControlAdapter.php +++ b/framework/Web/UI/JuiControls/TJuiControlAdapter.php @@ -194,6 +194,8 @@ class TJuiControlOptions } elseif(is_numeric($value)) { // trick to get float or integer automatically when needed $this->_options[$option] = $value + 0; + } elseif(substr($low,0,8)=='function') { + $this->_options[$option] = new TJavaScriptLiteral($value); } else { $this->_options[$option] = $value; } diff --git a/framework/Web/UI/JuiControls/TJuiDatePicker.php b/framework/Web/UI/JuiControls/TJuiDatePicker.php index d894e07d..1f6e7619 100644 --- a/framework/Web/UI/JuiControls/TJuiDatePicker.php +++ b/framework/Web/UI/JuiControls/TJuiDatePicker.php @@ -93,7 +93,8 @@ class TJuiDatePicker extends TActiveTextBox implements INamingContainer, IJuiOpt 'dayNamesShort', 'defaultDate', 'duration', 'firstDay', 'gotoCurrent', 'hideIfNoPrevNext', 'isRTL', 'maxDate', 'minDate', 'monthNames', 'monthNamesShort', 'navigationAsDateFormat', 'nextText', 'numberOfMonths', 'prevText', 'selectOtherMonths', 'shortYearCutoff', 'showAnim', 'showButtonPanel', 'showCurrentAtPos', 'showMonthAfterYear', - 'showOn', 'showOptions', 'showOtherMonths', 'showWeek', 'stepMonths', 'weekHeader', 'yearRange', 'yearSuffix'); + 'showOn', 'showOptions', 'showOtherMonths', 'showWeek', 'stepMonths', 'weekHeader', 'yearRange', 'yearSuffix', + 'beforeShow', 'beforeShowDay', 'onChangeMonthYear', 'onClose', 'onSelect'); } /** @@ -102,7 +103,7 @@ class TJuiDatePicker extends TActiveTextBox implements INamingContainer, IJuiOpt */ public function getValidEvents() { - return array('beforeShow', 'beforeShowDay', 'onChangeMonthYear', 'onClose', 'onSelect'); + return array(); } /** -- cgit v1.2.3 From 11666237dbdc0eb9e01d5d739994bdd88a551168 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sat, 7 Nov 2015 15:06:50 +0100 Subject: Prepare for release: update (c) year to 2015, version to 3.3 --- HISTORY | 42 ++++++ README.md | 2 +- UPGRADE | 8 +- bin/prado-cli.php | 2 +- build.xml | 2 +- buildscripts/apigen/pradosoft/@layout.latte | 2 +- buildscripts/texbuilder/quickstart/quickstart.tex | 6 +- composer.json | 2 +- framework/Caching/TAPCCache.php | 2 +- framework/Caching/TCache.php | 2 +- framework/Caching/TDbCache.php | 2 +- framework/Caching/TEACache.php | 2 +- framework/Caching/TMemCache.php | 2 +- framework/Caching/TSqliteCache.php | 2 +- framework/Caching/TXCache.php | 2 +- framework/Collections/TAttributeCollection.php | 2 +- framework/Collections/TDummyDataSource.php | 2 +- framework/Collections/TList.php | 2 +- framework/Collections/TListItemCollection.php | 2 +- framework/Collections/TMap.php | 2 +- framework/Collections/TPagedDataSource.php | 2 +- framework/Collections/TPagedList.php | 2 +- framework/Collections/TPriorityList.php | 2 +- framework/Collections/TPriorityMap.php | 2 +- framework/Collections/TQueue.php | 2 +- framework/Collections/TStack.php | 2 +- .../Exceptions/TActiveRecordException.php | 2 +- .../Relations/TActiveRecordBelongsTo.php | 2 +- .../Relations/TActiveRecordHasMany.php | 2 +- .../Relations/TActiveRecordHasManyAssociation.php | 2 +- .../ActiveRecord/Relations/TActiveRecordHasOne.php | 2 +- .../Relations/TActiveRecordRelation.php | 2 +- .../Relations/TActiveRecordRelationContext.php | 2 +- .../Scaffold/InputBuilder/TIbmScaffoldInput.php | 2 +- .../Scaffold/InputBuilder/TMssqlScaffoldInput.php | 2 +- .../Scaffold/InputBuilder/TMysqlScaffoldInput.php | 2 +- .../Scaffold/InputBuilder/TPgsqlScaffoldInput.php | 2 +- .../Scaffold/InputBuilder/TScaffoldInputBase.php | 2 +- .../Scaffold/InputBuilder/TScaffoldInputCommon.php | 2 +- .../Scaffold/InputBuilder/TSqliteScaffoldInput.php | 2 +- .../Data/ActiveRecord/Scaffold/TScaffoldBase.php | 2 +- .../ActiveRecord/Scaffold/TScaffoldEditView.php | 2 +- .../ActiveRecord/Scaffold/TScaffoldListView.php | 2 +- .../Data/ActiveRecord/Scaffold/TScaffoldSearch.php | 2 +- .../Data/ActiveRecord/Scaffold/TScaffoldView.php | 2 +- framework/Data/ActiveRecord/TActiveRecord.php | 2 +- .../Data/ActiveRecord/TActiveRecordConfig.php | 2 +- .../Data/ActiveRecord/TActiveRecordCriteria.php | 2 +- .../Data/ActiveRecord/TActiveRecordGateway.php | 2 +- .../Data/ActiveRecord/TActiveRecordManager.php | 2 +- .../Data/Common/Mssql/TMssqlCommandBuilder.php | 2 +- framework/Data/Common/Mssql/TMssqlMetaData.php | 2 +- framework/Data/Common/Mssql/TMssqlTableColumn.php | 2 +- framework/Data/Common/Mssql/TMssqlTableInfo.php | 2 +- .../Data/Common/Mysql/TMysqlCommandBuilder.php | 2 +- framework/Data/Common/Mysql/TMysqlMetaData.php | 2 +- framework/Data/Common/Mysql/TMysqlTableColumn.php | 2 +- framework/Data/Common/Mysql/TMysqlTableInfo.php | 2 +- .../Data/Common/Oracle/TOracleCommandBuilder.php | 2 +- framework/Data/Common/Oracle/TOracleMetaData.php | 2 +- .../Data/Common/Oracle/TOracleTableColumn.php | 2 +- framework/Data/Common/Oracle/TOracleTableInfo.php | 2 +- .../Data/Common/Pgsql/TPgsqlCommandBuilder.php | 2 +- framework/Data/Common/Pgsql/TPgsqlMetaData.php | 2 +- framework/Data/Common/Pgsql/TPgsqlTableColumn.php | 2 +- framework/Data/Common/Pgsql/TPgsqlTableInfo.php | 2 +- .../Data/Common/Sqlite/TSqliteCommandBuilder.php | 2 +- framework/Data/Common/Sqlite/TSqliteMetaData.php | 2 +- .../Data/Common/Sqlite/TSqliteTableColumn.php | 2 +- framework/Data/Common/Sqlite/TSqliteTableInfo.php | 2 +- framework/Data/Common/TDbCommandBuilder.php | 2 +- framework/Data/Common/TDbMetaData.php | 2 +- framework/Data/Common/TDbTableColumn.php | 2 +- framework/Data/Common/TDbTableInfo.php | 2 +- framework/Data/DataGateway/TDataGatewayCommand.php | 2 +- framework/Data/DataGateway/TSqlCriteria.php | 2 +- framework/Data/DataGateway/TTableGateway.php | 2 +- .../Data/SqlMap/Configuration/TDiscriminator.php | 2 +- .../Configuration/TInlineParameterMapParser.php | 2 +- .../Data/SqlMap/Configuration/TParameterMap.php | 2 +- .../SqlMap/Configuration/TParameterProperty.php | 2 +- framework/Data/SqlMap/Configuration/TResultMap.php | 2 +- .../Data/SqlMap/Configuration/TResultProperty.php | 2 +- .../SqlMap/Configuration/TSimpleDynamicParser.php | 2 +- .../SqlMap/Configuration/TSqlMapCacheModel.php | 2 +- .../Data/SqlMap/Configuration/TSqlMapStatement.php | 2 +- .../Configuration/TSqlMapXmlConfiguration.php | 2 +- .../DataMapper/TFastSqlMapApplicationCache.php | 2 +- framework/Data/SqlMap/DataMapper/TLazyLoadList.php | 2 +- .../Data/SqlMap/DataMapper/TPropertyAccess.php | 2 +- framework/Data/SqlMap/DataMapper/TSqlMapCache.php | 2 +- .../Data/SqlMap/DataMapper/TSqlMapPagedList.php | 2 +- .../DataMapper/TSqlMapTypeHandlerRegistry.php | 2 +- .../Data/SqlMap/Statements/TCachingStatement.php | 2 +- .../SqlMap/Statements/TDeleteMappedStatement.php | 2 +- .../SqlMap/Statements/TInsertMappedStatement.php | 2 +- .../Data/SqlMap/Statements/TMappedStatement.php | 2 +- .../Data/SqlMap/Statements/TPreparedCommand.php | 2 +- .../Data/SqlMap/Statements/TPreparedStatement.php | 2 +- .../Statements/TPreparedStatementFactory.php | 2 +- .../SqlMap/Statements/TSelectMappedStatement.php | 2 +- .../Data/SqlMap/Statements/TSimpleDynamicSql.php | 2 +- framework/Data/SqlMap/Statements/TStaticSql.php | 2 +- .../SqlMap/Statements/TUpdateMappedStatement.php | 2 +- framework/Data/SqlMap/TSqlMapConfig.php | 2 +- framework/Data/SqlMap/TSqlMapGateway.php | 2 +- framework/Data/SqlMap/TSqlMapManager.php | 2 +- framework/Data/TDataSourceConfig.php | 2 +- framework/Data/TDbCommand.php | 2 +- framework/Data/TDbConnection.php | 2 +- framework/Data/TDbDataReader.php | 2 +- framework/Data/TDbTransaction.php | 2 +- framework/Exceptions/TErrorHandler.php | 2 +- framework/Exceptions/TException.php | 2 +- framework/I18N/TChoiceFormat.php | 2 +- framework/I18N/TDateFormat.php | 2 +- framework/I18N/TGlobalization.php | 2 +- framework/I18N/TGlobalizationAutoDetect.php | 2 +- framework/I18N/TI18NControl.php | 2 +- framework/I18N/TNumberFormat.php | 2 +- framework/I18N/TTranslate.php | 2 +- framework/I18N/TTranslateParameter.php | 2 +- framework/I18N/Translation.php | 2 +- framework/IO/TTextWriter.php | 2 +- framework/PradoBase.php | 4 +- framework/Security/IUserManager.php | 2 +- framework/Security/TAuthManager.php | 2 +- framework/Security/TAuthorizationRule.php | 2 +- framework/Security/TDbUserManager.php | 2 +- framework/Security/TSecurityManager.php | 2 +- framework/Security/TUser.php | 2 +- framework/Security/TUserManager.php | 2 +- framework/TApplication.php | 2 +- framework/TApplicationComponent.php | 2 +- framework/TComponent.php | 2 +- framework/TModule.php | 2 +- framework/TService.php | 2 +- framework/TShellApplication.php | 2 +- framework/Util/TCallChain.php | 2 +- framework/Util/TDataFieldAccessor.php | 2 +- framework/Util/TDateTimeStamp.php | 2 +- framework/Util/TLogRouter.php | 2 +- framework/Util/TLogger.php | 2 +- framework/Util/TParameterModule.php | 2 +- framework/Util/TSimpleDateFormatter.php | 2 +- framework/Util/TVarDumper.php | 2 +- framework/Web/Javascripts/TJavaScript.php | 2 +- framework/Web/Javascripts/packages.php | 26 ++-- framework/Web/Javascripts/source/prado/prado.js | 2 +- framework/Web/Services/TFeedService.php | 2 +- framework/Web/Services/TJsonService.php | 2 +- framework/Web/Services/TPageService.php | 2 +- framework/Web/Services/TSoapService.php | 2 +- framework/Web/TAssetManager.php | 2 +- framework/Web/TCacheHttpSession.php | 2 +- framework/Web/THttpRequest.php | 2 +- framework/Web/THttpResponse.php | 2 +- framework/Web/THttpResponseAdapter.php | 2 +- framework/Web/THttpSession.php | 2 +- framework/Web/THttpUtility.php | 2 +- framework/Web/TUrlManager.php | 2 +- framework/Web/TUrlMapping.php | 2 +- framework/Web/UI/ActiveControls/TActiveButton.php | 2 +- .../Web/UI/ActiveControls/TActiveCheckBox.php | 2 +- .../Web/UI/ActiveControls/TActiveCheckBoxList.php | 2 +- .../Web/UI/ActiveControls/TActiveClientScript.php | 2 +- .../UI/ActiveControls/TActiveControlAdapter.php | 2 +- .../UI/ActiveControls/TActiveCustomValidator.php | 2 +- .../Web/UI/ActiveControls/TActiveDatePicker.php | 2 +- .../Web/UI/ActiveControls/TActiveDropDownList.php | 2 +- .../Web/UI/ActiveControls/TActiveHiddenField.php | 2 +- .../Web/UI/ActiveControls/TActiveHyperLink.php | 2 +- framework/Web/UI/ActiveControls/TActiveImage.php | 2 +- .../Web/UI/ActiveControls/TActiveImageButton.php | 2 +- framework/Web/UI/ActiveControls/TActiveLabel.php | 2 +- .../Web/UI/ActiveControls/TActiveLinkButton.php | 2 +- framework/Web/UI/ActiveControls/TActiveListBox.php | 2 +- .../ActiveControls/TActiveListControlAdapter.php | 2 +- .../Web/UI/ActiveControls/TActivePageAdapter.php | 2 +- framework/Web/UI/ActiveControls/TActivePager.php | 2 +- framework/Web/UI/ActiveControls/TActivePanel.php | 2 +- .../Web/UI/ActiveControls/TActiveRadioButton.php | 2 +- .../UI/ActiveControls/TActiveRadioButtonList.php | 2 +- .../Web/UI/ActiveControls/TActiveRatingList.php | 2 +- framework/Web/UI/ActiveControls/TActiveTextBox.php | 2 +- framework/Web/UI/ActiveControls/TAutoComplete.php | 2 +- .../Web/UI/ActiveControls/TBaseActiveControl.php | 2 +- framework/Web/UI/ActiveControls/TCallback.php | 2 +- .../UI/ActiveControls/TCallbackClientScript.php | 2 +- .../Web/UI/ActiveControls/TCallbackClientSide.php | 2 +- .../UI/ActiveControls/TCallbackEventParameter.php | 2 +- .../Web/UI/ActiveControls/TCallbackOptions.php | 2 +- .../UI/ActiveControls/TCallbackResponseAdapter.php | 2 +- .../UI/ActiveControls/TEventTriggeredCallback.php | 2 +- .../Web/UI/ActiveControls/TInPlaceTextBox.php | 2 +- .../UI/ActiveControls/TTimeTriggeredCallback.php | 2 +- .../Web/UI/ActiveControls/TTriggeredCallback.php | 2 +- .../UI/ActiveControls/TValueTriggeredCallback.php | 2 +- framework/Web/UI/JuiControls/TJuiAutoComplete.php | 2 +- .../Web/UI/JuiControls/TJuiControlAdapter.php | 2 +- framework/Web/UI/JuiControls/TJuiDialog.php | 2 +- framework/Web/UI/JuiControls/TJuiDraggable.php | 2 +- framework/Web/UI/JuiControls/TJuiDroppable.php | 2 +- framework/Web/UI/JuiControls/TJuiProgressbar.php | 2 +- framework/Web/UI/JuiControls/TJuiResizable.php | 2 +- framework/Web/UI/JuiControls/TJuiSelectable.php | 2 +- framework/Web/UI/JuiControls/TJuiSortable.php | 2 +- framework/Web/UI/TCachePageStatePersister.php | 2 +- framework/Web/UI/TClientScriptManager.php | 2 +- framework/Web/UI/TCompositeControl.php | 2 +- framework/Web/UI/TControl.php | 2 +- framework/Web/UI/TControlAdapter.php | 2 +- framework/Web/UI/TForm.php | 2 +- framework/Web/UI/THtmlWriter.php | 2 +- framework/Web/UI/TPage.php | 2 +- framework/Web/UI/TPageStatePersister.php | 2 +- framework/Web/UI/TSessionPageStatePersister.php | 2 +- framework/Web/UI/TTemplateControl.php | 2 +- framework/Web/UI/TTemplateManager.php | 2 +- framework/Web/UI/TThemeManager.php | 2 +- framework/Web/UI/WebControls/TAccordion.php | 2 +- framework/Web/UI/WebControls/TBaseDataList.php | 2 +- framework/Web/UI/WebControls/TBaseValidator.php | 2 +- framework/Web/UI/WebControls/TBoundColumn.php | 2 +- framework/Web/UI/WebControls/TBulletedList.php | 2 +- framework/Web/UI/WebControls/TButton.php | 2 +- framework/Web/UI/WebControls/TButtonColumn.php | 2 +- framework/Web/UI/WebControls/TCaptcha.php | 2 +- framework/Web/UI/WebControls/TCaptchaValidator.php | 2 +- framework/Web/UI/WebControls/TCheckBox.php | 2 +- framework/Web/UI/WebControls/TCheckBoxColumn.php | 2 +- framework/Web/UI/WebControls/TCheckBoxList.php | 2 +- framework/Web/UI/WebControls/TClientScript.php | 2 +- framework/Web/UI/WebControls/TColorPicker.php | 2 +- framework/Web/UI/WebControls/TCompareValidator.php | 2 +- framework/Web/UI/WebControls/TConditional.php | 2 +- framework/Web/UI/WebControls/TContent.php | 2 +- .../Web/UI/WebControls/TContentPlaceHolder.php | 2 +- framework/Web/UI/WebControls/TCustomValidator.php | 2 +- framework/Web/UI/WebControls/TDataBoundControl.php | 2 +- framework/Web/UI/WebControls/TDataGrid.php | 2 +- framework/Web/UI/WebControls/TDataGridColumn.php | 2 +- .../Web/UI/WebControls/TDataGridItemRenderer.php | 2 +- .../Web/UI/WebControls/TDataGridPagerStyle.php | 2 +- framework/Web/UI/WebControls/TDataList.php | 2 +- .../Web/UI/WebControls/TDataListItemRenderer.php | 2 +- framework/Web/UI/WebControls/TDataRenderer.php | 2 +- .../Web/UI/WebControls/TDataSourceControl.php | 2 +- framework/Web/UI/WebControls/TDataSourceView.php | 2 +- .../Web/UI/WebControls/TDataTypeValidator.php | 2 +- framework/Web/UI/WebControls/TDatePicker.php | 2 +- framework/Web/UI/WebControls/TDropDownList.php | 2 +- .../Web/UI/WebControls/TDropDownListColumn.php | 2 +- .../Web/UI/WebControls/TEditCommandColumn.php | 2 +- .../Web/UI/WebControls/TEmailAddressValidator.php | 2 +- framework/Web/UI/WebControls/TExpression.php | 2 +- framework/Web/UI/WebControls/TFileUpload.php | 2 +- framework/Web/UI/WebControls/TFont.php | 2 +- framework/Web/UI/WebControls/THead.php | 2 +- framework/Web/UI/WebControls/THeader1.php | 2 +- framework/Web/UI/WebControls/THeader2.php | 2 +- framework/Web/UI/WebControls/THeader3.php | 2 +- framework/Web/UI/WebControls/THeader4.php | 2 +- framework/Web/UI/WebControls/THeader5.php | 2 +- framework/Web/UI/WebControls/THeader6.php | 2 +- framework/Web/UI/WebControls/THiddenField.php | 2 +- framework/Web/UI/WebControls/THtmlArea.php | 2 +- framework/Web/UI/WebControls/THtmlArea4.php | 2 +- framework/Web/UI/WebControls/THtmlElement.php | 2 +- framework/Web/UI/WebControls/THyperLink.php | 2 +- framework/Web/UI/WebControls/THyperLinkColumn.php | 2 +- framework/Web/UI/WebControls/TImage.php | 2 +- framework/Web/UI/WebControls/TImageButton.php | 2 +- framework/Web/UI/WebControls/TImageMap.php | 2 +- framework/Web/UI/WebControls/TInlineFrame.php | 2 +- framework/Web/UI/WebControls/TItemDataRenderer.php | 2 +- framework/Web/UI/WebControls/TJavascriptLogger.php | 2 +- framework/Web/UI/WebControls/TKeyboard.php | 2 +- framework/Web/UI/WebControls/TLabel.php | 2 +- framework/Web/UI/WebControls/TLinkButton.php | 2 +- framework/Web/UI/WebControls/TListBox.php | 2 +- framework/Web/UI/WebControls/TListControl.php | 2 +- .../Web/UI/WebControls/TListControlValidator.php | 2 +- framework/Web/UI/WebControls/TListItem.php | 2 +- framework/Web/UI/WebControls/TLiteral.php | 2 +- framework/Web/UI/WebControls/TLiteralColumn.php | 2 +- framework/Web/UI/WebControls/TMarkdown.php | 2 +- framework/Web/UI/WebControls/TMultiView.php | 2 +- framework/Web/UI/WebControls/TOutputCache.php | 2 +- framework/Web/UI/WebControls/TPager.php | 2 +- framework/Web/UI/WebControls/TPanel.php | 2 +- framework/Web/UI/WebControls/TPanelStyle.php | 2 +- framework/Web/UI/WebControls/TPlaceHolder.php | 2 +- framework/Web/UI/WebControls/TRadioButton.php | 2 +- framework/Web/UI/WebControls/TRadioButtonList.php | 2 +- framework/Web/UI/WebControls/TRangeValidator.php | 2 +- framework/Web/UI/WebControls/TRatingList.php | 2 +- .../UI/WebControls/TRegularExpressionValidator.php | 2 +- framework/Web/UI/WebControls/TRepeatInfo.php | 2 +- framework/Web/UI/WebControls/TRepeater.php | 2 +- .../Web/UI/WebControls/TRepeaterItemRenderer.php | 2 +- .../Web/UI/WebControls/TRequiredFieldValidator.php | 2 +- framework/Web/UI/WebControls/TSafeHtml.php | 2 +- framework/Web/UI/WebControls/TSlider.php | 2 +- framework/Web/UI/WebControls/TStatements.php | 2 +- framework/Web/UI/WebControls/TStyle.php | 2 +- framework/Web/UI/WebControls/TStyleSheet.php | 2 +- framework/Web/UI/WebControls/TTabPanel.php | 2 +- framework/Web/UI/WebControls/TTable.php | 2 +- framework/Web/UI/WebControls/TTableCell.php | 2 +- framework/Web/UI/WebControls/TTableFooterRow.php | 2 +- framework/Web/UI/WebControls/TTableHeaderCell.php | 2 +- framework/Web/UI/WebControls/TTableHeaderRow.php | 2 +- framework/Web/UI/WebControls/TTableRow.php | 2 +- framework/Web/UI/WebControls/TTemplateColumn.php | 2 +- framework/Web/UI/WebControls/TTextBox.php | 2 +- framework/Web/UI/WebControls/TTextHighlighter.php | 2 +- framework/Web/UI/WebControls/TTextProcessor.php | 2 +- .../Web/UI/WebControls/TValidationSummary.php | 2 +- framework/Web/UI/WebControls/TWebControl.php | 2 +- .../Web/UI/WebControls/TWebControlAdapter.php | 2 +- .../Web/UI/WebControls/TWebControlDecorator.php | 2 +- framework/Web/UI/WebControls/TWizard.php | 2 +- .../WebControls/TWizardNavigationButtonStyle.php | 2 +- framework/Web/UI/WebControls/TXmlTransform.php | 2 +- framework/Web/UI/WebControls/assets/captcha.php | 2 +- framework/Wsat/TWsatARGenerator.php | 2 +- framework/Wsat/TWsatBaseGenerator.php | 2 +- framework/Wsat/TWsatScaffoldingGenerator.php | 2 +- framework/Wsat/TWsatService.php | 2 +- framework/Wsat/pages/TWsatGenerateAR.php | 2 +- framework/Wsat/pages/TWsatHome.php | 2 +- framework/Wsat/pages/TWsatLogin.php | 2 +- framework/Wsat/pages/TWsatScaffolding.php | 13 +- framework/Xml/TXmlDocument.php | 2 +- framework/interfaces.php | 2 +- framework/prado.php | 2 +- framework/pradolite.php | 153 ++++++++++++++++----- index.html | 6 +- 339 files changed, 532 insertions(+), 388 deletions(-) (limited to 'framework/Web/UI') diff --git a/HISTORY b/HISTORY index ef7b7d60..17c6bb84 100644 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,45 @@ +Version 3.3.0 November ??, 2015 + +CHG: Added jQuery and rebased PRADO's effect and controls on it (ctrlaltca) +ENH: Added jQueryUI and created new controls (ctrlaltca) +ENH: Added Bootstrap3 (daniel) +BUG: Issue #550 - TActivePager not working correctly on XAMP 5.6.3 (LCSKJ) +BUG: Issue #549 - TSqlCriteria, not possible to reset value of condition (majuca) +BUG: Issue #542 - Fix clientside validation in TActiveCustomValidator (majuca) +BUG: Issue #546 - Wrong exception messages in TAccordion (david0) +ENH: Issue #545 - Make Prado.Callback return the request (majuca, david0) +BUG: Issue #543 - Can't set a url mapping pattern class in php config (plachance) +BUG: Issue #541 - Security - HttpOnly parameter in THttpSession and THttpCookie (ctrlaltca) +BUG: Issue #539 - Status Code not send when throwing a THttpException (ctrlaltca) +BUG: Issues #528, 538 - Fix errors in Prado.Validation.validateControl (majuca, david0) + +Version 3.2.4 Aug 26, 2014 + +BUG: Issue #492 - Prado generates json_error when encoding an exception with non UTF-8 data (david0) +ENH: Issue #494 - Adding toArray() and toJSON() to TActiveRecord (dmarko484) +BUG: Issue #498 - Typo in TActiveFileUpload (Jens-mB) +BUG: Issue #499 - Avoid scrolling when calling TControl::focus() (david0) +BUG: Issue #502 - TSlider behaves strangely in TTabView (ctrlaltca) +BUG: Issue #504 - Default Button cannot be referenced by . (ctrlaltca) +BUG: Issue #506 - Unused lines of code in TLiteralColumn::initializeCell (cross) +BUG: Issue #511 - TActivePager's ButtonCssClass property is not rendered in buttons (ctrlaltca) +BUG: Issue #515 - THtmlArea should override Readonly property (ctrlaltca) +BUG: Issue #516 - Check Validators in TActiveEditCommandColumn (ctrlaltca) +BUG: Issue #517 - TXmlDocument adjustment (gnit) +BUG: Issue #518 - Runtime Notice in Gettext::factory() (ctrlaltca) +BUG: Issue #519 - For MySQL in case PDO::CASE_LOWER creating table info does not work (ganiuszka) +BUG: Issue #246 - Refix: User date() instead of gmdate() in TLogRoute (drigolin) +BUG: Issue #520 - Unknown runtime error with Internet Explorer 8 (david0) +BUG: Issue #524 - JSON error (5): Malformed UTF-8 characters when encoding callback response (david0) +BUG: Issue #526 - TJsonRpcProtocol::callMethod, requested method is called twice (jojoinside) +BUG: Issue #527 - TJsonRpcProtocol::callMethod, semicolon must be removed (jojoinside) +ENH: Ported tests to Selenium2 +BUG: Avoid an exception loop on callback error when headers have already been sent (ctrlaltca) +BUG: Avoid rendering - - - - -

TValidationSummary

-

-TValidationSummary menampilkan ringkasan dari kesalahan inline validasi pada halaman Web, dalam kotak pesan, atau keduanya. -

-

-Standarnya ringkasan validasi akan mengumpulkan ErrorMessage dari semua validator yang gagal pada halaman. Jika ValidationGroup tidak kosong, hanya validator itu yang dimiliki grup akan menampilkan pesan kesaslahannya dalam ringkasan. -

-

-Ringkasan dapat ditampilkan sebagai daftar, daftar bertitik, atau satu paragraf berdasarkan properti DisplayMode. Pesan yang ditampilkan dapat diawali dengan HeaderText. Ringkasan dapat ditampilkan pada halaman Web atau kotak pesan JavaScript, masing-masing dengan menyetel properti ShowSummary dan ShowMessageBox. Catatan, yang terakhir hanya efektif saat EnableClientScript adalah true. -

- - -

Berinteraksi dengan Validator

-

Mereset atau Membersihkan Validator

-

-Validator bisa mereset pada sisi-klien menggunakan javascript dengan memanggil -Prado.Validation.reset(groupID) di mana groupID adalah nama pengelompokan. Jika groupID adalah null, maka validator tanpa pengelompokan yang dipakai. -

- - - - - - -

Validasi Kondisional Sisi Server dan Klien

-

- Semua validator berisi event berikut. - Event terkait untuk sisi klien tersedia sebagai sub-properti - dari properti ClientSide pada validator. -

-
    -
  • Event OnValidate muncul sebelum fungsi validasi validator yang dipanggil.
  • -
  • Event OnValidationSuccess muncul setelah validator sukses memvalidasi kontrol.
  • -
  • Event OnValidationError muncul setelah validator gagal memvalidasi.
  • -
- -
Catatan: -Untuk Prado sebelum versi 3.1 nama properti adalah OnError dan OnSuccess. Untuk Prado versi 3.1 dan berikutnya masing-masing OnValidationError dan OnValidationSuccess. -
- -

Contoh berikut memunculkan pesan yang mengatakan "hello" saat validator gagal pada sisi-klien. - -<com:TRequiredFieldValidator ... > - <prop:ClientSide.OnValidationError> - alert("hello"); - </prop:ClientSide.OnValidationError> -</com:TRequiredFieldValidator> - -Hasil event fungsi callback sisi-klien adalah dalam bentuk seperti berikut. - -function onErrorHandler(sender, parameter) -{ - alert("hello"); -} - -di mana sender adalah vaidator sisi-klien saat ini dan parameter adalah kontrol yang memanggil validator. -

-

Contoh Validasi Kondisional

-

-Contoh berikut memperlihatkan penggunaan event validator sisi-klien dan sisi server. Contoh mendemonstrasikan validasi kondisional. Catatan bahwa, kita perlu menuliskan kode untuk sisi server dan klien. Selanjutnya, pada sisi server, kita perlu menghidupkankembali validator kondisional agar kode javascript dihasilkan tanpa mempedulikan apapun (sebaliknya, validator sisi-klien tidak tersedia). - -

- - diff --git a/demos/quickstart/protected/pages/Controls/id/Wizard.page b/demos/quickstart/protected/pages/Controls/id/Wizard.page deleted file mode 100755 index 5105adef..00000000 --- a/demos/quickstart/protected/pages/Controls/id/Wizard.page +++ /dev/null @@ -1,100 +0,0 @@ - - -

TWizard

- - -

Tinjauan

-

-TWizard adalah analogi terhadap bimbingan instalasi yang umum digunakan untuk menginstalasi software pada Windows. Ia memisahkan formulir besar dan menyajikan pengguna dengan sederetan formulir lebih kecil, disebut langkah bimbingan, untuk diselesaikan. Gambar berikut memperlihatkan bagaimana bimbingan dibuat atas kapan disajikan untuk pengguna, di mana konten langkah adalah konten utama pada langkah bimbingan untuk diselesaikan oleh para pengguna, header merujuk ke konten header yang umum bagi seluruh langkah, navigasi berisi tombol yang membolehkan pengguna untuk menjelajahi langkah demi langkah, dan bar samping berisi daftar hiperlink di mana para pengguna dapat menjangkau ke setiap langkah dengan satu klik. Penampakan bar samping dapat dihidup matikan dengan menyetel ShowSideBar. -

-components of wizard - -

-Standarnya TWizard menyertakan komponen di atas dalam sebuah tabel HTML agar bar samping bisa ditampilkan di kiri sementara sisanya di kanan. Jika UseDefaultLayout disetel ke false, tidak ada tabel HTML yang akan dipakai, dan para pengembang hrus menggunakan teknik murni CSS untuk posisi komponen bimbingan. Catatan, setiap komponen ditampilkan sebagai <div> dan bimbingan sendiri juga adalah <div> yang mengurung komponennya <div>. -

- -

-Langkah bimbingan disajikan dengan TWizardStep dan dipelihara dalam TWizard melalui properti WizardSteps. Kapan saja hanya satu yang terlihat, yang ditentukan oleh properti ActiveStep. Properti ActiveStepIndex memberikan indeks pada langkah yang aktif dalam koleksi langkah. Mengklik pada tombol navigasi dapat mengaktifkan langkah bimbingan yang berbeda. -

- -

-Langkah bimbingan biasanya ditambahkan ke bimbingan melalui template seperti berikut, -

- - -<com:TWizard> - <com:TWizardStep Title="step 1" StepType="Start"> - konten dalam langkah 1 dapat berisi kontrol lain - </com:TWizardStep> - - <com:TWizardStep Title="step 2" StepType="Step"> - konten dalam langkah 2 dapat berisi kontrol lain - </com:TWizardStep> - - <com:TWizardStep Title="finish step" StepType="Finish"> - konten dalam langkah selesai dapat berisi kontrol lain - </com:TWizardStep> -</com:TWizard> - - -

-Dalam contoh di atas, StepType merujuk ke tipe langkah bimbingan, yang dapat mempengaruhi bagaimana penampilan navigasi dan perilaku langkah. Langkah bimbingan dapat berupa salah satu dari tipe berikut: -

-
    -
  • Start - langkah pertama dalam bimbingan.
  • -
  • Step - langkah internal dalam bimbiingan.
  • -
  • Finish - langkah terakhir yang membolehkan interaksi pengguna.
  • -
  • Complete - langkah yang memperlihatkan ringkasan kepada penngguna. Dalam langkah ini, bar samping dan panel navigasi tidak terlihat. Selanjutnya, langkah ini biasanya tidak membolehkan interaksi pengguna.
  • -
  • Auto - tipe langkah ditentukan oleh bimbingan secara otomatis.
  • -
- - -

Menggunakan TWizard

- -

Contoh Bimbingan Satu-Langkah

-

-Dalam contoh ini, kita menggunakan bimbingan untuk mengumpulkan preferensi pengguna pada warna. Dalam langkah pertama, pengguna disajikan dengan daftar dropdown dari mana dia dapat memilih warna favoritnya. Dalam langkah kedua, langkah lengkap, pilihannya dalam langkah sebelumnya ditampilkan. Dalam aplikasi sebenarnya, pada langkah ini pilihan bisa disimpan dalam database di belakang layar. -

- - -

Mengkustomisasi Gaya Bimbingan

-

-TWizard mendefinisikan seluruh set properti untuk kustomisasi penampilan berbagai komponennya seperti yang ditampilkan pada gambar di atas. Dalam keadaan tertentu, properti berikut disediakan untuk kustomisasi gaya: -

-
    -
  • Header - HeaderStyle.
  • -
  • Langkah - StepStyle.
  • -
  • Navigasi - NavigationStyle, StartNextButtonStyle, StepNextButtonStyle, StepPreviousButtonStyle, FinishPreviousButtonStyle, FinishCompleteButtonStyle, CancelButtonStyle.
  • -
  • Bar samping - SideBarStyle, SideBarButtonStyle.
  • -
- - -

Mengkustomisasi Navigasi Bimbingan

-

-Berikut adalah set langkah bimbingan, TWizard mendukung tiga cara navigasi diantaranya: -

-
    -
  • Bidirectional - Para pengguna dapat menjelajahi maju dan mundur sepanjang rangkaian langkah bimbingan. Input data pengguna biasanya dikumpulkan di langkah terakhir. Ini juga dikenal sebagai model commit-at-the-end. Itulah cara navigasi standar yang didukung TWizard.
  • -
  • Unidirectional - Para pengguna dapat menjelajahi maju sepanjang rangkaian langkah bimbingan. Pindah mundur tidak dibolehkan. Data input pengguna biasa dikumpulkan langkah demi langkah. Ini juga dikenal sebagai model command-as-you-go. Untuk melarang perpindahan mundur ke langkah tertentu, setel properti AllowReturn ke false.
  • -
  • Nonlinear - Input pengguna dalam langkah menentukan langkah mana berikutnya. Untuk melakukannya, setel ActiveStepIndex ke langkah yang anda ingin agar pengguna pergi ke sana. Dalam hal ini, ketika pengguna mengklik pada tombol sebelumnya alam panel navigasi, langkah sebelumnya yang telah mereka kunjungi (bukan langkah sebelumnya dalam urtan sekuensial) akan menjadi terlihat.
  • -
- - -

Menggunakan Template dalam Bimbingan

-

-TWizard mendukung kontrol konkrit dari penampilannya melalui template. Dalam keadaan tertentu, ia menyediakan properti template yang membolehkan kustomisasi lengkap pada header, navigasi dan bar samping. -

-
    -
  • Header - HeaderTemplate.
  • -
  • Navigation - StartNavigationTemplate, StepNavigationTemplate, FinishNavigationTemplate.
  • -
  • Side bar - SideBarTemplate.
  • -
- - -

Menggunakan Langkah Bimbingan Bertemplate

-

-Langkah bimbingan juga dapat diberi template. Dengan menggunakan TTemplatedWizardStep, seseorang dapat mengkustomisasi konten langkah dan navigasi melalui masing-masing properti ContentTemplate dan NavigationTemplate. Ini berguna untuk pengembang kontrol guna membangun bimbingan khusus seperti registrasi pengguna, kereta belanja, dll. -

- - -
diff --git a/demos/quickstart/protected/pages/Controls/id/wizard.gif b/demos/quickstart/protected/pages/Controls/id/wizard.gif deleted file mode 100755 index 9faf580d..00000000 Binary files a/demos/quickstart/protected/pages/Controls/id/wizard.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/ActiveRecord.page b/demos/quickstart/protected/pages/Database/ActiveRecord.page index cf1485bd..566dfe66 100755 --- a/demos/quickstart/protected/pages/Database/ActiveRecord.page +++ b/demos/quickstart/protected/pages/Database/ActiveRecord.page @@ -36,7 +36,7 @@ Active Record objects can be used to update the database. The "relationship" between Active Records and SqlMap is illustrated in the following diagram. More details regarding the SqlMap Data Mapper can be found in - the SqlMap Manual. + the SqlMap Manual. alt="Active Records and SqlMap DataMapper" id="fig:diagram.png" class="figure"/>

diff --git a/demos/quickstart/protected/pages/Database/SqlMap.page b/demos/quickstart/protected/pages/Database/SqlMap.page index be8cb03a..8c528070 100755 --- a/demos/quickstart/protected/pages/Database/SqlMap.page +++ b/demos/quickstart/protected/pages/Database/SqlMap.page @@ -189,7 +189,7 @@ $user = $sqlmap->queryForObject("SelectUsers");

The above example shows demonstrates only a fraction of the capabilities of the SqlMap Data Mapper. Further details can be found in the - SqlMap Manual. + SqlMap Manual.

Combining SqlMap with Active Records

diff --git a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page b/demos/quickstart/protected/pages/Database/id/ActiveRecord.page deleted file mode 100755 index 8e81678e..00000000 --- a/demos/quickstart/protected/pages/Database/id/ActiveRecord.page +++ /dev/null @@ -1,1000 +0,0 @@ - -

Rekaman Aktif

- -

Rekaman Aktif adalah obyek yang melapisi baris dalam tabel atau view database, - melindungi akses database dan menambahkan logika domain pada data tersebut. - Dasar dari Rekaman Aktif adalah kelas bisnis, sebagai contoh, kelas - Products, yang hampir menyamai struktur rekaman dari tabel database - dibawahnya. Setiap Rekaman Aktif akan bertanggung jawab atas - penyimpanan dan pengambilan data ke dan dari database.

-
Info: - Struktur Rekaman Aktif harus sama dengan tabel dalam database. - Setiap kolom tabel harus mempunyai variabel atau properti anggota terkait dalam - kelas Rekaman Aktif yang mewakili tabel. -
- -

Kapan Menggunakannya

-

Rekaman Aktif adalah pilihan yang baik untuk logika domain yang tidak terlalu rumit, - seperti membuat, membaca, memutakhirkan, dan menghapus. Derivasi dan validasi - didasarkan pada satu rekaman yang bekerja denga baik dalam struktur ini. Rekaman Aktif mempunyai kuntungan utama dalam hal kesederhanaan. Mudah untuk membangun Rekaman Aktif, dan mudah untuk dimengerti.

- -

Akan tetapi, seiring dengan perkembangan logika bisnis Anda dalm hal kompleksitas, Anda akan segera ingin menggunakan hubungan langsung obyek Anda, koleksi, turunan, dan seterusnya. Ini tidak mudah diterapkan ke dalam Rekaman Aktif, dan menambahkannya sedikit demi sedikit menjadi sangat kacau. - Argumen lain terhadap Rekaman Aktif adalah kenyataan bahwa ia menyandingkan desin obyek ke desain database. Ini menjadikannya lebih sulit untuk merefraktorisasi karena proyek terus berjalan.

- -

Alternatifnya adalah menggunakan Pemeta Data yang yang memisahkan aturan dari obyek bisnis dan bagaimana obyek ini disimpan. - Prado menyediakan pilihan tambahan antara Rekaman Aktif dan - Pemeta Data SqlMap. - Pemeta Data SqlMap bisa dipakai untuk mengambil obyek Rekaman Aktif, hasilnya; obyek Rekaman Aktif ini bisa dipakai untuk memutakhirkan database. - "Hubungan" antara Rekaman Aktif dan SqlMap digambarkan dalam diagram berikut. Lebih rinci mengenai Pemeta Data SqlMap dapat ditemukan dalam - Manual SqlMap. - alt="Rekaman Aktif dan SqlMap DataMapper" id="fig:diagram.png" class="figure"/> -

- -

- Kelas Rekaman Aktif berfungsi untuk melakukan tugas-tugas berikut. -

-
    -
  • Membuat, Mengambil, Memutakhirkan dan Menghapus rekaman.
  • -
  • Metode pencari untuk melapisi queri SQL yang umum dipakai dan mengemalikan obyek Rekaman Aktif.
  • -
  • Mengambil hubungan (terkait dengan obyek asing) seperti "has many", "has one", "belongs to" dan "has many" melalui asosiasi tabel.
  • -
  • Pengambilan lazy atas hubungan.
  • -
-

Implikasi Desain

-

-Implementasi Prado terhadap Rekaman Aktif tidak memelihara identitas referensial. Setiap obyek diperoleh menggunakan Rekaman Aktif pada data dalam database. Sebagai contoh, jika Anda meminta kustomer tertentu dan mendapatkan kembali obyek Customer, kali berikutnya Anda meminta kustomer itu, Anda akan kembali mendapatkan turunan lain dari obyek Customer. Ini berarti bahwa perbandingan tepat (misalnya menggunakan ===) akan mengembalikan false, sementara perbandingan bebas (misalnya menggunakan ==) akan mengembalikan true jika nilai obyek sama menurut perbandingan bebas. -

-

-Implikasi desain ini terkait dengan pertanyaan berikut. -"Anda pikir kustomer sebagai obyek, di mana hanya satu, -atau Anda pikir obyek yang Anda operasikan sebagai duplikat dari database?" -Pemetaan O/R lain akan mengartikan bahwa hanya ada satu obyek Kustomer dengan custID 100, dan secara literal ia adalah kustomer. -Jika Anda mendapatkan kustomer dan mengubah field-nya, maka Anda sekarang telah mengubah kustomer itu. -"Itu berbatasan dengan: Anda telah mengubah duplikat kustomer ini, tapi bukan pada duplikat itu. -Dan jika dua orang memutakhirkan kustomer pada dua duplikat obyek, siapapun yang memutakhirkan pertama kali, atau mungkin yang terakhir yang menang." [A. Hejlsberg 2003] -

- -

Database yang Didukung

-

-Implementasi Rekaman Aktif memanfaatkan kelas Prado DAO untuk akses data. -Implementasi Rekaman Aktif saat ini mendukung database sebagai berikut. -

- -

Dukungan database lain dapat disediakan jika permintaan mencukupi.

- -

Mendefinisikan Rekaman Aktif

-

Mari kita anggap tabel - "users" berikut yang berisi dua kolom bernama "username" dan "email", - di mana "username" juga merupakan kunci primer. - -CREATE TABLE users -( - username VARCHAR( 20 ) NOT NULL , - email VARCHAR( 200 ) , - PRIMARY KEY ( username ) -); - -

-

Selanjutnya kelas Rekaman Aktif kita yang terkait dengan tabel "users". - -class UserRecord extends TActiveRecord -{ - const TABLE='users'; //nama tabel - - public $username; //kolom bernama "username" dalam tabel "users" - public $email; - - /** - * @return TActiveRecord active record finder instance - */ - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - -

-

Setiap kolom dari tabel "users" harus mempunyai properti terkait atas nama yang sama seperti nama kolom dalam kelas UserRecord. - Tentunya, Anda juga mendefinisikan variabel atau properti tambahan yang tidak ada dalam struktur tabel. - Konstan kelas - TABLE adalah opsional saat nama kelas adalah sama seperti nama tabel dalam database, sebaliknya TABLE harus - menetapkan nama tabel yang terkait dengan kelas Rekaman Aktif Anda. -

- -
Tip: -Anda dapat menetapkan nama-nama tabel yang memenuhi syarat. Contohnya untuk MySQL, TABLE = "`database1`.`table1`". -
- -

- Karena TActiveRecord memperluas TComponent, metode penyetel dan pengambil dapat didefinisikan guna membolehkan kontrol melalui bagaimana variabel disetel dan dikembalikan. Sebagai contoh, menambah properti $level untuk menggunakan kelas UserRecord: -

- -class UserRecord extends TActiveRecord { - ... //definisi yang sudah ada seprti di atas - - private $_level; - public function setLevel($value) { - $this->_level=TPropertyValue::ensureInteger($value,0); - } - public function getLevel($value){ - return $this->_level; - } -} - -

Lebih jelas mengenai TComponent dapat ditemukan dalam Dokumentasi komponen. -Nantinya kita harus dapat menggunakan pengambil/penyetel guna membolehkan pengambilan malas atas obyek yang berhubungan. -

- -
Info: -TActiveRecord juga dapat bekerja dengan view database dengan menetapkan konstan TABLE terkait ke nama view. Akan tetapi, -obyek yang dikembalikan dari view hanya-baca, memanggil metode -save() atau delete() akan memunculkan eksepsi. -
- -

- Metode statis finder() mengembalilkan turunan UserRecord - yang dapat dipakai untuk mengambil rekaman dari database. Pengambilan rekaman menggunakan metode finder akan didiskusikan nanti. Metode statis TActiveRecord::finder() mengambil nama kelas Rekaman Aktif sebagai parameter. -

- -

Menyiapkan koneksi database

-

- Koneksi database standar untuk Rekaman Aktif dapat disetel sebagai berikut. - Lihat Menetapkan Koneksi Database untuk - rincian lebih jauh mengenai pembuatan koneksi database secara umum. -

- -//buat koneksi dan berikan kepada manajer Rekaman Aktif. -$dsn = 'pgsql:host=localhost;dbname=test'; //Postgres SQL -$conn = new TDbConnection($dsn, 'dbuser','dbpass'); -TActiveRecordManager::getInstance()->setDbConnection($conn); - - -

Alternatifnya, Anda dapat membuat basis kelas dan mengganti metode getDbConnection() untuk mengembalikan -koneksi database. Ini adalah cara sederhana untuk mengijinkan koneksi database multipel. Kode berikut mendemonstrasikan penetapan koneksi database dalam sebuah basis kelas (tidak perlu menyetel koneksi DB di manapun juga). -

- -class MyDb1Record extends TActiveRecord -{ - public function getDbConnection() - { - static $conn; - if($conn===null) - $conn = new TDbConnection('xxx','yyy','zzz'); - return $conn; - } -} -class MyDb2Record extends TActiveRecord -{ - public function getDbConnection() - { - static $conn; - if($conn===null) - $conn = new TDbConnection('aaa','bbb','ccc'); - return $conn; - } -} - - - -

Menggunakan application.xml di dalam Kerangka Kerja Prado

-
-

- Koneksi database standar dapat juga dikonfigurasi menggunakan tag <module> dalam application.xml - atau config.xml seperti berikut. - - - - - - - -

Tip: - Atribut EnableCache ketika disetel ke "true" akan melakukan cache meta data tabel, yakni nama kolom tabel, indeks dan batasan yang disimpan dalam cache dan dipakai ulang. Anda harus membersihkan atau mematikan cache jika Anda ingin melihat perubahan terhadap definisi tabel Anda. Modul cache juga harus didefinisikan agar cache berfungsi. -
-

- -

Properti ConnectionID dapat ditetapkan dengan nilai yang terkait ke nilai ID konfigurasi modul TDataSourceConfig lain. Ini membolehkan koneksi database yang sama untuk dipakai dalam modul lainnya seperti SqlMap. - - - - - - - - - - - -

-
- -

Mengambil data dari database

-

- Kelas TActiveRecord menyediakan banyak metode yang sesuai untuk mencari rekaman dari database. Yang paling sederhana adalah mencari satu rekaman yang sama dengan kunci primer atau kunci komposit (kunci primer yang terdiri dari multipel kolom). - Lihat untuk lebih jelasnya. -

- -
Info: -Semua metode finder yang dapat mengembalikan hanya 1 rekaman akan mengembalikan null jika tidak ada data yang sama yang ditemukan. Semua metode finder yang mengembalikan array rekaman akan mengembalikan array kosong jika tidak ada data yang ditemukan. -
- -

findByPk()

-

Mencari satu rekaman hanya menggunakan kunci primer atau kunci gabungan. - -$finder = UserRecord::finder(); -$user = $finder->findByPk($primaryKey); - -//ketika tabel menggunakan kunci gabungan -$record = $finder->findByPk($key1, $key2, ...); -$record = $finder->findByPk(array($key1, $key2,...)); - -

- -

findAllByPks()

-

Mencari multipel rekaman menggunakan sebuah daftar kunci primer atau kunci gabungan. -Berikut adalah persamaan untuk kunci primer (kunci primer terdiri dari hanya satu kolom/field). -

- -$finder = UserRecord::finder(); -$users = $finder->findAllByPks($key1, $key2, ...); -$users = $finder->findAllByPks(array($key1, $key2, ...)); - -Berikut adalah persamaan untuk kunci gabungan. - -//ketika tabel menggunakan kunci gabungan -$record = $finder->findAllByPks(array($key1, $key2), array($key3, $key4), ...); - -$keys = array( array($key1, $key2), array($key3, $key4), ... ); -$record = $finder->findAllByPks($keys); - - - -

find()

-

Mencari satu rekaman tunggal yang memenuhi kriteria. Kriteria dapat berupa bagian string SQL atau obyek TActiveRecordCriteria.

- -$finder = UserRecord::finder(); - -//:name dan :pass adalah tempat untuk nilai $name dan $pass tertentu -$finder->find('username = :name AND password = :pass', - array(':name'=>$name, ':pass'=>$pass)); - -//menggunakan tempat posisi -$finder->find('username = ? AND password = ?', array($name, $pass)); -//same as above -$finder->find('username = ? AND password = ?', $name, $pass); - -//$criteria adalah TActiveRecordCriteria -$finder->find($criteria); //the 2nd parameter for find() is ignored. - - -

Kelas TActiveRecordCriteria mempunyai properti sebagai berikut: -

-
    -
  • Parameters -- pasangan parameter nama nilai.
  • -
  • OrdersBy -- pasangan nama kolom dan urutan.
  • -
  • Condition -- bagian dari kondisi SQL WHERE.
  • -
  • Limit -- jumlah maksimum rekaman diambil.
  • -
  • Offset -- ofset rekaman dalam tabel.
  • -
- - -$criteria = new TActiveRecordCriteria; -$criteria->Condition = 'username = :name AND password = :pass'; -$criteria->Parameters[':name'] = 'admin'; -$criteria->Parameters[':pass'] = 'prado'; -$criteria->OrdersBy['level'] = 'desc'; -$criteria->OrdersBy['name'] = 'asc'; -$criteria->Limit = 10; -$criteria->Offset = 20; - - -
Catatan: -Untuk MSSQL dan saat Limit serta Offset berisi nilai integer positif. Query aktual yang dijalankan diubah oleh kelas - -berdasarkan pada -http://troels.arvin.dk/db/rdbms/ -untuk mengemulasikan kondisi Limit dan Offset. -
- -

findAll()

-

Sama seperti find() tapi mengembalikan array obyek.

- -

findBy*() dan findAllBy*()

-

Metode find dinamis menggunakan bagian dari nama metode sebagai kriteria pencarian. -Nama metode dimulai dengan findBy mengembalikan hanya 1 rekaman dan nama metode yang dimulai dengan findAllBy mengembalikan array rekaman. -Kondisi diambil sebagai bagian dari nama metode setelah findBy atau findAllBy. - -Blok kode berikut adalah sama: -

- -$finder->findByName($name) -$finder->find('Name = ?', $name); - - - -$finder->findByUsernameAndPassword($name,$pass); -$finder->findBy_Username_And_Password($name,$pass); -$finder->find('Username = ? AND Password = ?', $name, $pass); - - - -$finder->findAllByAge($age); -$finder->findAll('Age = ?', $age); - - -
Tip: -Anda juga dapat menggunakan kombinasi AND dan OR sebagai kondisi dalam metode dinamis. -
- -

findBySql() dan findAllBySql()

-

Mencari rekaman menggunakan SQL penuh di mana findBySql() mengembalikan Rekaman Aktif dan findAllBySql()mengembalikan array obyek rekaman. -Untuk setiap kolom yang dikembalikan, kelas Rekaman Aktif terkait harus mendefinisikan variabel atau properti untuk setiap nama kolom terkait. - -class UserRecord2 extends UserRecord -{ - public $another_value; -} -$sql = "SELECT users.*, 'hello' as another_value FROM users"; -$users = TActiveRecord::finder('UserRecord2')->findAllBySql($sql); - -

-

count()

-

Mencari jumlah rekaman yang sama, menerima beberapa parameters seperti metode findAll().

- -

Menyisipkan dan memutakhirkan rekaman

-

-Menambah rekaman baru menggunakan TActiveRecord sangat sederhana, cukup buat obyek Rekaman Aktif baru dan panggil metode save(). Misalnya -

- -$user1 = new UserRecord(); -$user1->username = "admin"; -$user1->email = "admin@example.com"; -$user1->save(); //sisipkan rekaman baru - -$data = array('username'=>'admin', 'email'=>'admin@example.com'); -$user2 = new UserRecord($data); //buat dengan mengirimkan beberapa data yang sudah ada -$user2->save(); //sisipkan rekaman baru - -
Tip: -Obyek dimutakhirkan dengan kunci primer dari tabel itu yang berisi definisi yang secara otomatis membuat kunci primer untuk rekaman yang baru saja disisipkan. -Sebagai contoh, jika Anda menyisipkan sebuah rekaman baru ke dalam tabel MySQL yang kolomnya didefinisikan dengan "autoincrement", obyek Rekaman Aktif akan dimutakhirkan dengan nilai yang ditambahkan.
- -

-Untuk memutakhirkan rekaman dalam database, cukup ubah satu atau lebih properti obyek Rekaman Aktif yang sudah diambil dari database dan kemudian panggil metode save(). - - -$user = UserRecord::finder()->findByName('admin'); -$user->email="test@example.com"; //ubah properti -$user->save(); //mutakhirkan. - -

- -

-Obyek Rekaman Aktif mempunyai masa-hidup sederhana seperti digambarkan dalam diagram berikut. -

- alt="Active Records Life Cycle" id="fig:cycle.png" class="figure"/> -

-Kita melihat bahwa obyek TActiveRecord baru dibuat dengan menggunakan salah satu metode find*() ataupun membuat turunan baru dengan menggunakan kata kunci PHP new. Obyek yang dibuat dengan metode find*() dimulai dengan kondisi clean. Turunan baru TActiveRecord membuat selain metode find*() yang dimulai dengan kondisi new. -Kapan saja Anda memanggil metode save() pada obyek TActiveRecord, obyek memasuki keadaan clean. Obyek dalam clean menjadi dirty ketika satu atau lebih keadaan internalnya diubah. Pemanggilan metode delete() pada obyek mengakhiri masa-hidup obyek, tidak ada aksi lanjutan yang dilakukan pada obyek. -

- -

Menghapus rekaman yang sudah ada

-

- Untuk menghapus rekaman yang sudah ada dan diambil, cukup panggil metode delete(). - Anda juga dapat menghapus rekaman dalam database dengan kunci primer tanpa mengambil rekaman apapun menggunakan metode deleteByPk() (dan metode yang sama deleteAllByPks()). - Sebagai contoh, untuk menghapus satu atau beberapa rekaman dengan menggunakan satu atau lebih kunci primer. -

- -$finder->deleteByPk($primaryKey); //hapus 1 rekaman -$finder->deleteAllByPks($key1,$key2,...); //hapus multipel rekaman -$finder->deleteAllByPks(array($key1,$key2,...)); //hapus multipel rekaman - - -

-Untuk kunci gabungan (ditentukan secara otomatis dari definisi tabel): -

- -$finder->deleteByPk(array($key1,$key2)); //hapus 1 rekaman - -//hapus multipel rekaman -$finder->deleteAllByPks(array($key1,$key2), array($key3,$key4),...); - -//hapus multipel rekaman -$finder->deleteAllByPks(array( array($key1,$key2), array($key3,$key4), .. )); - - -

deleteAll() dan deleteBy*()

-

-Untuk menghapus dengan kriteria, gunakan deleteAll($criteria) dan deleteBy*() -yang sintaksnya mirip dengan findAll($criteria) dan findAllBy*() seperti dijelaskan di atas. -

- -//hapus semua rekaman dengan Name yang sama -$finder->deleteAll('Name = ?', $name); -$finder->deleteByName($name); - -//hapus dengan username dan password -$finder->deleteBy_Username_And_Password($name,$pass); - - -

Transaksi

-

Semua obyek Rekaman Aktif berisi properti DbConnection yang dapat dipakai untuk mendapatkan obyek transaksi. - -$finder = UserRecord::finder(); -$finder->DbConnection->Active=true; //buka bila perlu -$transaction = $finder->DbConnection->beginTransaction(); -try -{ - $user = $finder->findByPk('admin'); - $user->email = 'test@example.com'; //ubah obyek $user - $user->save(); - $transaction->commit(); -} -catch(Exception $e) // eksepsi dimunculkan jika query gagal -{ - $transaction->rollBack(); -} - - -

Event

-

-TActiveRecord menawarkan dua event, OnCreateCommand dan OnExecuteCommand. -

- -

Event OnCreateCommand dimunculkan ketika perintah disiapkan dan penyatuan parameter lengkap. Obyek parameter adalah TDataGatewayEventParameter di mana properti -Command bisa diperiksa agar SQL query dijalankan. -

- -

-Event OnExecuteCommand dimunculkan ketika perintah dijalankan dan hasil dari database dikembalikan. Obyek parameter TDataGatewayResultEventParameter -dari properti Result berisi data yang dikembalikan dari database. -Data yang dikembalikan dapat diubah dengan setelan properti Result. -

- -

Contoh Pencatatan

-

Menggunakan OnExecuteCommand kita dapat menempelkan pengendali event untuk mencatat seluruh query SQL yang dijalankan untuk kelas TActiveRecord atau turunan yang diberikan. Sebagai contoh, kita mendefinisikan sebuah basis kelas dan mengganti getDbConnection() atau konstruktornya. -

- - -class MyDb1Record extends TActiveRecord -{ - public function getDbConnection() - { - static $conn; - if($conn===null) - { - $conn = new TDbConnection('xxx','yyy','zzz'); - $this->OnExecuteCommand[] = array($this,'logger'); - } - return $conn; - } - public function logger($sender,$param) - { - var_dump($param->Command->Text); - } -} -//alternatifnya sebagai per turunan dari per obyek finder -function logger($sender,$param) -{ - var_dump($param->Command->Text); -} -TActiveRecord::finder('MyRecord')->OnExecuteCommand[] = 'logger'; -$obj->OnExecuteCommand[] = array($logger, 'log'); //setiap PHP callback yg benar. - - -

Hubungan Rekaman Aktif

- -

-Implementasi Rekaman Aktif Prado mendukung pemetaan kunci asing untuk database -yang mendukung batasan kunci asing. Agar hubungan Rekaman Aktif berfungsi, database di bawahnya harus mendukung batasan kunci asing (misalnya MySQL menggunakan InnoDB). -

- -

-Dalam bagian berikut kita akan menganggap hubungan tabel antara -Teams, Players, Skills dan Profiles. -

- class="figure" /> - - -

Tujuannya adalah untuk mendapatkan model obyek yang mewakili ke beberapa derajat hubungan entitas dalam gambar di atas. -

- - class="figure" /> - -

-Ada ketidak cocokan antara hubungan dengan obyek dan hubungan tabel. Pertama, ada perbedaan dalam penyajian. Penghubung kendali obyek dengen menyimpan referensi yang dipegang oleh lingkungan memori-teratur runtime. Database relasional menangani kaitan dengan membentuk sebuah kunci ke dalam tabel lainnya. Keuda, obyek dapat dengan mudah menggunakan koleksi guna menangani multipel referensi dari satu field, sementara normalisasi memaksa seluruh relasi entitas mengaitkan ke nilai tunggal. Ini menyebabkan pembalikan struktur data antara obyek dan tabel. Pendekatan yang diambil dalam desain Rekaman Aktif Prado adalah untuk menggunakan batasan kunci asing guna memperoleh hubungan obyek. Ini berarti bahwa database di bawahnya harus mendukung batasan kunci asing. -

-
Tip: -Untuk database SQLite, Anda dapat membuat tabel yang mendefinisikan batasan kunci asing seperti contoh di bawah ini. Akan tetapi, batasan ini TIDAK -dipaksakan oleh database SQLite itu sendiri. - -CREATE TABLE foo -( - id INTEGER NOT NULL PRIMARY KEY, - id2 CHAR(2) -); -CREATE TABLE bar -( - id INTEGER NOT NULL PRIMARY KEY, - foo_id INTEGER - CONSTRAINT fk_foo_id REFERENCES foo(id) ON DELETE CASCADE -); - -
- -

Pemetaan Kunci Asing

-

Hubungan entitas antara tabel Teams dan Players adalah apa yang dikenal sebagai hubungan 1-M. Yaitu, satu Tim dapat berisi 0 atau lebih Pemain. Dalam batasan hubungan obyek, kita katakan bahwa obyek TeamRecord memiliki banyak obyek PlayerRecord. -(Perhatikan kebalikan dari arah hubungan antara tabel dan obyek.) -

- -

Hubungan Has Many

-

-Kita membuat model obyek Team sebagai kelas Rekaman Aktif berikut. -

- -class TeamRecord extends TActiveRecord -{ - const TABLE='Teams'; - public $name; - public $location; - - public $players=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - - //mendefinisikan anggota $player yang memiliki hubungan banyak dengan PlayerRecord - public static $RELATIONS=array - ( - 'players' => array(self::HAS_MANY, 'PlayerRecord', 'team_name'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - -

-Properti statis $RELATIONS dari TeamRecord mendefinisikan bahwa properti $players has many PlayerRecord. Multipel hubungan dibolehkan dengan mendefinisikan setiap hubungan dengan sebuah entitas dalam array $RELATIONS di mana kunci array untuk entri menunjukan nama properti. -Dalam array(self::HAS_MANY, 'PlayerRecord'), elemen pertama mendefinisikan tipe hubungan, tipe yang benar adalah self::HAS_MANY, -self::HAS_ONE dan self::BELONGS_TO. -Elemen kedua adalah string 'PlayerRecord' yang menunjukan nama kelas dari kelas PlayerRecord. -

- -
Catatan: -Seperti dijelaska dalam komentar kode di atas, sejak versi 3.1.2, properti terkait tidak tidak lagi perlu dideklarasikan secara eksplisit. Standarnya, akan secara implisit dideklarasikan berdasarkan pada kunci array $RELATIONS. Keuntungan utama atas properti terkait yang dideklarasikan secara implisit adalah obyek terkait dapat diambil secara otomatis dengan cara malas. Sebagai contoh, anggap kita mempunyai TeamRecord turunan $team. Kita dapat mengakses players via $team->players, -meskipun kita tidak pernah menerbitkan perintah mengambil untuk players. Jika $players dideklarasikan secara eksplisit, kita harus menggunakan pendekatan with seperti dijelaskan dalam contoh berikut untuk mengambil rekaman player. -
- -

-Batasan kunci asing tabel Players dipakai untuk menentukan nama kunci tabel Teams terkait. Ini dikerjakan secara otomatis, ditangani dalam Rekaman Aktif dengan memeriksa definisi tabel Players dan Teams. -

- -
Info: -Sejak versi 3.1.2, Rekaman Aktif mendukung multipel referensi kunci asing pada tabel yang sama. Kerancuan diantara multipel referensi kunci asing dipecahkan dengan penyediaan nama kolom kunci asing sebagai parameter ke-3 dalam array relationship. -Sebagai contoh, kedua kunci asing owner_id dan reporter_id -merujuk tabel yang sama, didefinisikan dalam UserRecord. - -class TicketRecord extends TActiveRecord -{ - public $owner_id; - public $reporter_id; - - public $owner; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - public $reporter; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - - public static $RELATION=array - ( - 'owner' => array(self::BELONGS_TO, 'UserRecord', 'owner_id'), - 'reporter' => array(self::BELONGS_TO, 'UserRecord', 'reporter_id'), - ); -} - -Ini berlaku untuk hubungan termasuk BELONGS_TO, HAS_ONE dan -HAS_MANY. Lihat seksi Tabel Asosiaasi Merujuk Dirinya Sendiri untuk memecahkan kerancuan atas hubungan MANY_TO_MANY. -
- -

Hubungan "has many" tidak diambil secara otomatis ketika Anda menggunakan salah satu metode finder Rekaman Aktif. -Anda perlu untuk mengambil secara eksplisit obyek terkait seperti berikut. Dalam kode di bawah ini, kedua baris adalah sama dan nama metode tidak sensitif huruf. -

- -$team = TeamRecord::finder()->withPlayers()->findAll(); -$team = TeamRecord::finder()->with_players()->findAll(); //equivalent - -

-Metode with_xxx() (di mana xxx adalah nama properti hubungan, dalam hal ini, players) mengambil PlayerRecords terkait menggunakan query kedua (bukan menggunakan join). with_xxx() menerima argumen yang sama seperti metode finder lainnya dari TActiveRecord, misalnya with_players('age = ?', 35). -

- -
Catatan: -Penting untuk dimengerti bahwa obyek terkait diambil menggunakan query tambahan. Query pertama mengambil obyek sumber, misalnya TeamRecord dalam contoh kode di atas. -Query kedua dipakai untuk mengambil obyek PlayerRecord terkait. -Penggunaan dua query mirip dengan query tunggal menggunakan Left-Outer join dengan eksepsi bahwa hasil null pada tabel kanan tidak dikembalikan. Konsekuensi pemakaian dua tau lebih query adalah kondisi agregat dan join tidak layak menggunakan Rekaman Aktif. Untuk query di luar lingkup Rekaman Aktif, Pemeta Data SqlMap diapat dupertimbangkan. -
- -
Info: -Pendekatan with di atas juga bekerja dengan properti terkait yang dideklarasikan secara implisit (diperkenalkan dalam versi 3.1.2). Lalu apa perbedaan antara pendekatan with dan pendekatan pengambilan malas? Pengambilan malas berarti kita menerbitkan query SQL jika obyek terkait awalnya diakses dan tidak siap, -sementara query pendekatan with untuk obyek terkait sekaligus, tida peduli obyek terkait diakses atau tidak. Pendekatan pengambilan malas sangat cocok karena kita tidak perlu secara eksplisit mengambil obyek terkait, sementara pendekatan with lebih efisien jika multipel rekaman yang dikembalikan, masing-masing dengan beberapa obyek terkait. -
- -

Hubungan Belongs To

-

Hubungan "has many" dalam bagian di atas mendefinisikan koleksi obyek asing. Dalam keadaan tertentu, kita mempunyai TeamRecord memiliki banyak (nol atau lebih) obyek PlayerRecord. Kita juga dapat menambah penunjuk kembali dengan menambahkan properti dalam kelas PlayerRecord yang mengaitkan kembali ke obyek TeamRecord, secara efektif membuat asosiasi dua arah. -Kita katakan bahwa properti $team dalam kelas PlayerRecord belongs to obyek TeamRecord. -Kode berikut mendefinisikan kelas PlayerRecord lengkap dengan 3 hubungan. -

- -class PlayerRecord extends TActiveRecord -{ - const TABLE='Players'; - public $player_id; - public $age; - public $team_name; - - public $team; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - public $skills=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - public $profile; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - - public static $RELATIONS=array - ( - 'team' => array(self::BELONGS_TO, 'TeamRecord', 'team_name'), - 'skills' => array(self::MANY_TO_MANY, 'SkillRecord', 'Player_Skills'), - 'profile' => array(self::HAS_ONE, 'ProfileRecord', 'player_id'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - -

-Properti $RELATIONS dari PlayerRecord mendefinisikan properti $team milik TeamRecord. -Array $RELATIONS juga mendefinisikan dua hubungan lainnya yang nanti akan kita uji dalam seksi di bawah ini. -Dalam array(self::BELONGS_TO, 'TeamRecord'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::BELONGS_TO dan -elemen kedua adalah string 'TeamRecord' yang terkait ke nama kelas dari kelas TeamRecord. -Obyek pemain dengan obyek tim terkait dapat diambil serperti berikut. -

- -$players = PlayerRecord::finder()->with_team()->findAll(); - - -

- Metode with_xxx() (di mana xxx adalah nama properti hubungan dalam hal ini, team) mengambil TeamRecords terkait menggunakan query kedua (bukan menggunakan join). with_xxx() menerima argumen yang sama seperti metode finder lainnya dari TActiveRecord, contohnya with_team('location = ?', 'Madrid'). -

- -
Tip: -Hubungan tambahan dapat diambil dengan mengaitkan with_xxx() bersama seperti yang didemonstrasikan berikut. - -$players = PlayerRecord::finder()->with_team()->with_skills()->findAll(); - -Setiap metode with_xxx() akan menjalankan query SQL tambahan. Setiap with_xxx() menerima argumen mirip dengan apa yang ada di dalam metode findAll() dan hanya diterapkan ke query hubungan tertentu tersebut. -
- -

Hubungan "belongs to" dari kelas ProfileRecord didefinisikan hampir sama.

- -class ProfileRecord extends TActiveRecord -{ - const TABLE='Profiles'; - public $player_id; - public $salary; - - public $player; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - - public static $RELATIONS=array - ( - 'player' => array(self::BELONGS_TO, 'PlayerRecord'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - - -

Intinya, ada hubungan "belongs to" untuk obyek yang mengaitkan entitas yang memmpunyai kolom yakni kunci asing. Dalam keadaan tertentu, kita melihat bahwa tabel Profiles mempunyai batasan kunci asing pada kolom player_id yang terkait ke tabel -Players kolom player_id. Selanjutnya, obyek ProfileRecord -memiliki properti ($player) yang adalah milik obyek PlayerRecord. -Demikian juga, tabel Players mempunyai batasan kunci asing pada kolom team_name yang terkait ke tabel Teams kolom name. -Kemudian, obyek PlayerRecord mempunyai properti ($team) yang adalah milik obyek TeamRecord. -

- -

Hubungan Has One

-

Hubungan entitas antara Players dan Profiles adalah satu ke satu. Yaitu, setiap obyek -PlayerRecord has one obyek ProfileRecord (mungkin tidak ada atau null). -Hubungan has one hampir identik ke hubungan has many dengan eksepsi bahwa obyek terkait hanya satu obyek (bukan koleksi obyek). -

- -

Hubungan Leluhur Anak

-

Hubungan leluhur anak bisa didefinisikan menggunakan kombinasi hubungan has many dan belongs to yang -merujuk ke kelas yang sama. Contoh berikut memperlihatkan hubungan leluhur dan anaknya antara "kategori" dan "leluhur kategori". -

- - -class Category extends TActiveRecord -{ - public $cat_id; - public $category_name; - public $parent_cat_id; - - public $parent_category; // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - public $child_categories=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - - public static $RELATIONS=array - ( - 'parent_category' => array(self::BELONGS_TO, 'Category', 'parent_cat_id'), - 'child_categories' => array(self::HAS_MANY, 'Category', 'parent_cat_id'), - ); -} - - -

Kriteria Query untuk Obyek Terkait

-

-Dalam contoh di atas, kami memperlihatkan bahwa obyek Rekaman Aktif dapat mereferensi ke obyek terkaitnya sendiri dengan -mendeklarasikan anggota kelas statis $RELATIONS yang menetapkan sebuah daftar relasi. Setiap relasi -ditetapkan sebagai array yang terdiri dari tiga elemen: tipe relasi, nama kelas AR terkait, -dan kunci asing. Sebagai contoh, kami menggunakan array(self::HAS_MANY, 'PlayerRecord', 'team_name') -untuk menetapkan pemain dalam sebuah tim. Ada dua elemen opsional berikutnya yang dapat ditetapkan -dalam array ini: kondisi query (elemen keempat) dan parameters (elemen kelima). -Elemen tersebut dipakai untuk mengontrol bagaimana untuk melakukan query terhadap obyek terkait. Sebagai contoh, jika kita ingin memperoleh -para pemain yang diurut dengan usianya, kita dapat menetapkan array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'ORDER BY age'). -Jika kita ingin mendapatkan para pemain yang usianya kurang dari 30, kita dapat menggunakan -array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'age<:age', array(':age'=>30)). Secara umum, -dua elemen tambahan ini mirip seperti parameter yang dikirimkan ke metode find() dalam AR. -

- -

Pemetaan Tabel Asosiasi

-

-Obyek dapat dengan mudah menangani field multi nilai dengan menggunakan koleksi sebagai nilai field. Database relasional tidak memiliki fitur ini dan dibatasi hanya ke field nilai-tunggal. Ketika Anda memetakan asosiasi satu-ke-banyak, Anda bisa menangani ini menggunakan hubungan has many, intinya menggunakan kunci asing untuk nilai-tunggal akhir dari asosiasi. Tapi asosiasi banyak-ke-banyak tidak bisa melakukan ini karena tidak ada nilai-tunggal akhir ke kunci asing yang dipegangnya. -

-

-Jawabannya adalah resolusi klasik yang telah dipakai oleh orang selama dekade ini yakni: buat tabel ekstra (tabel asosiasi) untuk merekam asosiasi. -Ide dasarnya adalah menggunakan tabel asosiasi untuk menyimpan asosiasi. Tabel ini memiliki ID kunci asing untuk dua tabel yang dikaitkan bersama, masing-masing memiliki pasangan dari obyek yang diasosiasikan. -

-

-Tabel asosiasi tidak mempunyai kaitan obyek dalam-memori dan kunci primernya adalah gabungan dari dua kunci primer dari tabel yang diasosiasikan. -Dalam batasan yang sederhana, tuntuk mengambil data dari tabel asosiasi, Anda melakukan dua query (secara umum, ini juga bisa dicapai menggunakan satu query yang terdiri dari join). -Anggap pengambilan koleksi SkillRecord untuk daftar obyek PlayerRecord. -Dalam hal ini, Anda melakukan query dalam dua tahap. Tahap pertama meng-query tabel Players untuk mencari seluruh baris dari pemain yang Anda inginkan. Tahap kedua mencari obyek SkillRecord ID pemain terkait untuk setiap barisnya dalam tabel asosiasi Player_Skills menggunakan sebuah inner join. -

- -

Desain Rekaman Aktif Prado mengimplementasikan dua tahap pendekatan. Untuk hubungan entitas Players-Skills M-N (many-to-many), kita perlu mendefinisikan sebuah hubungan has many dalam kelas PlayerRecord dan sebagai tambahan mendefinisikan hubungan has many dalam kelas SkillRecord juga. -Kode contoh berikut mendefinisikan kelas SkillRecord lengkap dengan hubungan banyak-ke-banyak dengan kelas PlayerRecord. (Lihat definisi kelas PlayerRecord di atas untuk mengaitkan hubungan banyak-ke-banyak dengan kelas SkillRecord.) -

- - -class SkillRecord extends TActiveRecord -{ - const TABLE='Skills'; - public $skill_id; - public $name; - - public $players=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - - public static $RELATIONS=array - ( - 'players' => array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - - -

-Properti statis $RELATIONS dari SkillRecord mendefinisikan bahwa properti $players memiliki banyak PlayerRecords melalui tabel asosiasi 'Player_Skills'. -Dalam array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), elemen pertama mendefinisikan tipe hubungan, dalam hal ini self::HAS_MANY, -elemen kedua adalah string 'PlayerRecord' yang terkait ke nama kelas dari kelas PlayerRecord, dan elemen ketiga adalah nama dari nama tabel asosiasi. -

- -
Catatan: -Sebelum versi 3.1.2 (versi sampai dengan 3.1.1), hubungan many-to-many didefinisikan menggunakan self::HAS_MANY. Untuk versi 3.1.2 dan seterusnya, ini harus diubah ke self::MANY_TO_MANY. Ini bisa dikerjakan dengan mencari HAS_MANY dalam kode sumber dan hati-hati mengubah definisi terkait. -
- -

-Daftar obyek pemain dengan koleksi obyek skil terkait bisa diambil seperti berikut. -

- -$players = PlayerRecord::finder()->withSkills()->findAll(); - -

-Metode with_xxx() (di mana xxx adalah nama properti hubungan, dalam hal ini, Skill) mengambil SkillRecords terkait menggunakan query kedua (tidak dengan menggunakan join). with_xxx() menerima argumen yang sama seperti metode finder dari TActiveRecord. -

- -

Tabel Asosiasi Mereferensi Dirinya

-

-Untuk tabel asosiasi yang mererefensi dirinya sendiri, yaitu titik asosiasi ke tabel yang sama. Sebagai contoh, anggap tabel items dengan item terkait M-N melalui tabel asosiasi related_items. Sintaks dalam contoh berikut adalah benar untuk database PostgreSQL. Untuk database lain, lihat dokumentasinya masing-masing untuk mendefinisikan batasan kunci asing. - -CREATE TABLE items -( - "item_id" SERIAL, - "name" VARCHAR(128) NOT NULL, - PRIMARY KEY("item_id") -); -CREATE TABLE "related_items" -( - "item_id" INTEGER NOT NULL, - "related_item_id" INTEGER NOT NULL, - CONSTRAINT "related_items_pkey" PRIMARY KEY("item_id", "related_item_id"), - CONSTRAINT "related_items_item_id_fkey" FOREIGN KEY ("item_id") - REFERENCES "items"("item_id") - ON DELETE CASCADE - ON UPDATE NO ACTION - NOT DEFERRABLE, - CONSTRAINT "related_items_related_item_id_fkey" FOREIGN KEY ("related_item_id") - REFERENCES "items"("item_id") - ON DELETE CASCADE - ON UPDATE NO ACTION - NOT DEFERRABLE -); - - -

Nama tabel asosiasi dalam elemen ketiga dari array hubungan dapat berisi nama kolom tabel asing. Kolom yang didefinisikan dalam tabel asosiasi harus juga didefinisikan dalam kelas rekaman (contohnya properti $related_item_id terkait ke kolom related_item_id dalam tabel related_items). -

- -class Item extends TActiveRecord -{ - const TABLE="items"; - public $item_id; - public $details; - - //id item asing tambahan didefinisikan dalam tabel asosiasi - public $related_item_id; - public $related_items=array(); // deklarasi ini tidak diperlukan lagi sejak v3.1.2 - - public static $RELATIONS=array - ( - 'related_items' => array(self::MANY_TO_MANY, - 'Item', 'related_items.related_item_id'), - ); -} - -
Tip: -Kunci gabungan dalam tabel asing dapat ditetapkan sebagai nilai dipisahkan koma diantara kurung buka/tutup. Contohnya 'related_items.(id1,id2)'. -
- - - -

Pengambilan Malas Obyek Terkait

- -
Catatan: -Secara implisit mendeklarasikan properti terkait yang diperkenalkan dalam versi 3.1.2 secara otomatis memiliki fitur pengambilan malas. Oleh karena itu, teknik pengambilan malas dijelaskan berikut ini tidak lagi diperlukan dalam banyak kasus, kecuali Anda ingin memanipulasi obyek terkait melalui pengambil/penyetel. -
- -

Menggunakan metode with_xxx() akan mengambil hubungan rekaman sesuai permintaan. Mengambil rekaman terkait dengan lazy loading (yaitu, hanya obyek terkait itu saja yang diakses) bisa dicapai dengan menggunakan sebuah fitur TComponent yang menyediakan metode pengakses. Dalam keadaan tertentu, kita mendefinisikan pasangan metode pengambil dan penyetel di mana metode pengambil akan mengambil hubungan secara kondisional. Contoh berikut menggambarkan bahwa PlayerRecord dapat mengambil obyek asing $skills secara kondisional. -

- -class PlayerRecord extends BaseFkRecord -{ - //... properti dan metode lainnya seperti sebelumnya - - private $_skills; //ubah ke private dan standar sebagai null - - public function getSkills() - { - if($this->_skills===null && $this->player_id !==null) - { - //lazy load rekaman skill - $this->setSkills($this->withSkills()->findByPk($this->player_id)->skills); - } - else if($this->_skills===null) - { - //buat TList baru; - $this->setSkills(new TList()); - } - - return $this->_skills; - } - - public function setSkills($value) - { - $this->_skills = $value instanceof TList ? $value : new TList($value); - } -} - -

Pertama kita perlu mengubah deklarasi $skills=array() ke properti private $_skills (perhatikan garis bawah) dan sebaliknya setel ke null. Ini membolehkan kita untuk mendefinisikan properti skills menggunakan metode pengambil/penyetel -(lihat Komponen untuk lebih jelasnya). Metode pengambil getSkills() untuk properti skills akan mengambil malas rekaman skill terkait saat ia dipakai sebagai berikut. Catatan bahwa kita hanya melakukan pengambilan malas ketika $player_id tidak null (yakni, ketika rekaman sudah diambil dari database ataau id player sudah disetel). -

- -$player = PlayerRecord::finder()->findByPk(1); -var_dump($player->skills); //pengambilan malas saat akses pertama -var_dump($player->skills[0]); //properti skills sudah diambil -$player->skills[] = new SkillRecord(); //menambah skill - - -

The setSkills() memastikan bahwa properti skills akan selalu berupa TList. -Menggunakan TList yang membolehkan kita untuk menyetel elemen properti skills seolah-olah mereka -sebuah array. Contohnya $player->skills[] = new SkillRecord(). Jika array dipakai, kesalahan PHP -akan dikeluarkan. -

- -

Pemetaan Kolom

-

-Sejak v3.1.1, Rekaman Aktif mulai mendukung pemetaan kolom. Pemetaan kolom membolehkan para -pengembang untuk mengalamatkan kolom dalam Rekaman Aktif menggunakan konvensi penamaan lebih -konsisten. Dalam keadaan tertentu, menggunakan pemetaan kolom, seseorang dapat mengakses kolom -menggunakan apapun namanya yang disukainya, daripada nama terbatas yang didefinisikan dalam -skema database. -

-

-Untuk menggunakan pemetaan kolom, deklarasikan array statis bernama COLUMN_MAPPING dalam kelas Rekaman Aktif. -Kunci dari array adalah nama kolom (disebut nama kolom fisik) yang didefinisikan dalam skema database, -sementara nilai terkait dengan nama properti (disebut nama kolom logika) didefinisikan dalam -kelas Rekaman Aktif. Nama properti dapat nama variabel anggota kelas public atau nama properti komponen -yang didefinisikan via pengambil/penyetel. Jika nama kolom fisik terjadi sama seperti nama kolom logika, -keduanya tidak perlu didaftarkan dalam COLUMN_MAPPING. -

- -class UserRecord extends TActiveRecord -{ - const TABLE='users'; - public static $COLUMN_MAPPING=array - ( - 'user_id'=>'id', - 'email_address'=>'email', - 'first_name'=>'firstName', - 'last_name'=>'lastName', - ); - public $id; - public $username; // nama kolom fisik dan logika sama - public $email; - public $firstName; - public $lastName; - //.... -} - -

-Dengan pemetaan kolom di atas, kita mengalamatkan first_name menggunakan $userRecord->firstName -daripada $userRecord->first_name. Ini membantu pemisahan dari logika dengan model. -

- -

Referensi

- - -
diff --git a/demos/quickstart/protected/pages/Database/id/DAO.page b/demos/quickstart/protected/pages/Database/id/DAO.page deleted file mode 100755 index 8ccfb149..00000000 --- a/demos/quickstart/protected/pages/Database/id/DAO.page +++ /dev/null @@ -1,163 +0,0 @@ - -

Data Access Object (DAO)

- -

-Obyek Akses Data atau Data Access Object (DAO) memisahkan data sumber daya antarmuka klien dari mekanisme akses datanya. Ia mengadaptasi API akses sumber daya ke antarmuka klien generik. Hasilnya, mekanisme akses data dapat diubah tersendiri atas kode yang menggunakan data. -

-

-Sejak versi 3.1, PRADO mulai menyediakan DAO yang adalah pelapis tipis sekitar PHP Data Objects (PDO). Meskipun PDO memiliki set fitur bagus dan API yang baik, kami memilih untuk mengimplementasikan PRADO DAO di atas PDO karena kelas PRADO DAO adalah kelas komponen dan bisa dikonfigurasi dalam aplikasi PRADO. Para pengguna dapat menggunakan kelas DAO ini dalam cara yang lebih disukai-PRADO. -

-
Catatan: -Karena PRADO DAO didasarkan pada PDO, ekstensi PDO PHP perlu diinstalasi. Sebagai tambahan, Anda perlu menginstalasi driver PDO database terkait untuk digunakan dalam aplikasi Anda. Lihat lebih jelasnya dalam PHP Manual. -
-

-PRADO DAO sebagian besar terdiri dari empat kelas (kebalikan dari PDO yang hanya dua kelas, PDO dan PDOStatement): -

-
    -
  • TDbConnection - mewakili koneksi ke database.
  • -
  • TDbCommand - mewakili pernyataan SQL yang dijalankan terhadap database.
  • -
  • TDbDataReader - mewakili stream hanya-maju atas stream baris dari set hasil query.
  • -
  • TDbTransaction - mewakili transaksi DB.
  • -
-

-Berikutnya, kami memperkenalkan penggunaan PRADO DAO dalam skenario yang berbeda. -

- -

Menetapkan Koneksi Database

-

-Untuk menetapkan koneksi database, seseorang membuat turunan TDbConnection dan mengaktifkannya. Nama sumber data (DSN) diperlukan guna menetapkan informasi yang dibutuhkan untuk menyambung ke database. Nama pengguna dan kata sandi database mungkin perlu disertakan untuk menetapkan koneksi. -

- -$connection=new TDbConnection($dsn,$username,$password); -// panggil setAttribute() untuk mengirim parameter koneksi tambahan -// $connection->Persistent=true; // gunakan koneksi persisten -$connection->Active=true; // koneksi terlaksana -.... -$connection->Active=false; // koneksi ditutup - -

-Spesifikasi lengkap terhadap DSN dapat ditemukan dalam dokumentasi PDO. Di bawah ini adalah daftar format DNS paling umum dipakai: -

-
    -
  • MySQL - mysql:host=localhost;dbname=test
  • -
  • SQLite - sqlite:/path/to/dbfile
  • -
  • ODBC - odbc:SAMPLE -
-

-Dalam hal terjadi kesalahan ketika menetapkan koneksi (seperti DSN atau nama pengguna/sandi salah), TDbException akan dimunculkan. -

- -

Menjalankan Pernyataan SQL

-

-Sekali koneksi database terlaksana, pernyataan SQL dapat dijalankan melalui TDbCommand. Seseorang membuat TDbCommand dengan memanggil TDbConnection.createCommand() dengan pernyataan SQL yang ditetapkan: -

- -$command=$connection->createCommand($sqlStatement); -// jika diperlukan, pernyataan SQL dapat dimutakhirkan seperti berikut: -$command->Text=$newSqlStatement; - - -

-Pernyataan SQL dijalankan melalui TDbCommand dalam salah satu dari dua cara berikut: -

-
    -
  • execute() - melakukan pernyataan SQL non-query, seperti INSERT, UPDATE dan DELETE. Jika berhasil, ia mengembalikan jumlah baris yang dipengaruhi oleh eksekusi.
  • -
  • query() - melakukan pernyataan SQL yang mengembalikan baris data, seperti SELECT. Jika berhasil, ia mengembalikan turunan TDbDataReader dari salah satu yang bisa mengambil hasil baris data. -
  • -
- -$affectedRowCount=$command->execute(); // jalankan SQL non-query -$dataReader=$command->query(); // jalankan query SQL -$row=$command->queryRow(); // jalankan query SQL dan kembalikan hasil baris pertama -$value=$command->queryScalar(); // jalankan query SQL dan kembalikan nilai kolom pertama - -

-Dalam hal terjadi kesalahan selama eksekusi pernyataan SQL, TDbException akan dimunculkan. -

- -

Mengambil Hasil Query

-

-Setelah TDbCommand.query() membuat turunan TDbDataReader, seseorang dapat mengambil baris dari data hasil dengan memanggil TDbDataReader.read() secara berulang. Seseorang juga bisa menggunakan TDbDataReader dalam konstruksi bahasa PHP foreach untuk mengambil baris demi baris. -

- -// memanggil read() secara berulang sampai ia mengembalikan false -while(($row=$dataReader->read())!==false) { ... } -// menggunakan foreach untuk menjelajah melalui setiap baris data -foreach($dataReader as $row) { ... } -// mengambil semua baris sekaligus dalam satu array tunggal -$rows=$dataReader->readAll(); - - -

Menggunakan Transaksi

-

-Ketika aplikasi menjalankan beberapa query, setiap pembacaan dan/atau penulisan informasi dalam database, penting untuk memastikan bahwa datanase tidak dibiarkan dengan hanya beberapa query yang dibawanya. Transaksi, mewakili turunan TDbTransaksi dalam PRADO, dapat diinisialisasi dalam hal ini: -

-
    -
  • Mulai transaksi.
  • -
  • Jalankan query satu demi satu. Setiap memutakhirkan ke database tidak terlihat bagi dunia luar.
  • -
  • Komit transaksi. Pemutakhiran menjadi terlihat jika transaksi berhasil.
  • -
  • Jika salah satu query gagal, seluruh transaksi digulung kembali.
  • -
- -$transaction=$connection->beginTransaction(); -try -{ - $connection->createCommand($sql1)->execute(); - $connection->createCommand($sql2)->execute(); - //.... eksekusi SQL lain - $transaction->commit(); -} -catch(Exception $e) // eksepsi dimunculkan jika query gagal -{ - $transaction->rollBack(); -} - - - -

Mengikat Parameter

-

-Guna menghindari serangan injeksi SQL dan untuk meningkatkan performansi dari eksekusi pernyataan SQL yang dipakai secara berulang-ulang, seseorang dapat "menyiapkan" pernyataan SQL dengan tempat parameter opsional yang akan diganti dengan parameter sebenarnya selama proses pengikatan parameter. -

-

-Tempat parameter dapat bernama (diwakili dengan token unik) ataupun tidak bernama (diwakili dengan tanda tanya). Panggil TDbCommand.bindParameter() atau TDbCommand.bindValue() untuk mengganti tempat ini dengan parameter aktual. Parameter tidak perlu diberi tanda kutip: driver database melakukan ini bagi Anda. Pengikatan parameter harus dikerjakan sebelum pernyataan SQL dijalankan. -

- -// sebuah SQL dengan dua tempat ":username" dan ":email" -$sql="INSERT INTO users(username, email) VALUES(:username,:email)"; -$command=$connection->createCommand($sql); -// ganti tempat ":username" dengan nilai username sebenarnya -$command->bindParameter(":username",$username,PDO::PARAM_STR); -// ganti tempat ":email" dengan nilai email sebenarnya -$command->bindParameter(":email",$email,PDO::PARAM_STR); -$command->execute(); -// sisipkan baris lain dengan set parameter baru -$command->bindParameter(":username",$username2,PDO::PARAM_STR); -$command->bindParameter(":email",$email2,PDO::PARAM_STR); -$command->execute(); - -

-Metode bindParameter() dan bindValue() sangat mirip. Perbedaanya hanyalah pembentuk mengikat parameter dengan referensi variabel PHP sementara yang terkahir dengan nila. Untuk parameters yang mewakili blok memori data besar, pembentuk lebih disukai untuk pertimbangan performansi. -

-

-Untuk lebih jelasnya mengenai pengikatan parameter, lihat dokumentasi PHP terkait. -

- - -

Mengikat Kolom

-

-Ketika mengambil hasil query, seseorang dapat juga mengikat kolom dengan bariabel PHP agar dipopulasikan secara otomatis dengan data terbaru setiap kali baris diambil. -

- -$sql="SELECT username, email FROM users"; -$dataReader=$connection->createCommand($sql)->query(); -// ikat kolom ke-1 (username) dengan variabel $username -$dataReader->bindColumn(1,$username); -// ikat kolom ke-2 (email) dengan variabel $email -$dataReader->bindColumn(2,$email); -while($dataReader->read()!==false) -{ - // $username dan $email berisi username dan email dalam baris sekarang -} - - -
diff --git a/demos/quickstart/protected/pages/Database/id/Scaffold.page b/demos/quickstart/protected/pages/Database/id/Scaffold.page deleted file mode 100755 index e9f15b39..00000000 --- a/demos/quickstart/protected/pages/Database/id/Scaffold.page +++ /dev/null @@ -1,130 +0,0 @@ - -

Tampilan Scaffold Rekaman Aktif

- -

Kelas Rekaman Aktif dapat digunakan dengan - -dan - -( -mengaitkan TScaffoldListView dan TScaffoldEditView) untuk membuat aplikasi web Create/Read/Update/Delete (CRUD) sederhana.

- -

Tampilan scaffold dimaksudkan untuk membantu dalam membuat prototipe aplikasi web, tidak didesain sebagai yang bisa dikustomisasi atau serumit komponen misalnya -TDataGrid. Tampilan scaffold menyediakan fungsionalitas builtin: -

- -
    -
  • Mendaftar semua item rekaman aktif.
  • -
  • Mencari rekaman.
  • -
  • Memilah halaman dan mengurut.
  • -
  • Menghapus item.
  • -
  • Menyisipkan item baru.
  • -
  • Memutakhirkan item yang ada.
  • -
  • Memvalidasi field dan tipe data dasar yang diperlukan.
  • -
  • Menyajikan kontrol khusus seperti pengambil tanggal.
  • -
- -

Tampilan Scaffold berdiri sendiri pada Rekaman Aktif dan saat ini mendukung database: Mysql, Sqlite dan Postgres SQL. Dukungan untuk database lain dapat diputuskan bila ada permintaan yang cukup.

- -

Menyiapkan Tampilan Scaffold

-

Untuk menggunakan tampilan scaffold, pertama kita mendefinisikan kelas Rekaman Aktif yang mewakili tabel atau view dalam database. Tetapkan kelas Rekaman Aktif berikut yang berkaitan dengan tabel users -seperti didefinisikan dalam halaman Rekaman Aktif. -

- - -class UserRecord extends TActiveRecord -{ - const TABLE='users'; - - public $username; - public $email; -} - - -

Kelas tampilan scaffold ada di System.Data.ActiveRecord.Scaffold.* -namespace. -namespace ini bisa diimpor ke -Konfigurasi Aplikasi -menggunakan file application.xml atau melalui kode php menggunakan metode Prado::using(). Untuk mulai menggunakan - -cukup setel nilai properti RecordClass sama dengan nama kelas Rekaman Aktif. -

- - -<com:TScaffoldView RecordClass="UserRecord" /> - - -

Kode di atas akan mendaftar rekaman saat ini dalam tabel users. -Setiap rekaman dapat diedit dengan mengklik tombol "edit" dan dihapus dengan mengklik tombol "delete". Rekaman baru bisa ditambahkan dengan mengklik pada tombol "Add new record", masukkan beberapa data (perhatikan validasi otomatis terhadap field dan tipe data yang diperlukan), dan klik tombol "save". -Menetapkan batas pencarian dalam kotak teks cari guna menemukan rekaman tertentu. Akhirnya, daftar rekaman bisa disimpan pada setiap kolom dengan mengubah kolom pengurutan serta urutan. -

- -

TScaffoldView adalah kontrol template yang dibuat dari kontrol scaffold lainnya. -Properti berikut memberikan akses ke kontrol gabungan ini.

-
    -
  • ListView -- TScaffoldListView menampilkan daftar rekaman.
  • -
  • EditView -- TScaffoldEditView yang menyajikan input untuk mengedit dan menambah rekaman.
  • -
  • SearchControl -- TScaffoldSearch bertanggung jawab atas pencarian antarmuka pengguna.
  • -
-

- Semua kontrol gabungan ini bisa dikustomisasi seperti yang akan kita lihat di bawah. -

- -

TScaffoldListView

- -

Daftar Rekaman Aktif dapat ditampilkan menggunakan TScaffoldListView dengan properti berguna berikut.

-
    -
  • Header -- TRepeater menampilkan properti/nama field Rekaman Aktif.
  • -
  • Sort -- TDropDownList menampilkan kombinasi properti dan kemungkinan urutannya.
  • -
  • Pager -- kontrol TPager menampilkan link dan/atau tombol yang menavigasi ke halaman berbeda dalam data Rekaman Aktif.
  • -
  • List -- TRepeater yang menyajikan baris data Rekaman Aktif.
  • -
- -

Penyajian kustom dari Rekaman Aktif dapat dicapai dengan menetapkan properti ItemTemplate dan/atau AlternatingItemTemplate dari pengulang List. -TScaffoldListView akan mendengarkan dua event perintah bernama "delete" dan "edit". Perintah "delete" akan menghapus rekaman untuk baris di mana perintah "delete" berasal. -Perintah "edit" akan memaksa data rekaman untuk diedit oleh -TScaffoldEditView dengan ID yang ditetapkan dengan properti EditViewID. -Contoh berikut mendaftar nama pengguna hanya dengan format tebal. -

- - -<com:TScaffoldListView RecordClass="UserRecord" > - <prop:List.ItemTemplate> - <strong><%# $this->Data->username %></strong> - </prop:List.ItemTemplate> -</com:TScaffoldListView> - - -
Info: -Untuk TScaffoldView, tampilan daftar dapat diakses melalui properti ListView dari TScaffoldView. -Selanjutnya, subproperti ListView.List.ItemTemplate pada TScaffoldView -adalah sama dengan subproperti List.ItemTemplate dari TScaffoldListView dalam contoh di atas. -
- -

Properti SearchCondition dan properti SearchParameters (mengambil nilai array) bisa ditetapkan untuk mengkustomisasi rekaman yang ditampilkan. SearchCondition -akan dipakai sebagai properti Condition dari TActiveRecordCriteria -dan properti SearchParameters berkaitan dengan properti -Parameters dari TActiveRecordCriteria.

- -

TScaffoldEditView

- -<com:TScaffoldEditView RecordPk="user1" RecordClass="UserRecord" /> - - -

Menggabungkan tampilan daftar + edit

- - -<com:TScaffoldEditView ID="edit_view" RecordClass="UserRecord" /> -<com:TScaffoldListView EditViewID="edit_view" RecordClass="UserRecord" /> - - -

Mengkustomisasi TScaffoldView

- -<com:TScaffoldView RecordClass="UserRecord" > - <prop:ListView.List.ItemTemplate> - <%# $this->DataItem->username %> - <com:TLinkButton Text="Edit" CommandName="edit" /> - </prop:ListView.List.ItemTemplate> -</com:TScaffoldView/> - - -
diff --git a/demos/quickstart/protected/pages/Database/id/SqlMap.page b/demos/quickstart/protected/pages/Database/id/SqlMap.page deleted file mode 100755 index 4b5041cc..00000000 --- a/demos/quickstart/protected/pages/Database/id/SqlMap.page +++ /dev/null @@ -1,210 +0,0 @@ - - -

Pemeta Data

- -

Pemeta Data memindahkan data antara obyek dan database sementara memeliharanya berdiri sendiri satu sama lain dan pemetanya sendiri. Jika Anda mulai dengan - Active Records, mungkin nantinya Anda dihadapkan dengan obyek bisnis lebih kompleks seiring denga kemajuan proyek Anda. Ketika Anda membangun model obyek dengan banyak logika bisnis, sangat berharga untuk memakai mekanisme ini untuk mengatur data lebih baik dan perilaku bersamanya. Melakukan itu menyebabkan skema varian; yakni skema obyek dan skema relasional tidak sama. -

- -

Pemeta Data memisahkan obyek dalam-memori dari database. Tanggung jawabnya adalah mentransfer data diantara keduanya dan juga saling mengisolasinya. - Dengan Pemeta Data obyek dalam-memori tidak perlu mengetahui meskipun ada sebuah database; tidak perlu kode antarmuka SQL, dan tentunya tidak mengetahui skema database. (Skema database selalu diabaikan dari obyek yang memakainya.) -

- -

Kapan Menggunakannya

-

Tujuan utama menggunakan Pemeta Data ialah ketika Anda menginginkan skema database dan model obyek tumbuh secara independen. Keuntungan utama dari Pemeta Data adalah bahwa saat bekerja pada obyek bisnis (atau domain) Anda bisa mengabaikan database, baik dalam desain maupun pembangunan propes pengujian. Obyek domain tidak mengetahui struktur databasenya karena semua ini dikerjakan oleh pemeta. -

- -

Ini membantu Anda dalam kode karena Anda bisa mengerti serta bekerja dengan obyek domain tanpa harus mengerti bagaimana ia disimpan dalam. Anda bisa memodifikasi model bisnis atau database tanpa harus mengubahnya. Dengan pemetaan rumit, terutama yang menyangkut database yang sudah ada, ini sangat berharga. -

- -

Harga tentunya merupakan lapisan ekstra yang tidak Anda peroleh dengan Rekaman Aktif, maka pengujian menggunakan pola ini adalah kompleksitas dari logika bisnis. Jika Anda memiliki logika bisa cukup sederhana, Rekaman Aktif mungkin akan mencukupi. -Untuk logika yang lebih rumit, Pemeta Data mungkin lebih cocok. -

- -

Pemeta Data SqlMap

-

Kerangka kerja Pemeta Data SqlMap memudahkan untuk menggunakan database dengan aplikasi PHP. - PemetaData SqlMap memasangkan obyek dengan prosedur tersimpan atau pernyataan SQL menggunakan deskriptor XML. Kesederhanaan adalah keuntungan terbesar dari PemetaData SqlMap di atas piranti pemetaan relasional obyek. Untuk menggunakan PemetaData SqlMap Anda bergantung pada obyek Anda sendiri, - XML, dan SQL. Anda sedikit yang harus mempelajari yang belum Anda ketahui. - Dengan Pemeta Data SqlMap Anda mempunyai tenaga penuh pada SQL dan prosedur tersimpan di tangan Anda. -

- -

- alt="Tinjauan Pemeta Data SqlMap" id="fig:sqlmap.png" class="figure"/> - - Ini adalah penjelasan tingkat tinggi atas alur kerja yang dilukiskan pada gambar di atas. - Menyediakan parameter, baik sebagai obyek ataupun tipe primitif. Parameter bisa dipakai untuk menyetel nilai runtime dalam pernyataan SQL atau prosedur. Jika nilai runtime tidak diperlukan, parameter dapat diabaikan. -

-

Menjalankan pemetaan dengan mengirimkan parameter dan nama yang Anda berikan pada deskriptor XML Anda. Langkah ini adalah saat di mana keajaiban terjadi. Kerangka kerja akan menyiapkan pernyataan SQL atau prosedur tersimpan, menyetel setiap nilai runtime menggunakan parameter Anda, menjalankan prosedur atau pernyataan, dan mengembalikan hasil. -

- -

Dalam hal pemutakhiran, jumlah baris yang dipengaruhi dikembalikan. Dalam hal query, obyek tunggal, atau koleksi obyek dikembalikan. Seperti parameter, obyek hasil, atau koleksi obyek, bisa berupa obyek biasa ataupun tipe PHP primitif. -

- -

Menyiapkan koneksi database dan menginisialisasi SqlMap

-

- Koneksi database untuk SqlMap dapat disetel seperti berikut. - Lihat Menetapkan Koneksi Database untuk lebih jelasnya mengenai pembuatan koneksi database secara umum. - -//buat koneksi dan berikan ke manajer SqlMap. -$dsn = 'pgsql:host=localhost;dbname=test'; //Postgres SQL -$conn = new TDbConnection($dsn, 'dbuser','dbpass'); -$manager = new TSqlMapManager($conn); -$manager->configureXml('my-sqlmap.xml'); -$sqlmap = $manager->getSqlMapGateway(); - -

- -

- TSqlMapManager bertanggung jawab untuk menyiapkan koneksi database dan mengkonfigurasi SqlMap dengan file XML yang diberikan. metode configureXml() menerima string yang merujuk ke file konfigurasi XML SqlMap. Sekali dikonfigurasi, panggil metode getSqlMapGateway() untuk memperoleh turunan dari antarmuka gateway SqlMap (pakai obyek ini untuk menyisipkan/menghapus/mencari rekaman). -

- -

- Koneksi database SqlMap juga bisa dikonfigurasi menggunakan tag <module> dalam application.xml atau - config.xml seperti berikut. - - - - - - - -

- -

- Atribut ConfigFile harus menunjuk ke file konfigurasi SqlMap (dijelaskan nanti) baik menggunakan path absolut, path relatif ataupun path notasi titik namespace Prado (harus mengabaikan ekstensi ".xml"). - -

Tip: - Atribut EnableCache saat disetel "true" akan men-cache - konfigurasi yang diurai. Anda harus membersihkan atau menghapus cache jika Anda mengubah file konfigurasinya. - modul cache juga harus didefinisikan agar cache berfungsi. -
-

- -

Untuk mendapatkan antarmuka gateway SqlMap dari konfigurasi <module>, cukup lakukan misalnya - -class MyPage extends TPage -{ - public function onLoad($param) - { - parent::onLoad($param); - $sqlmap = $this->Application->Modules['my-sqlmap']->Client; - $sqlmap->queryForObject(...); //query beberapa obyek - } -} - -

- -

Contoh cepat

-

Mari kita anggap tabel "users" berikut yang berisi dua kolom bernama "username" dan "email", di mana "username" juga merupakan kunci primer. - -CREATE TABLE users -( - username VARCHAR( 20 ) NOT NULL , - email VARCHAR( 200 ) , - PRIMARY KEY ( username ) -); - -

-

Kemudian kita mendefinisikan kelas User biasa seperti berikut. Perhatikan bahwa User sangat sederhana. - -class User -{ - public $username; - public $email; -} - -

-

- -

Selanjutnya, kita perlu mendefinisikan file konfigurasi XML SqlMap, mari namai file sebagai my-sqlmap.xml. - - - - - - -

-

Tag <select> mengembalikan definisi pernyataan SQL. Atribut id akan dipakai sebagai pengenal untuk query. Nilai atribut resultClass adalah nama kelas obyek yang dikembalikan. - Sekarang kita dapat melakukan query obyek sebagai berikut: - - -//anggap bahwa $sqlmap adalah turunan TSqlMapGateway -$userList = $sqlmap->queryForList("SelectUsers"); - -//Atau hanya satu, jika hanya itu yang Anda butuhkan: -$user = $sqlmap->queryForObject("SelectUsers"); - -

- -

Contoh di atas hanya menampilkan demonstrasi sedikit kemampuan Pemeta Data SqlMap. Rincian selanjutnya dapat ditemukan dalam - SqlMap Manual. -

- -

Menggabung SqlMap dengan Rekaman Aktif

-

Contoh di atas nampaknya seperti sepele dan ia juga seperti banyak pekerjaan hanya untuk mengambil data. Akan tetapi, perhatikan bahwa kelas User sama sekali tidak mengetahui telah disimpan dalam database, dan database tidak mengetahui kelas User. -

-

- Salah satu keuntungan dari SqlMap adalah kemampuan memetakan hubungan - obyek yang kompleks, koleksi dari datbase yang sudah ada. Dilain pihak, - Rekaman Aktif menyediakan cara - yang sangat sederhana untuk berinteraksi dengan database tapi tidak bisa - melakukan hubungan atau koleksi yang lebih rumit. Kompromi yang baik adalah - menggunakan SqlMap untuk mengambil hubungan dan koleksi rumit sebagai - obyek Rekaman Aktif dan kemudian menggunakan Rekaman Aktif ini untuk memutakhirkan, menyisipkan dan menghapus. -

-

Melanjutkan contoh sebelumnya, kita mengubah definisi kelas User menjadi sebuah Rekaman Aktif. - -class UserRecord extends TActiveRecord -{ - const TABLE='users'; //nama tabel - - public $username; //kolom bernama "username" dalam tabel "users" - public $email; - - /** - * @return TActiveRecord active record finder instance - */ - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - -

- -

Kita juga perlu mengubah definisi dari konfigurasi XML SqlMap XML configuration. Kita cukup perlu mengubah nilai atribut resultClass ke UserRecord. - - - - - - -

- - -

Kode PHP untuk mengambil pengguna tetap sama, tapi sebaliknya SqlMap mengembalikan Rekaman Aktif, dan kita bisa mengambil keuntungan dari metode Rekaman Aktif. - - -//anggap bahwa $sqlmap adalah turunan TSqlMapGateway -$user = $sqlmap->queryForObject("SelectUsers"); - -$user->email = 'test@example.com'; //ubah data -$user->save(); //simpan menggunakan Rekaman Aktif - -

- -

Referensi

-
    -
  • Fowler et. al. Patterns of Enterprise Application Architecture, - Addison Wesley, 2002.
  • -
  • iBatis Team. iBatis Data Mapper, - http://ibatis.apache.org.
  • -
- -
diff --git a/demos/quickstart/protected/pages/Database/id/ar_objects.png b/demos/quickstart/protected/pages/Database/id/ar_objects.png deleted file mode 100755 index 50ab812d..00000000 Binary files a/demos/quickstart/protected/pages/Database/id/ar_objects.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/id/ar_relations.png b/demos/quickstart/protected/pages/Database/id/ar_relations.png deleted file mode 100755 index 48e29f48..00000000 Binary files a/demos/quickstart/protected/pages/Database/id/ar_relations.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/id/diagram.png b/demos/quickstart/protected/pages/Database/id/diagram.png deleted file mode 100755 index 0a0ca73d..00000000 Binary files a/demos/quickstart/protected/pages/Database/id/diagram.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/id/object_states.png b/demos/quickstart/protected/pages/Database/id/object_states.png deleted file mode 100755 index db194783..00000000 Binary files a/demos/quickstart/protected/pages/Database/id/object_states.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/id/sqlmap_active_record.png b/demos/quickstart/protected/pages/Database/id/sqlmap_active_record.png deleted file mode 100755 index 6d958d33..00000000 Binary files a/demos/quickstart/protected/pages/Database/id/sqlmap_active_record.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/pl/ActiveRecord.page b/demos/quickstart/protected/pages/Database/pl/ActiveRecord.page deleted file mode 100755 index 3a073e57..00000000 --- a/demos/quickstart/protected/pages/Database/pl/ActiveRecord.page +++ /dev/null @@ -1,1144 +0,0 @@ - -

Rekord Aktywny (ang. Active Record)

- -

Rekordy Aktywne są obiektami, które opakowują wiersz w bazie danych lub widoku, - obudowują (ang. encapsulate) dostęp do bazy danych oraz dziedziny logiki dla tych danych. - Podstawą Rekordu Aktywnego są klasy biznesowe np. klasa - Produkty, które są bardzo podobne do struktury rekordu należącego do bazy danych. Każdy Rekord Aktywny jest odpowiedzialny - za zapisywanie i łądowanie danych do i z bazy danych.

-
Info: - Struktura danych Rekordu Sktywnego powinna zgadzać się ze strukturą tablicy w bazie danych. - Każda kolumna w bazie danych powinna posiadać odpowiadający element: zmienną lub właściwość w klasie Rekordu Aktywnego reprezentującego tablicę. -
- -

Kiedy używać?

-

Rekord Aktywne jest dobrym wyborem dla dziedziny logiki, która nie jest zbyt złożona, tak jak tworzenie, odczyty, aktualizacje oraz usuwanie. - Pochocne (ang. derivations) oraz sprawdzenia bazujące na pojedyńczym rekordzie sprawdzają się dobrze w tej konstrukcji. - Rekord Aktywne ma podstawową zaletę, którą jest prostota. Łatwo jest stworzyć Rekord Aktywny, łatwo go również zrozuieć. -

- -

Jednakże, jeśli twoja logika biznesowa staje się coraz bardziej złożona, wkrótce będziesz chciał - używać bezpośrednich relacji, zbiorów, dziedziczenia twojego obiektu i tak dalej. Nie da się tego łatwo odwzorować za pomocą Rekordu Aktywnego, - a dodawanie ich po kawałku staje się bardzo kłopotliwe. Innym argumentem przeciw Rekordowi Aktywnemu jest fakt, że łączy model obiektowy z modelem baz danych. - To czyni trudniejszym refaktoring, gdy projekt idzie naprzód. -

- -

Alternatywą jest używanie wzorca Data Mapper (mapa danych), który odseparowuje role obiektu biznesowego od tego jak te obiekty są przechowywane. - Prado dostarcza - Prado provides a darmowy wybór pomiędzy rekordem aktywnym a SqlMap Data Mapper. - SqlMap Data Mapper może być uzywany do wczytania obiektów Rekordu Aktywnego, i na odwrót, te Rekordy Aktywne mogą zostać użyte do aktualizacji bazy danych. - Związek pomiędzy Rekordem Aktywnym a SqlMap przedstawiony jest na kolejnym diagramie. Więcej informacji związanych z SqlMap Data Mapper można znaleźć w - manualu SqlMap. - alt="Active Records and SqlMap DataMapper" id="fig:diagram.png" class="figure"/> -

- -

- Klasa Rekordu aktywnego posiada funkcjonalność do przeprowadzenia następujących zadań: -

-
    -
  • Tworzenie, zwracanie, aktualizowani i usuwanie recordów (CRUD)
  • -
  • metody wyszukujące obudowujące powszechnie używane zapytania SQL i zwracające obiekty Rekordu Aktywnego
  • -
  • Wydobywają relacje (powiazanych obcych obiektów) takie jak "posiada wiele" (ang. has many), "posiada jedno" (ang. has one), "należy do" (ang. belongs to) oraz wiele do wielu "many to many" poprzez tablice asocjacyjne.
  • -
  • Opóźnione ładowanie (ang. Lazy loading) relacji
  • -
-

Implikacje modelu

-

-Implementacja wzorca Aktywnego Rekordu w PRADO nie zapewnia referencyjnej tożsamości (ang. referential identity). Każdy istniejący obiekt używający -Rekordu Aktywnego jest koopią danych z bazy danych. Na przykład jeśli zapytasz o konkretnego klienta i zostanie zwrócony obiekt Klient, -to następnym razem kiedy zapytasz o tego klienta otrzymasz spowrotem inną instancję obiektu Klient. To implikuje, że ścisłe porównianie (np. używając ===) -zwróci fałsz, natomiast luźne porównianie (np. używając ==) zwróci prawdę jeśli wartości obiektu są równe poprzez luźne porónanie. -

-

-Jest to implikacja modelu wynikająca z następującego pytania: -"Czy myślisz o kliencie jako o obiekcie, którego któy jest tylko jeden, czy też myślisz o obiekcie na którym działasz jako o kopii bazy danych. -Inne mapowania O/R implikują, że istnieje tylko jeden obiekt Klienta z KlientID 100 -Other O/R mappings will imply that there is only one Customer object with custID 100 i to dosłownie jest ten klient. -Jeśli pobierzesz klienta i zmienisz pole w nim, wtedy masz zmienionego tego klienta. -"To kontroastuje z: zmieniłeś tą kopię klienta ale nie tamtą kopię. -Jeśli dwóch ludzi zaktualizuje kleinta z dwóch kopii obiektu, kto zaktualizuje pierwszy lub być może ostanie wygrywa." [A. Hejlsberg 2003] -

- -

Wspierane bazy danych

-

-Implementacja Aktywnego Rekordu wykorzystuje kalsy Prado DAO by uzyskać dostęp do danych. Aktualna implementacja Aktywnego Rekordu wspiera następujace bazy danych -

- -

Wsparcie dla pozostałych baz danych może zostać wprowadzone, keidy będzie dostatecne zapotrzebowanie

- -

Definiowanie Aktywnego Rekordu

-

Rozważmy następującą tablicę "users", która zawiera dwie kolumny nazwane "username" oraz "email", - gdzie "username" jest kluczem głównym. - -CREATE TABLE users -( - username VARCHAR( 20 ) NOT NULL , - email VARCHAR( 200 ) , - PRIMARY KEY ( username ) -); - -

-

Następnie zdefiniujemy naszą klasę Rekordu Aktywnego odpowiadającą tablicy "users". - -class UserRecord extends TActiveRecord -{ - const TABLE='users'; //nazwa tablicy - - public $username; //kolumna nazwana "username" w tablicy "users" - public $email; - - /** - * @return TActiveRecord intancja finder rekordu aktywnego - */ - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - -

-

Każda kolumna tablicy "users" musi posiadać odpowiadającą jej właściwość o tej samej nazwie co kolumna w tablicy w klasie UserRecord. - Oczywiście, możesz zdefiniować dodatkowe zmienne lub właściwości, które nie istnieją w strukturze tablicy. - Stała TABLE jest opcjonalna w klasie , kiedy nazwa klasy jest taka sama jak nazwa tablicy w bazie danych, w przeciwnym przypadku TABLE - musi określać nazwę tablicy, która odpowiada klasie Rekordu Aktywnego. -

- -
Tip: -Możesz określić kwalifikowane (ang. qualified) nazwy tablic np dla MySQL, TABLE = "`bazadanych1`.`tablica1`". -
- -

- Odkąd TActiveRecord rozszerza TComponent, metody setter i getter mogą zostać zdefiniowane - by umożliwić kontrolę nad tym jak zmienne są ustawiane i zwracane. Na przykłąd dodanie właściwości $level - do klasy UserRecord: -

- -class UserRecord extends TActiveRecord { - ... //istniejąca uprzednio część definicji - - private $_level; - public function setLevel($value) { - $this->_level=TPropertyValue::ensureInteger($value,0); - } - public function getLevel($value){ - return $this->_level; - } -} - -

Więcej szczegółów dotyczących TComponent można znaleźć dokumentacji komponentów. -Później użyjemy metod getter/setters by umożliwić opóźnione ładowanie (ang. lazy loading) obiektów relacji. -

- -
Info: -TActiveRecord może również działać z widokami poprzez przypisanie do stałej TABLE - odpowiedniej nazwy widoku. Jednakże obiektu zwracane przez widoki są tylko do odczytu, wywołanie metod save() lub delete() -spowoduje wywołanie wyjątku. -
- -

- Metoda statyczna finder() zwraca instancję UserRecord, która może zostać użyta do załadowania rekordów z bazy. - Ładowanie rekordów za pomocą tej metody będzie omówione później. Statyczna metoda TActiveRecord::finder() - pobiera nazwę klasy Rekord Aktywnego jako parametr. -

- -

Ustanawianie połączenia z bazą danych

-

- Domyślne połączenie z bazą dla Rekordu Aktywnego może zostać ustawione następujaco. - Zobacz Ustanawianie połączenia z bazą - by uzyskać ogólnie dalsze szczegóły odnośnie tworzenia połączenia z bazą danych. -

- -//utwóz połączenie i przekaż je do menadżera Rekordu Aktywnego -$dsn = 'pgsql:host=localhost;dbname=test'; //Postgres SQL -$conn = new TDbConnection($dsn, 'dbuser','dbpass'); -TActiveRecordManager::getInstance()->setDbConnection($conn); - - -

Alternatywnie, możesz stworzyć klasę bazową i nadpisać metodę getDbConnection() -do zwracania połączenia z bazą. To jest prosty spodób, by umożliwić wielkokrotne połączenia do wielu baz danych. - Następujący kod demonstruje definiowanie połączenia z bazą danych w klasie bazowej (nie ma potrzeby by ustawiać połączenie DB gdziekolwiek indziej). -

- -class MyDb1Record extends TActiveRecord -{ - public function getDbConnection() - { - static $conn; - if($conn===null) - $conn = new TDbConnection('xxx','yyy','zzz'); - return $conn; - } -} -class MyDb2Record extends TActiveRecord -{ - public function getDbConnection() - { - static $conn; - if($conn===null) - $conn = new TDbConnection('aaa','bbb','ccc'); - return $conn; - } -} - - - -

Używanie application.xml w frameworku Prado

-
-

- Domyślne połączenie z bazą może zostać również skonfigurowane używając tagu <module> - w pliku application.xml - lub config.xml następująco: - - - - - - - -

Wskazówka: - Atrybut EnableCache gdy ustawiony na "true" będzie keszował metadane tablicy, to oznacza, że nazwy kolumn, indeksy i ograniczenia (ang. constraints) - są zapisywane w keszu i używane ponownie. Musisz wyczyścić lub wyłączyć kesz jeśli chcesz zobaczyć wprowadzone zmiany do definicji twoich tablic. - Moduł keszowania musi być również zdefiniowany dla keszu by zadziałał. -
-

- -

Do właściwość ConnectionID może zostać przypisana wartość ID z konfiguracji z innego modułu - TDataSourceConfig. To pozwala uyżywać to połączenie z bazą danych w innych modułach, takich jak SqlMap (mapa SQL). - - - - - - - - - - - -

-
- -

Ładowanie danych z tablicy

-

- Klasa TActiveRecord dostarcza wielu wygodnych metod do wyszukiwania rekordów z bazy danych. - Najprostszym jest znajdowanie jednego rekordu poprzez dopasowanie klucza głównego lub klucza złożonego (ang. composite key) - (klucz główny skłądający się z wielu kolumn). - Zobacz by dowiedzieć się więcej. -

- -
Info: -Wszystkie metody wyszukujące, które mogą zwrócić tylko 1 rekord zwrócą null jeśli nie znajdą pasujących danych. -Wszystkie metody wyszukujące, które zwracają tablicę rekordów zwrócą pustą tablicęm jeśli nie znajdą pasujących danych. -
- -

findByPk()

-

Znajduje jeden rekord używając klucza głównego lub klucza złożonego. - -$finder = UserRecord::finder(); -$user = $finder->findByPk($primaryKey); - -//kiedy tablica używa klucza złożonego -$record = $finder->findByPk($key1, $key2, ...); -$record = $finder->findByPk(array($key1, $key2,...)); - -

- -

findAllByPks()

-

Znajduje wiele rekordów używając listy kluczy głównych lub kluczy złożonych. -Co następuje jest odpowiednie dla kluczów głównych (klucz główny składa się tylko z jednego pola/kolumny) -

- -$finder = UserRecord::finder(); -$users = $finder->findAllByPks($key1, $key2, ...); -$users = $finder->findAllByPks(array($key1, $key2, ...)); - -Co następuje jest odpowiednie dla kluczów złożonych: - -//kiedy tablica używa klucza złożonego -$record = $finder->findAllByPks(array($key1, $key2), array($key3, $key4), ...); - -$keys = array( array($key1, $key2), array($key3, $key4), ... ); -$record = $finder->findAllByPks($keys); - - - -

find()

-

Znajduje pojedyńczy rekord, który spełnia kryteria. Kryteria mogą być częściowym łąńcuchem SQL lub obiektem TActiveRecordCriteria

- -$finder = UserRecord::finder(); - -//:name oraz :pass są pojemnikami dla konkretnych wartości $name oraz $pass -$finder->find('username = :name AND password = :pass', - array(':name'=>$name, ':pass'=>$pass)); - -//użycie znaków zastępczych -$finder->find('username = ? AND password = ?', array($name, $pass)); -//jak wyżej -$finder->find('username = ? AND password = ?', $name, $pass); - -//$criteria są typu TActiveRecordCriteria -$finder->find($criteria); //drugi parametr dla find() jest zignorowany. - - -

Klasa TActiveRecordCriteria ma następujące właściwości: -

-
    -
  • Parameters -- pary wartość nazwa parametru.
  • -
  • OrdersBy -- nazwa kolumny i sortowanie par
  • -
  • Condition -- część WHERE zapytania SQL
  • -
  • Limit -- maksymalna ilość rekordów, któe zostaną zwrócone.
  • -
  • Offset -- offset rekordów w tablicy.
  • -
- - -$criteria = new TActiveRecordCriteria; -$criteria->Condition = 'username = :name AND password = :pass'; -$criteria->Parameters[':name'] = 'admin'; -$criteria->Parameters[':pass'] = 'prado'; -$criteria->OrdersBy['level'] = 'desc'; -$criteria->OrdersBy['name'] = 'asc'; -$criteria->Limit = 10; -$criteria->Offset = 20; - - -
Przypis: -For MSSQL and when Limit and Offset are positive integer values. The -actual query to be executed is modified by the - -class according to -http://troels.arvin.dk/db/rdbms/ -to emulate the Limit and Offset conditions. -
- -

findAll()

-

Podobnie jak find() ale zwraca tablicę obiektów.

- -

findBy*() oraz findAllBy*()

-

Dynamiczne metody wyszukujące używające część nazwy metody jako kryteria wyszukiwania. -Metody zaczynające się od słów findBy zwracają tylko 1 rekord natomiast metody zaczynające się findAllBy zwracają tablicę obiektów. -Warunej jest wzięty jako część nazwy metody po przedrostku findBy lub findAllBy. - -Następujące bloki kodów są sobie równoważne: -

- -$finder->findByName($name) -$finder->find('Name = ?', $name); - - - -$finder->findByUsernameAndPassword($name,$pass); -$finder->findBy_Username_And_Password($name,$pass); -$finder->find('Username = ? AND Password = ?', $name, $pass); - - - -$finder->findAllByAge($age); -$finder->findAll('Age = ?', $age); - - -
Tip: -Możesz również użyć połączenia AND oraz OR jako warunek w dynamicznych metodach. -
- -

findBySql() oraz findAllBySql()

-

Znajdują rekordy używając pełnego zapytania SQL z tym, że findBySql() -zwraca Rekord Aktywny a findAllBySql()zwraca tablicę obiektów rekordów. -Dla każdej zwróconej kolumny, odpowiadająca klasa Rekordu Aktywnego musi posiadać zdefiniowaną zmienną lub właściwość odpowiadającą nazwie kolumny. - -class UserRecord2 extends UserRecord -{ - public $another_value; -} -$sql = "SELECT users.*, 'hello' as another_value FROM users"; -$users = TActiveRecord::finder('UserRecord2')->findAllBySql($sql); - -

-

count()

-

Zlicza ilość pasujących rekordów, akceptuje te same parametry co metoda findAll()

- -

Wstawianie i aktualizowanie rekordów

-

-Dodanie nowego rekordu za pomocą TActiveRecord jest bardzo łatwe, po prostu stwórz nowy obiekt Rekordu Aktywnego i wywołaj metodę save(). Na przykład -

- -$user1 = new UserRecord(); -$user1->username = "admin"; -$user1->email = "admin@example.com"; -$user1->save(); //wstaw nowy rekord - -$data = array('username'=>'admin', 'email'=>'admin@example.com'); -$user2 = new UserRecord($data); //stwórz przekazując istniejące dane -$user2->save(); //wstaw nowy rekord - -
Wskazówka: -Obiekty są aktualizowe automatycznie o wartość klucza głównego dla tych tablic, które zawierają definicję -określającą automatyczne tworzenie klucza głównego dla nowo tworzonych rekordów (przyp. tłum. autoincrement). -Na przykład jeśli wstawiasz nowy rekord do tablicy MySQL która posiada kolumnę zdefiniowaną jako to obiekt Rekordu Aktywnego -zostanie zaktualizowant o nową zwiększoną wartość.
- -

-Aby zaktualizować rekord w bazie danych po prostu zmień jedną lub więcej właściwości obiektu Rekordu Aktywnego które zostały odczytane z bazy a następnie wywołaj metodę save(). - - -$user = UserRecord::finder()->findByName('admin'); -$user->email="test@example.com"; //zmiana właściwości -$user->save(); //zaktualizuj ją - -

- -

-Obiekt Rekordu Aktywnego posiada prosty cykl życia zilustrowany następujący diagram. -

- alt="Active Records Life Cycle" id="fig:cycle.png" class="figure"/> -

-Widzimy, że nowe obiekty Rekordu Aktywnego są tworzone zarówno przez jedną z metod find*() -lub poprzez stworzenie nowej instancji poprzez użycie polecenia PHP new. Obiekty stworzone przez metodę find*() -zaczynają ze stanem czysty (ang. clean). Nowa instancja TActiveRecord stworzona inaczej niż za pomocą metod find*() zaczyna ze stanem nowy (ang. new). -Kiedykolwiek wywołasz metodę save() na obiekcie TActiveRecord, obiekt przyjmuje stan czysty. -Obiekty będące czystymi stają się brudne (ang. dirty) kiedy jeden lub więcej ze stwoich wewnętrznych stanów ulegnie zmianie. -Wywoałanie metody delete() obiektu kończy cykl życia, żadne inne akcje nie mogą być wywołane na obiekcie. -

- -

Usuwanie istniejących obiektów

-

- Aby usunąc istniejący rekord, który jest załadowany, po prostu wywołaj metodę delete. - Możesz rónież usunąć rekord w bazie danych poprzez klucz główny bez ładowania żadnego rekordu używając metody - deleteByPk() (również metoda deleteAllByPks()). - Na przykład, aby usunąć jeden lub więcej rekordów z tabeli używając jednego lub wielu kluczów głównych: -

- -$finder->deleteByPk($primaryKey); //usuwanie 1 rekordu -$finder->deleteAllByPks($key1,$key2,...); //usuwanie wielu rekordów -$finder->deleteAllByPks(array($key1,$key2,...)); //usuwanie wielu rekordów - - -

-Dla klucza złożonego (ustalanego automatycznie na podstawie definicji tablicy): -

- -$finder->deleteByPk(array($key1,$key2)); //usuwanie 1 rekordu - -//usuwanie wielu rekordów -$finder->deleteAllByPks(array($key1,$key2), array($key3,$key4),...); - -//usuwanie wielu rekordów -$finder->deleteAllByPks(array( array($key1,$key2), array($key3,$key4), .. )); - - -

deleteAll() oraz deleteBy*()

-

-Aby usunąć używając kryteria użyj deleteAll($criteria) oraz deleteBy*() -z podobną składnią jak findAll($criteria) oraz findAllBy*() opisaną wcześniej. -

- -//usuwanie wszystkich rekordów z pasującym Name -$finder->deleteAll('Name = ?', $name); -$finder->deleteByName($name); - -//usuwanie na podstawie Name oraz Password -$finder->deleteBy_Username_And_Password($name,$pass); - - -

Tranzakcje

-

Wszystkie obiekkty Rekordu Aktywnego zawierają właściwość DbConnection, - która może być używana by uzyskać obiekt tranzakcyjny. - -$finder = UserRecord::finder(); -$finder->DbConnection->Active=true; //otwórz jeśli to konieczne -$transaction = $finder->DbConnection->beginTransaction(); -try -{ - $user = $finder->findByPk('admin'); - $user->email = 'test@example.com'; //zmień obiekt użytkownika $user - $user->save(); - $transaction->commit(); -} -catch(Exception $e) // wyjątek jest wołany jeśli zapytanie nie powiedzie się -{ - $transaction->rollBack(); -} - - -

Zdarzenia

-

-Rekord Aktywny oferuje dwa zdarzenia: OnCreateCommand oraz OnExecuteCommand. -

- -

Zdarzenie OnCreateCommand jest wołane gdy polecenie jest przygotowywane i przypisywanie (ang. binding) parametrów jest zakończone. - Parametrem obiektu jest TDataGatewayEventParameter, którego właściwość Command może być sprawdzona by otrzymać zapytanie, które będzie wykonane wykonywane. -

- -

-Zdarzenie OnExecuteCommand jest wywoływane kiedy polecenie jest wykonane i rezultat z bazy danych został zwrócony. - Parametrem obiektu jest TDataGatewayResultEventParameter, którego właściwość Result zawiera dane zwrócone z bazy danych. - Dane zwrócone mogą zostać zmienione poprzez ustawienie właściwości Result. -

- -

Przykład z logowaniem

-

Używając OnExecuteCommand możemy przypiąć uchwyt zdarzenia by logować całe -zapytanie SQL wwywoływane dla danej instancji lub klasy TActiveRecord. Na przykład definiujemy klasę bazową i nadpisujemy -metodę getDbConnection() lub konstruktor. -

- - -class MyDb1Record extends TActiveRecord -{ - public function getDbConnection() - { - static $conn; - if($conn===null) - { - $conn = new TDbConnection('xxx','yyy','zzz'); - $this->OnExecuteCommand[] = array($this,'logger'); - } - return $conn; - } - public function logger($sender,$param) - { - var_dump($param->Command->Text); - } -} -//alternatively as per instance of per finder object -function logger($sender,$param) -{ - var_dump($param->Command->Text); -} -TActiveRecord::finder('MyRecord')->OnExecuteCommand[] = 'logger'; -$obj->OnExecuteCommand[] = array($logger, 'log'); //dowolny poprawny callback PHP - - -

Relacje dla Rekordu Aktywnego

- -

-Implementacja Rekordu Aktywnego w Prado wspiera mapowanie kluczów obcych dla baz, które wspierają ograniczenia (ang. constraints) kluczów obcych. - Aby relacje dla Rekordu Aktywnego działały używana baza danych musi wspierać ograniczenia klucza głównego (np. MySQL używająca InnoDB) -

- -

-W następnych sekcjach będziemy rozważać nastepujące relacje pomiędzy tabelami Teams, Players, Skills oraz Profiles. -

- class="figure" /> - - -

Celem jest uzyskanie modelu obiektowego, który będzie reprezetnował w pewnym stopniu relacje pomiędzy polami z powyższego rysunku. -

- - class="figure" /> - -

-Istnieje rozbieżność pomiędzy relacjami w obiektach i relacjami w tablicach. - Po pierwsze jest różnica w reprezentacji. Obiekty trzymają powiązanie poprzez przechowywanie referencji, -które są trzymane poprzez zarządzające pamięcią środowiko uruchomieniowe. Bazy relacyjne trzymają powiązanie poprzez utworzenie klucza do innej tablicy. - Po drugie, obiekty mogą łatwo uzywać kolekcji by trzymać wielokrotnie referencje z jednego pola, -to handle multiple references from a single field, gdyż normalizacja zmusza wszystkie powiązania relacji encji by były pojedyńczymi wartościami. -To prowadzi do odwrócenia struktury danych pomiędzy obiektami i tablicami. -Podejście zastosowane w modelu Rekordu Aktywnego Prado uzywa ograniczeń kluczów obcych tablicy do wyprowadzenia relacji obiektów. -To implikuje fakt wspierania ograniczeń kluczów obcych dla bazy danych. -

-
Tip: -Dla baz danych SQLite możesz stworzyć tablice, które definiują ograniczenia kluczó obcych tak jak na przykładzie poniżej. -Jednakże te ograniczenia NIE SĄ narzucane przez samą bazę SQLite. - -CREATE TABLE foo -( - id INTEGER NOT NULL PRIMARY KEY, - id2 CHAR(2) -); -CREATE TABLE bar -( - id INTEGER NOT NULL PRIMARY KEY, - foo_id INTEGER - CONSTRAINT fk_foo_id REFERENCES foo(id) ON DELETE CASCADE -); - -
- -

Mapowanie kluczów obcych

-

Relacja pól pomiędzy tablicami Teams and Players jest znana jako relacja jeden-do-wielu (ang. 1-M). Oznacza to, że jeden Team moze zawierać zero lub więcej Players. Z punktu widzenia relacji obiektów -powiemy, że obiekt TeamRecord posiada wiele (ang. has many) obiektów PlayerRecord. -(Zauważ odwrócenie kierunku relacji pomiędzy tablicami a obiektami) -

- -

Relacja posiada wiele (ang. has Many Relationship)

-

-Zamodelujemy obiekt Team jako następującą klasę Rekordu Aktywnego. -

- -class TeamRecord extends TActiveRecord -{ - const TABLE='Teams'; - public $name; - public $location; - - public $players=array(); // this declaration is no longer needed since v3.1.2 - - //define the $player member having has many relationship with PlayerRecord - public static $RELATIONS=array - ( - 'players' => array(self::HAS_MANY, 'PlayerRecord', 'team_name'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - -

-The static $RELATIONS property of TeamRecord defines that the -property $players has many PlayerRecords. Multiple relationships -is permitted by defining each relationship with an entry in the $RELATIONS -array where array key for the entry corresponds to the property name. -In array(self::HAS_MANY, 'PlayerRecord'), the first element defines the -relationship type, the valid types are self::HAS_MANY, self::HAS_ONE, -self::BELONGS_TO and self::MANY_TO_MANY. -The second element is a string 'PlayerRecord' that corresponds to the -class name of the PlayerRecord class. -And the third element 'team_name' refers to the foreign key column in the Players table that -references to the Teams table. -

- -
Note: -As described in the code comment above, since version 3.1.2, related properties no longer -need to be explicitly declared. By default, they will be implicitly declared according to -keys of the $RELATIONS array. A major benefit of declared related properties implicitly -is that related objects can be automatically loaded in a lazy way. For example, assume we have -a TeamRecord instance $team. We can access the players via $team->players, -even if we have never issued fetch command for players. If $players is explicitly declared, -we will have to use the with approach described in the following to fetch the player records. -
- -

-The foreign key constraint of the Players table is used to determine the corresponding -Teams table's corresponding key names. This is done automatically handled -in Active Record by inspecting the Players and Teams table definitions. -

- -
Info: -Since version 3.1.2, Active Record supports multiple foreign key -references of the same table. Ambiguity between multiple foreign key references to the same table is -resolved by providing the foreign key column name as the 3rd parameter in the relationship array. -For example, both of the following foreign keys owner_id and reporter_id -references to the same table defined in UserRecord. - -class TicketRecord extends TActiveRecord -{ - public $owner_id; - public $reporter_id; - - public $owner; // this declaration is no longer needed since v3.1.2 - public $reporter; // this declaration is no longer needed since v3.1.2 - - public static $RELATION=array - ( - 'owner' => array(self::BELONGS_TO, 'UserRecord', 'owner_id'), - 'reporter' => array(self::BELONGS_TO, 'UserRecord', 'reporter_id'), - ); -} - -This is applicable to relationships including BELONGS_TO, HAS_ONE and -HAS_MANY. See section Self Referenced Association Tables for solving ambiguity of MANY_TO_MANY -relationships. -
- -

The "has many" relationship is not fetched automatically when you use any of the Active Record finder methods. -You will need to explicitly fetch the related objects as follows. In the code below, both lines -are equivalent and the method names are case insensitive. -

- -$team = TeamRecord::finder()->withPlayers()->findAll(); -$team = TeamRecord::finder()->with_players()->findAll(); //equivalent - -

-The method with_xxx() (where xxx is the relationship property -name, in this case, players) fetches the corresponding PlayerRecords using -a second query (not by using a join). The with_xxx() accepts the same -arguments as other finder methods of TActiveRecord, e.g. with_players('age = ?', 35). -

- -
Note: -It is essential to understand that the related objects are fetched using additional -queries. The first query fetches the source object, e.g. the TeamRecord in the above example code. -A second query is used to fetch the corresponding related PlayerRecord objects. -The usage of the two query is similar to a single query using Left-Outer join with the -exception that null results on the right table -are not returned. The consequence of using two or more queries is that the aggregates -and other join conditions are not feasible using Active Records. For queries outside the -scope of Active Record the SqlMap Data Mapper may be considered. -
- -
Info: -The above with approach also works with implicitly declared related properties (introduced -in version 3.1.2). So what is the difference between the with approach and the lazy loading -approach? Lazy loading means we issue an SQL query if a related object is initially accessed and not ready, -while the with approach queries for the related objects once for all, no matter the related objects -are accessed or not. The lazy loading approach is very convenient since we do not need to explictly -load the related objects, while the with approach is more efficient if multiple records are -returned, each with some related objects. -
- -

Has One Relationship

-

The entity relationship between Players and Profiles is one to one. That is, -each PlayerRecord object has one ProfileRecord object (may be none or null). -A has one relationship is nearly identical to a has many relationship with the exception -that the related object is only one object (not a collection of objects). -

- -

Belongs To Relationship

-

The "has many" relationship in the above section defines a collection of foreign -objects. In particular, we have that a TeamRecord has many (zero or more) -PlayerRecord objects. We can also add a back pointer by adding a property -in the PlayerRecord class that links back to the TeamRecord object, -effectively making the association bidirectional. -We say that the $team property in PlayerRecord class belongs to a TeamRecord object. -The following code defines the complete PlayerRecord class with 3 relationships. -

- -class PlayerRecord extends TActiveRecord -{ - const TABLE='Players'; - public $player_id; - public $age; - public $team_name; - - public $team; // this declaration is no longer needed since v3.1.2 - public $skills=array(); // this declaration is no longer needed since v3.1.2 - public $profile; // this declaration is no longer needed since v3.1.2 - - public static $RELATIONS=array - ( - 'team' => array(self::BELONGS_TO, 'TeamRecord', 'team_name'), - 'skills' => array(self::MANY_TO_MANY, 'SkillRecord', 'Player_Skills'), - 'profile' => array(self::HAS_ONE, 'ProfileRecord', 'player_id'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - -

-The static $RELATIONS property of PlayerRecord defines that the -property $team belongs to a TeamRecord. -The $RELATIONS array also defines two other relationships that we -shall examine in later sections below. -In array(self::BELONGS_TO, 'TeamRecord', 'team_name'), the first element defines the -relationship type, in this case self::BELONGS_TO; -the second element is a string 'TeamRecord' that corresponds to the -class name of the TeamRecord class; and the third element 'team_name' refers -to the foreign key of Players referencing Teams. -A player object with the corresponding team object may be fetched as follows. -

- -$players = PlayerRecord::finder()->with_team()->findAll(); - - -

- The method with_xxx() (where xxx is the relationship property - name, in this case, team) fetches the corresponding TeamRecords using - a second query (not by using a join). The with_xxx() accepts the same -arguments as other finder methods of TActiveRecord, e.g. -with_team('location = ?', 'Madrid'). -

- -
Tip: -Additional relationships may be fetched by chaining the with_xxx() together as the following -example demonstrates. - -$players = PlayerRecord::finder()->with_team()->with_skills()->findAll(); - -Each with_xxx() method will execute an additional SQL query. Every -with_xxx() accepts arguments similar to those in the findAll() method and is only -applied to that particular relationship query. -
- -

The "belongs to" relationship of ProfileRecord class is defined similarly.

- -class ProfileRecord extends TActiveRecord -{ - const TABLE='Profiles'; - public $player_id; - public $salary; - - public $player; // this declaration is no longer needed since v3.1.2 - - public static $RELATIONS=array - ( - 'player' => array(self::BELONGS_TO, 'PlayerRecord'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - - -

In essence, there exists a "belongs to" relationship for objects corresponding to -entities that has column which are foreign keys. In particular, we see that -the Profiles table has a foreign key constraint on the column player_id -that relates to the Players table's player_id column. Thus, the ProfileRecord -object has a property ($player) that belongs to a PlayerRecord object. -Similarly, the Players table has a foreign key constraint on the column team_name that relates to the -Teams table's name column. -Thus, the PlayerRecord object has a property ($team) that belongs to a -TeamRecord object. -

- -

Parent Child Relationships

-

A parent child relationship can be defined using a combination of has many and belongs to -relationship that refers to the same class. The following example shows a parent children relationship between -"categories" and a "parent category". -

- - -class Category extends TActiveRecord -{ - public $cat_id; - public $category_name; - public $parent_cat_id; - - public $parent_category; // this declaration is no longer needed since v3.1.2 - public $child_categories=array(); // this declaration is no longer needed since v3.1.2 - - public static $RELATIONS=array - ( - 'parent_category' => array(self::BELONGS_TO, 'Category', 'parent_cat_id'), - 'child_categories' => array(self::HAS_MANY, 'Category', 'parent_cat_id'), - ); -} - - -

Query Criteria for Related Objects

-

-In the above, we show that an Active Record object can reference to its related objects by -declaring a static class member $RELATIONS which specifies a list of relations. Each relation -is specified as an array consisting of three elements: relation type, related AR class name, -and the foreign key(s). For example, we use array(self::HAS_MANY, 'PlayerRecord', 'team_name') -to specify the players in a team. There are two more optional elements that can be specified -in this array: query condition (the fourth element) and parameters (the fifth element). -They are used to control how to query for the related objects. For example, if we want to obtain -the players ordered by their age, we can specify array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'ORDER BY age'). -If we want to obtain players whose age is smaller than 30, we could use -array(self::HAS_MANY, 'PlayerRecord', 'team_name', 'age<:age', array(':age'=>30)). In general, -these two additional elements are similar as the parameters passed to the find() method in AR. -

- - - -

Association Table Mapping

-

-Objects can handle multivalued fields quite easily by using collections as field values. -Relational databases don't have this feature and are constrained to single-valued fields only. -When you're mapping a one-to-many association you can handle this using has many relationships, -essentially using a foreign key for the single-valued end of the association. -But a many-to-many association can't do this because there is no single-valued end to -hold the foreign key. -

-

-The answer is the classic resolution that's been used by relational data people -for decades: create an extra table (an association table) to record the relationship. -The basic idea is using an association table to store the association. This table -has only the foreign key IDs for the two tables that are linked together, it has one -row for each pair of associated objects. -

-

-The association table has no corresponding in-memory object and its primary key is the -compound of the two primary keys of the tables that are associated. -In simple terms, to load data from the association table you perform two queries (in general, it may also be achieved using one query consisting of joins). -Consider loading the SkillRecord collection for a list PlayerRecord objects. -In this case, you do queries in two stages. -The first stage queries the Players table to find all the rows of the players you want. -The second stage finds the SkillRecord object for the related player ID for each row -in the Player_Skills association table using an inner join. -

- -

The Prado Active Record design implements the two stage approach. For the -Players-Skills M-N (many-to-many) entity relationship, we -define a many-to-many relationship in the PlayerRecord class and -in addition we may define a many-to-many relationship in the SkillRecord class as well. -The following sample code defines the complete SkillRecord class with a -many-to-many relationship with the PlayerRecord class. (See the PlayerRecord -class definition above to the corresponding many-to-many relationship with the SkillRecord class.) -

- - -class SkillRecord extends TActiveRecord -{ - const TABLE='Skills'; - public $skill_id; - public $name; - - public $players=array(); // this declaration is no longer needed since v3.1.2 - - public static $RELATIONS=array - ( - 'players' => array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), - ); - - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } -} - - -

-The static $RELATIONS property of SkillRecord defines that the -property $players has many PlayerRecords via an association table 'Player_Skills'. -In array(self::MANY_TO_MANY, 'PlayerRecord', 'Player_Skills'), the first element defines the -relationship type, in this case self::MANY_TO_MANY, -the second element is a string 'PlayerRecord' that corresponds to the -class name of the PlayerRecord class, and the third element is the name -of the association table name. -

- -
Note: -Prior to version 3.1.2 (versions up to 3.1.1), the many-to-many relationship was -defined using self::HAS_MANY. For version 3.1.2 onwards, this must be changed -to self::MANY_TO_MANY. This can be done by searching for the HAS_MANY in your -source code and carfully changing the appropriate definitions. -
- -

-A list of player objects with the corresponding collection of skill objects may be fetched as follows. -

- -$players = PlayerRecord::finder()->withSkills()->findAll(); - -

-The method with_xxx() (where xxx is the relationship property -name, in this case, Skill) fetches the corresponding SkillRecords using -a second query (not by using a join). The with_xxx() accepts the same -arguments as other finder methods of TActiveRecord. -

- -

Self Referenced Association Tables

-

-For self referenced association tables, that is, the association points to the same -table. For example, consider the items table with M-N related -item via the related_items association table. The syntax in the following -example is valid for a PostgreSQL database. For other database, consult their respective documentation for -defining the foreign key constraints. - -CREATE TABLE items -( - "item_id" SERIAL, - "name" VARCHAR(128) NOT NULL, - PRIMARY KEY("item_id") -); -CREATE TABLE "related_items" -( - "item_id" INTEGER NOT NULL, - "related_item_id" INTEGER NOT NULL, - CONSTRAINT "related_items_pkey" PRIMARY KEY("item_id", "related_item_id"), - CONSTRAINT "related_items_item_id_fkey" FOREIGN KEY ("item_id") - REFERENCES "items"("item_id") - ON DELETE CASCADE - ON UPDATE NO ACTION - NOT DEFERRABLE, - CONSTRAINT "related_items_related_item_id_fkey" FOREIGN KEY ("related_item_id") - REFERENCES "items"("item_id") - ON DELETE CASCADE - ON UPDATE NO ACTION - NOT DEFERRABLE -); - - -

The association table name in third element of the relationship array may -contain the foreign table column names. The columns defined in the association -table must also be defined in the record class (e.g. the $related_item_id property -corresponds to the related_item_id column in the related_items table). -

- -class Item extends TActiveRecord -{ - const TABLE="items"; - public $item_id; - public $details; - - //additional foreign item id defined in the association table - public $related_item_id; - public $related_items=array(); // this declaration is no longer needed since v3.1.2 - - public static $RELATIONS=array - ( - 'related_items' => array(self::MANY_TO_MANY, - 'Item', 'related_items.related_item_id'), - ); -} - -
Tip: -Compound keys in the foreign table can -be specified as comma separated values between brackets. E.g. -'related_items.(id1,id2)'. -
- - - -

Lazy Loading Related Objects

- -
Note: -Implicitly declared related properties introduced in version 3.1.2 automatically have lazy -loading feature. Therefore, the lazy loading technique described in the following is no longer -needed in most of the cases, unless you want to manipulate the related objects through getter/setter. -
- -

Using the with_xxx() methods will load the relationship record on demand. Retrieving the -related record using lazy loading (that is, only when those related objects are accessed) can be -achieved by using a feature of the TComponent that provides accessor methods. In particular, -we define a pair of getter and setter methods where the getter method will retrieve the relationship -conditionally. The following example illustrates that the PlayerRecord can retrieve its -$skills foreign objects conditionally. -

- -class PlayerRecord extends BaseFkRecord -{ - //... other properties and methods as before - - private $_skills; //change to private and default as null - - public function getSkills() - { - if($this->_skills===null && $this->player_id !==null) - { - //lazy load the skill records - $this->setSkills($this->withSkills()->findByPk($this->player_id)->skills); - } - else if($this->_skills===null) - { - //create new TList; - $this->setSkills(new TList()); - } - - return $this->_skills; - } - - public function setSkills($value) - { - $this->_skills = $value instanceof TList ? $value : new TList($value); - } -} - -

We first need to change the $skills=array() declaration to a private property -$_skills (notice the underscore) and set it to null instead. This allows us -to define the skills property using getter/setter methods -(see Components for details). The getSkills() -getter method for the skills property will lazy load the corresponding skills foreign record -when it is used as follows. Notice that we only do a lazy load when its $player_id is -not null (that is, when the record is already fetched from the database or player id was already set). -

- -$player = PlayerRecord::finder()->findByPk(1); -var_dump($player->skills); //lazy load it on first access -var_dump($player->skills[0]); //already loaded skills property -$player->skills[] = new SkillRecord(); //add skill - - -

The setSkills() ensures that the skills property will always be a TList. -Using a TList allows us to set the elements of the skills property as if they were -arrays. E.g. $player->skills[] = new SkillRecord(). If array was used, a PHP error -will be thrown. -

- -

Column Mapping

-

-Since v3.1.1, Active Record starts to support column mapping. Column mapping allows developers -to address columns in Active Record using a more consistent naming convention. In particular, -using column mapping, one can access a column using whatever name he likes, rather than limited by -the name defined in the database schema. -

-

-To use column mapping, declare a static array named COLUMN_MAPPING in the Active Record class. -The keys of the array are column names (called physical column names) as defined in the database -schema, while the values are corresponding property names (called logical column names) defined -in the Active Record class. The property names can be either public class member variable names or -component property names defined via getters/setters. If a physical column name happens to be the same -as the logical column name, they do not need to be listed in COLUMN_MAPPING. -

- -class UserRecord extends TActiveRecord -{ - const TABLE='users'; - public static $COLUMN_MAPPING=array - ( - 'user_id'=>'id', - 'email_address'=>'email', - 'first_name'=>'firstName', - 'last_name'=>'lastName', - ); - public $id; - public $username; // the physical and logical column names are the same - public $email; - public $firstName; - public $lastName; - //.... -} - -

-With the above column mapping, we can address first_name using $userRecord->firstName -instead of $userRecord->first_name. This helps separation of logic and model. -

- -

References

- - -
diff --git a/demos/quickstart/protected/pages/Database/pl/ar_objects.png b/demos/quickstart/protected/pages/Database/pl/ar_objects.png deleted file mode 100755 index ac33b88b..00000000 Binary files a/demos/quickstart/protected/pages/Database/pl/ar_objects.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/pl/ar_relations.png b/demos/quickstart/protected/pages/Database/pl/ar_relations.png deleted file mode 100755 index 48e29f48..00000000 Binary files a/demos/quickstart/protected/pages/Database/pl/ar_relations.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/pl/diagram.png b/demos/quickstart/protected/pages/Database/pl/diagram.png deleted file mode 100755 index 0a0ca73d..00000000 Binary files a/demos/quickstart/protected/pages/Database/pl/diagram.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/pl/object_states.png b/demos/quickstart/protected/pages/Database/pl/object_states.png deleted file mode 100755 index db194783..00000000 Binary files a/demos/quickstart/protected/pages/Database/pl/object_states.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Database/pl/sqlmap_active_record.png b/demos/quickstart/protected/pages/Database/pl/sqlmap_active_record.png deleted file mode 100755 index 6d958d33..00000000 Binary files a/demos/quickstart/protected/pages/Database/pl/sqlmap_active_record.png and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Applications.page b/demos/quickstart/protected/pages/Fundamentals/id/Applications.page deleted file mode 100755 index 43b956c3..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Applications.page +++ /dev/null @@ -1,55 +0,0 @@ - - -

Aplikasi

-

-Aplikasi adalah turunan dari TApplication atau asal kelasnya. Ia mengatur modul yang menyediakan fungsionalitas berbeda dan diambil bila diperlukan. Ia menyediakan layanan bagi pengguna-akhir. Ia adalah tempat utama untuk menyimpan berbagai parameter dalam sebuah aplikasi. Dalam aplikasi PRADO, turunan aplikasi adalah satu-satunya obyek yang secara global dapat diakses melalui panggilan fungsi Prado::getApplication(). -

-

-Aplikasi dikonfigurasi melalui konfigurasi aplikasi. Biasanya dibuat dalam naskah entri seperti berikut, - -require_once('/path/to/prado.php'); -$application = new TApplication; -$application->run(); - -Di mana metode run() memulai aplikasi untuk menangani permintaan pengguna. -

- -

Organisasi Direktori

-

-Aplikasi PRADO minimal berisi dua file: file entri dan file template halaman. Ini harus diatur sebagai berikut, - -

-
    -
  • wwwroot - Akar dokumen Web atau sub-direktori.
  • -
  • index.php - naskah entri dari aplikasi PRADO.
  • -
  • assets - direktori yang menyimpan file pribadi yang dipublikasikan. Lihat seksi assets.
  • -
  • protected - path basis aplikasi yang menyimpan data aplikasi dan file naskah pribadi. Direktori ini harus dikonfigurasi tidak bisa diakses terhadap Web-inaccessible, atau ia dapat ditempatkan di luar direktori Web.
  • -
  • runtime - path penyimpan runtime aplikasi. Direktori ini dipakai oleh PRADO untuk menyimpan informasi runtime aplikasi, seperti kondisi aplikasi, data di-cache, dll.
  • -
  • pages - path basis yang menyimpan semua halaman PRADO. Lihat seksi layanan.
  • -
  • Home.page - Halaman standar yang diberikan saat pengguna tidak secara eksplisit menetapkan halaman yang diminta. Ini adalah file template halaman. Nama file tanpa akhiran adalah nama halaman. Kelas halaman adalah TPage. Jika di sana juga aga file kelas Home.php, kelas halaman menjadi Home.
  • -
- -

-Produk aplikasi PRADO biasanya membutuhkan file lebih banyak. Ia dapat menyertakan file konfigurasi aplikasi bernama application.xml di bawah path basis aplikasi protected. Halaman bisa diatur dalam direktori, beberapa diantaranya dapat berisi file konfigurasi halaman bernama config.xml. Untuk lebih jelasnya, silahkan lihat seksi konfigurasi. -

- -

Penyebaran Aplikasi

-

-Menyebarkan aplikasi PRADO sebagian besar terkait dengan meng-copy direktori. Sebagai contoh, untuk menyebarkan aplikasi minimal di atas ke server lain, ikuti langkah-langkah berikut, -

-
    -
  1. Copy konten di bawah wwwroot ke direktori yang dapat diakses=Web pada server baru.
  2. -
  3. Ubah file naskah entri index.php agar ia menyertakan file prado.php secara benar.
  4. -
  5. Hapus semua konten di bawah direktori assets dan runtime dan pastikan kedua direktori dapat ditulis oleh proses server Web.
  6. -
- -

Masa Hidup Aplikasi

-

-Seperti masa hidup halaman, aplikasi juga mempunyai masa hidup. Modul aplikasi dapat meregistrasi event masa hidup. Ketika aplikasi mencapai masa hidup tertentu dan memunculkan event terkait, metode modul teregistrasi akan di panggil secara otomatis. Modul yang disertakan dalam rilis PRADO, seperti TAuthManager, menggunakan cara ini untuk melasanakan tujuannya. -

-

-Masa hidup aplikasi dapat digambarkan sebagai berikut, -

- - -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Architecture.page b/demos/quickstart/protected/pages/Fundamentals/id/Architecture.page deleted file mode 100755 index 354e2403..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Architecture.page +++ /dev/null @@ -1,13 +0,0 @@ - -

Arsitektur

- -

-PRADO adalah kerangka kerja presentasi utama, meskipun tidak dibatasi demikian. Kerangka kerja terfokus pada pembuatan pemrograman Web, yang banyak berkaitan dengan interaksi pengguna, menjadi berbasis-komponen dan kendali-event agar pengembang itu bisa lebih produktif. Susunan kelas berikut menggambarkan beberapa kelas utama yang disediakan oleh PRADO, -

- - -

-Ketika aplikasi PRADO memproses permintaan halaman, diagram obyek statisnya dapat dilihat sebagai berikut, -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Components.page b/demos/quickstart/protected/pages/Fundamentals/id/Components.page deleted file mode 100755 index 4eb14964..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Components.page +++ /dev/null @@ -1,128 +0,0 @@ - -

Komponen

-

-Komponen adalah turunan dari TComponent atau kelas anaknya. Basis kelas TComponent menerapkan mekanisme properti dan event komponen. -

- -

Properti Komponen

-

-Properti komponen dapat dilihat sebagai variabel public yang menjelaskan aspek tertentu dari komponen seperti warna latar belakang, besar font, dll. Properti didefinisikan dengan keberadaan metode penyetel dan/atau pengambil dalam kelas komponen. Sebagai contoh, dalam TControl, kami mendefinisikan properti ID menggunakan metode pengambil dan penyetel berikut, - -class TControl extends TComponent { - public function getID() { - ... - } - public function setID($value) { - ... - } -} - -

-

-Untuk mendapatkan atau menetapkan properti ID, lakukan seperti berikut, seperti bekerja dengan sebuah variabel, - -$id = $component->ID; -$component->ID = $id; - -Ini sama dengan yang berikut, - -$id = $component->getID(); -$component->setID( $id ); - -

-

-Properti hanya-baca jika metode pengambil tetapi tidak untuk metode penyetel. Karena nama metode PHP adalah sensitif-huruf, nama properti juga sensitif-huruf. Kelas komponen mewariskan seluruh properti kelas leluhurnya. -

- -

Subproperti

-

-Subproperti adalah properti dari beberapa properti tipe-obyek. Sebagai contoh, TWebControl mempunyai properti Font yang merupakan tipe TFont. Kemudian properti Name dari Font dirujuk sebagai subproperti (dengan memperhatikan TWebControl). -

-

-Untuk mendapatkan atau menentukan subproperti Name, gunakan metode beriktu, - -$name = $component->getSubProperty('Font.Name'); -$component->setSubProperty('Font.Name', $name); - -Ini sama dengan yang berikut, - -$name = $component->getFont()->getName(); -$component->getFont()->setName( $name ); - - - -

- -

Event Komponen

-

-Event komponen adalah properti khusus yang mengambil nama metode sebagai nilainya. Melampirkan (setelan) metode ke sebuah event akan menancapkan metode ke tempat di mana event dimunculkan. Oleh karena itu, perilaku komponen bisa diubah dalam cara yang tidak terlihat selama pengembangan komponen. -

-

-Event komponen didefinisikan dengan keberadaan metode yang namanya dimulai dengan kata on. Nama event adalah nama metode dan sensitif-huruf. Sebagai contoh, dalam TButton, kita mempunyai - -class TButton extends TWebControl { - public function onClick( $param ) { - ... - } -} - -Ini mendefinisikan event bernama OnClick, dan pengendali dapat dilampirkan ke event menggunakan salah satu cara berikut, - -$button->OnClick = $callback; -$button->OnClick->add( $callback ); -$button->OnClick[] = $callback; -$button->attachEventHandler( 'OnClick' , $callback ); - -di mana $callback merujuk ke callback PHP yang benar (misalnya nama fungsi, metode kelas array($object,'method'), dll). -

- -

Namespace

-

-Namespace merujuk ke pengelompokan logis dari beberapa nama kelas agar dapat dibedakan dari nama kelas lain meskipun jika namanya sama. Karena PHP pada hakekatnya tidak mendukung namespace, Anda tidak bisa membuat turunan dari dua kelas yang mempunyai nama sama tapi dengan definisi berbeda. Untuk membedakan dari kelas didefinisikan pengguna, semua kelas PRADO diawali dengan huruf 'T' (berarti 'Type'). Para pengguna disarankan untuk tidak menamai kelasnya seperti ini. Sebaiknya mengawali nama kelasnya dengan huruf yang lainnya. -

-

-Namespace dalam PRADO dianggap sebagai direktori yang berisi satu atau beberapa file kelas. Sebuah kelas dapat ditetapkan tanpa dwimakna menggunakan namespace demikian diikuti oleh nama kelas. Setiap namespace dalam PRADO ditetapkan dalam format berikut, -

-PathAlias.Dir1.Dir2 -
-di mana PathAlias adalah alias dari beberapa direktori, sementara Dir1 dan Dir2 adalah subdirektori di bawah direktori itu. Kelas yang benama MyClass didefinisikan di bawah Dir2 sekarang berkualifikasi lengkap sebagai PathAlias.Dir1.Dir2.MyClass. -

-

-Untuk menggunakan namespace dalam kode, lakukan seperti berikut, - -Prado::using('PathAlias.Dir1.Dir2.*'); - -menambah direktori yang dirujuk oleh PathAlias.Dir1.Dir2 ke dalam path include PHP agar kelas itu didefinisikan di bawah direktori itu dapat diturunkan tanpa prefiks namespace. Anda juga dapat menyertakan definisi kelas individual dengan - -Prado::using('PathAlias.Dir1.Dir2.MyClass'); - -yang akan menyertakan file kelas jika MyClass tidak didefinisikan. -

-

-Untuk lebih jelasnya mengenai mendefinisikan alias path, lihat seksi konfigurasi aplikasi. -

- -

Penurunan Komponen

-

-Penurunan komponen berarti membuat turunan dari kelas komponen. Ada dua tipe penurunan komponen: penurunan statis dan dinamis. Komponen yang dibuat masing-masing disebut komponen statis dan komponen dinamis. -

- -

Penurunan Komponen Dinamis

-

-Penurunan komponen dinamis berarti membuat turunan komponen dalam kode PHP. Itu sama dengan apa yang umum dirujuk pembuatan obyek dalam PHP. Sebuah komponen dapat dibuat secara dinamis menggunakan salah satu dari dua metode berikut dalam PHP, - -$component = new ComponentClassName; -$component = Prado::createComponent('ComponentType'); - -di mana ComponentType merujuk ke nama kelas atau nama tipe dalam format namespace (contoh System.Web.UI.TControl). Pendekatan kedua diperkenalkan guna mengimbangi kekurangan dukungan namespace dalam PHP. -

- -

Penurunan Komponen Statis

-

-Penurunan komponen statis adalah mengenai pembuatan komponen melalui konfigurasi. Pekerjaan pembuatan sebenarnya dilakukan oleh kerangka kerja PRADO. Sebagai contoh, dalam konfigurasi aplikasi, seseorang dapat mengkonfigurasi sebuah modul untuk diambil ketika aplikasi dijalankan. Selanjutnya modul adalah komponen statis yang dibuat oleh kerangka kerja. Penurunan komponen statis lebih umum digunakan dalam template. Setiap tag komponen dalam sebuah template menetapkan komponen yang akan dibuat secara otomatis oleh kerangka kerja ketika template diambil. Sebagai contoh, dalam sebuah template halaman, tag berikut akan membawa ke pembuatan komponen TButton pada halaman, - -<com:TButton Text="Register" /> - -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Controls.page b/demos/quickstart/protected/pages/Fundamentals/id/Controls.page deleted file mode 100755 index 47222b3d..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Controls.page +++ /dev/null @@ -1,51 +0,0 @@ - -

Kontrol

-

-Kontrol adalah turunan dari kelas TControl atau asal sub kelasnya. Kontrol adalah komponen yang didefinisikan sebagai tambahan pada antarmuka pengguna. Kelas basis TControl mendefinisikan hubungan leluhur-anak diantara kontrol yang mencerminkan pengurungan hubungan diantara elemen antarmuka pengguna. -

- -

Susunan Kontrol

-

-Kontrol dikaitkan satu sama lain melalui hubungan leluhur-anak. Setiap kontrol leluhur dapat memiliki beberapa kontrol anak. Kontrol leluhur bertugas terhadap transisi keadaan dari kontrol anaknya. Hasil dari kontrol anak biasanya dipakai untuk mengatur penampilan kontrol leluhur. Hubungan leluhur-anak membawa kontrol bersama ke dalam susunan kontrol. Halaman ada di akar dari susunan yang penampilannya di berikan kepada pengguna-akhir. -

-

-Hubungan leluhur-anak biasanya dilakukan oleh kerangka kerja melalui template. Dalam kode, Anda dapat menetapkan kontrol secara eksplisit sebagai anak dari yang lainnya menggunakan salah satu metode berikut, - -$parent->Controls->add($child); -$parent->Controls[]=$child; - -di mana properti Controls merujuk ke koleksi kontrol anak dari leluhur. -

- -

Identifikasi Kontrol

-

-Setiap kontrol mempunyai properti ID yang dapat secara unik dapat mengidentifikasi dirinya sendiri diantara kontrol keluarganya. Sebagai tambahan, setiap kontrol mempunyai UniqueID dan ClientID yang dapat dipakai untuk mengidentifikasi kontrol secara global dalam susunan di mana kontrol berada. UniqueID dan ClientID sangat mirip. Pembentuk dipakai oleh kerangka kerja guna menentukan lokasi dari kontrol terkait dalam susunan, sementara yang kedua sebagian besar dipakai pada sisi klien sebagai ID tag HTML. Secara umum, Anda tidak boleh bergantung pada bentuk eksplisit UniqueID atau ClientID. -

- -

Wadah Penamaan

-

-Setiap kontrol mempunyai wadah penamaan yang mana kontrol membuat ruang nama (namespace) unik untuk membedakan antara kontrol dengan ID yang sama. Sebagai contoh, kontrol TRepeater membuat multipel item masing-masing mempunyai kontrol anak dengan ID yang sama. Untuk membedakan kontrol anak ini, setiap item bertindak sebagai wadah penamaan. Oleh karena itu, kontrol anak dapat diidentifikasi secara unik menggunakan wadah penamaan ID bersama dengan ID-nya sendiri. Seperti yang mungkin sudah Anda mengerti, UniqueID dan ClientID bergantung pada wadah penamaan. -

-

-Kontrol dapat bertindak sebagai wadah penamaan jika ia menerapkan antarmuka INamingContainer. -

- -

ViewState dan ControlState

-

-HTTP adalah protokol tidak berkondisi, berarti ia tidak menyediakan fungsionalitas untuk mendukung interaksi berlanjut antara pengguna dan server. Setiap permintaan dianggap sebagai diskrit dan berdiri sendiri dari yang lainnya. Aplikasi Web, sering perlu untuk mengetahui apa yang telah dilakukan pengguna dalam permintaan sebelumnya. Selanjutnya orang memperkenalkan sesi guna membantu mengingat informasi kondisi seperti itu. -

-

-PRADO meminjam konsep viewstate dan controlstate dari Microsoft ASP.NET guna menyediakan tambahan mekanisme pemrograman berkondisi. Penyimpanan nilai dalam viewstate atau controlstate mungkin tersedia untuk permintaan berikutnya jika permintaan baru dari submisi (disebut postback) ke halamanyang sama oleh pengguna yang sama. Perbedaan antara viewstate dan controlstate adalah bahwa pembentuk dapat dimatikan saat yang kemudian tidak bisa. -

-

-Viewstate dan controlstate diterapkan dalam TControl. Biasanya dipakai untuk mendefinisikan berbagai properti kontrol. Untuk menyimpan dan mengambil nilai dari viewstate atau controlstate, gunakan metode berikut, - -$this->getViewState('Name',$defaultValue); -$this->setViewState('Name',$value,$defaultValue); -$this->getControlState('Name',$defaultValue); -$this->setControlState('Name',$value,$defaultValue); - -di mana $this merujuk ke turunan kontrol, Name merujuk ke kunci yang mengidentifikasi nilai pasti, $defaultValue adalah opsional. Ketika mengambil nilai dari viewstate atau controlstate, jika kunci terkait tidak ada, nilai standar akan diberikan. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Hangman.page b/demos/quickstart/protected/pages/Fundamentals/id/Hangman.page deleted file mode 100755 index 44a8887e..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Hangman.page +++ /dev/null @@ -1,14 +0,0 @@ - - -

Contoh: Permainan Hangman

-

-Setelah melihat aplikasi "Hello World", sekarang kita membuat aplikasi yang lebih rumit disebut "Permainan Hangman". Dalam permainan ini, pemain diminta untuk menebak kata, satu huruf setiap waktu. Jika dia menebak huruf dengan benar, huruf akan ditampilkan dalam kata. Pemain dapat melanjutkan untuk menebak selama angka kesalahannya dalam batas yang sudah ditetapkan. Pemain memenangkan permainan jika menemukan kata dalam batas kesalahan, atau dia kalah. -

-

-Untuk memfasilitasi pembangunan permainan ini, kami perlihatkan diagram transisi keadaan dari proses permainan sebagai berikut, -

-Untuk dilanjutkan... -

- - -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Modules.page b/demos/quickstart/protected/pages/Fundamentals/id/Modules.page deleted file mode 100755 index f484fece..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Modules.page +++ /dev/null @@ -1,50 +0,0 @@ - - -

Modul

-

-Modul adalah turunan dari kelas yang menerapkan antarmuka IModule. Umumnya sebuah modul didesain untuk fungsionalitas tertentu yang dapat disertakan ke dalam aplikasi PRADO dan berbagi dengan semua komponen dalam aplikasi. -

-

-PRADO menggunakan konfigurasi untuk menetapkan apakah mengambil sebuah modul, mengambil modul jenis apa, dan bagaimana untuk menginisialisasi modul yang diambilnya. Para pengembang dapat mengganti modul inti dengan implementasinya sendiri melalui konfigurasi aplikasi, atau mereka dapat menulis modul baru guna menyediakan fungsionalitas tambahan. Sebagai contoh, modul dapat dikembangkan untuk menyediakan logika database umum pada satu atau beberapa halaman. Untuk lebih jelasnya, silahkan lihat konfigurasi. -

-

-Ada tiga modul inti yang diambil secara standar kapan saja aplikasi dijalankan. Ketiganya adalah modul permintaan, modul respon, dan modul pengendali kesalahan. Sebagai tambahan, modul sesi diambil saat ia digunakan dalam aplikasi. PRADO menyediakan implementasi standar untuk semua modul ini. Modul kustom dapat dikonfigurasi atau dikembangkan guna mengganti atau menambah modul inti ini. -

- - -

Modul Permintaan

-

-Modul permintaan menyediakan penyimpanan dan skema akses untuk permintaan pengguna yang dikirim melalui HTTP. Permintaan pengguna datang dari beberapa sumber, termasuk URL, data post, data sesi, data cookie, dll. Data ini semuanya dapat diakses melalui modul permintaan. Standarnya PRADO menggunakan THttpRequest sebagai modul permintaan. Modul permintaan dapat diakses melalui properti Request dari aplikasi dan kontrol. -

- - -

Modul Respon

-

-Modul respon menerapkan mekanisme untuk mengirimkan output ke pengguna klien. Modul respon dapat dikonfigurasi guna mengontrol bagaimana output di-cache pada sisi klien. Standarnya PRADO menggunakan THttpResponse sebagai modul respon. Modul respon dapat diakses melalui properti Response dari aplikasi dan kontrol. -

- - -

Modul Sesi

-

-Modul sesi melapisi fungsionalitas terkait dengan penanganan sesi pengguna. Modul sesi secara otomatis diambil saat aplikasi menggunakan sesi. Standarnya PRADO menggunakan THttpSession sebagai modul sesi, yang merupakan pelapis sederhana dari fungsi sesi yang disediakan oleh PHP. Modul sesi dapat diakses melalui properti Session dari aplikasi dan kontrol. -

- - -

Modul Pengendali Kesalahan

-

-Modul pengendali kesalahan dipakai untuk menangkap dan memproses semua kondisi kesalahan dalam sebuah aplikasi. PRADO menggunakan TErrorHandler sebagai modul pengendali kesalahan. Ia menangkap semua peringatan PHP, perhatian dan eksepsi, dan ditampilkan dalam bentuk yang tepat bagi pengguna-akhir. Modul pengendali kesalahan dapat diakses melalui properti ErrorHandler dari turunan aplikasi. -

- - -

Modul Kustom

-

-PRADO dirilis dengan beberapa modul lebih disamping yang inti. Ini termasuk modul cache (TSqliteCache dan TMemCache), modul manajemen pengguna (TUserManager), modul otentikasi dan otorisasi (TAuthManager), dll. -

-

-Ketika TPageService diminta, ia juga mengambil modul tertentu untuk layanan halaman, termasuk manajer asset (TAssetManager), manajer template (TTemplateManager), manajer tema/skin (TThemeManager). -

-

-Modul kustom dan modul inti semuanya dapat dikonfigurasi melalui konfigurasi. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Pages.page b/demos/quickstart/protected/pages/Fundamentals/id/Pages.page deleted file mode 100755 index 496f9530..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Pages.page +++ /dev/null @@ -1,23 +0,0 @@ - - -

Halaman

-

-Halaman adalah kontrol teratas yang tidak mempunyai leluhur. Presentasi halaman ditampilkan secara langsung ke pengguna-akhir. Pengguna mengakses halaman dengan mengirimkan permintaan layanan halaman. -

-

-Setiap halaman harus mempunyai file template. Akhiran nama file harus .page. Nama file (tanpa akhiran) adalah nama halaman. PRADO akan mencoba mencari file kelas halaman di bawah direktori yang berisi file template halaman. File kelas halaman tersebut harus mempunyai nama file yang sama (diakhiri dengan .php) seperti file template. Jika file kelas tidak ditemukan, halaman akan mengambil kelas TPage. -

- -

PostBack

-

-Submisi formulir disebut postback jika submisi dibuat untuk halaman yang berisi formulir. Postback dapat dianggap sebagai kondisi di sisi klien, dimunculkan oleh pengguna. PRADO akan mencoba mengidentifikasi kontrol mana pada sisi server untuk postback kondisi. Jika seseorang menentukan misalnya, TButton, kami menyebutnya pengirim event postback yang akan menterjemahkan event postback ke dalam beberapa event sisi-server tertentu (contoh event OnClick dan OnCommand untuk TButton). - -

- -

Masa Hidup Halaman

-

-Mengerti masa hidup halaman adalah penting untuk menguasai pemrograman PRADO. Masa hidup halaman merujuk ke transisi kondisi dari sebuah halaman saat melayani halaman ini bagi pengguna-akhir. Ini dapat digambarkan dalam grafik kondisi berikut, - -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/Services.page b/demos/quickstart/protected/pages/Fundamentals/id/Services.page deleted file mode 100755 index 8834f214..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/id/Services.page +++ /dev/null @@ -1,34 +0,0 @@ - - -

Layanan

-

-Layanan adalah turunan dari kelas yang menerapkan antarmuka IService. Setiap jenis layanan memproses tipe permintaan tertentu pengguna. Sebagai contoh, respon layanan halaman terhadap permintaan pengguna untuk halaman PRADO. -

-

-Sebuah layanan diidentifikasi secara unik dengan properti ID-nya. Standarnya ketika THttpRequest dipakai sebagai modul permintaan, nama variabel GET digunakan untuk mengidentifikasi layanan mana yang sedang diminta oleh pengguna. Jika nama variabel GET sama dengan beberapa ID layanan, permintaan dianggap untuk layanan itu, dan nilai dari variabel GET dikirimkan sebagai parameter layanan. Untuk layanan halaman, nama variabel GET harus page. Sebagai contoh, URKL berikut meminta halaman Fundamentals.Services, - -http://hostname/index.php?page=Fundamentals.Services - -

-

-Para pengembang dapat menerapkan layanan tambahan untuk aplikasinya. Untuk menjadikan layanan agar tersedia, konfigurasi itu dalam konfigurasi aplikasi. -

- -

Layanan Halaman

-

-PRADO menerapkan TPageService untuk melayani permintaan halaman pengguna. Halam disimpan di bawah direktori yang ditetapkan oleh properti BasePath dari layanan halaman. Properti standarnya ke direktori pages di bawah path basis aplikasi. Anda boleh mengubah standar ini dengan mengkonfigurasi layanan dalam konfigurasi aplikasi. -

-

-Halaman disusun ke dalam direktori di bawah BasePath. Dalam setiap direktori, di sana ada file konfigurasi bernama config.xml, yang berisi konfigurasi yang hanya efektif ketika halaman di bawah direktori atau sub direktori itu diminta. Untuk lebih jelasnya, lihat seksi konfigurasi halaman. -

-

-Parameter layanan untuk layanan halaman merujuk pada halaman yang sedang diminta. Parameter seperti Fundamentals.Services merujuk pada halaman Services di bawah direktori <BasePath>/Fundamentals. Jika parameter tersebut tidak ada dalam permintaan, dianggap sebagai halaman standar bernama Home. Menggunakan THttpRequest sebagai modul permintaan (default), URL berikut masing-masing akan meminta halaman Home, About dan Register, - -http://hostname/index.php -http://hostname/index.php?page=About -http://hostname/index.php?page=Users.Register - -di mana contoh pertama mengambiil keuntungan bahwa layanan halaman adalah layanan standar dan Home adalah halaman default. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/id/applifecycles.gif b/demos/quickstart/protected/pages/Fundamentals/id/applifecycles.gif deleted file mode 100755 index d5300aa6..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/applifecycles.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/applifecycles.vsd b/demos/quickstart/protected/pages/Fundamentals/id/applifecycles.vsd deleted file mode 100755 index 56f6602d..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/applifecycles.vsd and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/classtree.gif b/demos/quickstart/protected/pages/Fundamentals/id/classtree.gif deleted file mode 100755 index b1fbf0d6..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/classtree.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/classtree.vsd b/demos/quickstart/protected/pages/Fundamentals/id/classtree.vsd deleted file mode 100755 index c000d32f..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/classtree.vsd and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/directory.gif b/demos/quickstart/protected/pages/Fundamentals/id/directory.gif deleted file mode 100755 index c7d5086d..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/directory.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/lifecycles.gif b/demos/quickstart/protected/pages/Fundamentals/id/lifecycles.gif deleted file mode 100755 index 5edaff5f..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/lifecycles.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/lifecycles.vsd b/demos/quickstart/protected/pages/Fundamentals/id/lifecycles.vsd deleted file mode 100755 index 368d0ba7..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/lifecycles.vsd and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/objectdiagram.gif b/demos/quickstart/protected/pages/Fundamentals/id/objectdiagram.gif deleted file mode 100755 index 7910469c..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/objectdiagram.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/id/objectdiagram.vsd b/demos/quickstart/protected/pages/Fundamentals/id/objectdiagram.vsd deleted file mode 100755 index b2457220..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/id/objectdiagram.vsd and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Applications.page b/demos/quickstart/protected/pages/Fundamentals/ja/Applications.page deleted file mode 100755 index 8e0b9e9a..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Applications.page +++ /dev/null @@ -1,55 +0,0 @@ - - -

Applications

-

-An application is an instance of TApplication or its derived class. It manages modules that provide different functionalities and are loaded when needed. It provides services to end-users. It is the central place to store various parameters used in an application. In a PRADO application, the application instance is the only object that is globally accessible via Prado::getApplication() function call. -

-

-Applications are configured via application configurations. They are usually created in entry scripts like the following, - -require_once('/path/to/prado.php'); -$application = new TApplication; -$application->run(); - -where the method run() starts the application to handle user requests. -

- -

Directory Organization

-

-A minimal PRADO application contains two files: an entry file and a page template file. They must be organized as follows, - -

-
    -
  • wwwroot - Web document root or sub-directory.
  • -
  • index.php - entry script of the PRADO application.
  • -
  • assets - directory storing published private files. See assets section.
  • -
  • protected - application base path storing application data and private script files. This directory should be configured inaccessible to Web-inaccessible, or it may be located outside of Web directories.
  • -
  • runtime - application runtime storage path. This directory is used by PRADO to store application runtime information, such as application state, cached data, etc.
  • -
  • pages - base path storing all PRADO pages. See services section.
  • -
  • Home.page - default page returned when users do not explicitly specify the page requested. This is a page template file. The file name without suffix is the page name. The page class is TPage. If there is also a class file Home.php, the page class becomes Home.
  • -
- -

-A product PRADO application usually needs more files. It may include an application configuration file named application.xml under the application base path protected. The pages may be organized in directories, some of which may contain page configuration files named config.xml. Fore more details, please see configurations section. -

- -

Application Deployment

-

-Deploying a PRADO application mainly involves copying directories. For example, to deploy the above minimal application to another server, follow the following steps, -

-
    -
  1. Copy the content under wwwroot to a Web-accessible directory on the new server.
  2. -
  3. Modify the entry script file index.php so that it includes correctly the prado.php file.
  4. -
  5. Remove all content under assets and runtime directories and make sure both directories are writable by the Web server process.
  6. -
- -

Application Lifecycles

-

-Like page lifecycles, an application also has lifecycles. Application modules can register for the lifecycle events. When the application reaches a particular lifecycle and raises the corresponding event, the registered module methods are invoked automatically. Modules included in the PRADO release, such as TAuthManager, are using this way to accomplish their goals. -

-

-The application lifecycles can be depicted as follows, -

- - -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Architecture.page b/demos/quickstart/protected/pages/Fundamentals/ja/Architecture.page deleted file mode 100755 index 7d828803..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Architecture.page +++ /dev/null @@ -1,15 +0,0 @@ - -

アーキテクチャ

- -

-PRADO は主にプレゼンテーションを操作するためのフレームワークです。(プレゼンテーション操作のみで制限されるわけではありません)
-このフレームワークはウェブプログラミングに集中するためのものであり、開発者がより生産性を上げられるようにコンポーネントベース、イベントドリブンなプログラミングが可能なつくりになっています。
-以下のクラスツリーは PRADO によって提供されている主要なクラスについて書かれたものです。 -

- - -

-PRADO アプリケーションがページ要求処理を行う際、以下のオブジェクトダイアグラムで動作します。 -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Components.page b/demos/quickstart/protected/pages/Fundamentals/ja/Components.page deleted file mode 100755 index 5662b53b..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Components.page +++ /dev/null @@ -1,128 +0,0 @@ - -

Components

-

-A component is an instance of TComponent or its child class. The base class TComponent implements the mechanism of component properties and events. -

- -

Component Properties

-

-A component property can be viewed as a public variable describing a specific aspect of the component, such as the background color, the font size, etc. A property is defined by the existence of a getter and/or a setter method in the component class. For example, in TControl, we define its ID property using the following getter and setter methods, - -class TControl extends TComponent { - public function getID() { - ... - } - public function setID($value) { - ... - } -} - -

-

-To get or set the ID property, do as follows, just like working with a variable, - -$id = $component->ID; -$component->ID = $id; - -This is equivalent to the following, - -$id = $component->getID(); -$component->setID( $id ); - -

-

-A property is read-only if it has a getter method but no setter method. Since PHP method names are case-insensitive, property names are also case-insensitive. A component class inherits all its ancestor classes' properties. -

- -

Subproperties

-

-A subproperty is a property of some object-typed property. For example, TWebControl has a Font property which is of TFont type. Then the Name property of Font is referred to as a subproperty (with respect to TWebControl). -

-

-To get or set the Name subproperty, use the following method, - -$name = $component->getSubProperty('Font.Name'); -$component->setSubProperty('Font.Name', $name); - -This is equivalent to the following, - -$name = $component->getFont()->getName(); -$component->getFont()->setName( $name ); - - - -

- -

Component Events

-

-Component events are special properties that take method names as their values. Attaching (setting) a method to an event will hook up the method to the places at which the event is raised. Therefore, the behavior of a component can be modified in a way that may not be foreseen during the development of the component. -

-

-A component event is defined by the existence of a method whose name starts with the word on. The event name is the method name and is thus case-insensitve. For example, in TButton, we have - -class TButton extends TWebControl { - public function onClick( $param ) { - ... - } -} - -This defines an event named OnClick, and a handler can be attached to the event using one of the following ways, - -$button->OnClick = $callback; -$button->OnClick->add( $callback ); -$button->OnClick[] = $callback; -$button->attachEventHandler( 'OnClick' , $callback ); - -where $callback refers to a valid PHP callback (e.g. a function name, a class method array($object,'method'), etc.) -

- -

Namespaces

-

-A namespace refers to a logical grouping of some class names so that they can be differentiated from other class names even if their names are the same. Since PHP does not support namespace intrinsically, you cannot create instances of two classes who have the same name but with different definitions. To differentiate from user defined classes, all PRADO classes are prefixed with a letter 'T' (meaning 'Type'). Users are advised not to name their classes like this. Instead, they may prefix their class names with any other letter(s). -

-

-A namespace in PRADO is considered as a directory containing one or several class files. A class may be specified without ambiguity using such a namespace followed by the class name. Each namespace in PRADO is specified in the following format, -

-PathAlias.Dir1.Dir2 -
-where PathAlias is an alias of some directory, while Dir1 and Dir2 are subdirectories under that directory. A class named MyClass defined under Dir2 may now be fully qualified as PathAlias.Dir1.Dir2.MyClass. -

-

-To use a namespace in code, do as follows, - -Prado::using('PathAlias.Dir1.Dir2.*'); - -which appends the directory referred to by PathAlias.Dir1.Dir2 into PHP include path so that classes defined under that directory may be instantiated without the namespace prefix. You may also include an individual class definition by - -Prado::using('PathAlias.Dir1.Dir2.MyClass'); - -which will include the class file if MyClass is not defined. -

-

-For more details about defining path aliases, see application configuration section. -

- -

Component Instantiation

-

-Component instantiation means creating instances of component classes. There are two types of component instantation: static instantiation and dynamic instantiation. The created components are called static components and dynamic components, respectively. -

- -

Dynamic Component Instantiation

-

-Dynamic component instantiation means creating component instances in PHP code. It is the same as the commonly referred object creation in PHP. A component can be dynamically created using one of the following two methods in PHP, - -$component = new ComponentClassName; -$component = Prado::createComponent('ComponentType'); - -where ComponentType refers to a class name or a type name in namespace format (e.g. System.Web.UI.TControl). The second approach is introduced to compensate for the lack of namespace support in PHP. -

- -

Static Component Instantiation

-

-Static component instantiation is about creating components via configurations. The actual creation work is done by the PRADO framework. For example, in an application configuration, one can configure a module to be loaded when the application runs. The module is thus a static component created by the framework. Static component instantiation is more commonly used in templates. Every component tag in a template specifies a component that will be automatically created by the framework when the template is loaded. For example, in a page template, the following tag will lead to the creation of a TButton component on the page, - -<com:TButton Text="Register" /> - -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Controls.page b/demos/quickstart/protected/pages/Fundamentals/ja/Controls.page deleted file mode 100755 index 75f6bedf..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Controls.page +++ /dev/null @@ -1,51 +0,0 @@ - -

Controls

-

-A control is an instance of class TControl or its subclass. A control is a component defined in addition with user interface. The base class TControl defines the parent-child relationship among controls which reflects the containment relationship among user interface elements. -

- -

Control Tree

-

-Controls are related to each other via parent-child relationship. Each parent control can have one or several child controls. A parent control is in charge of the state transition of its child controls. The rendering result of the child controls are usually used to compose the parent control's presentation. The parent-child relationship brings together controls into a control tree. A page is at the root of the tree, whose presentation is returned to the end-users. -

-

-The parent-child relationship is usually established by the framework via templates. In code, you may explicitly specify a control as a child of another using one of the following methods, - -$parent->Controls->add($child); -$parent->Controls[]=$child; - -where the property Controls refers to the child control collection of the parent. -

- -

Control Identification

-

-Each control has an ID property that can be uniquely identify itself among its sibling controls. In addition, each control has a UniqueID and a ClientID which can be used to globally identify the control in the tree that the control resides in. UniqueID and ClientID are very similar. The former is used by the framework to determine the location of the corresponding control in the tree, while the latter is mainly used on the client side as HTML tag IDs. In general, you should not rely on the explicit format of UniqueID or ClientID. -

- -

Naming Containers

-

-Each control has a naming container which is a control creating a unique namespace for differentiating between controls with the same ID. For example, a TRepeater control creates multiple items each having child controls with the same IDs. To differentiate these child controls, each item serves as a naming container. Therefore, a child control may be uniquely identified using its naming container's ID together with its own ID. As you may already have understood, UniqueID and ClientID rely on the naming containers. -

-

-A control can serve as a naming container if it implements the INamingContainer interface. -

- -

ViewState and ControlState

-

-HTTP is a stateless protocol, meaning it does not provide functionality to support continuing interaction between a user and a server. Each request is considered as discrete and independent of each other. A Web application, however, often needs to know what a user has done in previous requests. People thus introduce sessions to help remember such state information. -

-

-PRADO borrows the viewstate and controlstate concept from Microsoft ASP.NET to provides additional stateful programming mechanism. A value storing in viewstate or controlstate may be available to the next requests if the new requests are form submissions (called postback) to the same page by the same user. The difference between viewstate and controlstate is that the former can be disabled while the latter cannot. -

-

-Viewstate and controlstate are implemented in TControl. They are commonly used to define various properties of controls. To save and retrieve values from viewstate or controlstate, use following methods, - -$this->getViewState('Name',$defaultValue); -$this->setViewState('Name',$value,$defaultValue); -$this->getControlState('Name',$defaultValue); -$this->setControlState('Name',$value,$defaultValue); - -where $this refers to the control instance, Name refers to a key identifying the persistent value, $defaultValue is optional. When retrieving values from viewstate or controlstate, if the corresponding key does not exist, the default value will be returned. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Hangman.page b/demos/quickstart/protected/pages/Fundamentals/ja/Hangman.page deleted file mode 100755 index d1776b7c..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Hangman.page +++ /dev/null @@ -1,14 +0,0 @@ - - -

Sample: Hangman Game

-

-Having seen the simple "Hello World" application, we now build a more complex application called "Hangman Game". In this game, the player is asked to guess a word, a letter at a time. If he guesses a letter right, the letter will be shown in the word. The player can continue to guess as long as the number of his misses is within a prespecified bound. The player wins the game if he finds out the word within the miss bound, or he loses. -

-

-To facilitate the building of this game, we show the state transition diagram of the gaming process in the following, -

-To be continued... -

- - -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Modules.page b/demos/quickstart/protected/pages/Fundamentals/ja/Modules.page deleted file mode 100755 index 37406976..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Modules.page +++ /dev/null @@ -1,50 +0,0 @@ - - -

Modules

-

-A module is an instance of a class implementing the IModule interface. A module is commonly designed to provide specific functionality that may be plugged into a PRADO application and shared by all components in the application. -

-

-PRADO uses configurations to specify whether to load a module, load what kind of modules, and how to initialize the loaded modules. Developers may replace the core modules with their own implementations via application configuration, or they may write new modules to provide additional functionalities. For example, a module may be developed to provide common database logic for one or several pages. For more details, please see the configurations. -

-

-There are three core modules that are loaded by default whenever an application runs. They are request module, response module, and error handler module. In addition, session module is loaded when it is used in the application. PRADO provides default implementation for all these modules. Custom modules may be configured or developed to override or supplement these core modules. -

- - -

Request Module

-

-Request module represents provides storage and access scheme for user request sent via HTTP. User request data comes from several sources, including URL, post data, session data, cookie data, etc. These data can all be accessed via the request module. By default, PRADO uses THttpRequest as request module. The request module can be accessed via the Request property of application and controls. -

- - -

Response Module

-

-Response module implements the mechanism for sending output to client users. Response module may be configured to control how output are cached on the client side. It may also be used to send cookies back to the client side. By default, PRADO uses THttpResponse as response module. The response module can be accessed via the Response property of application and controls. -

- - -

Session Module

-

-Session module encapsulates the functionalities related with user session handling. Session module is automatically loaded when an application uses session. By default, PRADO uses THttpSession as session module, which is a simple wrapper of the session functions provided by PHP. The session module can be accessed via the Session property of application and controls. -

- - -

Error Handler Module

-

-Error handler module is used to capture and process all error conditions in an application. PRADO uses TErrorHandler as error handler module. It captures all PHP warnings, notices and exceptions, and displays in an appropriate form to end-users. The error handler module can be accessed via the ErrorHandler property of the application instance. -

- - -

Custom Modules

-

-PRADO is released with a few more modules besides the core ones. They include caching modules (TSqliteCache and TMemCache), user management module (TUserManager), authentication and authorization module (TAuthManager), etc. -

-

-When TPageService is requested, it also loads modules specific for page service, including asset manager (TAssetManager), template manager (TTemplateManager), theme/skin manager (TThemeManager). -

-

-Custom modules and core modules are all configurable via configurations. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Pages.page b/demos/quickstart/protected/pages/Fundamentals/ja/Pages.page deleted file mode 100755 index 19900937..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Pages.page +++ /dev/null @@ -1,23 +0,0 @@ - - -

Pages

-

-Pages are top-most controls that have no parent. The presentation of pages are directly displayed to end-users. Users access pages by sending page service requests. -

-

-Each page must have a template file. The file name suffix must be .page. The file name (without suffix) is the page name. PRADO will try to locate a page class file under the directory containing the page template file. Such a page class file must have the same file name (suffixed with .php) as the template file. If the class file is not found, the page will take class TPage. -

- -

PostBack

-

-A form submission is called postback if the submission is made to the page containing the form. Postback can be considered an event happened on the client side, raised by the user. PRADO will try to identify which control on the server side is responsible for a postback event. If one is determined, for example, a TButton, we call it the postback event sender which will translate the postback event into some specific server-side event (e.g. OnClick and OnCommand events for TButton). - -

- -

Page Lifecycles

-

-Understanding the page lifecycles is crucial to grasp PRADO programming. Page lifecycles refer to the state transitions of a page when serving this page to end-users. They can be depicted in the following statechart, - -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/Services.page b/demos/quickstart/protected/pages/Fundamentals/ja/Services.page deleted file mode 100755 index 5e5889df..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/ja/Services.page +++ /dev/null @@ -1,34 +0,0 @@ - - -

Services

-

-A service is an instance of a class implementing the IService interface. Each kind of service processes a specific type of user requests. For example, the page service responds to users' requests for PRADO pages. -

-

-A service is uniquely identified by its ID property. By default when THttpRequest is used as the request module, GET variable names are used to identify which service a user is requesting. If a GET variable name is equal to some service ID, the request is considered for that service, and the value of the GET variable is passed as the service parameter. For page service, the name of the GET variable must be page. For example, the following URL requests for the Fundamentals.Services page, - -http://hostname/index.php?page=Fundamentals.Services - -

-

-Developers may implement additional services for their applications. To make a service available, configure it in application configurations. -

- -

Page Service

-

-PRADO implements TPageService to process users' page requests. Pages are stored under a directory specified by the BasePath property of the page service. The property defaults to pages directory under the application base path. You may change this default by configuring the service in the application configuration. -

-

-Pages may be organized into subdirectories under the BasePath. In each directory, there may be a page configuration file named config.xml, which contains configurations effective only when a page under that directory or a sub-directory is requested. For more details, see the page configuration section. -

-

-Service parameter for the page service refers to the page being requested. A parameter like Fundamentals.Services refers to the Services page under the <BasePath>/Fundamentals directory. If such a parameter is absent in a request, a default page named Home is assumed. Using THttpRequest as the request module (default), the following URLs will request for Home, About and Register pages, respectively, - -http://hostname/index.php -http://hostname/index.php?page=About -http://hostname/index.php?page=Users.Register - -where the first example takes advantage of the fact that the page service is the default service and Home is the default page. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/applifecycles.gif b/demos/quickstart/protected/pages/Fundamentals/ja/applifecycles.gif deleted file mode 100755 index d5300aa6..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/ja/applifecycles.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/classtree.gif b/demos/quickstart/protected/pages/Fundamentals/ja/classtree.gif deleted file mode 100755 index b1fbf0d6..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/ja/classtree.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/directory.gif b/demos/quickstart/protected/pages/Fundamentals/ja/directory.gif deleted file mode 100755 index c7d5086d..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/ja/directory.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/lifecycles.gif b/demos/quickstart/protected/pages/Fundamentals/ja/lifecycles.gif deleted file mode 100755 index 5edaff5f..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/ja/lifecycles.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/ja/objectdiagram.gif b/demos/quickstart/protected/pages/Fundamentals/ja/objectdiagram.gif deleted file mode 100755 index 7910469c..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/ja/objectdiagram.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Applications.page b/demos/quickstart/protected/pages/Fundamentals/pl/Applications.page deleted file mode 100755 index 23866005..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Applications.page +++ /dev/null @@ -1,58 +0,0 @@ - - -

Aplikacja

-

-Aplikacja jest instancją TApplication lub klasy po niej dziedziczącej. Zarządza modułami dostarczającymi różnorodne funkcjonalności i ładuje je w razie potrzeby. Dostarcza użytkownikowu końcowemu serwisy. -Jest centralnym miejscem do przechowywania różnych parametrów używanych w aplikacji. W aplikacji PRADO instancja aplikacji jest jedynym globalnie dostepnym obiektem poprzez wywołania funkcji Prado::getApplication(). -

-

-Aplikacje są konfigurowane poprzez konfigurację aplikacji. Są zazwyczaj tworzone w skrypcie wejściowym w podobny do następującego sposób, - -require_once('/path/to/prado.php'); -$application = new TApplication; -$application->run(); - -gdzie metoda run() rozpoczyna działanie aplikacji obsługującej żądania użytkownika. -

- -

Organizacja folderów

-

-Minimalna aplikacja PRADO zawiera dwa pliki: plik wejściowy i plik szablonu. Muszą być one zorganizowane w następujący sposób. - -

-
    -
  • wwwroot - główny katalog serwera WWW lub jeden z podkatalogów.
  • -
  • index.php - skrypt wejściowy aplikacji PRADO.
  • -
  • assets - katalog przechowujący opublikowane pliki prywatne. Zobacz sekcję assets.
  • -
  • protected - podstawowa ścieżka aplikacji zawierająca jej dane oraz prywatne pliki skryptów. Ten folder powinien być niedostepny z zewnątrz lub powinien znajdować się poza strukturą serwera WWW.
  • -
  • runtime - application runtime storage path. Ten folder jest używany przez PRADO do przechowywania informacji o wykonywanej aplikacji, takich jak stan aplikacji, kedzowane dane, itd.
  • -
  • pages - podstawowa ścieżka przechowująca wszystkie strony PRADO. Zobacz sekcję serwisy.
  • -
  • Home.page - domyślna strona zwracana gdy użytkownik nie poda jawnie żadanej strony. Jest to plik szablonu strony. Nazwa pliku bez rozszerzenia jest nazwą strony. Klasą strony jest klasa TPage. Jeśli znajduje się tam również plik klasy Home.php, klasą strony staje się Home.
  • -
- -

-Produktywna aplikacja PRADO zazwyczaj potrzebuje więcej plików. Może ona zawierać plik konfiguracji aplikacji application.xml w podstawej ścieżce aplikacji protected. Strony mogą być zorganizowane w foldery, część z nich może zawierać pliki konfiguracji strony config.xml. Aby dowiedzieć się wiecej, zajrzyć do sekcji konfiguracji. -

- -

Osadzanie aplikacji

-

-Osadzanie aplikacji PRADO zazwyczaj wiąże się z kopiowaniem folderów. Na przykład, aby osadzić powyższą minimalną wersję aplikacji na innym serwerze należy wykonać następujące kroki. -

-
    -
  1. Skopiuj zawartość z wwwroot do dostępnego poprzez WWW foldera na nowym serwerze.
  2. -
  3. Zmodyfikuj skrypt wejściowy index.php tak by prawidłowo inkludował plik prado.php.
  4. -
  5. Usuń całą zawartość z folderów assets i runtime i upewnij się, że oba umożliwiają zapis procesom serwera WWW.
  6. -
- -

Cykle życia aplikacji

-

-Tak jak cykle życia strony tak aplikacja również posiada cykle życia. Moduły aplikacji mogą rejestrować zdarzenia dla cykli życia. -Kiedy aplikacja znajduje się w konkretnym cyklu i wywołuje odpowiednie zdarzenie, zarejstrowana metoda modułu jest wywoływana automatycznie. -Moduły załaczone w oficjalnym wydaniu PRADO, takie jak TAuthManager, używają tego sposobu aby wyknać swoje zadania. -

-

-Cykle życia aplikacji mogą zostać przedstawione następująco: -

- - -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Architecture.page b/demos/quickstart/protected/pages/Fundamentals/pl/Architecture.page deleted file mode 100755 index db429253..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Architecture.page +++ /dev/null @@ -1,15 +0,0 @@ - -

Architektura

- -

-Prado jest przede wszystkim frameworkiem służącym do prezentacji, mimo to nie jest on ograniczony jedynie do ten funkcjonalności. -Framework skupia się na programowaniu webowym, które w większości czasu ma do czynienia z interakcją z użytkownikiem, bazując na programowaniu sterowanym zdarzeniami (ang. event driven) oraz bazującym na komponentach (ang. component based), -tak by deweloper był bardziej produktywny. Następujące drzewko klas pokazuje główne klasy dostarczanych przez PRADO. -

- - -

-Kiedy PRADO przetwarza żądanie strony, jego diagram obiektów statycznych wygląda następująco. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Components.page b/demos/quickstart/protected/pages/Fundamentals/pl/Components.page deleted file mode 100755 index 5890f17f..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Components.page +++ /dev/null @@ -1,128 +0,0 @@ - -

Komponenty

-

-Komponent jest instancją klasy lub klasy potomnej TComponent. Klasa bazowa TComponent implementuje mechanizm właściwości oraz zdarzeń kompomentu. -

- -

Właściwości komponentu (ang. component properties)

-

-Właściwość kompoenentu może być postrzegana jako publiczna zmienna opsiującą określoną cechę/właściwość komponentu, taką jak kolor tła, rozmiar czcionki, itp. Właściwość jest definiowana poprzez istnienie metody getter i/lub setter w klasie. Na przykład w TControl definiujemy właściwość ID komponentu używając następujących funkcji typu getter i setter, - -class TControl extends TComponent { - public function getID() { - ... - } - public function setID($value) { - ... - } -} - -

-

-Aby pobrać lub ustawić właściwość ID, postępuj jak poniżej (tak jakbyś miał do czynienia ze zmienną): - -$id = $component->ID; -$component->ID = $id; - -Jest to równoznaczne z następującym zapisem: - -$id = $component->getID(); -$component->setID( $id ); - -

-

-Właściwość jest "tylko do odczytu" jeśli posiada metodę getter a nie posiada metody setter. Odkąd nazwy metod w PHP nie są zależne od wielkiej bądź małej litery, właściwości również są niewrażliwe na wielkość liter. Klasa kompomentu dziedziny wszystkie właściwości rodzica. -

- -

Subwłaściwości (ang. subproperties)

-

-Subwłaściwość jest właściwością właściwości typu obiektowego. Dla przykładu TWebControl posiada właściwość Font, która jest typu TFont. Wtedy właściwość Name właściwości Font jest subwłaściwością w stosunku do TWebControl. -

-

-Aby pobrać lub ustawić subwłaściwość Name należy użyć następującej metody: - -$name = $component->getSubProperty('Font.Name'); -$component->setSubProperty('Font.Name', $name); - -Jest to równoznaczne z następującym zapisem: - -$name = $component->getFont()->getName(); -$component->getFont()->setName( $name ); - - - -

- -

Zdarzenia komponentu

-

-Zdarzenia komponentu są specjalnymi właściwościami, które pobierają nazwy metod jako swoje wartości. Przypisując (ustawiając) metodę do zdarzenia (will hook up the method ) do miejsca gdzie zdarzenie jest wywoływane. Dzięki temu zachowanie komponentu może zostać zmodyfikowane w sposób, który nie był przewidziany podczas fazy dewelopowania komponentu. -

-

-Zdarzenie komponentu jest definiowane poprzez istnienie metody, której nazwa zaczyna się przedrostkiem on. Nazwa zdarzenia jest nazwą metody i z tego powodu jest niewrażliwa na wielkość liter. Na przykład w komponencie TButton mamy: - -class TButton extends TWebControl { - public function onClick( $param ) { - ... - } -} - -W ten sposób definiujemy metodę o nazwie OnClick a uchwyt do zdarzenia przez nią definiowanego może być przypisany w jeden z następujących sposobów: - -$button->OnClick = $callback; -$button->OnClick->add( $callback ); -$button->OnClick[] = $callback; -$button->attachEventHandler( 'OnClick' , $callback ); - -gdzie $callback odnosi się do poprawnej funkcji typu callback w PHP (np. nazwy funkcji, metody klasy array($object,'method'), itp.) -

- -

Przestrzenie nazw (ang. namespaces)

-

-Przestrzeń nazw odnosi się do logicznego pogrupowania nazwy klas w taki sposób, że moga być one odróżniane od innych klas, których nazwy są identyczne. Ponieważ PHP nie wspiera przestrzeni nazw sam w sobie, nie można stworzyć instancji dwóch klas, które mają tą samoą nazwę ale różne definicje. Aby odróżniać się od klas użytkowników wszystkie klasy PRADO posiadają prefix 'T' (oznaczający 'Type' - z angielskiego: typ). Zachęcamy do nazywania własnych klas w ten sposób. W odróznieniu można dodawać prefiksy klas zaczynające się dowolną inną literą (lub grupą liter). -

-

-Przestrzeń nazw w PRADO jest postrzegana jako folder zawierający jednen lub więcej plików klas. Poprzez poprzedzania nazwy klasy przestrzenią nazw klasa może zostać określona jednoznacznie. Każda przestrzeń nazw jest w PRADO określona w następujący sposób: -

-PathAlias.Dir1.Dir2 -
-gdzie PathAlias jest aliasem jakiegoś katalogu, gdzie Dir1 i Dir2 są podkatalogami tego katalogu. Klasa o nazwie MyClass zdefiniowana w Dir2 jest fully qualified poprzez PathAlias.Dir1.Dir2.MyClass. -

-

-By używać przestrzeni nazw w kodzie, napisz: - -Prado::using('PathAlias.Dir1.Dir2.*'); - -co spowoduje dołączenie katalogu wskazywanego przez PathAlias.Dir1.Dir2 do ścieżek include w PHP, dzięki czemu instancje klas zdefiniowanych w podanym katalogu mogą zostać utworzone bez podawania pełnej przestrzeni nazw. Możesz również zainkludować pojedyńczą definicję klasy poprzez - -Prado::using('PathAlias.Dir1.Dir2.MyClass'); - -co spowoduje zainkludowanie pliku klasy MyClass jeśli nie została ona jeszcze zdefiniowana. -

-

-Aby zobaczyć więcej informacji o definiowaniu aliasów zobacz sekcję konfigurowanie aplikacji. -

- -

Tworzenie instancji komponentu

-

-Tworzenie instancji komponentu oznacza tworzenie instancji klasy komponentu. Rozróżniamy dwa typy instancji komponentu: statyczną i dynamiczną. Utworzone komponenty nazywane są odpowiednio komponentami statycznymi i dynamicznymi. -

- -

Dynamiczne tworzenie instancji komponentów

-

-Dynamiczne tworzenie instancji komponentów oznacza tworzenie instancji komponentu w kodzie PHP. Wygląda to identycznie jak zwyczajne tworznie komponentów w PHP. Komponent może zostać dynamicznie utworzony w jeden z poniższych sposobów w PHP: - -$component = new ComponentClassName; -$component = Prado::createComponent('ComponentType'); - -gdzie ComponentType wskazuje na nazwę klasy lub nazwę typu w formacie przestrzeni nazw (np. System.Web.UI.TControl). Drugi sposób został wprowadzony aby wypełnić brak wsparcia dla przestrzeni nazw w PHP. -

- -

Statyczne tworzenie instancji komponentów

-

-Statyczne tworzenie instancji komponentów odnosi się do tworznenia komponentów poprzez konfigurację. Proces tworzenia odbywa się po stronie frameworku. Na przykład w konfiguracji aplikacji można skonfigurować moduł, który zostanie załadowany podczas uruchamiania aplikacji. Zatem moduł jest statycznym komponentem stworzonym przez framework. Statyczne tworzenie instancji jest często wspólnie używane w szablonach. Każdy tag komponentu w szablonie określa komponent, który będzie automatycznie stworzony przez framework, kiedy szablon będzie ładowany. Na przykład w szablonie strony następujący tag doprowadzi do stworzenia komponentu TButton na stronie: - -<com:TButton Text="Register" /> - -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Controls.page b/demos/quickstart/protected/pages/Fundamentals/pl/Controls.page deleted file mode 100755 index 68fdb993..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Controls.page +++ /dev/null @@ -1,51 +0,0 @@ - -

Kontrolki (ang. controls)

-

-Kontrolka jest instancją klasy TControl lub jej dziecka. Kontrolka jest komponentem definiowanym z dodatkiem interfejsu użytkownika. Klasa bazowa TControl definiuje relację rodzic-dziecko among controls which reflects the containment relationship among user interface elements. -

- -

Drzewko kontrolek

-

-Kontrolki są powiązane z sobą za pomocą relacji rodzic-dziecko. Każda kontrolka rodzica może posiadać jedną lub więcej kontrolek dzieci. Kontrolka rodzica jest in charge of the state transition of its child controls. Wynik renderowanie kontrolki dziecka jest zazwyczaj używany do stworzenia warstwy prezentacji kontrolki rodzica. Relacja rodzic-dziecko brings together controls into a control tree. Strona jest korzeniem drzewka, której warstwa prezentacji jest zwracana dla użytkownika końcowego. -

-

-Relacja rodzic-dziecko jest zazwyczaj ustalana przez framework poprzez szablony. W kodzie można bezpośrednio określić kontrolkę jako dziecko innej kontrolki stosując jedną z następujących metod: - -$parent->Controls->add($child); -$parent->Controls[]=$child; - -gdzie właściwość Controls wskazuje na kolekcję kontrolek bedących dziećmi rodzica. -

- -

Identyfikacja kontrolki

-

-Każda kontrolka ma właściwość ID, która jednoznacznie identyfikuje ją samą spośród jej rodzeństwa. W dodatku każda kontrolka posiada właściwość UniqueID oraz ClientID, która może zostać użyta do identyfikacji "globalnej" kontrolki w drzewku gdzie znajduje się ta kontrolka. Właściwości UniqueID oraz ClientID są bardzo podobne. Pierwsza jest używana przez framework do określenia położenia odpowiedniej kontrolki w drzewku, druga jest głównie używana po stronie klienta jako ID w tagach HTML. Ogólnie rzecz ujmując nie powinno się polegać na tak sprecyzowanym formacie UniqueID lub ClientID. -

- -

Kontenery nazw (ang. naming containers)

-

-Każda kontrolka posiada kontener nazw, który jest kontrolką tworzącą unikalną przestrzeń nazw dla rozróżnienie pomiędzy kontrolkami o tych samych ID. Na przykład kontrolka TRepeater tworzy wiele pozycji, które posiadają kontrolki-dzieci o tych samych ID. Aby rozróżnić te kontrolki-dzieci, każda pozycja służy jako kontener nazw. Dzięki temu, kontrolka-dziecko może zostać jednoznacznie zidentyfikowana używając ID swojego kontenera nazw razem z swoim własnym ID. Powinieneś teraz zrozumieć, że właściwości UniqueID i ClientID bazują (wynikają?) na kontenerze nazw. -

-

-Kontrolka może służyć jako kontener naz jeśli implementuje interfejs INamingContainer. -

- -

Stan widoku (ang. ViewState) oraz stan kontrolki (ang. ControlState)

-

-HTTP jest protokołem bezstanowym, co oznacza, że nie dostarcza on funkjonalności wspierającej kontynuowanie interakcji pomiędzy użytkownikiem a serwerem. Każde żądanie (ang. request) jest rozpatrywane jako pojedyńcze i niezależne w stosunku do innego żądania. Jednakże, aplikacja webowa często potrzebuje wiedzieć co użytkownik zrobił w poprzednich żądaniach. Dlatego wprowadzono sesje by pomóc zapamiętać te informacje o stanie. -

-

-PRADO zapożycza koncept stanu widoku oraz stanu kontrolki z ASP.NET Microsoftu by dostarczać dodatkowego stanowego mechanizmu programowania (ang. stateful programming mechanism). Wartość zachowana w stanie widoku lub stanie kontrolki może być dostępna w następnym żądaniu jeśli nowe żądanie pochodzi od wysłania formularza (ang. form submissions) (nazywanej postback'iem) do tej samej strony przez tego samego użytkownika. Różnica pomiędzy stanem widoku a stanem kontrolki wynika z tego iż pierwsza może zostać wyłączona a druga nie. -

-

-Stan widoku i stan kontrolki są zaimplementowane w TControl. Są one zazwyczaj używane do zdefiniowania różnych właściwościu kontrolki. By zapisać i przywrócić wartości ze stanu widoku lub stanu kontrolki, należy użyć następujących sposobów: - -$this->getViewState('Nazwa',$wartoscDomyslna); -$this->setViewState('Nazwa',$wartosc,$wartoscDomyslna); -$this->getControlState('Nazwa',$wartoscDomyslna); -$this->setControlState('Nazwa',$wartosc,$wartoscDomyslna); - -gdzie $this odnosi się do instancji kontrolki, Nazwa odnosi się to klucza identyfikującego zachowaną wartość, $wartoscDomyslna jest opcjonalna. Kiedy przywracamy wartości z stanu widoku lub stanu kontrolki, jeśli podany klucz nie istnieje, wartość domyślna jest zwracana. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Hangman.page b/demos/quickstart/protected/pages/Fundamentals/pl/Hangman.page deleted file mode 100755 index e3ad1338..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Hangman.page +++ /dev/null @@ -1,16 +0,0 @@ - - -

Przykład: wisielec

-

-Zobaczywszy prostą aplikację "Witaj Świecie" stworzymy teraz bardziej skomplikowaną aplikację "Wisielca". -W tej grze gracz musi odgadnąć słowo podając litery w zadanym czasie. Jeśli odgadnie prawidłowo litera pojawi się w słowie. Gracz może tak długo kontynuować zgadywanie dopóki liczba pomyłek znajduje się w zdefiniwanym na początku zakresie. -Gracz wygrywa grę jeśli znajdzie słowo zanim przekroczy dozwoloną liczbę pomyłek, w przeciwnym przypadku przegrywa. -

-

-Aby ułatwić stowrzenie tej gry, pokażemy diagram zmiany stanów gry następująco -

-Ciąg dalszy nastąpi... -

- - -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Modules.page b/demos/quickstart/protected/pages/Fundamentals/pl/Modules.page deleted file mode 100755 index 1bc8ca94..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Modules.page +++ /dev/null @@ -1,50 +0,0 @@ - - -

Moduły (ang. modules)

-

-Moduł jest instancją klasy implementującej interfejs IModule. Moduł jest zazwyczaj zaprojektowany by dostarczać określonej funkcjonalności, która może być podłączona do aplikacji PRADO i dzielona wśród wszystkich komponentów aplikacji. -

-

-PRADO używa konfiguracji aby określić kiedy załadować moduł, jaki rodzaj modułu i jak zainicjalizować załadowane moduły. Deweloper może zastąpić zródłowe (ang. core) moduły własnymi implementacjami poprzez konfigurację aplikacji lub może napisać nowe moduły by dostarczać dodatkowe funkcjonalności. Na przykład można stworzyć moduł, który będzie dostarczał wspólną logikę baz danych dla jednej lub więcej stron. Aby dowiedzieć się więcej zobacz sekcję konfiguracja. -

-

-Domyślnie ładowane są 3 moduły źródłowe (ang. core modules) podczas starty aplikacji. Są to moduł żądania (ang. request module), moduł odpowiedzi (ang. responce module) oraz moduł zarządzania błędami (ang. error handler module). Dodatkowo moduł sesji (ang. session module) jest ładowany kiedy jejst on używany w aplikacji. PRADO dostarcza domyślną implementację dla wszystkich tych modułów. Dodatkowe moduły (ang. custom modules) mogą być konfigurowane lub stworzone by nadpisać lub uzupełnić te trzy moduły źródłowe. -

- - -

Moduł żądania (ang. request module)

-

-Moduł żądań reprezentuje i dostarcza schemat dostępu i przechowywania żądań użytkownika wysyłanych poprzez HTTP. Dane żądania użytkownika przychodzą z kilku źródeł wliczając adresy URL, dane z żądania POST, dane sesyjne, dane z ciasteczek, itd. Te dane są dostępne poprzez moduł żądania. Domyślnie PRADO używa THttpRequest jako moduł żądania. Moduł żądania jest dostępne poprzez właściwość Request aplikacjji i kontrolek. -

- - -

Moduł odpowiedzi (ang. response module)

-

-Moduł odpowiedzi implementuje mechanizm do wysywałania wyjścia do klienta użytkwonika. Moduł odpowiedzi może zostać skonfigurowany by kontrolować jak wyjście jest keszowane po stronie klienta. Może on być również uzywany by wysyłać cookie z powrotem na stronę klienta. Domyślnie PRADO używa THttpResponse jako moduły odpowiedzi. Moduł odpowiedzi jest dostępny poprzez właściwość Response aplikacji i kontrolek. -

- - -

Moduł sesji (ang. session module)

-

-Moduł sesji enkapsuluje funkcjonalność związaną z zarządzaniem sesji użytkowika. Moduł sesji jest automatycznie ładowany jeśli aplikacja używa sesji. Domyślnie PRADO używa THttpSession jako moduł sesji, który jest po prostu nadkładką (ang. wrapper) dla funkcji sesyjnych dostarczanych przez PHP. Moduł sesji jest dostępny poprzez właściwość Session aplikacji i kontrolek. -

- - -

moduł zarządzania błędami (ang. error handler module)

-

-Moduł zarządzzania błędami jest użuwany by przechwycić i obsłużyć wszystkie przypadki błędów w aplikacji. PRADO używa TErrorHandler jako moduł zarządzania błędami. Przechwytuje on wszystkie ostrzeżenia PHP (ang. warnings), wiadomości (ang. notices) oraz wyjątki (ang. exceptions) i wyświetla w odpowiedniej formie użytkownikowi końcowemu. Moduł zarządzania błędami jest dostępny poprzez właściwość ErrorHandler instancji aplikacji. -

- - -

Dodatkowe moduły (ang. custom modules)

-

-PRADO zostało wydane z większą ilością modułów niż wymienione moduły źródłowe. PRADO zawiera moduły keszujące (TSqliteCache oraz TMemCache), moduły zarządzające użytkownikami (TUserManager), moduły autentykacji i autoryzacji (TAuthManager), itd. -

-

-Kiedy wystąpi żądanie TPageService ładowane są także określone moduły dla serwisu stron, włączając menedżer elementów aktywnych (ang. assets manager) (TAssetManager), menedżer szablonów (TTemplateManager), menedżer tematów/skórek (ang. theme/skin manager) (TThemeManager). -

-

-Dodatkowe moduły oraz moduły źródłowe są konfigurowalne poprzez konfigurację. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Pages.page b/demos/quickstart/protected/pages/Fundamentals/pl/Pages.page deleted file mode 100755 index a6318674..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Pages.page +++ /dev/null @@ -1,25 +0,0 @@ - - -

Strony (ang. pages)

-

-Strony są najwyżej umiejscowionymi w hierarchi kontrolkamki, które nie posiadają rodzica. -Prezentacja strony jest bezpośrednio wyświetlana użytkownikowi końcowemu. Użytkownicy posiadają dostęp do strony poprzez wysłanie żądanie do serwisu strony (ang. sending page service requests). -

-

-Każda strona musi posiadać plik szablonu. Musi posiadać on rozszerzenie .page. Nazwa pliku (bez rozszerzenia) jest nazwą strony. PRADO będzie próbować znaleźć plik klasy strony w katalogu zawierającym szablon strony. Taki plik klasy strony musi posiadać tą samą nazwę (z rozszerzeniem .php) jak plik szablonu. Jeśli klasa nie zostanie znaleziona, strona skorzysta z klasy TPage. -

- -

PostBack

-

-Wysłanie formularza jest nazywane postback jeśli wysłanie następuje do strony zawierającej formularz. Postback może być postrzegany jako zdarzenie po stronie klienta, wywoływane przez użytkownika. PRADO będzie próbowało zidentyfikować, która kontrolka po stronie serwera jest odpowiedzialna za zdarzenie postblack. Jeśli znajdzie taką, np. przykład TButton, nazywać ją będziemy senderem zdarzenia postback, który przetłumaczy zdarzenie postback na pewne specyficzne zdarzenia po stronie serwera (np. zdarzenia OnClick i OnCommand dla TButton). - -

- -

Cykl życia strony (ang. page lifecycles)

-

-Zrozumienie cyklu życia strony jest kluczowe by zrozumieć istotę programowania w PRADO. -Cykl życia strony odwołuje się do stanów przejściowych strony, gdy jest ona dostarczana użytkownikowi końcowemu. Może on (cykl) być przedstawiony za pomocą następującej tablicy stanów: - -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/Services.page b/demos/quickstart/protected/pages/Fundamentals/pl/Services.page deleted file mode 100755 index 6d8b8866..00000000 --- a/demos/quickstart/protected/pages/Fundamentals/pl/Services.page +++ /dev/null @@ -1,34 +0,0 @@ - - -

Serwisy (ang. services)

-

-Serwis jest instancją klasy implementującej interfejs IService. Każdy rodzaj serwisu przetwarza specyficzny typ żądania użytkownika. Na przykład serwis strony (ang. page service) odpowiada na żądania użytkownika dla stron PRADO. -

-

-Serwis jest jednoznacznie identyfikowany poprzez swoją właściwość ID. Domyślnie kiedy THttpRequest jest używany jako moduł żądania (ang. request module), nazwy zmiennych GET są używane by zidentyfikować serwis żadany przez użytkownika. Jeśli nazwa zmiennej GET zgadza się z jakimś ID serwisu, żądanie jest przetwarzane przez ten serwis oraz wartość parametru GET jest przekazywana jako parametr serwisu. Dla serwisu strony nazwą zmiennej GET musi być page. Na przykład następujący adres URL żadą strony Fundamentals.Services, - -http://hostname/index.php?page=Fundamentals.Services - -

-

-Deweloper może zaimplementować dodatkowe serwisy dla swojej aplikacji. Aby uczynić serwis dostępnym należy go skonfigurować w konfiguracji aplikacji. -

- -

Serwis strony (ang. page service)

-

-PRADO implementuje TPageService by przetwarzać żądania stron użytkonika. Strony są przechowywane w katalogu określonej przez właściwość BasePath serwisu strony. Właściwość wskazuje domyślnie na katalog pages w ścieżce aplikacji. Możesz zmienić tą wartość domyślną poprzez skonfigurowanie serwisu w konfiguracji aplikacji. -

-

-Strony mogą być zorganizowane w podkatalogi w BasePath. W każdym katalogu może znajdować się plik konfiguracji strony o nazwie config.xml, który zawiera konfigurację aktywną tylko wtedy gdy strona spod tego katalogu lub podkatalogu jest żądana. Aby dowiedzieć się wiecej zobacz sekcję konfiguracja strony. -

-

-Parametr dla serwisu stron wskazuje na żądaną stronę. Parametr taki jak Fundamentals.Services wskazuje na stronę Services w katalogu <BasePath>/Fundamentals. Jeśli taki parametr nie jest obecny w żądaniu domyślnie przyjmowana jest jego wartość jako Home. Używając THttpRequest jako moduł żądania (domyślnie), następujący adres URL zażada stron Home, About i Register odpowiednio dla: - -http://hostname/index.php -http://hostname/index.php?page=About -http://hostname/index.php?page=Users.Register - -gdzie pierwszy przukład wynika z faktu, że serwis strony jest domyślnym serwisem a strona Home jest stroną domyślną. -

- -
diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/applifecycles.gif b/demos/quickstart/protected/pages/Fundamentals/pl/applifecycles.gif deleted file mode 100755 index caf16028..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/pl/applifecycles.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/classtree.gif b/demos/quickstart/protected/pages/Fundamentals/pl/classtree.gif deleted file mode 100755 index b1fbf0d6..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/pl/classtree.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/directory.gif b/demos/quickstart/protected/pages/Fundamentals/pl/directory.gif deleted file mode 100755 index c7d5086d..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/pl/directory.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/lifecycles.gif b/demos/quickstart/protected/pages/Fundamentals/pl/lifecycles.gif deleted file mode 100755 index 5edaff5f..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/pl/lifecycles.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/Fundamentals/pl/objectdiagram.gif b/demos/quickstart/protected/pages/Fundamentals/pl/objectdiagram.gif deleted file mode 100755 index 7910469c..00000000 Binary files a/demos/quickstart/protected/pages/Fundamentals/pl/objectdiagram.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/HelloWorld.page b/demos/quickstart/protected/pages/GettingStarted/HelloWorld.page index d65cf7f8..285be3b4 100755 --- a/demos/quickstart/protected/pages/GettingStarted/HelloWorld.page +++ b/demos/quickstart/protected/pages/GettingStarted/HelloWorld.page @@ -77,7 +77,7 @@ class Home extends TPage The application is now ready and can be accessed via: http://Web-server-address/helloworld/index.php, assuming helloworld is directly under the Web DocumentRoot. Try to change TButton in Home.page to TLinkButton and see what happens.

-Complete source code of this demo can be found in the PRADO release. You can also try the online demo. +Complete source code of this demo can be found in the PRADO release. You can also try the online demo.

diff --git a/demos/quickstart/protected/pages/GettingStarted/Installation.page b/demos/quickstart/protected/pages/GettingStarted/Installation.page index f59eed70..5280d25b 100755 --- a/demos/quickstart/protected/pages/GettingStarted/Installation.page +++ b/demos/quickstart/protected/pages/GettingStarted/Installation.page @@ -15,7 +15,7 @@ PRADO can be installed as a standalone package or using

Standalone package

    -
  1. Go to pradosoft.com to grab the latest version of PRADO.
  2. +
  3. Go to the Prado framework project page to grab the latest version of PRADO.
  4. Unpack the PRADO release file to a Web-accessible directory.
diff --git a/demos/quickstart/protected/pages/GettingStarted/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/Introduction.page index 522e385c..2056b5e1 100755 --- a/demos/quickstart/protected/pages/GettingStarted/Introduction.page +++ b/demos/quickstart/protected/pages/GettingStarted/Introduction.page @@ -52,11 +52,7 @@ You may refer to the following resources if you find this tutorial does not fulf

- diff --git a/demos/quickstart/protected/pages/GettingStarted/de/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/de/Introduction.page deleted file mode 100755 index 0c6b4ee6..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/de/Introduction.page +++ /dev/null @@ -1,62 +0,0 @@ - -

Willkommen zum PRADO Quickstart Tutorial

-
-

-Das Quicktstart tutorial soll Sie bei der Erstellung einer PRADO 3.x-basierten Webanwendung unterstützen. -

-

-Wenn Sie bereits PRADO 3.x nutzen und herausfinden möchten welche Verbesserungen und neuen Funktionen mit welcher Prado-Version unterstützt werden, besuchen sie die Neue Features-Seite. -

- - -

-Nutzen Sie auch die folgenden Ressourcen, wenn dieses Tutorial ihre Fragen nicht hinreichend beantwortet: -

-
- - -
diff --git a/demos/quickstart/protected/pages/GettingStarted/es/AboutPrado.page b/demos/quickstart/protected/pages/GettingStarted/es/AboutPrado.page deleted file mode 100755 index 1aa1d765..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/es/AboutPrado.page +++ /dev/null @@ -1,86 +0,0 @@ - -

¿Que es PRADO?

-

-PRADO es una capa de programación (framework) basada componentes y programación dirigida por eventos, para desarrollos de aplicaciones Web en PHP 5. Las siglas PRADO significan en español Desarrollo Rapido de Aplicaciones con Programación Orientada a Objetos en PHP (PHP Rapid Application Development Object-oriented). -

-

-El principal objetivo de PRADO es utilizar al máximo la reutilización en la programación Web. Por reusabilidad, queremos decir no solamente reutilizar el código propio, si no el de otros programadores de una manera fácil. Lo último dicho es más importante, ya que evita el esfuerzo de reinventar nuevamente la rueda y además posibilita disminuir notablemente los tiempos de desarrollos. La introducción al concepto de componentes tiene este propósito. -

-

-Para alcanzar el propósito mencionado, PRADO estipula un protocolo para escribir y usar componentes para construir una aplicación Web. Un componente es una pieza de programa que es autocontenido (self-contained) y puede ser reutilizado con una mínima personalización del mismo. Nuevos componentes pueden ser creados por una simple composición de componentes existentes. -

-

-Para facilitar la interacción con componentes, PRADO implementa el paradigma de la programación dirigida por eventos (event-driven) que permite la delegación de comportamientos extensibles a los componentes. -Las actividades de los usuarios finales, tales como hacer clic en un botón de un formulario, son capturados como eventos en el lado del servidor (server events). -Metodos o funciones deben ser enlazadas a dichos eventos de tal manera que cuando los eventos sucedan, estos son invocados automáticamente para responder a dicho evento. Comparado con la programación Web tradicional en la cual los desarrolladores tienen que tratar directamente (raw) con las variables de arreglo POST y GET, la programación dirigida por eventos ayuda a los desarrolladores enfocarse mejor en las necesidades lógicas y reducir significativamente el código de bajo nivel repetitivo (low-level repetitive coding). -

-

-En resumen, desarrollar aplicaciones Web con PRADO principalmente involucra instantáneamente tipos de componentes predesarrollados, configurarlos mediante sus propiedades, responder a sus eventos escribiendo funciones manipuladoras de los mismos , y agrupándolos (composing them) dentro de paginas para la aplicación. Es muy similar al Kit de herramientas RAD de Borland Delphi y Microsoft Visual Basic, que son utilizadas para desarrollar aplicaciones (Interfaces Graficas de Usuarios, GUI) de escritorio. -

- -

¿Proque PRADO?

-

-PRADO es comúnmente citado como una plataforma de programación (framework) única. En realidad es tan único que puede convertir una tediosa y aburrida tarea de programación en PHP en una tarea divertida (fun task). La siguiente lista es un pequeño resumen de las características principales de PRADO, -

-
    -
  • -Reutilización - Los codigos que se rigen por el protocolo basado en componentes de PRADO son altamente reutilizables. Esto beneficia a los equipos de desarrollo a largo plazo, ya que pueden reutilizar sus trabajos anteriores e integrar otras partes de trabajo con facilidad.
  • -
  • -Programación dirigida por eventos - Las actividades del usuario final, tales como como hacer clic en un botón de enviar, son capturadas como eventos del servidor permitiendo que los desarrolladores tengan un mejor enfoque en interacciones del usuario.
  • -
  • Integración de equipo - La capa de presentacion y la capa logica son almacenados por separado. Las aplicaciones en PRADO pueden ser armadas por temas (themable).
  • -
  • -Controles webs Potentes - PRADO viene con un conjunto de poderosos componentes que se ocupan de interfaces de usuario Web. Altamente interactivo de páginas web se puede crear con unas pocas líneas de código. Por ejemplo, utilizando el componente DataGrid, se puede crear rápidamente una página que presenta una tabla de datos que permite la paginación, la clasificación, editar y eliminar filas de los datos. -
  • -Fuerte soporte de bases de datos - Desde la versión 3.1, PRADO ha sido equipada con total soporte de bases de datos escrita en forma nativa y, por tanto, encaja con el resto del framework PRADO. De acuerdo a la complejidad de los objetos de negocio, se puede optar por utilizar la PDO simple, basada en el acceso a los datos, o el apmpliamente conocido Active Record, o el mapa completo de los objetos del negocio SqlMap.
  • -
  • -Soporte de AJAX sin fisuras - Uso de AJAX en PRADO nunca ha sido más fácil con su innovador Controles Activos (Active Controls) introducidos desde la versión 3.1. Puede escribir una aplicación AJAX sin escribir una sola línea de código javascript. De hecho, que la utilización de los Controles Activos, no es muy diferente a la utilizacion de componentes no-AJAX.
  • -
  • -Soporte de I18N y L10N - PRADO incluye soporte completo para crear aplicaciones con múltiples idiomas y la localización.
  • -
  • -Compatibilidad (compliance) XHTML - Las páginas Web generadas por PRADO son compatibles con XHTML.
  • -
  • -Albergar trabajos ya existentes - PRADO es un framework genérico, con especial atención a la capa de presentación. No excluye a desarrolladores que hacen uso de la mayoría de las actuales bibliotecas de clase o juegos (kits) de herramientas. Por ejemplo, uno puede usar ADOdb o Creole para tratar con base de datos en su aplicación PRADO. -
  • -Otras características - Potente manipulación de errores /excepciones y registro de mensjes (message logging); cahe genérico y memoria caché de salida selectiva; manejo de errores personalizable y localizable; extensible autentificación y autorización; prevención de medidas de seguridad tales como cross-site script (XSS) , protección de cookies, etc. -
  • -
- -

¿Qué es adecuado para utilizar PRADO

-

-PRADO es mejor adecuado para la creación de aplicaciones Web que tienen alta interactividdad con usuarios (user-interactive). Se puede utilizar para desarrollar sistemas tan simple como un blog o para aquellos sistema tan complejo como un sistema de gestión de contenidos (CMS) o una completa solución de comercio electrónico. PRADO promueve la programación orientada a objetos a través de su metodología basada en componente , se ajusta muy bien para el trabajo en equipo y el desarrollo empresarial. -

-

-PRADO viene con un conjunto completo de técnicas de caching que ayudan a acelerar las aplicaciones Web PRADO y acomodar el tráfico de alta exigencia. Su arquitectura modular permite a los desarrolladores el uso o icorporar (plug-in) diferentes módulos de caché de memoria para diferentes necesidades. La salida de caché permite elegir selectivamente el caché de las paginas webs generadas. -

- -

-¿Cómo se PRADO en comparación con otros Frameworks? -

-

-PRADO es a menudo citado como un framework único. Su singularidad radica principalmente en el paradigma de la programacion basada en componentes (component-based) y dirigida a eventos (event-driven) que pretende promover. Aunque este paradigma de programación no es nuevo en programación de aplicaciones de escritorio y no en una nueva web de algunos lenguajes de programación, PRADO es quizás el primer framework PHP que lo lleva a cabo. -

-

-La mayoría de frameworks de PHP principalmente se centra en separar la presentación y la lógica y promueve el patrón de diseño MVC (modelo-vista-controlador) . PRADO logra el mismo objetivo, naturalmente, al exigir que la lógica se almacena en las clases y la presentación en las plantillas. PRADO hace mucho más en otros aspectos distintos de MVC. Se llena de mucho espacio en blanco en la programación web en PHP, con su paradigma de programacion basada en componentes, la riqueza de su conjunto de controles Web, sus potente soporte de bases de datos, su flexible manejo de errores y registro de mensajes, y muchos otros. -

- -

-¿Es PRADO lo suficientemente estable? -

-

-Sí. PRADO inicialmente fue liberado en agosto de 2004. Muchas series de ensayos se han escrito y realizado con frecuencia para asegurar su calidad. Se ha utilizado por miles de desarrolladores y muchas aplicaciones Web se han desarrollado sobre la base de la misma. Bugs y peticiones se gestionan a través del sistema TRAC y tenemos una gran comunidad de usuarios y el equipo de desarrollo para asegurar que todas las preguntas se respondan en forma oportuna. -

- -

Historia de PRADO

-

-La propia inspiración original de PRADO vino de Apache Tapestry. Durante el diseño y la ejecución, me tome prestadas muchas ideas de Borland Delphi y Microsoft ASP.NET. La primera versión de PRADO salió en junio de 2004 y fue escrita en PHP 4. Impulsado por el concurso de codificación de Zend PHP 5 , re-escrbí PRADO en PHP 5, que resultó ser una sabia decisión, gracias al nuevo modelo de objetos proporcionados por PHP 5. PRADO ganó el gran premio en el concurso Zend, ganando el más alto de votos del público y los jueces del panel. -

-

-En agosto de 2004, PRADO comenzó a ser alojado en SourceForge como un proyecto de código abierto. Poco después, el sitio del proyecto xisc.com se anunció para el orden público. Con el fantástico apoyo del equipo de desarrolladores PRADO y usuarios PRADO, PRADO evolucionado a la versión 2,0 a mediados de 2005. En esta versión, Wei Zhuo contribuyó en PRADO con el excelente I18N y L10N apoyo. -

-

-En mayo de 2005, se decidió re-escribir por completo el framework PRADO para resolver algunas cuestiones fundamentales que se encuentran en la versión 2.0 y para ponerse al día con algunas geniales características disponibles en Microsoft ASP.NET 2.0. Después de casi un año de arduo trabajo con más de 50.000 líneas de nuevo código, la versión 3.0 fue finalmente puesta a disposición en abril de 2006. -

-

-A partir de la versión 3.0, importantes esfuerzos se asignan a asegurar la calidad y la estabilidad de PRADO. Si decimos PRADO v2.x y v1.x son prueba de concepto de trabajo, podemos decir PRADO 3.x ha crecido a un proyecto que es adecuado para un negocio serio el desarrollo de aplicaciones. -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/es/Installation.page b/demos/quickstart/protected/pages/GettingStarted/es/Installation.page deleted file mode 100755 index 973415fa..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/es/Installation.page +++ /dev/null @@ -1,29 +0,0 @@ - -

Installing PRADO

-
-

-Su usted esta viendo esta pagina desde su explorador Web, usted ha ya realizado la instalación. -

-

-Los requerimientos minimos por PRADO, son que el servidor Web soporte PHP version 5. PRADO ha sido probado con el servidor Web Apache en las plataformas Windows y Linux. Existen muchas probabilidades de que tambien pueda correr en otras plataformas con otros servidores Webs siempre y cuando estos soporten PHP 5. -

-
- -
-

-La instalacion de PRADO, consiste principalmente en descargarlo y descomprimirlo. -

-
    -
  1. Ingrese en pradosoft.com para obtener la ultima version de PRADO.
  2. -
  3. Descomprima el archivo de la ultima publicacion de PRADO en una carpeta o directorio accesible via Web (Web-accessible). -
-
-
-

-Su instalacion de PRADO esta lista y usted puede comenzar a probarlo con las aplicaciones de demostraciones incluidas en la pulicacion de prado a travez de la URL http://web-server-address/prado/demos/. Aqui asumimos que PRADO esta descomprimido en la subcarpeta prado que se ecnuentra debajo de DocumentRoot del servidor Web. -

-

-Si encuentra algun problema con las aplicaciones demostrativa de PRADO, utilice por favor el script de chequeo de requerimientos que viene con PRADO , accesible desde http://web-server-address/prado/requirements/index.php, para comprobar primeramente si la configuracion de su server cumple con las condiciones requeridas por PRADO. -

-
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/es/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/es/Introduction.page deleted file mode 100755 index 324843ea..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/es/Introduction.page +++ /dev/null @@ -1,60 +0,0 @@ - -

Bienvenido al Tutorial rápido de PRADO

-
-

Este tutorial rápido se presta a ayudarle rápidamente a empezar a construir tu propia web aplicaciones basadas en PRADO versión 3.x. -

-

Si ya es usuario PRADO 3.x y me gustaría saber qué mejoras están disponibles para cada nueva versión, por favor, consulte las nuevas características . De lo contrario, las siguientes secciones son útiles para novatos. -

- - -

- -

-Usted podrá hacer referencia a los siguientes recursos si usted encuentra que este tutorial no cumple con todas sus necesidades. -

-
- - -
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/AboutPrado.page b/demos/quickstart/protected/pages/GettingStarted/fr/AboutPrado.page deleted file mode 100755 index 25bb0bc7..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/fr/AboutPrado.page +++ /dev/null @@ -1,71 +0,0 @@ - -

Qu'est-ce que PRADO ?

-

-PRADO est un framework de programmation évènementielle basé sur des composants pour développer des applications Web en PHP5. PRADO signifie PHP Rapid Application Development Object-oriented. -

-

-Le but principal de PRADO est la réutilisation maximale de code dans la programmation Web. Par réutilisation, cela ne se limite pas à son propre code mais aussi celui d'autres développeurs, de manière la plus aisée possible. Cela est très important car cela évite de réinventer la roue et peut donc réduire de façon significative le temps de développement. L'introduction du concept de composant provient de cela. -

-

-Afin de parvenir au but ci-dessus, PRADO stipule un protocole d'écriture et d'utilisation des composants afin de construire des applications Web. Un composant est une brique logicielle qui peut être réutilisée avec quelques modifications. De nouveaux composants peuvent ainsi être construits en utilisant des composants existants. -

-

-Afin de faciliter l'intéraction avec les composants, PRADO implémente une programmation évènementielle qui permet la délégation des comportements aux composants. Les actions des utilisateurs comme le click sur un bouton de type submit sont capturées comme des évènements serveurs. Des méthodes ou fonctions peuvent être attachées à ces évènements et lorsque l'évènement se produit, elles sont automatiquement invoquées afin de répondre à ces même évènements. Comparé à la traditionnelle programmation Web où les développeurs doivent utiliser les variables POST ou GET, la programmation évènementielle aide les développeurs à se consacrer à la logique et réduit de façon significative le code répétitif. -

-

-Développer une application Web avec PRADO se résume à instancier des composants existants, les configurer en définissant leurs propriétés, leur affecter des fonctions répondants à ces mêmes évènements, et ainsi composer les pages de l'application. Cela est très similaire aux développants à l'aide de RAD, comme Borland Delphi et Microsoft Visual Basic, qui sont utilisés pour développer des applications GUI. -

- -

Pourquoi PRADO ?

-

-PRADO est le plus souvent cité comme un framework unique. En fait, il est tellement unique qu'il peut changer votre programmation PHP en une tâche amusante. La liste suivante est un rapide résumé des principales fonctionnalités de PRADO, -

-
    -
  • Réutilisation - Le code provenant du protocole de composant PRADO est réellement réutilisable. Cela bénéficie à l'équipe de développement dans le sens où ils peuvent réutiliser leur travail précédent afin de l'intégrer dans d'autres parties de façon aisée.
  • -
  • Programmation évènementielle - Les actions de l'utilisateur, comme un click sur un bouton de type submit, sont capturées comme évènement serveur afin que le développeur se consacre principalement à la façon de gérer ces interactions.
  • -
  • Intégration des équipes - La logique et la présentation sont séparées. Des thèmes peuvent être appliqués aux applications PRADO.
  • -
  • Contrôles Web puissants - PRADO possède un large éventail de composants afin de gérer les interfaces Web. Des pages Web très interactives peuvent être crées avec peu de lignes de code. Par exemple, le seul composant "datagrid" (ou grille de données) permet de créer rapidement une page présentant un tableau paginé triable qui permet l'édition et la suppression de lignes de données. -
  • Support robuste des base de données - Depuis la version 3.1, PRADO a été doté d'un support complet des base de données qui s'intègre totalement avec les autres parties du framework. Selon la complexité des objets métiers, votre choix pourra porter vers une simple couche d'accès PDA, vers les largements connus "Active Record" ou un mapping complet des objets métiers à travers un schéma SqlMap.
  • -
  • Support de AJAX - Utiliser AJAX dans PRADO n'a jamais été aussi facile qu'avec les innovants "active controls" introduits depuis la version 3.1. Vous pouvez facilement créer une application intégrant de l'AJAX sans écrire une seule ligne de javascript. En fait, l'utilisation des "active controls" n'est pas différente des contrôles Web standards.
  • -
  • Support I18N et L10N - PRADO intègre un support complet afin de contruire des applications dans plusieurs langues et plusieurs locales.
  • - -
  • Rendu XHTML - Les pages Web générées par PRADO sont "XHTML-compliant" et ainsi conformes aux standards W3C.
  • -
  • Intégration de l'existant - PRADO est un framework généric se focalisant sur la couche de présentation. Cela n'empêche en rien les développeurs d'utiliser la plupart des bibliothèques existantes. Par exemple, on peut utiliser AdoDB ou Creole afin de gérer l'accès données dans son application PRADO. -
  • Autres fonctionnalités - Puissante gestion des erreurs et/ou exceptions et enregistrement des messages; Cache générique et sélectif; Gestion des erreurs customisable et localisable; Authentification et authorisation extensible; Mesures de sésurité comme prévention des cross-site script (CSS), protection des cookies, etc...
  • -
- -

Pour quelles applications PRADO est-il adapté ?

-

-PRADO est le plus adapté pour des applications Web très interactives. Il peut être utilisé pour développer des systèmes simples comme un blog, ou complexes comme un système de gestion de contenu (CMS), ou une solution complète de e-commerce. Puisque PRADO est basé sur une programmation orientée objet à travers sa méthodologie de composants, il convient particulièrement bien pour le travail en équipe et le développement d'entreprise. -

-

-PRADO intègre un système de cache complet qui peut aider les applications à tenir des charges de traffic élevées. Son architecture modulaire permet aux développeurs d'utiliser des modules de cache différents pour chaque besoin. Le cache peut s'effectuer sur toute ou partie d'une page Web. -

- -

Comment est PRADO comparé à d'autres Frameworks ?

-

-PRADO est souvent cité comme un framework unique. Sa particularité est principalement liée à la gestion des composants et à la programmation évènementielle qu'il essaie de promouvoir. Bien que ce paradigme ne soit pas nouveau dans la programmation d'application GUI, PRADO est peut-être le premier framework PHP à l'intégrer. -

-

-La plupart des frameworks PHP se focalise principalement sur la séparation des couches de présentation et de la logique en utilisant le design pattern MVC (Model-Vue-Contrôleur). PRADO atteint le même but en imposant que la logique se situe dans des classes et la présentation dans des templates. PRADO fait beaucoup plus sur d'autres aspects que le MVC. Il comble des manque dans la programmation PHP avec son modèle de composants Web riches, son support robuste des bases de données, sa gestion d'erreur flexible et beaucoup d'autre... -

- -

PRADO est-il assez stable ?

-

-Oui. Le projet PRADO a débuté en août 2004. Beaucoup de tests unitaires ont été écrits et fréquemment éxecutés afin d'assurer sa qualité. Il a été utilisé par des milliers de développeurs et beaucoup d'applications sont basés sur celui-ci. Les bugs et les demandes de fonctionnalités sont gérées à travers le système TRAC, nous avons une grande communauté d'utilisateurs et une équipe de développement afin d'assurer que toutes les questions sont répondues en un temps record. -

- -

Histoire de PRADO

-

-L'inspiration originale de PRADO vient de Apache Tapestry. Pendant le design et l'implémentation, j'ai emprunté beaucoup d'idées de Borland Delphi et Microsoft ASP.NET. La première version de PRADO a vue le jour en juin 2004 et était écrite en PHP4. Conduit par le concours de codage de Zend, j'ai réécrit PRADO en PHP5, qui est un changement majeur grâce au nouveau modèle objet fourni par PHP5. PRADO a remporté le grand prix du concours grâce aux votes du public ainsi que du jury. -

-

-En août 2004, PRADO a commencé à être hébergé sur SourceForge en projet Open Source. Peu après, le site du projet xisc.com a été annoncé au public. Grâce au fantastique support de l'équipe de développement et des utilisateurs de PRADO, PRADO a évolué en version 2.0 mi 2005. Dans cette version, Wei Zhuo a contribué à PRADO avec le support I18N et L10N. -

-

-En mai 2005, nous avons décidé de réécrire complètement le framework PRADO afin de résoudre quelques problèmes trouvés dans la version 2.0 et ajouter des fonctionnalités disponibles dans Microsoft ASP.NET 2.0. Après près d'un an de dur labeur et 50.000 lignes de nouveau code, la version 3.0 était finalement disponible en avril 2006. -

-

-Au démarrage de la version 3.0, des efforts significatifs ont été fournis afin d'assurer la qualité et la stabilité de PRADO. Si PRADO v2.x et v1.x sont la preuve du concept, nous pouvons affirmer que PRADO v3.x est un projet qui est désormais adapté pour le développement d'applications métiers. -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/CommandLine.page b/demos/quickstart/protected/pages/GettingStarted/fr/CommandLine.page deleted file mode 100755 index d1406928..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/fr/CommandLine.page +++ /dev/null @@ -1,94 +0,0 @@ - -

Outil en ligne de commande

-

Le script optionnel prado-cli.php du répertoire framework est un outil en ligne de commande destiné à éxecuter certaines tâches dans PRADO. -Le script prado-cli.php peut être utilisé pour créer le squelette de projet PRADO, des fichiers tests et accéder à un shell interactif PHP. -

-

Pré-requis

-

-Afin d'utiliser l'outil en ligne de commande, vous aurez à utiliser une console. De plus, PHP doit être capable d'éxecuter des scripts en ligne de commande. -

- -

Utilisation

-

-Si vous tapez php chemin/vers/framework/prado-cli.php, vous devez voir les informations suivantes. Alternativement, si vous n'êtes pas sous Windows, vous pouvez essayer de transformer le fichier prado-cli.php en un éxecutable

- -Command line tools for Prado 3.0.5. -usage: php prado-cli.php action [optional] -example: php prado-cli.php -c mysite - -actions: - -c - Creates a Prado project skeleton for the given . - - -t - Create test fixtures in the given . - - shell [directory] - Runs a PHP interactive interpreter. Initializes the Prado - application in the given [directory]. - - -

Les <parameter> sont les paramètres requis et [optional] -désignent les paramètres optionnels.

- -

Créer un nouveau squelette de projet PRADO

- -

Afin de créer un squelettre de projet PRADO, suivez les instructions suivantes :

-
    -
  1. Placez-vous dans le dossier où vous souhaitez créer le projet.
  2. -
  3. Tapez, php ../prado/framework/prado-cli.php -c helloworld, où - helloworld est le nom du dossier où vous souhaitez créer le squelette.
  4. -
  5. Tapez, php ../prado/framework/prado-cli.php -t helloworld afin de créer les fichiers tests du projet helloworld.
  6. -
- -

Shell interactif

-

-Le shell interactif vous permet d'évaluer des scripts PHP directement en ligne de commande. -Le script prado-cli.php peut être utilisé pour démarrer le shell et charger un projet PRADO existant. -Par exemple, chargons le projet de démo blog. En supposant que votre console se situe actuellement dans le répertoire prado de la distribution, tapez : -

-

- -$: php framework/prado-cli.php shell demos/blog - -Le résultat doit être - -Command line tools for Prado 3.0.5. -** Loaded Prado application in directory "demos\blog\protected". -PHP-Shell - Version 0.3.1 -(c) 2006, Jan Kneschke - ->> use '?' to open the inline help - ->> - -Ensuite, nous allons appeler une instance de l'application du blog PRADO, et de cette instance nous allons créer une instance du module'data'. Notez qu'un point-virgule à la fin de la ligne n'affiche pas la sortie. - - ->> $app = Prado::getApplication(); - ->> $db = $app->getModule('data'); - -Pour finir, nous voulons utiliser le module 'data' pour récupérer le post ayant l'ID=1. Notez que nous n'avons pas mis de point-virgule afin de voir le résultat de la commande. - ->> $db->queryPostByID(1) - -Aucune erreur ne doit se produire et vous devez dorénavant voir : - -PostRecord#1 -( - [ID] => 1 - [AuthorID] => 1 - [AuthorName] => 'Prado User' - [CreateTime] => 1148819691 - [ModifyTime] => 0 - [Title] => 'Welcome to Prado Weblog' - [Content] => 'Congratulations! You have successfully installed Prado Blog -- - a PRADO-driven weblog system. A default administrator account has been created. - Please login with admin/prado and update your password as soon as possible.' - [Status] => 0 - [CommentCount] => 0 -) - -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/HelloWorld.page b/demos/quickstart/protected/pages/GettingStarted/fr/HelloWorld.page deleted file mode 100755 index 1e0f5574..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/fr/HelloWorld.page +++ /dev/null @@ -1,83 +0,0 @@ - -

Ma première application PRADO

-
-

-Dans cette partie, nous allons vous guider afin de créer votre première application PRADO, la fameuse application "Hello World". -

-

-"Hello World" est peut-être l'application PRADO la plus simple et interactive que vous pouvez créer. Cela affiche une page avec un bouton où il est affiché Click Me. Lorsque l'utilisateur clicke sur la bouton, il est affiché Hello World. -

-

-Il y a plusieurs approches afin d'arriver au but ci-dessus. On peut envoyer la page au serveur, vérifier le contenu de la variable POST, et générer une nouvelle page avec le texte du bouton modifié. On peut également simplement utiliser du javascript afin de mettre à jour le libellé du bouton après l'évènement onclick. -

-
-

-PRADO privilégie une programmation évènementielle basée sur des composants. Le bouton est représenté par un objet TButton. Celui-ci comprend le libellé du bouton en tant que propriété Text et associe l'évènement "click" avec un évènement serveur OnClick. Afin de répondre à l'action de l'utilisateur sur le click du bouton, il suffit simplement d'attacher une fonction à l'évènement OnClick du bouton. Dans cette fonction, la propriété Text est modifiée en "Hello World". Le diagramme suivant image la séquence ci-dessus : - -

-

-Notre application PRADO sera composée de trois fichiers, index.php, Home.page et Home.php, qui sont organisés de la façon suivante : - - -où chaque répertoire est expliqué comme suit. Notez que la structure des répertoire peut être personnalisée. Par example, le dossier protected peut se trouver hors du répertoire Web public. Vous saurez comment faire à la suite de ce tutorial. -

-
    -
  • assets - dossier de stockage des fichiers publiés privés. Voir la partie "assets" pour plus de détails. Le processus du serveur Web doit avoir les droits d'écriture sur ce répertoire.
  • -
  • protected - répertoire de base de l'application comprenant les données et fichiers privés. Ce répertoire se doit de ne pas être accessible au public.
  • -
  • runtime - répertoire de stockage des fichiers d'éxecution de l'application, comme des données de cache, etc. Le processus du serveur Web doit avoir les droits d'écriture sur ce répertoire.
  • -
  • pages - répertoire de base des pages PRADO.
  • -
- -
-Astuce :Vous pouvez également utiliser le script framework/prado-cli.php -en ligne de commande -afin de créer la structure de votre projet PRADO. Par exemple, tapez la commande -php path/to/prado-cli.php -c helloworld dans le dossier où vous souhaitez créer votre projet helloworld. -
- -

-Les trois fichiers dont nous avons besoin sont expliqués comme suit. -

-
    -
  • index.php - script d'entrée de notre application PRADO. Ce fichier est requis par toutes les applications PRADO et il s'agit du seul script accessible par les utilisateurs finaux. Le contenu du fichier index.php consiste principalement aux trois lignes suivantes : - -require_once('path/to/prado.php'); // include du script prado -$application=new TApplication; // création de l'instance de l'application PRADO -$application->run(); // démarrage de l'application - -
  • -
  • Home.page - template de la page par défaut retournée lorsque les utilisateurs ne spécifient pas de façon explicite la page demandée. Un template désigne la présentation des composants. Dans cet exemple, nous utiliserons deux composants,TForm et TButton, qui correspondent respectivement aux tags HTML <form> et <input>. Le fichier template contient le contenu suivant : - - - - <com:TForm> - <com:TButton Text="Click me" OnClick="buttonClicked" /> - </com:TForm> - - - -
  • -
  • Home.php - fichier de classe pour la page Home page. Celui-ci contient principalement la méthode répondant à l'évènement OnClick du bouton. - -class Home extends TPage -{ - public function buttonClicked($sender,$param) - { - // $sender se rapporte au composant bouton - $sender->Text="Hello World!"; - } -} - -
  • -
-
-

-L'application is maintenant prête et est accesible à l'adresse -The application is now ready and can be accessed via: http://Web-server-address/helloworld/index.php, en supposant que helloworld soit directement sous la racine de votre serveur. Essayez de modifier le TButton de la page Home.page en TLinkButton et voyez ce qui se produit. -

-

-Le code source complet de cette démonstration peut être téléchargé dans la release de PRADO. Vous pouvez également essayer la démonstration en ligne. -

-
- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/Installation.page b/demos/quickstart/protected/pages/GettingStarted/fr/Installation.page deleted file mode 100755 index 04b31cef..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/fr/Installation.page +++ /dev/null @@ -1,29 +0,0 @@ - -

Installer PRADO

-
-

-Si vous voyez cette page à partir de votre serveur Web, c'est que l'installation s'est déjà bien déroulée. -

-

-La configuration minimum requise par PRADO est que le serveur Web supporte PHP 5. PRADO a été testé avec un serveur Apache sur une platforme Windows et Linux. Il est fort possible qu'il fonctionne avec d'autres platformes avec d'autres types de serveurs Web tant que PHP 5 est supporté. -

-
- -
-

-L'installation de PRADO se résume principalement au téléchargement et à la décompression des sources. -

-
    -
  1. Rendez-vous sur pradosoft.com afin de récupérer la dernière version de PRADO.
  2. -
  3. Décompressez le fichier PRADO dans le répertoire du serveur Web. -
-
-
-

-Votre installation de PRADO est terminée et vous pouvez commencer à utiliser les applications de démonstration incluses dans PRADO avec l'URL http://web-server-address/prado/demos/. Ici nous supposons que PRADO est décompressé dans le sous-répertoire prado sous le répertoire racine du serveur Web. -

-

-Si vous rencontrez un problème avec les applications de démonstration, merci d'utiliser le script de vérification des pré-requis de PRADO, accessible à l'adresse http://web-server-address/prado/requirements/index.php, afin de vérifier que votre configuration réponds bien aux exigences de PRADO. -

-
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/fr/Introduction.page deleted file mode 100755 index 2a7768ee..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/fr/Introduction.page +++ /dev/null @@ -1,19 +0,0 @@ - -

Bienvenue sur le tutorial de démarrage rapide de PRADO

-
-

-Ce tutorial est destiné à vous aider rapidement à créer votre propre application Web basée sur PRADO version 3.X. -

-

-Vous pouvez vous réferrer aux ressouces suivantes si vous trouvez que ce tutorial ne correspond pas à vos besoins. -

-
- - -
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/NewFeatures.page b/demos/quickstart/protected/pages/GettingStarted/fr/NewFeatures.page deleted file mode 100755 index 7e0805c4..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/fr/NewFeatures.page +++ /dev/null @@ -1,24 +0,0 @@ - - -

Nouvelles fonctionnalités

- -

-Cette page résume les principale fonctionnalités introduites dans chaque version de PRADO. -

- -

Version 3.1.0

-
    - -
  • Ajout d'un support d'AJAX. Un large panel de contrôles AJAX, appelés "active controls", est introduit. L'utilisation de ces contrôles est très similaires à leur homologue "non-AJAX". Pour plus de détails, voir le détail sur les "active controls".
  • - -
  • Ajout d'un support complet de base de données.
  • -
  • Ajout de nouveaux contrôles, modules et services, incluant TSoapService, TOutputCache, TSessionPageStatePersister, TFeedService, TJsonService, cache des dépendances entre les classes et TXmlTransform. -
  • - -
  • Amélioration de certains contrôles de données avec des "renderers". Le "Renderer" permet la réutilisation des templates qui sont généralement trouvés dans les contrôles comme TRepeater, TDataList et TDataGrid, rendant ainsi la configuration de ces contrôles plus "propre". Pour plus de détails, consultez les tutoriaux mis à jour : TRepeater, TDataList et TDataGrid.
  • - -
  • Ajout du support des fichiers de configurations externes. Amélioration de la syntaxe des templates afin de faciliter la configuration des sous-propriétés.
  • - -
- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/Upgrading.page b/demos/quickstart/protected/pages/GettingStarted/fr/Upgrading.page deleted file mode 100755 index 18d3b218..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/fr/Upgrading.page +++ /dev/null @@ -1,63 +0,0 @@ - - -

Mise à jour à partir des versions v2.x et v1.x

- -
-

-PRADO v3.0 n'est pas rétro-compatible avec les versions précédents de PRADO. -

-

-La bonne nouvelle est que les propriétés et que les évènements de la plupart des contrôles restent identiques ainsi que la syntaxe des templates qui reste largement inchangée. Par conséquent, les connaissances des développeurs des anciennes versions restent applicables dans la v3.0. -

-

-Nous résumons ci-dessous les changements les plus significatifs de la v3.0 afin d'aider les développeurs à migrer leurs applications v2.x et v1.x plus facilement, si besoin est. -

-
- -

Définition des composants

-

-La version 3.0 a complètement changé de besoin de fichiers de spécifications des composants. Il se fonde davantage sur des conventions pour définir les propriétés et les événements des composants . En particulié, une propriété est définit par la présence d'une méthode getter et/ou setter, tandis qu'un évènement est définit par l'existance d'une méthode on... .Les noms des propriétés et évènements dans la v3.0 sont tous les deux case-insensitive. Par conséquence, les développeurs sont désormais obligés de faire attention aux conversions de type lorsque la propriété d'un composant est définie. Par example, le code suivant est utilisé afin de définir la propriété Enabled propriétaire d'un TControl, qui est un type booléen, -

- -public function setEnabled($value) -{ - $value=TPropertyValue::ensureBoolean($value); - $this->setViewState('Enabled',$value,true); -} - -

-où la fonction TPropertyValue::ensureBoolean() est utilisée afin de s'assurer que la variable est bien un booléen. Ceci car lorsque la propriété est configurée dans un template, une chaîne de caractère est passée au setter. Dans les versions précédentes, PRADO connaissait le type de chaque propriété des composants grâce aux fichiers de spécifications et se chargeait de la conversion de type pour vous. -

- -

Contrôleur de l'application

-

-Le contrôleur de l'application implémente désormais une architecture modulaire. Les modules peuvent être ajoutés et configurés dans la configuration de l'application. Chaque module assure une fonction particulière et ils peuvent être coordonnés entre eux par le cycle de vie de l'application. Le concept des modules de la version 2.x a été replacé dans la v3.0 par les répertoires des pages. En conséquence, le format de configuration de l'application de la v3.0 est très différent des versions précédentes. -

- -

Pages

-

-Les pages dans la version 3.0 sont organisés dans des répertoires qui peuvent être comparés au concept des modules de la v2.x. Les pages sont demandées selon leur structure. Par exemple, une URL index.php?page=Controls.Samples.Sample1 sera utilisée pour servir une page nommée Sample1 se trouvant dans le répertoire [BasePath]/Controls/Samples, où [BasePath] se réfère au répertoire racine des pages. Le nom d'un fichier template d'une page doit avoir comme extension .page, principalement pour différencier les templates des pages des templates des contrôles qui se termineront par l'extension .tpl. -

- -

Relation des contrôles

-

-La version 3.0 redéfinit les relations entre les contrôles. En particulier, la relation parent-enfant se réfère désormais à la relation entre les contrôles et la présentation. Un nouveau nom de relation est introduit afin d'aider la gestion des identifiants des contrôles. Pour plus de détails, voir la section concernant les contrôles. -

- -

Syntaxe des Templates

-
-

-La syntaxe des contrôles dans les templates de la v3.0 est très similaire à celle des versions précédentes avec beaucoup d'améliorations. Un changement important est au sujet des expression dans le databinding. Dans la v3.0, cela est fait de la façon suivante,

- -<com:MyComponent PropertyName=<%# PHP expression %> .../> - -

-Les expressions et les tags d'états ont aussi changé. Pour plus de détails, voir la section concernant la définition des templates. -

-
-

Syntaxe des Thèmes

-

-Les thèmes dans la v3.0 sont définis comme les contrôles des templates avec quelques restrictions. -

- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/directory.gif b/demos/quickstart/protected/pages/GettingStarted/fr/directory.gif deleted file mode 100755 index e6c4f724..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/fr/directory.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/fr/sequence.gif b/demos/quickstart/protected/pages/GettingStarted/fr/sequence.gif deleted file mode 100755 index 4207a9bb..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/fr/sequence.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/id/AboutPrado.page b/demos/quickstart/protected/pages/GettingStarted/id/AboutPrado.page deleted file mode 100755 index e2704859..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/id/AboutPrado.page +++ /dev/null @@ -1,70 +0,0 @@ - -

Apa itu PRADO?

-

-PRADO adalah kerangka pemrograman berbasis-komponen dan kendali-event untuk mengembangkan aplikasi Web dalam PHP 5. PRADO singkatan dari PHP Rapid Application Development Object-oriented. -

-

-Tujuan utama dari PRADO adalah menghidupkan usabilitas secara maksimum dalam pemrograman Web. Dengan usabilitas, kami artikan tidak hanya menggunakan ulang kode yang dimiliki seseorang, tapi juga menggunakan ulang kode orang lain dalam cara yang mudah. Yang terakhir lebih penting karena menghemat usaha penciptaan roda dan menghemat waktu pengembangan secara dramatis. Pengenalan atas konsep komponen adalah untuk tujuan ini. -

-

-Untuk mencapai tujuan di atas, PRADO menetapkan sebuah protokol atas penulisan dan pemakaian komponen untuk membentuk aplikasi Web. Komponen adalah unit software yang mengandung-dirinya sendiri dan dapat dipakai ulang dengan kustomisasi mudah. Komponen baru dapat dibuat dengan komposisi sederhana terhadap komponen-komponen yang sudah ada. -

-

-Untuk menjembatani interaksi dengan komponen, PRADO menerapkan paradigma pemrograman kendali-event yang membolehkan delegasi aturan yang bisa diperpanjang ke komponen. Aktivitas pengguna-akhir seperti mengklik pada tombol kirim, ditangkap sebagai event server. Metode atau fungsi dapat disertakan pada event ini agar ketika event terjadi, metode atau fungsi dipanggil secara otomatis untuk merespon event. Dibandingkan dengan pemrograman Web tradisional di mana para pengembang harus berhadapan dengan variabel kasar POST atay GET, pemrograman kendali-event membantu para pengembang lain lebih berfokus pada logika yang diperlukan dan mengurangi secara drastis pengkodean berulang kali. -

-

-Ringkasnya, mengembangkan aplikasi Web PRADO sebagian besar menyangkut penurunan tipe komponen yang sudah dibuat sebelumnya, mengkonfigurasinya dengan menyetel propertinya, merespon ke event-nya dengan menulis fungsi pengendali, dan mengaturnya ke dalam halaman untuk aplikasi. Ini sangat mirip dengan kit piranti RAD, seperti Borland Delphi dan Microsoft Visual Basic, yang digunakan untuk mengembangkan aplikasi GUI desktop. -

- -

Mengapa PRADO?

-

-PRADO banyak dikutip sebagai kerangka kerja yang unik. Kenyataannya, ia begitu unik sehinggi ia dapat mengalihkan pemrograman PHP yang membosankan menjadi tugas yang menyenangkan. Daftar berikut adalah ringkasan pendek dari fitur utama PRADO, -

-
    -
  • Usabilitas - Kode mengikuti protokol komponen yang dapat digunakan secara berulang-ulang. Ini menguntungkan tim pengembang selama bekerja karena mereka dapat menggunakan kembali pekerjaan mereka sebelumnya serta mengintegrasikan pekerjaan pihak lain dengan mudah.
  • -
  • Pemrograman kendali-event - Aktivitas pengguna-akhir, seperti mengklik pada tombol kirim, dianggap sebagai event server dengan begitu para pengembang lebih terfokus pada menghadapi interaksi pengguna.
  • -
  • Integrasi tim - Penyajian dan logika disimpan secara terpisah. Aplikasi PRADO dapat berganti tema.
  • -
  • Kontrol Web bertenaga - PRADO hadir dengan set komponen bertenaga berkenaan dengan antarmuka pengguna Web. Halaman Web interaktif tinggi dapat dibuat dengan beberapa baris kode. Sebagai contoh, menggunakan komponen datagrid, seseorang bisa dengan cepat membuat sebuah halaman yang menyajikan tabel data yang membolehkan banyak halaman, pengurutan, penyuntingan, dan penghapusan baris data. -
  • Dukungan database kuat - Sejak versi 3.1, PRADO telah dilengkapi dengan dukungan database lengkap yang secara alami ditulis dan selanjutnya cocok dengan kerangka kerja PRADO lainnya. Berdasarkan kompleksitas dari obyek bisnis, seseorang dapat memilih untuk menggunakan akses data berbasis-PDO, atau rekaman aktif yang lebih umum dikenal, atau skema pemetaan obyek bisnis lengkap SqlMap.
  • -
  • Dukungan AJAX - Menggunakan AJAX dalam PRADO jauh lebih mudah dengan kontrol aktif inovatif yang diperkenalkan sejak versi 3.1. Dengan mudah Anda dapat menulis aplikasi AJAX-enabled tanpa menuliskan satu barispun kode javascript. Kenyataannya, menggunakan kontrol aktif tidak jauh berbeda dengan menggunakan kontrol Web reguler non-AJAX.
  • -
  • Dukungan I18N dan L10N - PRADO menyertakan dukungan lengkap untuk membangun aplikasi dengan multipel bahasa dan lokal.
  • -
  • Sesuai XHTML - Halaman Web yang dibuat oleh PRADO sesuai dengan XHTML.
  • -
  • Akomodasi dari pekerjaan yang sudah ada - PRADO adalah kerangka kerja umum dengan fokus pada lapisan penyajian. Ita tidak mengecualikan para pengembang dari pemakaian librari kelas atau kit piranti yang sudah ada. Sebagai contoh, seseorang dapat memakai AdoDB atau Creole untuk berhadapan dengan DB dalam aplikasi PRADO-nya. -
  • Fitur lainnya - Penangangan kesalahan/kekecualian bertenaga serta pencatatan pesan; cache generik dan cache output selektif; penanganan kesalahan yang dapat dikustomisasi serta dilokalisasi; otorisasi dan otentikasi yang yang dapat diperluas; ukuran keamanan serperti pencegahan naskah situs-silang (XSS), proteksi cookie, dll.
  • -
- -

Untuk Apa PRADO Paling Cocok?

-

-PRADO paling cocok untuk membuat aplikasi Web yang tingkat interaksif-penggunanya cukup tinggi. Ia dapat dipakai untuk mengembangkan sistem sesederhana sistem blog sampai serumit sistem manajemen konten (CMS) atau solusi e-commerce lengkap. Karena PRADO mempromosikan pemrograman terorientasi-obyek melalui metodologi basis-komponennya, ia sangat cocok untuk kerjasama tim dan pengembangan enterprise. -

-

-PRADO hadir dengan set lengkap atas teknik cache yang membantu mempercepat aplikasi Web PRADO untuk mengakomodasi kebutuhan lalu lintas tinggi. Arsitektur modularnya membolehkan para pengembang menyertakan modul cache berbeda untuk keperluan yang berbeda pula. Cache output membebaskan seseorang untuk memilih secara selektif bagian halaman Web yang akan di-cache. -

- -

Bagaimana PRADO Bila Dibandingkan dengan Kerangka Kerja Lain?

-

-PRADO sering dikutip sebagai kerangka kerja unik. Keunikannya terutama berada pada paradigma pemrograman berbasis-komponen dan kendali-event yang dicoba dipromosikan. Meskipun paradigma pemrograman ini bukan hal baru dalam pemrograman aplikasi desktop dan bukan hal baru dalam beberapa bahasa pemrograman Web, Barangkali PRADO adalah kerangka kerja PHP pertama yang menghidupkannya. -

-

-Kebanyakan kerangka kerja PHP berfokus pada pemisahan penyajian dan logika serta mempromosikan pola desain MVC (model-view-controller). Pada dasarnya PRADO melakukan tujuan yang sama dengan membutuhkan logika disimpan dalam kelas dan penyajian dalam template. PRADO melakukan lebih banyak aspek tidak hanya MVC. Ia mengisi banyak area kosong dalam pemrograman Web PHP dengan paradigma pemrograman berbasis-komponen, kontrol Web yang kaya, dukungan database yang handal, fitur penanganan kesalahan yang fleksibel serta fitur pencatatan, dan masih banyak lagi. -

- -

Apakah PRADO Cukup Stabil?

-

-Ya. PRADO awalnya dirilis pada bulan Agustus 2004. Banyak rangkaian pengujian sudah ditulis dan dilaksanakan secara berkala guna memastikan kualitasnya. Sudah dipakai oleh ribuan pengembang dan banyak aplikasi Web dikembangkan berbasis itu. Bugs dan permintaan fitur diatur melalui sistem TRAC dan kami mempunyai komunitas pengguna besar dan tim pengembangan untuk memastikan semua pertanyaan dijawab dalam model berkala. -

- -

Sejarah PRADO

-

-Inspirasi orisinil PRADO berasal dari Apache Tapestry. Selama desain dan implementasi, Saya meminjam ide dari Borland Delphi dan Microsoft ASP.NET. Versi pertama PRADO keluar dalam bulan Juni 2004 dan ditulis dalam PHP 4. Karena adanya kontes kode Zend PHP 5, Saya menulis ulang PRADO dalam PHP 5, yang membuktikan menjadi perpindahan yang bijaksana, terima kasih pada model obyek baru yang disediakan PHP 5. PRADO memenangkan hadiah utama dalam kontes Zend, memperoleh pilihan tertinggi baik dari umum dan panelis juri. -

-

-Dalam bulan Agustus 2004, PRADO mulai ditampung pada SourceForge sebagai proyek sumber terbuka. Segera setelah itu, situs proyek xisc.com diumumkan kepada publik. Dengan dukungan fantastis dari tim pengembang PRADO dan pengguna PRADO, PRADO berkembang ke versi 2.0 di pertengahan 2005. Dalam versi ini, Wei Zhuo berkontribusi ke PRADO dengan dukungan I18N dan L10N yang istimewa. -

-

-Dalam bulan Mei 2005, kami memutuskan untuk menulis ulang sepenuhnya kerangka kerja PRADO untuk memecahkan beberapa isu dasar dalam versi 2.0 dan untuk menangkap dengan beberapa fitur bagus dalam Microsoft ASP.NET 2.0. Setelah hampir setahun kerja keras dengan lebih dari 50,000 baris kode baru, versi 3.0 akhirnya tersedia pada bulan April 2006. -

-

-Mulai dari versi 3.0, usaha signifikan dialokasikan untuk memastikan kualitas dan stabilitas PRADO. Jika kami katakan PRADO v2.x dan v1.x adalah pekerjaan bukti-konsep, kami dapat mengatakan PRADO 3.x telah berkembang menjadi proyek yang layak untuk pengembangan aplikasi bisnis serius. -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/id/CommandLine.page b/demos/quickstart/protected/pages/GettingStarted/id/CommandLine.page deleted file mode 100755 index 36c29700..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/id/CommandLine.page +++ /dev/null @@ -1,93 +0,0 @@ - -

Piranti Baris Perintah

-

File naskah PHP opsional prado-cli.php dalam direktori framework -menyediakan piranti baris perintah untuk melakukan berbagai hal membosankan dalam Prado. -prado-cli.php dapat dipakai untuk membuat kerangka proyek Prado, membuat perlengkapan pengujian awal, dan akses ke shell PHP interaktif. -

-

Persyaratan

-

-Untuk menggunakan piranti baris perintah, Anda perlu memakai prompt perintah Anda, konsol perintah atau terminal. Sebagai tambahan, PHP harus dapat menjalankan naskah PHP dari baris perintah. -

- -

Usage

-

-Jika Anda ketik php path/ke/framework/prado-cli.php, Anda seharusnya melihat informasi berikut. Alternatifnya, jika Anda tidak pada Windows, Anda dapat mencoba untuk mengubah prado-cli.php ke dalam eksecutabel dan menjalankannya seperti sebuah naskah

- -Command line tools for Prado 3.0.5. -usage: php prado-cli.php action [optional] -example: php prado-cli.php -c mysite - -actions: - -c - Creates a Prado project skeleton for the given . - - -t - Create test fixtures in the given . - - shell [directory] - Runs a PHP interactive interpreter. Initializes the Prado - application in the given [directory]. - - -

<parameter> adalah parameter diperlukan dan [optional] adalah parameter opsional.

- -

Membuat kerangka proyek Prado baru

- -

Untuk membuat kerangka proyek Prado, lakukan yang berikut:

-
    -
  1. Ubah direktori di mana Anda ingin membuat kerangka proyek.
  2. -
  3. Ketik, php ../prado/framework/prado-cli.php -c helloworld, sedangkan - helloworld adalah nama direktori di mana file kerangka proyek ingin Anda buat.
  4. -
  5. Ketik, php ../prado/framework/prado-cli.php -t helloworld untuk membuat perlengkapan pengujian untuk proyek helloworld.
  6. -
- -

Shell Interaktif

-

-Shell interaktif membolehkan Anda untuk mengevaluasi pernyataan PHP dari baris perintah. -Naskah prado-cli.php dapat dipakai untuk memulai shell dan mengambil proyek Prado yang sudah ada. Sebagai contoh, mari kita ambil proyek demo blog. Anggap bahwa baris perintah Anda ada dalam direktori distribusi prado dan Anda mengetikkannya. -

-

- -$: php framework/prado-cli.php shell demos/blog - -Output seharusnya - -Command line tools for Prado 3.0.5. -** Loaded Prado application in directory "demos\blog\protected". -PHP-Shell - Version 0.3.1 -(c) 2006, Jan Kneschke - ->> use '?' to open the inline help - ->> - -Selanjutnya kita akan mendapatkan turunan dari aplikasi blog Prado, dan dari turunan itu kita menginginkan sebuah turunan dari modul 'data'. Catatan bahwa titik koma di akhir baris menindih output. - - ->> $app = Prado::getApplication(); - ->> $db = $app->getModule('data'); - -Terakhir, kita ingin menggunakan modul data untuk meng-query sebuah tulisan dengan ID=1. Catatan bahwa kita membiarkan titik koma untuk menampilkan hasilnya. - ->> $db->queryPostByID(1) - -Di sana seharusnya tidak terjadi kesalahan apapun dan seharusnya Anda melihat yang berikut. - -PostRecord#1 -( - [ID] => 1 - [AuthorID] => 1 - [AuthorName] => 'Prado User' - [CreateTime] => 1148819691 - [ModifyTime] => 0 - [Title] => 'Welcome to Prado Weblog' - [Content] => 'Congratulations! You have successfully installed Prado Blog -- - a PRADO-driven weblog system. A default administrator account has been created. - Please login with admin/prado and update your password as soon as possible.' - [Status] => 0 - [CommentCount] => 0 -) - -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/id/HelloWorld.page b/demos/quickstart/protected/pages/GettingStarted/id/HelloWorld.page deleted file mode 100755 index a24b5969..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/id/HelloWorld.page +++ /dev/null @@ -1,82 +0,0 @@ - -

Aplikasi PRADO Pertama Saya

-
-

-Dalam seksi ini, kami membimbing Anda melalui pembuatan aplikasi PRADO pertama Anda, aplikasi terkenal "Hello World". -

-

-"Hello World" barangkali adalah aplikasi PRADO interaktif paling sederhana yang bisa Anda buat. Ia menampilkan kepada pengguna-akhir sebuah halaman dengan tombol kirim yang judulnya adalah Click Me. Setelah pengguna mengklik tombol, judulnya diubah ke Hello World. -

-

-Ada banyak pendekatan yang dapat mencapai tujuan di atas. Seseorang dapat mengirim halaman ke server, menentukan variabel POST, dan membuat halaman baru dengan judul tombol yang dimutakhirkan. Atau seseorang cukup menggunakan JavaScript untuk memutakhirkan judul tombol setelah event klien onclick. -

-
-

-PRADO mempromosikan pemrograman Web berbasis-komponen dan kendali-event. Tombol disajikan oleh obyek TButton. Ia melapisi judul tombol sebagai properti Text dan mengaitkan tindakan klik pengguna dengan event sisi-server OnClick. Untuk merespon klik pengguna pada tombol, seseorang cukup perlu menyertakan fungsi ke event OnClick tombol. Di dalam fungsi, properti tombol Text diubah sebagai "Hello World". Diagram berikut menampilkan urutan di atas, - -

-

-Aplikasi PRADO kita terdiri dari tiga file, index.php, Home.page dan Home.php, yang diatur sebagai berikut, - - -di mana setiap direktori dijelaskan sebagai berikut. Catatan, struktur direktori di atas bisa dikustomisasi. Sebagai contoh, seseorang dapat memindahkan direktori protected ke luar direktori Web. Anda akan mengetahui bagaimana melakukan ini setelah Anda melewati tutorial ini. -

-
    -
  • assets - direktori yang menyimpan file pribadi yang dipublikasikan. Lihat seksi assets untuk lebih jelasnya. Direktori ini harus bisa ditulisi oleh proses server Web.
  • -
  • protected - path basis aplikasi yang menyimpan data aplikasi dan file naskah pribadi. Direktori ini harus dikonfigurasi tidak bisa diakses terhadap pengguna-akhir.
  • -
  • runtime - path penyimpan runtime aplikasi. Direktori ini dipakai oleh PRADO untuk menyimpan informasi runtime aplikasi, seperti kondisi aplikasi, data di-cache, dll. Direktori ini harus bisa ditulisi oleh proses server Web.
  • -
  • pages - path basis yang menyimpan semua halaman PRADO.
  • -
- -
-Tip:Anda juga dapat menggunakan framework/prado-cli.php -naskah baris perintah -untuk membuat struktur direktori Prado. Sebagai contoh, ketik perintah -php path/to/prado-cli.php -c helloworld dalam direktori di mana Anda ingin membuat proyek helloworld. -
- -

-Ketiga file yang kita pakai dijelaskan sebagai berikut. -

-
    -
  • index.php - naskah entri dari aplikasi PRADO. File ini dibutuhkan oleh semua aplikasi PRADO dan satu-satunya file naskah yang secara langsung bisa diakses oleh pengguna-akhir. Konten dalam index.php sebagian besar terdiri dari tiga baris berikut, - -require_once('path/to/prado.php'); // sertakan naskah prado -$application=new TApplication; // buat turunan aplikasi PRADO -$application->run(); // jalankan aplikasi - -
  • -
  • Home.page - template untuk setiap halaman standar saat pengguna tidak secara eksplisit menetapkan halaman yang diminta. Sebuah template menetapkan penyajian tata letak komponen. Dalam contoh ini, kita gunakan dua komponen, TForm dan TButton, masing-masing terkait ke tag HTML <form> dan <input>. Template berisi konten berikut, - - - - <com:TForm> - <com:TButton Text="Click me" OnClick="buttonClicked" /> - </com:TForm> - - - -
  • -
  • Home.php - Kelas halaman untuk halaman Home. Ia terutama berisi metode yang terkait dengan event tombol OnClick. - -class Home extends TPage -{ - public function buttonClicked($sender,$param) - { - // $sender refers to the button component - $sender->Text="Hello World!"; - } -} - -
  • -
-
-

-Aplikasi sekarang siap dan dapat diakses melalui: http://Web-server-address/helloworld/index.php, menganggap helloworld adalah direktori di bawah Web DocumentRoot. Coba untuk mengubah TButton dalam Home.page ke TLinkButton dan lihat apa yang terjadi. -

-

-Kode sumber lengkap dari demo ini dapat ditemukan pada rilis PRADO. Anda juga dapat mencoba demo online. -

-
- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/id/Installation.page b/demos/quickstart/protected/pages/GettingStarted/id/Installation.page deleted file mode 100755 index 1990335b..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/id/Installation.page +++ /dev/null @@ -1,29 +0,0 @@ - -

Menginstalasi PRADO

-
-

-Jika Anda sedang melihat halaman ini dari server Web Anda, maka Anda sudah selesai dengan instalasi. -

-

-Persyaratan minimum PRADO adalah server Web yang mendukung PHP 5. PRADO sudah diuji dengan server Web Apache pada Windows dan Linux. Sangat dimungkinkan ia juga berjalan pada platform lain dengan server Web lain, selama PHP 5 didukung. -

-
- -
-

-Instalasi PRADO sebagian besar menyangkut download dan penguraian. -

-
    -
  1. Pergi ke pradosoft.com untuk mendapatkan PRADO versi terbaru.
  2. -
  3. Uraikan file rilis PRADO ke direktori yang dapat diakses Web. -
-
-
-

-Instalasi PRADO Anda selesai dan dapat mulai bermain dengan demo aplikasi yang disertakan dalam rilis PRADO via URL http://web-server-address/prado/demos/. Di sini kami menganggap PRADO diurai ke subdirektori prado di bawah DocumentRoot pada server Web. -

-

-Jika Anda menemukan masalah dengan demo aplikasi, silahkan gunakan naskah pemeriksa persyaratan, yang dapapt diakses melalui http://web-server-address/prado/requirements/index.php, untuk terlebih dahulu memeriksa apakah konfigurasi server Anda memenuhi kondisi yang dibutuhkan oleh PRADO. -

-
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/id/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/id/Introduction.page deleted file mode 100755 index 3aed6f6e..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/id/Introduction.page +++ /dev/null @@ -1,62 +0,0 @@ - -

Selamat datang di Tutorial Cepat PRADO

-
-

-Tutorial Cepat ini disediakan untuk membantu Anda secara cepat membangun aplikasi Web Anda sendiri berbasis PRADO versi 3.x. -

-

-Jika Anda adalah pengguna yang sudah mengenal PRADO 3.x dan ingin mempelajari peningkatan apa yang tersedia pada versi baru, silahkan periksa halaman fitur baru. Sebaliknya, seksi berikut sangat membantu bagi para pemula. -

- - -

-Anda dapat merujuk ke sumber daya berikut jika Anda mendapatkan tutorial ini tidak memenuhi semua kebutuhan Anda. -

-
- - -
diff --git a/demos/quickstart/protected/pages/GettingStarted/id/NewFeatures.page b/demos/quickstart/protected/pages/GettingStarted/id/NewFeatures.page deleted file mode 100755 index 6d3ce4f9..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/id/NewFeatures.page +++ /dev/null @@ -1,41 +0,0 @@ - - -

Fitur Baru

- -

-Halaman ini meringkas fitur-fitur utama baru yang diperkenalkan dalam setiap rilis PRADO. -

- -

Version 3.1.1

-
    -
  • Ditambahkan kontrol baru TTabPanel yang menampilkan tampilan tab.
  • -
  • Ditambahkan kontrol baru TKeyboard yang menampilkan keyboard virtual untuk input teks.
  • -
  • Ditambahkan kontrol baru TCaptcha yang menampilkan CAPTCHA untuk menjaga spammers dari pendaftaran untuk akun online tertentu. Validator TCaptchaValidator terkait juga diimplementasikan.
  • -
  • Ditambahkan kontrol baru TSlider yang menampilkan sebuah slider yang dapat dipakai untuk input numerik.
  • -
  • Ditambahkan kontrol baru TConditional yang menampilkan salah satu dari dua konten secara kondisional.
  • -
  • Ditambahkan dukungan Oracle DB ke Rekaman Aktif
  • -
  • Ditambahkan dukungan TDataGrid untuk membolehkan pengelompokan sel yang berurutan dengan isi yang sama.
  • -
  • Ditambahkan dukungan untuk mengkonfigurasi properti halaman dan aturan otorisasi menggunakan path halaman relatif dalam konfigurasi aplikasi dan halaman. Ditambahkan dukungan untuk membolehkan otorisasi didasarkan pada alamat remote host.
  • -
  • Ditambahkan persister kondisi halaman baru TCachePageStatePersister. Ia membolehkan kondisi halaman untuk disimpan menggunakan modul cache (misalnya TMemCache, TDbCache, dll.) -
  • Ditambahkan dukungan untuk kerangka kerja otentikasi guna mengingat yang sudah masuk.
  • -
  • Ditambahkan dukungan untuk menampilkan item pertanyaan dalam TDropDownList dan TListBox (sesuatu mirip 'Please select:' sebagai item pertama.)
  • -
  • Ditambahkan dukungan untuk pemetaan kolom dalam Rekaman Aktif.
  • -
- -

Versi 3.1.0

-
    -
  • Ditambahkan dukungan AJAX. Seluruh array dari kontrol AJAX-enabled, disebut kontrol aktif, diperkenalkan. Penggunaan dari kontrol aktif ini sangat mirip dengan kontrol non-AJAX lainnya, misalnya masukkan dan gunakan. Untuk lebih jelasnya, lihat tutorial mengenai kontrol aktif.
  • - -
  • Ditambahkan dukungan lengkap database.
  • -
  • Ditambahkan kontrol, modul dan layanan baru, termasuk TSoapService, TOutputCache, TSessionPageStatePersister, TFeedService, TJsonService, cache dependency classes, TXmlTransform. -
  • - -
  • Ditingkatkan beberapa kontrol data dengan penyaji. Penyaji mendhidupkan penggunaan kembali item template yang umumnya ditemukan dalam TRepeater, TDataList dan TDataGrid, dan menjadikan konfigurasi pada kontrol-kontrol ini jauh lebih mudah. Untuk lebih jelasnya mengenai penyaji, lihat tutorial yang dimutakhirkan pada TRepeater, TDataList dan TDataGrid.
  • - -
  • Ditambahkan dukungan untuk membolehkan menyertakan konfigurasi aplikasi eksternal. Sintaks template ditingkatkan untuk menjembatani konfigurasi subproperti.
  • - -
  • Ditambahkan TDbUserManager dan TDbUser untuk menyederhanakan otentikasi dan otorisasi dengan akun pengguna yang disimpan dalam sebuah database.
  • - -
- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/id/Upgrading.page b/demos/quickstart/protected/pages/GettingStarted/id/Upgrading.page deleted file mode 100755 index 744256ce..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/id/Upgrading.page +++ /dev/null @@ -1,64 +0,0 @@ - - -

Meningkatkan dari v2.x dan v1.x

- -
-

-PRADO v3.0 TIDAK kompatibel mundur dengan versi PRADO sebelumnya. -

-

-Berita baiknya adalah, properti dan event dari kebanyakan kontrol tetap sama, dan sintaks template kontrol sebagian besar tidak diubah. Oleh karena itu, pengetahuan para pengembang dari versi PRADIO sebelumnya masih berlaku dalam v3.0. -

-

-Kami meringkas perubahan paling berarti dalam v3.0 guna membantu para pengembang meningkatkan aplikasi PRADO v2.x dan v1.x lebih mudah, jika diperlukan. -

-
- -

Definisi Komponen

-

-Versi 3.0 sepenuhnya telah mengabaikan kebutuhan file spesifikasi komponen. Ia banyak bergantung pada konvensi untuk mendefinisikan properti dan event komponen. Dalam keadaan tertentu, properti didefinisikan oleh keberadaan dari metode pengambil dan/atau metode penyetel, sementara event didefinisikan dengan keberadaan pada-metode. Nama properti dan event dalam v3.0 keduanya sensitif-huruf. Sebagai konsekuensinya, para pengembang diperlukan untuk memelihara perubahan tipe saat properti komponen sedang disetel. Sebagai contoh, kode berikut dipakai untuk mendefinisikan metode penyetel untuk properti yang Dihidupkan dari TControl, yang merupakan tipe boolean, -

- -public function setEnabled($value) -{ - $value=TPropertyValue::ensureBoolean($value); - $this->setViewState('Enabled',$value,true); -} - -

-di mana TPropertyValue::ensureBoolean() dipakai untuk memastikan bahwa nilai input adalah boolean. Ini adalah karena ketika properti dikonfigurasi dalam template, nilai string dikirimkan ke penyetel. Dalam versi sebelumnya, PRADO mengetahui tipe properti berdasarkan file spesifikasi komponen dan melakukan konversi tipe bagi Anda. -

- -

Pengontrol Aplikasi

-

-Pengontrol aplikasi sekarang menerapkan sebuah arsitektur modular. Modul bisa disertakan dan dikonfigurasi dalam spesifikasi aplikasi. Setiap modul menganggap fungsionalitas tertentu, dan dikoordinasikan bersama oleh masa hidup aplikasi. Konsep modul v2.x diganti dalam v3.0 by direktori halaman. Walhasil, format v3.0 spesifikasi aplikasi juga berbeda dari versi sebelumnya. -

- -

Halaman

-

-Halaman pada v3.0 diatur dalam direktori yang bisa dibandingkan ke konsep modul pada v2.x. Halaman diminta menggunakan path kepadanya. Sebagai contoh, URL index.php?page=Controls.Samples.Sample1 akan dipakai untuk meminta halaman bernama Sample1 yang disimpan di bawah direktori [BasePath]/Controls/Samples, di mana [BasePath] merujuk ke akar path halaman. Nama file dari template halaman harus diakhiri dengan .page, terutama untuk membedakan template halaman dari template kontrol non-halaman yang nama filenya sama harus diakhiri dengan .tpl. -

- -

Hubungan Kontrol

-

-Versi 3.0 mendefinsikan kembali hubungan diantara kontrol. Dalam keadaan tertentu, hubungan leluhur-anak sekarang merujuk ke hubungan lampiran antara penyajian kontrol. Dan hubungan wadah-penamaan baru diperkenalkan guna membantu lebih baik mengatur ID kontrol. Untuk lebih jelasnya, lihat seksi controls. -

- -

Sintaks Template

-
-

-Sintaks template kontrol dalam v3.0 tetap mirip dengan versi sebelumnya, dengan banyak peningkatan. Perubahan utama adalah mengenai ekspresi penyatuan data. Dalam v3.0, ini dikerjakan dengan mengikuti, -

- -<com:MyComponent PropertyName=<%# PHP expression %> .../> - -

-Tag ekspresi dan pernyataan juga diubah. Untuk lebih jelasnya, lihat seksi definisi template. -

-
-

Sintaks Tema

-

-Tema dalam v3.0 didefinisikan seperti template kontrol dengan beberapa batasan. -

- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/id/directory.gif b/demos/quickstart/protected/pages/GettingStarted/id/directory.gif deleted file mode 100755 index e6c4f724..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/id/directory.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/id/sequence.gif b/demos/quickstart/protected/pages/GettingStarted/id/sequence.gif deleted file mode 100755 index df5e7cef..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/id/sequence.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/id/sequence.vsd b/demos/quickstart/protected/pages/GettingStarted/id/sequence.vsd deleted file mode 100755 index 4129f1fc..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/id/sequence.vsd and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/AboutPrado.page b/demos/quickstart/protected/pages/GettingStarted/ja/AboutPrado.page deleted file mode 100755 index 81c1efa0..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/ja/AboutPrado.page +++ /dev/null @@ -1,79 +0,0 @@ - -

PRADO とは?

-

-PRADO はコンポーネントベースかつイベントドリブンなウェブアプリケーションを開発するためのPHP5フレームワークです。「PRADO」の名称は、PHP Rapid Application Development Object-oriented の略です。 -

- -

-PRADO の第一の目標は、ウェブプログラミングにおけるコードの再利用性を最大限に高めることです。 -ここでの再利用性は、自分自身で開発したコードを再利用することだけではなく、簡単な方法で他人の開発したコードを再利用することも意味しています。これは、「車輪の発明」という無駄な努力に要する時間を節約し開発工数を劇的に減らすためにはとても重要な項目といえます。PRADOではこの目的を実現するためにコンポーネントという概念を導入しています。 -

-

-上記の目的を達するために、PRADO ではウェブアプリケーション構築のためのコンポーネントの作成方法および使用方法を規定しています。コンポーネントとは、自己充足的かつちょっとしたカスタマイズで再利用が可能なソフトウェアユニットです。新しいコンポーネントは既存のコンポーネントを単純に組み合わせるだけで作成する事ができます。 -

-

-コンポーネントをインタラクティブに利用できるように、PRADO ではイベントドリブンプログラミングの枠組みを実装しています。ボタンの押下などのユーザーアクションはサーバー側のイベントとして補足されます。メソッドや関数をそれらのイベントに対応付けておくと、イベントに反応するかのように自動的にメソッドや関数が実行されます。POST/GET 変数を取得して処理をする従来のウェブプログラミングと比べて、イベントドリブン型プログラミングは開発者が必要な処理に集中でき、POST/GET の取得などの反復コードも激減する事になります。 -

-

-PRADO でのアプリケーション開発は、ページにコンポーネントを配置し、プロパティの設定やイベントに反応するメソッドをコーディングすることが主な作業となります。これはデスクトップ GUI アプリケーションを開発するのに使用する Borland Delphi や Microsoft Visual Basic などの RAD ツールと非常に似た作りとなっています。 -

- -

なぜ PRADO を使うのですか?

-

-PRADO はユニークなフレームワークとして紹介されています。事実、退屈な PHP プログラミングを楽しいものと変えることができるくらいユニークなフレームワークです。以下のリストは、PRADO に関する主な機能となっています。 -

-
    -
  • 再利用性 - PRADOコンポーネント規約に則って作成されたコードは再利用性が高いです。開発チームの他の人が開発したコードを再利用することにより、容易にチーム開発での連携を強める事ができます。
  • - -
  • イベントドリブン型プログラミング - サーバーイベントとしてユーザーのアクションを取得する事ができるので、開発者はユーザの操作とアプリケーションとの相互作用に今まで以上に焦点を合わせることができます。。
  • - -
  • チーム統合 - 画面出力部分とロジック部分が別々に保存されるので、デザイナーと開発者の連携が容易になります。
  • -
  • 便利なウェブコントロール - PRADO ではとても便利なウェブコントロールがいくつも用意されており、インタラクティブなウェブページをほんの数行のコードで作成することができます。例えば DataGrid コントロールを使用すると、ページングやソート、編集、行の削除が可能なテーブルを表示するページをすぐに作成することができます。
  • - -
  • バージョン3.1から、PRADOはデータベースアクセス機能をサポートがしています。開発者はビジネスロジックの複雑さに応じて、シンプルな PDO ベースのデータベースアクセス、広く知られているアクティブレコードによるデータベースアクセス、複雑なビジネスオブジェクトとスキーマとのマッピングをサポートした SqlMapによるデータベースアクセスという3つの中から選択する事ができます。はどうでしょう。 -
  • - -
  • AJAX サポート - バージョン3.1から、アクティブコントロールが実装されました。開発者は javascript のコードを一行も書くことなく、AJAXを利用する事ができます。アクティブコントロールの利用は、通常のコントロールの利用方法とまったく変わらずに行う事ができます。
  • -
  • I18N/L10N サポート - PRADO では国際語化ならびにローカライズに対応しています。
  • -
  • XHTML 対応 - PRADO で生成されたウェブページは XHTML に対応しています。
  • -
  • 既存技術の利用が可能 - PRADO はプレゼンテーション層にターゲットを当てたフレームワークです。ほとんどの既存クラスライブラリやツールをそのまま利用する事ができます。例として、AdoDB や Creole なども PRADO アプリケーションで利用する事ができます。
  • -
  • その他の機能 - エラーハンドリングとメッセージのロギング機能、キャッシング機構、エラーハンドリングのカスタム、ローカライズ、拡張可能な認証機能、クロスサイトサイトスクリプティング等のセキュリティに対応、クッキー保護等
  • -
- -

PRADO での開発はどの場面が適していますか?

-

-PRADO はインタラクティブなウェブアプリケーションを開発するのにとても適しています。コンテンツ管理システム(CMS)や、Eコマースなどの複雑なシステムを比較的容易に開発する事ができます。PRADO はコンポーネントベースのオブジェクト指向プログラミングですので、企業等でのチーム開発で力を発揮します。 -

-

-PRADO はアプリケーションの高速化とスケーラビリティを実現するためのキャッシュ機構を実装しています。利用する環境によりキャッシュモジュールを選択し、PRADO アプリケーションで利用する事ができます。出力キャッシュは、レンダリングされたウェブページの一部をキャッシュとして保存しておき、再度レンダリングする際に自動的にキャッシュから取得する機構になっています。 -

- -

PRADO は他のフレームワークと比較してどのような点が異なっていますか?

-

-PRADO はよくユニークなフレームワークと呼ばれています。コンポーネントベースとイベントドリブンな実装が特にユニークであるとされています。このプログラミング方法はデスクトップアプリケーション開発においては新しくはなく、いくつかのウェブプログラミング言語でも実装されていますが、PHP のフレームワークとしてはおそらく初めて実装されたフレームワークです。 -

-

-ほとんどの PHP フレームワークでは、画面表示部分とロジック部分を分離することに着目し、そのためにMVCデザインパターンで開発することを推奨しています。一方PRADOでは、テンプレートの中に画面表示部分を、クラスにロジック部分を記述することで、自然に同様の目標を達成する事ができています。そして、MVCでは実現できなかったコンポーネントベースのプログラミングスタイル、豊富なウェブコントロール、強力なデータベースサポート、柔軟なエラー処理とロギング機能などの色々な機能を実装することができています。 -

- -

PRADO は安定していますか?

-

-はい。PRADO は2004年8月に初めてリリースされました。品質を確保するために多くのテストプログラムが作成されており、何千人もの開発者が利用しています。このテストプログラムによるテストを重ねて、フレームワークは開発されており、バグや機能追加などは TRAC システムにより管理されています。そして、すべての開発者の疑問にスピーディーに回答できるようにコミュニティも用意してあります。 -

- -

PRADO の歴史

-

-PRADO のユニークな発想は Apache Tapestry から生まれました。設計と実装には、Borland Delphi と Microsoft ASP.NET から多くのアイディアを借りました。PRADO の最初のバージョンは、2004年6月にできて、PHP4で書かれていましたが、Zend PHP5コンテストに応募するためにPHP5のコードに書き直しました。(PHP5から提供されたオブジェクトモデルはとても助けになりました)そして PRADO は Zend コンテストで観客・審査員の高い評価を得て特賞を勝ち取りました。 -

-

-2004年8月にオープンソースプロジェクトとして SourceForge にて提供され始め、そのすぐ後にプロジェクトサイト「xisc.com」が公開されました。PRADO 開発チームと PRADO ユーザーのサポートにより、PRADO は2005年中頃にバージョン2.0へとバージョンアップしました。このバージョンでは Wei Zhuo が I18N/L10N サポートの実装で貢献をしました。 -

-

-2005年5月に、バージョン2.0で見つかった問題点を解決し、さらに Microsoft ASP.NET2.0 で利用可能ないくつかの機能を実装するために PRADO フレームワークを完全に書き直す決定をしました。1年近い期間をかけて、新たに50,000行を超える新しいコードを追加し、2006年4月にバージョン3.0をリリースしました。 -

-

-バージョン3.0では、PRADO の品質と安定性を確実にするために多くの時間を当てています。 -そして私たちは、PRADO 2.x/1.x においてそのコンセプトの正しさが証明され、PRADO 3.x において重要なビジネスアプリケーションの開発に適したフレームワークにまで成長したと私たちは確信しています。 -

- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/CommandLine.page b/demos/quickstart/protected/pages/GettingStarted/ja/CommandLine.page deleted file mode 100755 index 5f5dacb9..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/ja/CommandLine.page +++ /dev/null @@ -1,106 +0,0 @@ - -

Command Line Tool

-

The optional prado-cli.php PHP script file in the framework -directory provides command line tools to perform various tedious takes in Prado. -The prado-cli.php can be used to create Prado project skeletons, create -initial test fixtures, and access to an interactive PHP shell. -

-

Requirements

-

-To use the command line tool, you need to use your command prompt, command console -or terminal. In addition, PHP must be able to execute PHP scripts from -the command line. -

- -

Usage

-

-If you type php path/to/framework/prado-cli.php, you should see -the following information. Alternatively, if you are not on Windows, -you may try to change the prado-cli.php into an executable -and execute it as a script

- -Command line tools for Prado 3.0.5. -usage: php prado-cli.php action [optional] -example: php prado-cli.php -c mysite - -actions: - -c - Creates a Prado project skeleton for the given . - - -t - Create test fixtures in the given . - - shell [directory] - Runs a PHP interactive interpreter. Initializes the Prado - application in the given [directory]. - - -

The <parameter> are required parameters and [optional] -are optional parameters.

- -

Creating a new Prado project skeleton

- -

To create a Prado project skeleton, do the following:

-
    -
  1. Change to the directory where you want to create the project skeleton.
  2. -
  3. Type, php ../prado/framework/prado-cli.php -c helloworld, where - helloworld is the directory name that you want to create the project skeleton files.
  4. -
  5. Type, php ../prado/framework/prado-cli.php -t helloworld to create - the test fixtures for the helloworld project.
  6. -
- -

Interactive Shell

-

-The interactive shell allows you to evaluate PHP statements from the command line. -The prado-cli.php script can be used to start the shell and load an existing -Prado project. For example, let us load the blog demo project. Assume that your -command line is in the prado distribution directory and you type. -

-

- -$: php framework/prado-cli.php shell demos/blog - -The output should be - -Command line tools for Prado 3.0.5. -** Loaded Prado application in directory "demos\blog\protected". -PHP-Shell - Version 0.3.1 -(c) 2006, Jan Kneschke - ->> use '?' to open the inline help - ->> - -Then we will get an instance of the Prado blog application, and from -that instance we want an instance of the 'data' module. Notice that -a semicolon at the end of the line suppresses the output. - - ->> $app = Prado::getApplication(); - ->> $db = $app->getModule('data'); - -Lastly, we want to use the data module to query for a post with ID=1. Notice that -we leave out the semicolon to show the results. - ->> $db->queryPostByID(1) - -There should not be any errors and you should see the following. - -PostRecord#1 -( - [ID] => 1 - [AuthorID] => 1 - [AuthorName] => 'Prado User' - [CreateTime] => 1148819691 - [ModifyTime] => 0 - [Title] => 'Welcome to Prado Weblog' - [Content] => 'Congratulations! You have successfully installed Prado Blog -- - a PRADO-driven weblog system. A default administrator account has been created. - Please login with admin/prado and update your password as soon as possible.' - [Status] => 0 - [CommentCount] => 0 -) - -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/HelloWorld.page b/demos/quickstart/protected/pages/GettingStarted/ja/HelloWorld.page deleted file mode 100755 index bc9cf264..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/ja/HelloWorld.page +++ /dev/null @@ -1,89 +0,0 @@ - -

初めての PRADO アプリケーション

-
-

-ここでは、初めて PRADO アプリケーションを開発する人のために、定番の "Hello World" アプリケーションを解説します。 -

-

-"Hello World" を作る事は、最もシンプルでインタラクティブな PRADO アプリケーションを作る事かもしれません。
-このアプリケーションは、ページに Click Me と書いてある送信ボタンを配置してあります。
-ユーザーがボタンをクリックすると、ボタン文字が Hello World に変わるというアプリケーションです。 -

-

-このアプリケーションには、複雑なアプリケーションを作る上で重要なアプローチがいくつかあります。
-ひとつは、ページからサーバーに変数を送信して、その変数を利用して新しいページ(新しいボタン)を生成していることです。
-またもう一つは、Javascript の onclick を意識することなく利用し、ボタン文字を変更する事ができるということです。 -

-
-

-PRADO ではコンポーネントベース、そしてイベントドリブンのウェブプログラミングを構築する事ができます。
-ボタンは、TButton オブジェクトを使用します。 -TButton では Text プロパティがボタン文字となり、ユーザーのクリック動作をサーバーサイドの OnClick イベントに対応付けます。
-Text プロパティを変更する内容を定義したメソッドを OnClick に対応付けるだけで、ボタンクリックのアクションを設定することができます。
-以下にアプリケーションのシーケンスを示します。 - -

-

-このアプリケーションは3つのファイル index.php, Home.page, Home.php から構成されています。 - - -各ディレクトリ名は開発者によって変更する事が可能です。例えば protected ディレクトリはウェブサーバーにより公開されたディレクトリ以外の場所へ移動することができます。このチュートリアルを読む事で、その方法を修得する事ができます。 -

-
    -
  • assets - このディレクトリにはコンポーネントからファイルが展開されます。詳細は assets に書かれていますのでご覧下さい。このディレクトリはウェブサーバープロセスから書き込み可能である事が必要となります。
  • -
  • protected - アプリケーションデータと開発したコードが保存されるディレクトリです。このディレクトリは閲覧者からのアクセスを禁止されているべきディレクトリです。
  • -
  • runtime - アプリケーション状態などのアプリケーション情報がキャッシュとして保存されるディレクトリです。このディレクトリはウェブサーバープロセスからの書き込みが可能でなければなりません。
  • -
  • pages - PRADO ページを保存するディレクトリです。
  • -
- -
-Tip:PRADO プロジェクトディレクトリを作成するのに framework/prado-cli.phpコマンドラインスクリプト)を使用することができます。
-例えば、helloworld プロジェクトを作りたいディレクトリへ移動し、php path/to/prado-cli.php -c helloworld とコマンド入力する事で、helloworld プロジェクトディレクトリを作成する事ができます。 -
- -

-アプリケーションの実行に必要な3つのファイルの内容は以下のとおりです。 -

-
    -
  • index.php - PRADO アプリケーションのエントリースクリプトです。このファイルは、PRADO アプリケーションでは必ず必要なファイルであり、唯一エンドユーザーが直接アクセスできるスクリプトファイルです。index.php の内容は主に以下の3つの項目からなっています。 - -require_once('path/to/prado.php'); // PRADO スクリプトの読み込み -$application=new TApplication; // PRADO アプリケーションインスタンスの作成 -$application->run(); // アプリケーション実行 - -
  • -
  • Home.page - エンドユーザーが明示的にページを指定しない場合にこのページテンプレートが呼び出されます。テンプレートファイルでは、コンポーネントのレイアウトを定義します。この例では、TFormTButton を使用しており、それぞれ<form> <input> のHTMLタグに対応しています。 - - - - <com:TForm> - <com:TButton Text="Click me" OnClick="buttonClicked" /> - </com:TForm> - - - -
  • -
  • Home.php - Home テンプレートファイルのクラス定義ファイルです。ここではボタンの OnClick イベント内容の定義を行っています。 - -class Home extends TPage -{ - public function buttonClicked($sender,$param) - { - // $sender refers to the button component - $sender->Text="Hello World!"; - } -} - -
  • -
-
-

-アプリケーションファイルの準備ができたら、次のURLからアクセスすることができます。 http://Web-server-address/helloworld/index.php
-この例ではドキュメントルート配下に helloworld というディレクトリを配置しています。Home.page テンプレートファイル内の TButtonTLinkButton へ変更してみてどのようになるかも試してみてください。 -

-

-PRADO リリースアーカイブファイルにこのデモのソースを格納しています。また、オンラインデモにて動作を確認する事ができます。 -

-
- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/Installation.page b/demos/quickstart/protected/pages/GettingStarted/ja/Installation.page deleted file mode 100755 index b0c35205..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/ja/Installation.page +++ /dev/null @@ -1,33 +0,0 @@ - -

PRADO のインストール

-
-

-ご自分で管理されているサーバーをお持ちであれば、すぐにインストールすることが可能です。 -

-

-PRADO の最小構成は、サーバーがPHP5をサポートしていることです。
-PRADO は Windows と Linux 両環境の Apache サーバーでテストされています。
-PHP5 がサポートされているのであれば、他の環境でも動作させることができるかもしれません。 -

-
- -
-

-PRADO のインストールは、PRADO をダウンロードし解凍することが主な作業となります。 -

-
    -
  1. PRADO公式ページからPRADOの最新版をダウンロードします。
  2. -
  3. ウェブアクセス可能なディレクトリに展開します。
  4. -
-
-
-

-上記の作業のみでPRADOのインストールが完了します。
-http://web-server-address/prado/demos/ 以下にPRADOデモアプリケーションが展開されますので、PRADOを利用したアプリケーションの動作を体験する事ができます。
-デモアプリケーションの動作が確認できていれば、DocumentRoot 配下に prado サブディレクトリが展開されたことになりますので、インストールは正常に完了しております。 -

-

-もしデモアプリケーションが動作しない等の問題が発生しましたら、サーバー構成がPRADO必要条件を満たしているかどうかを確認する事ができるスクリプト http://web-server-address/prado/requirements/index.php が用意されていますので、確認してください。 -

-
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/ja/Introduction.page deleted file mode 100755 index 832b5916..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/ja/Introduction.page +++ /dev/null @@ -1,62 +0,0 @@ - -

ようこそ PRADO クイックスタートチュートリアルへ

-
-

-このチュートリアルはPRADO3.xを使ったアプリケーションをスピーディーに構築するためのものです。 -

-

-既にPRADO3.xを使用しており新しいバージョンで強化された機能を知りたい方は、まずは新機能ページをご覧ください。PRADOを使用したことのない方にはこのチュートリアルはとても役立つものですので、ぜひご覧下さい。 -

- - -

-もしこのチュートリアルの内容では不十分と感じたら、以下リンクの各種資料もご覧ください。 -

-
- - -
diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/NewFeatures.page b/demos/quickstart/protected/pages/GettingStarted/ja/NewFeatures.page deleted file mode 100755 index f2fdc618..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/ja/NewFeatures.page +++ /dev/null @@ -1,35 +0,0 @@ - - -

新機能

- -

-このページは、以下バージョンの PRADO に含まれる新機能の概要を紹介するページです。 -

- -

バージョン 3.1.0

-
    - -
  • AJAXサポート
    -全てのコントロールにて Ajaxが有効になりました。(アクティブコントロール - active controls)
    -アクティブコントロールは、通常のコントロールととても似た作りになっています。
    -使用方法の詳細はチュートリアル アクティブコントロール をご覧下さい。
  • - -
  • データベース連携サポートの完成
  • -
  • 新しいコントロール/モジュール/サービスを追加
    -TSoapService, TOutputCache, TSessionPageStatePersister, TFeedService, TJsonService, cache dependency classes, TXmlTransform. -
  • - -
  • データコントロールの描画エンジンを改善
    -データコントロールにて、アイテムテンプレートを再利用して描画するよう改善しました。
    -TRepeater, TDataList, TDataGrid などのコントロールでの構成がクリアなコードになりました。
    -チュートリアルが更新されているので、詳細はチュートリアル TRepeater, TDataList, TDataGrid をご覧下さい。
  • - -
  • アプリケーション構造ファイルにて外部ファイル設定をサポート
    -アプリケーション構造を外部ファイルにも定義できるようになり、テンプレートでの定義など柔軟なアプリケーション定義ができるようになりました
  • - -
  • TDbUserManager / TDbUser によるシンプルなユーザー認証
    -認証処理時のユーザーアカウントをデータベースに簡単に保存できるようになりました。
  • - -
- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/Upgrading.page b/demos/quickstart/protected/pages/GettingStarted/ja/Upgrading.page deleted file mode 100755 index 9ad1f003..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/ja/Upgrading.page +++ /dev/null @@ -1,64 +0,0 @@ - - -

Upgrading from v2.x and v1.x

- -
-

-PRADO v3.0 is NOT backward compatible with earlier versions of PRADO. -

-

-A good news is, properties and events of most controls remain intact, and the syntax of control templates remains largely unchanged. Therefore, developers' knowledge of earlier versions of PRADO are still applicable in v3.0. -

-

-We summarize in the following the most significant changes in v3.0 to help developers upgrade their v2.x and v1.x PRADO applications more easily, if needed. -

-
- -

Component Definition

-

-Version 3.0 has completely discarded the need of component specification files. It relies more on conventions for defining component properties and events. In particular, a property is defined by the existence of a getter method and/or a setter method, while an event is defined by the existence of an on-method. Property and event names in v3.0 are both case-insensitive. As a consequence, developers are now required to take care of type conversions when a component property is being set. For example, the following code is used to define the setter method for the Enabled property of TControl, which is of boolean type, -

- -public function setEnabled($value) -{ - $value=TPropertyValue::ensureBoolean($value); - $this->setViewState('Enabled',$value,true); -} - -

-where TPropertyValue::ensureBoolean() is used to ensure that the input value be a boolean. This is because when the property is configured in template, a string value is passed to the setter. In previous versions, PRADO knows the property type based on the component specification files and does the type conversion for you. -

- -

Application Controller

-

-Application controller now implements a modular architecture. Modules can be plugged in and configured in application specifications. Each module assumes a particular functionality, and they are coordinated together by the application lifecycle. The concept of v2.x modules is replaced in v3.0 by page directories. As a result, the format of v3.0 application specification is also different from earlier versions. -

- -

Pages

-

-Pages in v3.0 are organized in directories which may be compared to the module concept in v2.x. Pages are requested using the path to them. For example, a URL index.php?page=Controls.Samples.Sample1 would be used to request for a page named Sample1 stored under the [BasePath]/Controls/Samples directory, where [BasePath] refers to the root page path. The file name of a page template must be ended with .page, mainly to differentiate page templates from non-page control templates whose file names must be ended with .tpl. -

- -

Control Relationship

-

-Version 3.0 redefines the relationships between controls. In particular, the parent-child relationship now refers to the enclosure relationship between controls' presentation. And a new naming-container relationship is introduced to help better manage control IDs. For more details, see the controls section. -

- -

Template Syntax

-
-

-The syntax of control templates in v3.0 remains similar to those in earlier versions, with many enhancements. A major change is about the databinding expression. In v3.0, this is done by the following, -

- -<com:MyComponent PropertyName=<%# PHP expression %> .../> - -

-Expression and statement tags are also changed similarly. For more details, see the template definition section. -

-
-

Theme Syntax

-

-Themes in v3.0 are defined like control templates with a few restrictions. -

- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/directory.gif b/demos/quickstart/protected/pages/GettingStarted/ja/directory.gif deleted file mode 100755 index e6c4f724..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/ja/directory.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/ja/sequence.gif b/demos/quickstart/protected/pages/GettingStarted/ja/sequence.gif deleted file mode 100755 index 4207a9bb..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/ja/sequence.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/AboutPrado.page b/demos/quickstart/protected/pages/GettingStarted/pl/AboutPrado.page deleted file mode 100755 index 023a9fe1..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/pl/AboutPrado.page +++ /dev/null @@ -1,71 +0,0 @@ - -

Czym jest PRADO?

-

-PRADO jest napisanym w PHP5 frameworkiem dla aplikacji webowych opartym na komponentach oraz programowaniu zdarzeniowym (ang. event-driven programming). -PRADO z angielskiego oznacza PHP Rapid Application Development Object-oriented (przyp. tłum. szybkie tworzenie aplikacji zorientowanych obiektowo w PHP). -

-

-Głównym celem PRADO jest zmaksymalizowanie ponownego wykorzystania kodu (ang. reusability w programowaniu webowym. Poprzez ponowne wykorzystanie kodu rozumiemy nie tylko ponowne używanie własnego kodu ale również ponowne używanie w prosty sposób tego kodu przez inne osoby. To drugie jest bardziej ważne, gdyż oszczędza niepotrzebny wysiłek włożony w ponowne odkrywanie koła i może znacznie zmniejszyć czas developmentu. Taka jest właśnie intencja zastosowania koncepcji komponentów. -

-

-Aby osiągnąć powyższe cele, PRADO wymaga protokołu pisania i używania komnponentów do konstrukcji aplikacji webowych. Komponent jest jednostką programowania, która jest samowystarczalna i może być użyta ponownie poprzez proste dostosowanie (ang. trivial customization). Nowy komponent może zostać stworzony jako prosta kompozycja istniejących komponentów. -

-

-Aby ułatwić interakcję z komponentami, PRADO implementuje paradygmat programowania sterowanego zdarzeniami (ang. event-driven programming paradigm), który umożliwia elastyczne przekierowanie zachowania do komponentu. Czynności użytkownika końcowego, takie jak kliknięcie na przycisk (ang. submit button), są przechwytywane jako zdarzenia serwera. Zarówno metody jak i funkcje mogą być przypisane do tych zdarzeń. W chwili gdy takie zdarzenie występuje są one (metody, funkcje) automatycznie wywoływane w odpowiedzi na zdarzenie. W porównaniu do tradycyjnego programowania, w których developerzy muszą zmagać się z surowymi zmiennymi POST i GET, programowanie zdarzeniowe pomaga developerom lepiej skupić się na niezbędnej logice i poważnie zredukować nispoziomowe powtarzające się kodowanie. -

-

-Sumując, tworzenie w PRADO aplikacji sieciowych, polega głównie na tworzeniu instancji różnego typu wbudowanych komponentów, konfigurowania ich, odpowiadania na ich zdarzenia poprzez przypisanie im uchwytów funkcji oraz wkomponowanie ich w stronę aplikacji. Jest to bardzo podobne do narzędzi RAD, takich jak Borland Delphi, czy też Microsoft Visual Basic, które używane są do tworzenia desktopowych aplickacji GUI (ang. develop GUI application). -

- -

Dlaczego PRADO?

-

-PRADO jest najczęściej postrzegane jako jedyny w swoim rodzaju framework. W rzeczy samej, jest on tak unikatowy, że może zamienić nużące programowanie w PHP w przyjemną zabawę. Poniższa lista jest krótkim podsumowaniem, głównych możliwości (cech) PRADO. -

-
    -
  • Ponowne wykorzystanie kodu (ang. Reusability) - kod zgodny z protokołem komponentów PRADO jest wysoce wielokrotnie używalny. To przynosi korzyści zespołom developerów w dłuższej prespektywie czasowej, gdyż mogą oni ponownie używać swoje poprzednio wykonane prace oraz łatwo integrować rozwiązania stron trzecich.
  • -
  • Programowanie zdarzeniowe - czynności użytkownika końcowego, takie jak kliknięcie na [submit button], są przechwytywane jako zdarzenia serwera, w ten sposób developerzy lepiej skupiają się na działaniach związanych z interakcją użytkownika.
  • -
  • Grupowa integracja - warstwa prezentacji i logiki są rozdzielone. W aplikacjach PRADO można stosować motywy.
  • -
  • Wszechstronne kotnrolki webowe - PRADO składa się z zestawu wszechstronnych komponentów mających do czynienia z interfejsem użytkownika. Wysoko interaktywne strony internetowe, mogą być stworzone za pomocą kilku linijek kodu. Na przykład, użycie komponentu datagrid (przyp. tłum. z and. data - dane, grid - siatka), może szybko stworzyć stronę prezentującą tabelę z danymi, krórą można posortować, stronicowac, edytować oraz usuwać wiersze danych. -
  • Silne wsparcie dla baz danych - od wersji 3.1, PRADO zostało wyposażone w kompletną obsługę baz danych, własnoręcznie napisaną, dzięki czemu odpowiednio współgrającą z pozostałymi elementami frameworku PRADO. W zależności od złożoności obiektów biznesowych, każdy może wybrać pomiędzy używaniem prostego, bazujacego na PDO dostępie do danych lub powszechnie znanym wzorcem Active Record lub też kompletnym schematem mapowania obiektów biznesowych SqlMap.
  • -
  • Jednolite wsparcie dla AJAXA - Używanie AJAX-a w PRADO nigdy nie było łatwiejsze. Wraz ze swym innowacymi aktywnymi kontrolkami (ang. active controls) wprowadzonymi w wersji 3.1 możesz łatwo napisać aplikację używającą AJAX-a bez napisania nawet linijki kodu w Java Skrypcie. W rzeczy samej, używanie kontrolek aktywnych, prawie nie różni się w użyciu od zwykłych nieAJAX-owych kontrolek webowych.
  • -
  • Wsparcie dla I18N oraz L10N - PRADO zawiera kompletne wsparcie dla tworzenia aplikacji wielojęzycznych i lokalnych
  • -
  • Zgodność z XHTML - Strony internetowe generowanie przez PRADO są zgodne z XHTML.
  • -
  • Przystosowanie istniejących prac - PRADO jest ogólnym frameworkiem skupiającym się na warstwie prezentacyjnej. Nie pozbawia on developerów możliwości używania istniejących bibliotek klas czy też narzędzi. Na przykład, kazdy może używać AdoDB czy też Creole do obsługi baz danych w aplikacjach PRADO. -ś
  • Pozostałe cechy - Wszechstronna obsługa błędów/wyjątków oraz logowania komunikatów; standardowe keszowanie oraz selektywne kaszowanie danych wyściowych; rozszerzalna oraz lokalizowalna obsługa błędów; elastyczna autentykacja oraz autoryzacja; przedsięwzięcie króków chroniących przed atakami cross-site script (XSS), ochrona plików cookie, itd.
  • -
- -

Do czego najlepiej nadaje się PRADO?

-

-Stosowanie PRADO jest najbardziej wskazane w aplikacjach internetowych, które są wysoce interaktywne z użytkownikiem. Może być wykorzystywane do tworzenia systemów tak prostych jak internetowe blogi po kompleksowe rozwiązania e-commerce. Ponieważ PRADO wspiera programowanie zorietnowane obiektowo (OOP) poprzez własną metodologię, bazująca na komponentach, pasuje ono ekstremalnie dobrze do pracy grupowej oraz tworzenia aplikacji klasy enterprise (ang. enterprise development). -

-

-PRADO przychodzi z kompletnym zestawem technik keszowania, które pomagają przyśpieszyć aplikacje internetowe PRADO, by móc zastosować je do aplikacji o wysokim ruchu. Jego modularna architektura umożliwia developerom używanie oraz podłączanie różnych modułów keszujących w zależności od potrzeb. Keszowanie wyjścia umożliwia każdemu selektywny wybór keszowania części wyświetlanej strony. -

- -

Jak PRADO reprezentuje się na tle innych frameworków?

-

-PRADO często jest postrzegane jako jedyny w swoim rodzaju framework. Jego unikatowość polega głównie na programowaniu bazującym na komponentach oraz paradygmacie programowania sterowanego zdarzeniami, które stara się promować. Chociaż ten paradygmat nie jest nowością w aplikacjach desktopowych oraz nie jest nowy w kilku językach programowania webowego, PRADO jest prawdopodobnie pierwszym frameworkiem umożliwiającym go. -

-

-Większość frameworków PHP skupia się głównie na odseparowaniu warstwy prezentacji i logiki promując wzorzec programowania MVC (przyp. tłum. od pierwszych liter model - model view - widok controler - kontroler). PRADO osiąga te same cele naturalnie poprzez potrzebę prechowywania logiki w klasach a prezetnacji w szablonach (ang. templates). PRADO robi dużo więcej w sprawach innych niż MVC. Wypełnia wiele białych plam w programowaniu webowym w PHP, swoim bazującym na komponentach paradygmacie programowania, jego bogatym zestawem kontrolek webowych, jego wszechstronną obsługą baz danych, jego elastyczną obsługą błędów oraz ich logowania oraz wiele wiele innych. -

- -

Czy PRADO jest wystarczająco stabilne?

-

-Tak. PRADO zostało pierwszy raz opublikowane w sierpniu 2004 roku. Wiele zestawów testów zostało od tego czasu napisanych oraz często przeprowadzanych by upewnić sie o jakości PRADO. Framework był używany przez tysiące użytkowników oraz developerów a wiele aplikacji internetowych powstało w oparciu o niego. Bugi oraz żądania rozszerzeń są zarządzane poprzez system TRAC, posiadamy także wspaniałą społeczność użytkowników oraz zespół developerów by być pewnym, że żadne pytanie nie pozostanie bez odpowiedzi. -

- -

Historia PRADO

-

-Pierwotna inspiracja PRADO pochodziła od Apache Taperstry. W trakcie projektowania i implementacji, zapożyczyłem wiele idei z Borland Delphi oraz Microsodt ASP.NET. Pierwsza wersja PRADO ujrzała świat w czerwcu 2004 roku i została napisana w PHP4. Zachęcony konkursem kodowania w PHP5 Zenda, przepisałem PRADO do PHP5, co okazało się mądrym posunięciem, dzięki nowemu modelowi obiektowemu dostarczonemu przez PHP5. PRADO zdobyło główną nagrodę w konkrusie Zenda, uzyskując najwięcej głosów zarówno wsród publiczności jak i wśród sędziów. -

-

-W sierpniu 2004, PRADO zaczęło być hostowane przez SourceForge jako projekt open source. Wkrótce, stona projektu xisc.com została zaprezentowana publicznie. Wraz z fantastycznym wparciem zespołu developerów PRADO oraz jego użytkowników, PRADO rozwinęło się do wersji 2.0 w połówie 2005 roku. W tej wersji, Wei Zhuo dołączył do PRADO ze znakomita opbsługą dla I18N oraz L10N. -

-

-W maju 2005, zdecydowaliśmy się całkowicie przepisać framewrork PRADO, by rozwiązać kilka kluczowych kwestii z wersji 2.0 oraz by porwać kilka fajnych możliwości dostępncyh w Microsoft ASP.NET. Po około roku ciężkiej pracy z ponad 50.000 liniami nowego kodu, wersja 3.0 została w końcu udostępniona w kwietniu 2006r. -

-

-Poczynając od wersji 3.0, znaczny nakład jest kładziony by zapewnić jakość oraz stabilność PRADO. Jeśli powiemy, że PRADO w wersjach 2.x oraz 1.x były dziełem potwierdzającym koncept (ang. proof-of-concept work), możemy powiedzieć, że PRADO 3.X wyrosło na projekt, który jest odpowiedni dla tworzenia plikacji biznesowych. -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/CommandLine.page b/demos/quickstart/protected/pages/GettingStarted/pl/CommandLine.page deleted file mode 100755 index f0edb39a..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/pl/CommandLine.page +++ /dev/null @@ -1,101 +0,0 @@ - -

Narzędzie linii poleceń

-

Opcjonalny plik skryptu PHP prado-cli.php PHP w folderze framework -dostarcza narzędzia linii poleceń do wykonywania różnych monotonnych czynności w PRADO. -Prado-cli.php może zostać użyte do stworzenia szkieletu projektu PRADO, zainicjowania testów oraz uzyskania dostępu do -interaktywnej powłoki PHP. -

-

Wymagania

-

-Aby używać narzędzia linii poleceń powinieneś użyć terminala, consoli komend lub opcji uruchom. Dodatkowo PHP musi mieć możliwość -wykonywania skryptów PHP z linii poleceń. -

- -

Używanie

-

-Wpisując php ścieżka/do/katalogu/framework/prado-cli.php, powinieneć zobaczyć następujace informacje. -Alternatywnie, jeśli nie używasz Windowsa możesz spróbować zamienić prado-cli.php na plik wykonywalny -i wywołać go jako skrypt.

- -Command line tools for Prado 3.0.5. -usage: php prado-cli.php action [optional] -example: php prado-cli.php -c mysite - -actions: - -c - Creates a Prado project skeleton for the given . - - -t - Create test fixtures in the given . - - shell [directory] - Runs a PHP interactive interpreter. Initializes the Prado - application in the given [directory]. - - -

<parameter> są wymaganymi parametrami a [optional] -są parametrami opcjonalnymi.

- -

Tworzenie szkieletu nowego projektu PRADO

- -

Aby stworzyć szkielekt projektu Prado, wykonaj następujące czynności:

-
    -
  1. Przejdź do folderu gdzie chcesz utworzyć szkielet projektu.
  2. -
  3. Wpisz php ../prado/framework/prado-cli.php -c helloworld, gdzie - helloworld jest nazwą katalogu w której chcesz utworzyć pliki należace do szkieletu projektu.
  4. -
  5. Wpisz php ../prado/framework/prado-cli.php -t helloworld aby stworzyć wbudowany test dla projektu helloworld (Witaj Świecie).
  6. -
- -

Interaktywna powłoka

-

-Interaktywna powłoka umożliwia Ci wykonywanie wyrażeń PHP z linii poleceń. -Skrypt prado-cli.php może zostać użyty do uruchomienia powłoki i załadowania istniejącego projektu Prado. -Dla przykładu załadujmy projekt demo blogu. Zakładając, że twoja linia poleceń jest w katalogu żródłowym prado i wpiszesz... -

-

- -$: php framework/prado-cli.php shell demos/blog - -jako rezultat powinieneś ujrzeć - -Command line tools for Prado 3.0.5. -** Loaded Prado application in directory "demos\blog\protected". -PHP-Shell - Version 0.3.1 -(c) 2006, Jan Kneschke - ->> use '?' to open the inline help - ->> - -Następnie pobierzemy instancję aplikacji blogu Prado a następnie z niej instancję modułu - 'data'. Zauważ, że średnik na koncu linii wycisza wyjście. - - ->> $app = Prado::getApplication(); - ->> $db = $app->getModule('data'); - -Na koniec będziemy chcieli użyć wybranego modułu aby zapytać o post o ID=1. Zauważ, że -pomijamy średnik aby zobaczyć rezultat. - ->> $db->queryPostByID(1) - -Nie powinien wystąpić żaden błąd i powinieneś zobaczyć następujący reziltat - -PostRecord#1 -( - [ID] => 1 - [AuthorID] => 1 - [AuthorName] => 'Prado User' - [CreateTime] => 1148819691 - [ModifyTime] => 0 - [Title] => 'Welcome to Prado Weblog' - [Content] => 'Congratulations! You have successfully installed Prado Blog -- - a PRADO-driven weblog system. A default administrator account has been created. - Please login with admin/prado and update your password as soon as possible.' - [Status] => 0 - [CommentCount] => 0 -) - -

-
diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/HelloWorld.page b/demos/quickstart/protected/pages/GettingStarted/pl/HelloWorld.page deleted file mode 100755 index c4a23059..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/pl/HelloWorld.page +++ /dev/null @@ -1,82 +0,0 @@ - -

Moja pierwsza aplikacja w PRADO

-
-

-W tej sekcji, przeprowadzimy Cię przez proces tworzenia Twojej pierwszej aplikcaji w PRADO, słynną aplikację "Witaj świecie" (ang. "Hello World"). -

-

-"Witaj świecie" prawdopodobnie jest najprostszą interaktywną aplikacją w PRADO, którą możesz stworzyć. Wyświetla ona użytkownikowu końcowemu stronę z przyciskiem, którego napis to Kliknij mnie (ang. Click Me). Po tym jak użytkownik kliknie na przycisk, jego napis zmienia się na Witaj świecie. -

-

-Jest wiele dróg aby osiągnąć ten cel. Można przesłać (ang. submit) stronę do serwera, sprawdzić zmienną POST i wygenerować nową stronę z przyciskiem ze zaktualizowanym napisem. Można też przez proste użycie JavaScript zaktualizować napis podczas zdarzenia OnClick po stronie klienta. -

-
-

-PRADO promuje programowanie sterowane zdarzeniami i bazujące na komponentach. Przycisk jest reprezentowany przez obiekt TButton. Hermetyzuje on napis na przycisku jako właściwość Text przycisku oraz wiąże akcję naciśnięcia przez użytkownika przycisku ze zdarzeniem po stronie serwera OnClick. Aby odpowiedzieć na naciśnięcie przez użytkownika przycisku, należy po prostu przypisać funkcję do zdarzenia OnClick przycisku. Wewnątrz funkcji, właściwość Text przycisku jest zmodyfikowana na "Witaj świecie". Poniższy diagram pokazuje powyższą sekwencję. - -

-

-Nasza aplikacja PRADO składa się z trzech plików index.php, Home.page and Home.php, które są zorganizowane w poniższy sposób, - - -gdzie każdy katalog należy rozumieć następująco. Zauważ, że powyższa struktura katalogów jest rozszerzalna. Na przykład, można przenieść katalog protected poza katalog WWW. Będziesz wiedział jak tego dokonać, jeśli przejdziesz przez ten przewodnik. -

-
    -
  • assets - katalog zawierający upublicznione prywatne pliki. Zobacz sekcję assets by dowiedzieć się więcej. Katalog ten musi być zapisywalny przez proces serwera.
  • -
  • protected - podstawowa ścieżka aplikacji zawierająca dane aplikacji oraz prywatne skrypty plików. Katalog ten powinien być skonfigurowany jako niedostępny dla użytkownika końcowego.
  • -
  • runtime - składująca uruchomieniowa ścieżka aplikacji (ang. application runtime storage path) przechowuje informacje rurchomieniowe aplikacji, takie jak stan aplikacji, keszowane dane, itp. Katalog ten musi być zapisywalny przez proces serwera.
  • -
  • pages - podstawowa ścieżka przechowująca wszystkie strony PRADO.
  • -
- -
-Podpowiedż:Możesz również użyć framework/prado-cli.php -narzędzia linii poleceń -aby stworzyć strukturę katalogów dla projektu w PRADO. Na przykład, wpisz komendę -php ścieżka/do/prado-cli.php -c helloworld w katalogu gdzie chcesz stworzyć projekt helloworld (witaj świecie). -
- -

-Trzy pliki, krórych potrzebujemy, kolejno oznaczają -

-
    -
  • index.php - skrypt wejściowy aplikacji PRADO. Ten plik jest wymagany prez wszyskie aplikacje PRADO i jest jedynym skryptem, który jest bezpośrednio dostępny przez użytkownika końcowego. Zawartość index.php przeważnie zawiera następujące trzy linie, - -require_once('path/to/prado.php'); // załącz skrypt PRADO -$application=new TApplication; // utwórz instancję aplikacji PRADO -$application->run(); // uruchom aplikację - -
  • -
  • Home.page - szablon dla domyślnej strony, zwracany gdy użytkownik nie wybierze jawnie żadnej strony. Szablon określa warstwę prezentacji komponentów. W tym przykładzie, używamy dwóch komponentów, TForm oraz TButton, które odpowiadają odpowiednio znacznikom HTML <form> oraz <input>. Szablon posiada następującą treść - - - - <com:TForm> - <com:TButton Text="Kliknij mnie" OnClick="buttonClicked" /> - </com:TForm> - - - -
  • -
  • Home.php - klasa strony dla strony głównej Home. Zawieta przeważnie metody odpowiadające na zdarzeniaOnClick przycisku. - -class Home extends TPage -{ - public function buttonClicked($sender,$param) - { - // $sender wskazuje na komponent przycisku - $sender->Text="Witaj świecie!"; - } -} - -
  • -
-
-

-Aplikacja jest teraz gotowa i jest dostępna poprzez adres http://adres-serwera/helloworld/index.php, zakładając, że helloworld znajduje się bezpośrenio w KataloguGłównymDokumentó serwera (ang. DocumentRoot). Spróbuj zmienić TButton w Home.page na TLinkButton i zobacz co się stanie. -

-

-Kompletne źródło kodu dla tego demo można znaleźć w wydaniu PRADO. Możesz również spróbować demo online. -

-
- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/Installation.page b/demos/quickstart/protected/pages/GettingStarted/pl/Installation.page deleted file mode 100755 index f25a4cc2..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/pl/Installation.page +++ /dev/null @@ -1,29 +0,0 @@ - -

Instalacja PRADO

-
-

-Jeśli widzisz tą stronę z poziomu własnego serwera, zakończyłeś właśnie instalację. -

-

-Minimalne wymagania PRADO to serwer internetowy wspierający PHP5. PRADO zostało przetestowane na serwerze Apache na Windowsie oraz Linuxie. Jest wielce prawdopodobne, że może również działać na innych platformach z innymi serwerami internetowymi dopóki wspierają one PHP5. -

-
- -
-

-Instalacja PRADO składa się głównie z jego pobrania oraz rozpakowania. -

-
    -
  1. Przejdź do strony pradosoft.com aby pobrać ostatnią wersję PRADO.
  2. -
  3. Rozpakuj plik PRADO zawierający jego ostatnie wydanie do katalogu znajdującego się na serwerze. -
-
-
-

-Twoja instalacja PRADO jest zakończona i możesz zacząć zabawę z aplikacjami demo zawartymi w PRADO znajdującymi się pod adresem http://adres-serwera/prado/demos/. Tutaj zakładamy, że PRADO jest rozpakowane do katalogu prado w katalogu głównym serwera. -

-

-Jeśli spotkasz się z jakimkolwiek problemem w aplikacjach demo, proszę użyj skryptu sprawdzającego wymagania do korzystania z PRADO dostępnego poprzez http://adres-serwera/prado/requirements/index.php, aby najpierw sprawdzić czy Twoja konfiguracja serwera spełnia wszystkie warunki wymagane przez PRADO. -

-
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/pl/Introduction.page deleted file mode 100755 index d8bd6381..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/pl/Introduction.page +++ /dev/null @@ -1,23 +0,0 @@ - -

Witamy w przewodniku SzybkiStart z PRADO

-
-

-Niniejszy przewodnik powstał by pomóc Tobie w szybkim rozpoczęciu budowania Twojej własnej aplikacji internetowej bazującej na PRADO w wersji 3.x -

-

-Jeśli jesteś już użytkownikiem PRADO #.x i chciałbyś dowiedzieć się jakie rozszerzenia są dostępne dla każdej nowej wersji, proszę sprawdź nowe właściwości. -Następujące sekcje są pomocne dla początkujących. -

-

-Możesz odwoływać się do następujących zasobów jeśli czujesz, że ten przewodnik nie spełnia wszystkich twoich oczekiwań. -

-
- - -
diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/NewFeatures.page b/demos/quickstart/protected/pages/GettingStarted/pl/NewFeatures.page deleted file mode 100755 index c5de2f02..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/pl/NewFeatures.page +++ /dev/null @@ -1,33 +0,0 @@ - - -

Nowe możliwości

- -

-Poniższa strona podsumowuje główne możliwości, które zostały wprowadzone w każnym z wydań PRADO. -

- -

Wersja 3.1.1

-
    -
  • Dodano nową kontrolkę TTabPanel wyświetlającą zawartość widoków w zakładkach.
  • -
  • Dodano nową kontrolkę TKeyboard wyświetlającą wirtualną klawiaturę do wprowadzania tekstu.
  • -
  • Dodano nową kontrolkę TCaptcha wyświetlającą CAPTCHA uniemożliwiającą spamerom logowanie się do kont online. Powiązany Validator TCaptchaValidator został również zaimplementowany.
  • -
  • Dodano nową kontrolkę TSlider wyświetlającą suwak do wprowadzania wartości numerycznych.
  • -
  • Dodano nową kontrolkę TConditional wyświetlającą jedną z dwóch rodzajów zawartości w zależności od spełnionego (bądź nie) warunku.
  • -
  • Dodano wsparcie dla baz Oracle dla Rekordu Aktywnego (Active Record).
  • -
  • Dodano wsparcie dla TDataGrid umożliwiające grupowanie kolejnych komórek z tą samą zawartością.
  • -
  • Dodanow możliwość konfiguracji właściwości strony oraz reguł autoryzacji za pomocą relacyjnych ścieżek strony w aplikacji oraz konfiguracji strony. Dodano możliwość autoryzacji bazującej na zewnętrzym adresie hosta.
  • -
  • Dodano nowy utrzymywacz (ang. persister) stanu strony TCachePageStatePersister umożliwiający przetrzymywanie stanu strony za pomocą modułów cache (np. TMemCache, TDbCache, itd.) -
  • Dodano wsparcie dla frameworku authentykacji umożliwiającą zapamiętanie logowania.
  • -
  • Dodano możliwość wyświetlenia wskazówki w TDropDownList oraz TListBox (coś na wzów 'Proszę wybrać :' jako pierwszą pozycję w liście.)
  • -
  • Dodanow wsparcie dla mapowania kolumn w Rekordzie Aktywnym (Active Record).
  • -
- -

wersja 3.1.0

-
    -
  • Dodano jednolite/spójne wsparcie dla AJAX-a. Wprowadzono cały zestaw kontrolek AJAX-owych, nazywanych kontrolkami aktywnymi (ang. active controls).Uzywanie tych kontrolek jest bardzo podobne do swoich nieAJAX-owych odpowiedników, np. wstaw w kod i korzystaj. Aby uzyskać więcej szczegółów, zobacz przewodnik o aktywnych kotnrolkach.
  • -
  • Dodano kompletną obsługę baz danych.
  • -
  • Dodano nowe kontrolki, moduły i serwisy, w tym TSoapService, TOutputCache, TSessionPageStatePersister, TFeedService, TJsonService, klasy powiązane z cachem (ang. cache dependency classes), TXmlTransform.
  • -
  • Rozszerzono część kontrolek danych o "odtwóców" (ang. renderers). "Odtwórcy" umożliwiają ponowne używanie szablonów pozycji (ang. item templates), które powszechnie można znaleźć w TRepeater, TDataList i TDataGrid, przez co czynią konfigurację tych kontrolek bardziej przejrzystą. Aby uzyskać więcej szczegółów o "odtwórcach" zobacz zaktualizowany przewodnik TRepeater, TDataList oraz TDataGrid.
  • -
  • Dodano usługę umożliwiającą inkludowanie zewnętrznej konfiguracji serwera. Rozszerzono składnię szablonów ułatwiającą konfigurację subwłaściwości (ang. subproperties).
  • -
-
diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/Upgrading.page b/demos/quickstart/protected/pages/GettingStarted/pl/Upgrading.page deleted file mode 100755 index deb726bb..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/pl/Upgrading.page +++ /dev/null @@ -1,64 +0,0 @@ - - -

Aktualizowanie z wersji 2.x i 1.x

- -
-

-PRADO 3.0 nie jest kompatybilne wstecz z wcześniejszymi wersjalmi PRADO. -

-

-Dobrą wiadomością jest, że własciwości oraz zdarzenia większości kontrolek pozostają niezmienione a składnia szablonów kontrolek pozostaje w dużej mierze niezmieniona. Dlatego więc, wiedza develoiperów dotycząca wcześniejszych wersji PRADO wciąż znajduje zastosowanie w wersji 3.0. -

-

-Kolejno podsumujemu najbardziej znaczące zmiany w wersji 3.0 aby pomóc developerom aktualizację ich aplikacji PRADO z wersji 2.x oraz 1.x jeśli wystąpi taka potrzeba. -

-
- -

Definicja komponentu (Component definition)

-

-Wersja 3.0 całkowicie zarzuciła potrzebę występowania pliku specyfikującego komponent. Polega ona obecnie bardziej na konwencji definiowania właściwości komponentu i jego zdarzeń. Uszczegóławiając, właściwość (ang. property) jest definiowana poprzez istnienie metod: getterów i/lub setterów (ang. getter and/or setter methods), natomiast zdarzenie jest zdefiniowane poprzez istnienie metod z przedrostniem on (ang. on-methods). Zarówno właściwości jak i nazwy zdarzeń są w wersji 3.0 nie są wrażliwe na wielkość liter. W konsekwencji developerzy, są teraz zobowiązaniu do troszczenia się konwersję typów, kiedy właściwość komponentu jest ustawiana. Na przykład, następujący kod jest używany do zdefiniowania metody będącej setterem dla właściwości Enabled (przyp. tłum. ang enabled - dostępny, umożliwiony) TControl, która jest typu boolowskiego: boolean, -

- -public function setEnabled($value) -{ - $value=TPropertyValue::ensureBoolean($value); - $this->setViewState('Enabled',$value,true); -} - -

-gdzie TPropertyValue::ensureBoolean() jest używana aby ipewnić się, że wartość wejściowa jest typu boolean. Dziejse się tak ponieważ, gdy watość jest konfigurowana w szablonie, wartość łańcuchowa (ang. string value) jest przekazywana do settera. W poprzednich wersjach PRADO znało typ właściwości bazując na pliku specyfikacji i wykonywało konwersję typów za Ciebie. -

- -

Kontroler aplickacji (Application Controller)

-

-Kontroler aplickacji implementuje teraz architekturę modułową. Moduły mogą być podłączone i skonfigurowane w specyfikacji aplikacji. Każdy moduł obejmuje określoną funkcjonalność a wszystkie one są koordynowane przez cykl życia aplickacji (ang. application lidecycle). Konecpcja modułów w wersji 2.x została zastąpiona w wersji 3.0 przez katalogi stron (ang. page directories). W wyniku tego format specyfikacji aplikacji (ang. application specification) w wersji 3.0 różni się od wersji wcześniejszych. -

- -

Strony (Pages)

-

-Strony w wersji 3.0 są zorganizowane w katalogach, które mogą zostać porównane do koncepcji modułów w wersji 2.x. Strony są dostępne poprzez ścieżkę do nich. Na przykład, adres URL index.php?page=Kontrolki.Przyklady.Przyklad1 będzie używany do dostępu do strony nazwanej Przyklad1 przechowywanej w katalogu [ŚcieżkaBazowa]/Kontrolki/Przyklad, gdzie [ŚcieżkaBazowa] oznacza główny katalog stron (ang. root page path). Nazwa pliku szablonu strony musi kończyć się rozszerzeniem .page, głównie, aby odróżnić szablony stron od "niestronowych" (ang. non-paged) szablonów kontrolek, których nazwa musi być zakończona rozszerzeniem .tpl. -

- -

Zależności między kontrolkami (Control Relationship)

-

-Wersja 3.0 redefiniuje zależności pomiędzy kontrolkami. W szczególności, relacja rodzic-dziecko (parent-child relationship teraz odnosi się do relacji zawierajacej się w prezentacji kontrolek. Nowa relacja naming-container (przyp tłum. ang. naming - nazywanie, container - kontener) została wprowadzona dla lepszego zarządzania identyfikatorami ID kontrolek. Aby uzyskać więcej informacji zobacz sekcję kontrolki. -

- -

Składnia szablonów (Template Syntax)

-
-

-Składnia szblonów kontrolek w wersji 3.0 została podobna do tej we wcześniejszych wersjach, ale z wieloma rozszerzeniami. Główna zmiana dotyczy wyrażenia wiążącego dane (ang. databind expression), które jest wykonywane następująco -

- -<com:MojKomponent NazwaWlasciwosci=<%# formuła PHP %> .../> - -

-Tagi formuł oraz wyrażeń (ang. expression and statement tags) zostały zmienione w podobny sposób. Aby uzyskać więcej szczegółów zobacz sekcję definiowanie szablonów (ang. template definition). -

-
-

Składnia tematów (Theme Syntax)

-

-Tematy w wersji 3.0 są definiowane jak szablony kotnrolek z kilkoma obwarowaniami. -

- -
diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/directory.gif b/demos/quickstart/protected/pages/GettingStarted/pl/directory.gif deleted file mode 100755 index e6c4f724..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/pl/directory.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/pl/sequence.gif b/demos/quickstart/protected/pages/GettingStarted/pl/sequence.gif deleted file mode 100755 index 4207a9bb..00000000 Binary files a/demos/quickstart/protected/pages/GettingStarted/pl/sequence.gif and /dev/null differ diff --git a/demos/quickstart/protected/pages/GettingStarted/zh/Introduction.page b/demos/quickstart/protected/pages/GettingStarted/zh/Introduction.page deleted file mode 100755 index ee5db70f..00000000 --- a/demos/quickstart/protected/pages/GettingStarted/zh/Introduction.page +++ /dev/null @@ -1,20 +0,0 @@ - -

欢迎使用PRADO快速教程

- -
-

-本教程旨在帮助您快速掌握用PRADO v3.x构建Web应用。 -

-

-如果您觉得本教程没能满足您的需求,您也可以参考以下资源: -

-
- - -
diff --git a/demos/quickstart/protected/pages/Services/id/SoapService.page b/demos/quickstart/protected/pages/Services/id/SoapService.page deleted file mode 100755 index e7f552c4..00000000 --- a/demos/quickstart/protected/pages/Services/id/SoapService.page +++ /dev/null @@ -1,164 +0,0 @@ - - -

Layanan SOAP

- -

-SOAP membentuk lapisan dasar dari tumpukan layanan Web. Ia menyediakan cara yang rapi agar aplikasi PHP saling berkomunikasi atau dengan aplikasi yang ditulis dalam bahasa lain. PRADO menyediakan TSoapService yang membuat pengembagan aplikasi server SOAP menjadi tugas yang sangat mudah. -

- -

-Untuk menggunakan TSoapService, konfigurasi itu dalam spesifikasi aplikasi seperti berikut: -

- - - - - - - - -

-Contoh menetapkan penyedia layanan SOAP bernama stockquote yang mengimplementasikan metode SOAP getPrice dalam kelas penyedia StockQuote, -

- -class StockQuote -{ - /** - * @param string $symbol the symbol of the stock - * @return float the stock price - * @soapmethod - */ - public function getPrice($symbol) - { - ....return stock price for $symbol - } -} - - -
Catatan: -TSoapService didasarkan pada ekstensi SOAP PHP dan memerlukan ekstensi terinstalasi. -
- -

-Dengan kode sederhana di atas, kita sudah menyelesaikan layanan SOAP sederhana yang membolehkan aplikasi lain untuk meng-query harga dari stok tertentu. Sebagai contoh, umumnya klien SOAP bisa ditulis seperti berikut guna mendapatkan harga stok atas IBM, -

- -$client=new SoapClient('http://path/to/index.php?soap=stockquote.wsdl'); -echo $client->getPrice('IBM'); - - -

-Perhatikan URL yang digunakan untuk membentuk SoapClient (kelas disediakan oleh ekstensi SOAP PHP). Ini adalah URL untuk WSDL yang menjelaskan protokol komunikasi untuk layanan SOAP yang baru kita implementasikan. WSDL sering kali terlalu rumit untuk ditulis secara manual. Kebetulan, TSoapService bisa membuat ini bagi kita menggunakan generator WSDL. Secara umum, URL untuk membuat WSDL secara otomatis dalam PRADO mempunyai format berikut: -

- -http://path/to/index.php?SoapServiceID=SoapProviderID.wsdl - - -

-Agar generator WSDL membuat WSDL untuk layanan SOAP, kelas penyedia perlu untuk mengikuti sintaks tertentu. Dalam keadaan tertentu, untuk metode yang akan diperlihatkan sebagai metode SOAP, kata kunci @soapmethod harus muncul dalam komentar phpdoc terhadap metode dengan baris berikut yang menetapkan parameter metode dan nilai hasil: -

-
    -
  • parameter: @param parameter-type $parameter-name description
  • -
  • return value: @return value-type description
  • -
-

-Parameter yang benar dan tipe hasil termasuk: string, int, boolean, float, array, mixed, dll. Anda dapat juga menetapkan nama kelas sebagai tipe, yang menterjemahkan ke dalam tipe SOAP kompleks. Sebagai contoh, untuk tipe kompleks Contact -

- - -/** - * Memperluas TComponent untuk menyediakan metode pengambil/penentu properti - */ -class Contact { - /** - * @var string $name - * @soapproperty - */ - public $name; - - /** - * @var Address $address - * @soapproperty - */ - private $_address; - - public function setAddress($value) { - $this->_address=$value; - } - - public function getAddress() { - if($this->_address===null) - $this->_address=new Address; - return $this->_address; - } -} - -class Address{ - /** - * @var string $city - * @soapproperty - */ - public $city; -} - -class ContactManager { - /** - * @return Contact[] an array of contacts - * @soapmethod - */ - function getAllContacts() { - return array(new Contact); - } - - /** - * @return Contact one contact - * @soapmethod - */ - function getContact($name) { - return new Contact; - } -} - -

Untuk obyek soap kompleks, properti obyek ditetapkan dengan kata kunci @soapproperty dalam phpdocs. Selanjutnya, nama tipe properti harus ditetapkan sebagai @var type $name di mana type adalah tipe apapun yang benar seperti telah disebutkan sebelumnya dan $name akan mendefinisikan properti name (catatan bahwa jika kelas Anda adalah TComponent, Anda bisa menyediakan properti pengambil/penentu). -

-

-Sebuah array dari obyek yang kompleks juga bisa dihasilkan dengan menambahkan pasangan yang dilindungi kurung kotak setelah nama tipe. Sebagai contoh, untuk menghasilkan array dari tipe Contact, kita mendefinisikan @return Contact[] .... -

- -
Tip: -Piranti sangat berguna untuk menguji layanan web Anda adalah piranti bebas -WebServiceStudio 2.0. Ia bisa memanggil webmethods secara interaktif. Pengguna dapat menyediakan sebuah titik akhir WSDL. Pada saat mengklik tombol Get piranti mengambil WSDL, membuat proxy .NET dari WSDL dan menampilkan daftar metode yang tersedia. Pengguna bisa memilih setiap metode dan menyediakan parameter input yang diplerukan. -Piranti membutuhkan MS .NET runtime terinstalasi. - -

Piranti semacam itu tersedia untuk Mac OS X Tiger dari -http://www.ditchnet.org/soapclient/ -

-
- -

-TSoapService bisa dikonfigurasi dan dikustomisasi dalam beberapa cara. Dalam contoh di atas, elemen <soap> sebenarnya menetapkan sebuah layanan SOAP menggunakan implementasi standar TSoapServer. Atribut dalam <soap> dikirimkan ke TSoapServer sebagai nilai properti awalnya. Sebagai contoh, atribut provider menginisialisasi properti Provider dari TSoapServer. Dengan menyetel SessionPersistent menjadi true dalam elemen <soap>, turunan penyedia akan sama di dalam sesi pengguna. Anda bisa mengembangkan kelas server SOAP sendiri dan menggunakannya dengan menetapkan atribut class dari <soap>. -

- -

Standarnya, server SOAP PHP akan membuat obyek dari tipe StdClass ketika obyek diterima dari klien. Server soap bisa dikonfigurasi untuk secara otomatis membuat obyek dari obyek tipe tertentu diterima sebagai parameter metode. Sebagai contoh, jika kita mempunyai sebuah metode Soap yang menerima obyek Contact sebagai parameter. - -/** - * @param Contact $contact - * @return boolean true if saved, false otherwise - * @soapmethod - */ - function save(Contact $contact) - { - return true - } - -Untuk melakukan ini, kita perlu menyetel properti ClassMaps dari -TSoapServer dalam tag <soap> sebagai nama kelas string dipisahkan koma yang kita inginkan secara otomatis dikonversi. - - - -

- -
diff --git a/demos/quickstart/protected/pages/Tutorial/AjaxChat.page b/demos/quickstart/protected/pages/Tutorial/AjaxChat.page index 92118720..40e283dd 100755 --- a/demos/quickstart/protected/pages/Tutorial/AjaxChat.page +++ b/demos/quickstart/protected/pages/Tutorial/AjaxChat.page @@ -22,7 +22,7 @@ that asks the user to enter their nickname and the main application chat page. You can try the application locally or at - Pradosoft.com. + Prado website. The main application chat page is shown bellow. class="figure" />

diff --git a/demos/quickstart/protected/pages/Tutorial/CurrencyConverter.page b/demos/quickstart/protected/pages/Tutorial/CurrencyConverter.page index 1abd68b9..0beeaaf4 100755 --- a/demos/quickstart/protected/pages/Tutorial/CurrencyConverter.page +++ b/demos/quickstart/protected/pages/Tutorial/CurrencyConverter.page @@ -10,15 +10,15 @@ a dollar amount to an other currency, given the rate of that currency relative to the dollar. The completed application is shown bellow. class="figure" /> - You can try the application locally or at - Pradosoft.com. + You can try the application locally or at the + Prado website. Notice that the application still functions exactly the same if javascript is not available on the user's browser.

Downloading and Installing Prado

-

To install Prado, simply download the latest version of Prado from - http://www.pradosoft.com +

To install Prado, simply download the latest version of Prado from the + Prado project website and unzip the file to a directory not accessible by your web server (you may unzip it to a directory accessible by the web server if you wish to see the demos and test). For further detailed installation, see the diff --git a/demos/quickstart/protected/pages/Tutorial/fr/AjaxChat.page b/demos/quickstart/protected/pages/Tutorial/fr/AjaxChat.page deleted file mode 100755 index 568e920f..00000000 --- a/demos/quickstart/protected/pages/Tutorial/fr/AjaxChat.page +++ /dev/null @@ -1,755 +0,0 @@ - -

Building an AJAX Chat Application

-

This tutorial introduces the Prado web application framework's - ActiveRecord - and Active Controls to build a Chat - web application. It is assumed that you - are familiar with PHP and you have access to a web server that is able to serve PHP5 scripts. - This basic chat application will utilize the following ideas/components in Prado. -

-
    -
  • Building a custom User Manager class.
  • -
  • Authenticating and adding a new user to the database.
  • -
  • Using ActiveRecord to interact with the database.
  • -
  • Using Active Controls and callbacks to implement the user interface.
  • -
  • Separating application logic and application flow.
  • -
- -

In this tutorial you will build an AJAX Chat web application that allows - multiple users to communicate through their web browser. - The application consists of two pages: a login page - that asks the user to enter their nickname and the main application chat - page. - You can try the application locally or at - Pradosoft.com. - The main application chat page is shown bellow. - class="figure" /> -

- -

Download, Install and Create a New Application

-

The download and installation steps are similar to those in - the Currency converter tutorial. - To create the application, we run from the command line the following. - See the Command Line Tool - for more details. - -php prado/framework/prado-cli.php -c chat - -

- -

The above command creates the necessary directory structure and minimal - files (including "index.php" and "Home.page") to run a Prado web application. - Now you can point your browser's URL to the web server to serve up - the index.php script in the chat directory. - You should see the message "Welcome to Prado!" -

- -

Authentication and Authorization

-

The first task for this application is to ensure that each user - of the chat application is assigned with a unique (chosen by the user) - username. To achieve this, we can secure the main chat application - page to deny access to anonymous users. First, let us create the Login - page with the following code. We save the Login.php and Login.page - in the chat/protected/pages/ directory (there should be a Home.page - file created by the command line tool). -

- -<?php -class Login extends TPage -{ -} - - - - - - Prado Chat Demo Login - - -<com:TForm> -

Prado Chat Demo Login

-