Loading...
 
Skip to main content
A proposal for a unified interface to access Tikiwiki data

TikiObject

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

Create a new object
Copy to clipboard
<?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

Edit and use existing object
Copy to clipboard
<?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

Collection handling
Copy to clipboard
<?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 interfaceQuestion 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

Proposed interfaces
Copy to clipboard
<?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:
Image

Remaining issues:

  • Error handling
  • Storage layer details / batch support
  • Caching
Show PHP error messages