Release date: March 13, 2011
Changed the error() method in CoreControllerLite and the Controller interface to accept an optional exception string as the second argument.
Added close() method to the CoreBootstrap.
Changed the MysqlQuery class to allow buildInsertOrUpdateQuery() to accept update values that differ from insert.
Added GroupBy support to the CoreDatabaseModel addQueryFilters() method.
Added ^ as a valid WHERE operators in the MysqlQuery class.
Changed the ModelRelations helper to add a new BatchLoader option.
Added optional WithTable paramter to ModelRelations filters.
Added a choice between <input> and <button> options form the button and submit elements in the Form class.
The token verification in the CommonHooks class now sends a 400 error (used to be 500) on failure.
No need to pass the exception object to the exception handler.
Fixed a bug with ModelValidation::validateUnique() that caused row counts to happen for each unique check.
Added optional language file cache to the CoreLanguage class.
Added AllowScript flag to the ScriptBootstrap, which is checked for in the ScriptController.
CoreApi calls called from the batch handler don't get the internal flag.
Renamed LocalFileSystemHandler and AmazonFileSystemHandler to just LocalFileSystem and AmazonS3FileSystem.
Fixed the way AmazonS3FileSystem handles files.
Release date: October 31, 2010
Changed the Form utility to use htmlspecialchars() instead of htmlentities().
Added a zero pad option to Form::getSelectRange().
Added getHelper() method to the CoreModel class.
Added disableField() and enableField() methods to the ModelValidation class.
Added a flag to CoreError::error() to allow the error to be first in the array.
Added nodeExists() to the CoreDisplay object.
Added AppConfig::get('InstallDir') calls before all CoreLoader includes in the Phork php directory.
Changed CoreLoader::getIncludePath() so it doesn't check all include paths for absolute paths passed.
Moved the load time and peak memory usage output from index.php into the SiteBootstrap in the standard site.
Release date: July 19, 2010
Changed CacheHooks to use getCurrentUrl() instead of getUrl() to account for query strings.
Changed CacheAdaptor to allow colons (:) and pipes (|) in cache keys and changed the namespace format to use pipes.
Changed CoreError to allow group stacks, and also to allow grouped errors to remain out of the global errors array.
Added batch API processing to the CoreApi class.
Added an ApiHelper utility class to make internal API calls without an extra HTTP request.
Changed the class_exists() || require() calls in the CoreBootstrap to not try to autoload.
Release date: May 27, 2010
Changed CoreBootstrap to destroy events after running them.
Added clearCache() method to the ModelCache helper which dispatches to a CacheHelper utility.
Added getCacheNamespace() method to the ModelCache helper so namespaces can be assigned dynamically in extensions.
Changed CoreDatabaseModel so the addQueryFilters() method can handle __id as a column value.
Changed CoreDatabaseModel so the addQueryFilters() method can accept HAVING filters.
Changed CoreDatabaseModel so the addQueryFilters() method can sort randomly.
Added BETWEEN filter to the MySqlQuery class.
Added setAlerts() to CoreAlert.
Changed CoreApi to add any alerts to the result.
Added exists() and removeDatabase() methods to the DatabaseManager class.
Renamed ModelTest helper to the more generic ModelDatabase.
Changed the DatabaseFactory constructor to accept a config array as well as config file name.
Added database cache classes (DbcacheTiered, CacheModel, CacheRecord).
Force API HEAD calls to GET.
Added Compress flag to the AccessHooks page cache.
Added query string support to the ConcatHelper class when including JS files.
Added setRoutedUrl() to CoreUrl.
Changed MySQL BETWEEN query to put quotes around values.
Release date: April 11, 2010
Changed CoreBootstrap to allow controllers to have numbers in them.
CoreBootstrap now sends a 404 header when the controller can't be found in verbose error mode.
Changed CoreConfig, CoreDisplay, CoreEvent, CoreLanguage, CoreLoader, CoreRegistry and CoreUrl to abstract classes.
Changed CoreLoader to a singleton. Static methods still work as usual. Extensions will need to call self::getInstance()->method() instead of self::method().
Added includeFile() method to CoreLoader.
Added a class extension property to the CoreLoader class.
Changed CoreUrl::setUrl() to parse out the query string.
Added CoreError::setErrors() method and renamed appendError() to error() and made it public.
Changed CoreDisplay::setErrorCode() to CoreDisplay::setStatusCode() and added http.config.php error codes.
Added CoreApi, the ApiHelper utility and an ApiController class to the standard site.
CoreControllerLite now sends an HTTP response header before throwing the exception in error().
The error() method in CoreControllerLite only uses the generic "Fatal error" when no other errors have been triggered.
Added getConfig() method to CoreModel.
Added clearHelpers() method to CoreModel.
Added Sanitizer utility and incorporated it into the CoreModel::sanitize() method.
Added pre-save event to CoreModel to automatically sanitize all data before saving.
Added init() method to CoreModel to hold all helper initialization, and __clone() now calls init().
The CoreDatabaseModel pre-load and post-load events get passed the $arrLoading data.
The setLoading() and clearLoading() methods are only called in the CoreDatabaseModel load() method if no wrapper method has set them.
Added setTable() method to CoreDatabaseModel.
Added extra $arrFilters and $blnCalcFoundRows params to CoreDatabaseModel::loadById().
Added items() method to the CoreIterator class to return all items.
Changed ObjectIterator's getAssociativeList() method to call get() instead of get[Foo]().
Changed MySqlQuery class to put quotation marks around the table name.
Added buildInsertOrUpdateQuery() to the MySqlQuery class.
Added optional seed to the random sort order in the MySqlQuery class.
Added isSelect(), isInsert(), isUpdate() and isDelete() to the MySqlQuery class.
Changed the MySqlQuery class to not required a "join using" value to allow for natural joins.
Added insert or update functionality to the MySqlQuery class.
Added optional ClassLoader parameter to the ModelRelations helper for the callback function to use to load the model when not using AppLoader::includeModel().
In the ModelValidation helper the custom validate function can now be an array called with call_user_func().
Added strlen() validation to strings, count() validation to arrays, and min and max value validation to ints and floats in the ModelValidation class.
Added ModelBackup helper to backup records before saving or deleting.
Added ModelCounter helper to update a record count in a different model on save or delete.
Moved CACHE_ADD_ONLY and CACHE_REPLACE_ONLY constants from CacheAdaptor to the Cache interface.
The loadMulti() method in the cache classes keys the results by the uncleaned keys.
Added decrement() to the Memcache classes.
Added urlencode() to base64 encoded concat URLs in the ConcatHelper utility.
Added getFilesDirectory(), setFilesDirectory() and setLenient() to the file system handlers.
Added optional TempDir config value used by LocalFileSystemHandler.
Added FileHelper utility.
Added blnIncludeKeys option to the XmlBuilder utility.
Added htmlentities() to Form::getTextarea() value.
Changed verifyPost() to verifyRequest() in the Token utility.
Add reviveToken() to the Token utility.
Added ExampleApi class to the standard site.
Added an initDebugging() override to the standard and lite site bootstraps to use the DebugDisplay handler.
Release date: October 29, 2009
Added DatabaseManager class to manage multiple read and write database combinations.
Added getInsertAllQuery() method to CoreDatabaseModel to generate a query to insert all new loaded records.
Changed the Timer utility so microtime() returns a float.
Added $strMethodPrefix defaulted to 'display' to the controller.
Database model save events now have a blnNewRecord flag when a record is being inserted.
Added a success flag to all the post event calls in the CoreDatabaseModel class.
Added pre and post destroy callbacks to the CoreDatabaseModel class.
Cloning a CoreModel object clears out the iterator object.
Changed the CoreEvent class and the helper callbacks to accept explicit args instead of using func_get_args().
Added an optional $blnIgnore flag to the MySQL Query class for inserts and updates.
Added an insert() method to the iterators to insert an item at a certain position.
Added an optional argument to CoreEvent::register() to insert the event at a certain position.
Fixed the MySQL class getAffectedRows() method.
Release date: October 15, 2009
Added includeController, includeModel, includeHooks, and includeExtension classes to the CoreLoader class.
Replaced the CoreActiveRecord class with CoreModel, CoreDatabaseModel, CoreDatabaseScaffoldModel, CoreRecord and CoreModelHelper.
Added ModelCache, ModelRelations and ModelValidation helpers.
Added display.pre-output event to the display class right before the output is printed.
Changed the CoreEvent class to store the event actions in an AssociativeIterator object.
Changed CoreEvent::register() to return a unique event action key which can be used with the new CoreEvent::remove() function.
Added an option to the AssociativeIterator object to generate a unique key.
Fixed a bug with the AssociativeIterator breaking on array_search() returning 0.
Changed how the LocalFileSystemHandler works with temp files.
Changed CoreUrl so if there are multiple filters with the same name it creates an array instead of replacing them.
Changed the Form class to accept name/value pairs for the additional config params.
Added getTableColumns() to the MySql class.