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
<?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(); ?>
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
<?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 ); ?>
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
<?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; ?>
Syntax details:
- 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
<?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 ); } ?>
Proposed classes:
- TikiObject_WikiHandler, TikiObject_TrackerHandler, TikiObject_TrackerFieldHandler, ...
- TikiObject_TableStorage, TikiObject_ColumnStorage, TikiObject_AmazonS3?, ...
Object collaboration:
Remaining issues:
- Error handling
- Storage layer details / batch support
- Caching