Loading...
 
Skip to main content

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
Show PHP error messages