History: TikiObject
Source of version: 4 (current)
Copy to clipboard
General goals:
* Improve the Tikiwiki infrastructure for the future
* Allow smooth transition from the current structure
* Improve performance
! Userland
Goals:
* Readable, because we spend more time reading code than writing it
* Unified, to make it easy to jump from one section to the other from the code
* Expandable, to let features be added easily without compromising the code base
* Easy, to reduce the learning curve
Samples:
* The following samples are only proposal
{CODE(colors=>php,caption=>Create a new object)}
<?php
$page = TikiObject::create( 'wiki page' );
$page['name'] = "HelloWorld";
$page['lang'] = 'en';
$page['description'] = 'Sample page to draw out TikiObject';
$page->content = "!Hello
Sample content
!World
...";
$page->save();
?>
{CODE}
Syntax details:
* Factory method to build a new object with object type as parameter
* Brackets used to store indexable data
* Property used to store large data like wiki text blocks
* Unified save method
* Fully abstracted from the storage
{CODE(colors=>php,caption=>Edit and use existing object)}
<?php
$page = TikiObject::fetch( 'wiki page', 123 );
$page['award'] = "Editor's Choice";
$page->save();
$smarty->assign( 'current', $page );
// echo TikiLib::parse_data( $page['content'] );
echo TikiLib::parse_data( $page->content );
?>
{CODE}
Syntax details:
* Factory method to obtain existing objects
* Unified save applies to updates as well as creation
* Object can be passed around freely
* Reading values can be done from either properties or brackets to make it easier to access from templates
{CODE(colors=>php,caption=>Collection handling)}
<?php
$list = TikiCollection::query( array( 'core', 'meta' ) )
->include( 'wiki page' )
->like( 'name', 'Hello%' )
->between( 'creationDate', time() - 3600*24*30, time() - 3600*24*15 )
->exists( 'award' )
->fetch();
$pageNames = $list->getArray( 'name' );
foreach( $list as $object )
unset( $object['award'] );
$list->update();
foreach( $list as $object )
echo $object;
?>
{CODE}
Syntax details:
* [http://en.wikipedia.org/wiki/Fluent_interface|Fluent interface] to build the query
* Selection of selected fields
* Batch collection operations to manipulate objects
! Backend
Goals:
* Storage independence, to adapt to specific needs, allow refactoring
* Be usable with the current database structure
* Allow flexibility to add meta-data and custom fields
* Support batch operations to scale
Big picture:
* Allow both standard normalized table storage and column-based storage
* Object type definitions using a pluggable architecture
* Each field defines it's own storage method
* Object types define the hooks to be called on various operations to suit specific needs
{CODE(colors=>php,caption=>Proposed interfaces)}
<?php
/**
* $objectType refers to the name of the object type, like 'wiki page', 'fgal', ...
* Properties and array indices are alphanumeric and follow the camelCase convension.
* Reserved names: id, objectType
*/
class TikiObject implements ArrayAccess
{
/**
* Initialization function
*/
static function registerHandler( TikiObject_TypeHandler $handler ) { /* ... */ }
static function create( $objectType ) { /* ... */ }
static function fetch( $objectType ) { /* ... */ }
function save() { /* ... */ }
function __get( $name ) { /* ... */ }
function __set( $name, $value ) { /* ... */ }
}
interface TikiObject_TypeHandler
{
function getFields();
function acceptsMetaData();
/**
* Pre- hooks return a boolean. Operation will not be performed
* unless the function returns true.
*/
function preCreate( TikiObject $object );
function postCreate( TikiObject $object );
function preUpdate( TikiObject $object );
function postUpdate( TikiObject $object );
function preDelete( TikiObject $object );
function postDelete( TikiObject $object );
}
/**
* Proposed to use Zend_Filter and Zend_Validate.
*/
class TikiObject_Field
{
function getFilters() { /* ... */ }
function getValidators() { /* ... */ }
function getName() { /* ... */ }
function getLabel() { /* ... */ }
function getStorage() { /* ... */ }
}
interface TikiObject_Storage
{
function save( $objects );
}
?>
{CODE}
Proposed classes:
* TikiObject_WikiHandler, TikiObject_TrackerHandler, TikiObject_TrackerFieldHandler, ...
* TikiObject_TableStorage, TikiObject_ColumnStorage, TikiObject_AmazonS3?, ...
Object collaboration:
{img src="img/wiki_up/tikiobject.dot.png" }
Remaining issues:
* Error handling
* Storage layer details / batch support
* Caching