Behaviors

Behaviors
     Behaviors types
         Guid
         Slug
         LocalBehavior
     Writing new behaviors

Behaviors allow to set and/or modify model field data by attaching the behavior to the model. A behavior can be implemented once an attached to different models, the number of behaviors that can be attached is unlimited.

A good example is a slug for a page, this is based on a title and needs to be updated during the commit. This slug can then be used in the URL to retrieve the model.

public function behavior()
{
    return array(
        // Guid generation
        // Generate a guid and store in in the guid column
        'Guid' => array('column' => 'guid'),

        // Slug generation
        // Generate a slug from the title column and store in in the slug column
        'Slug' => array('source'=>'title', column' => 'slug'),
    );
}

Behaviors types

Guid

This behavior will generate a GUID and store it in the specified column.

If the column key is ommited the 'guid' column will be used to store the generated GUID.

public function behavior()
{
    return array(
        ...
        'Guid' => array(
            'column'      => '[column name]'
        ),
        ...
    );
}

Slug

This behavior will generate a slug from the source field and store it in the specified column.

If the source key is ommited the 'name' column will be used to create the slug. If the column key is ommited the 'slug' column will be used to create the slug.

public function behavior()
{
    return array(
        ...
        'Slug' => array(
            'source'      => '[column name]',
            'column'      => '[column name]'
        ),
        ...
    );
}

LocalBehavior

Allows the creation of a local behavior that is model specific. The function takes up to two arguments; the first argument contains the type of operation on the model and can be either 'construct' during construction of the model class, 'update' when the model is updated or 'create' when the model is created.

public function behavior()
{
    return array(
        ...
        // Callback static method
        TRUE => array('MyClass::static_method'),
        // Callback method
        TRUE => array($this, 'custom_behavior')),
        // Function as the callback (PHP 5.3+)
        TRUE => function($action) {
            // Do something to $value and return it.
            return some_function($action);
        },

        ...
    );
}

Writing new behaviors

It is possible to create custom behaviors that can be reused in different models.

Create a subclass of the ORM_Behavior class and implement the on_construct, on_update and on_create functions.

class ORM_Behavior_MyBehavior extends ORM_Behavior {

    /**
     * Constructs a new model and loads a record if given
     *
     * @param   ORM   $model The model
     * @param   mixed $id    Parameter for find or object to load
     */
    public function on_construct($model, $id)
    {
        // return FALSE if the model is loaded from this function.
        return TRUE;
    }

    /**
     * The model is updated
     *
     * @param   ORM   $model The model
     */
    public function on_update($model)
    {
        // Modify or update the appropriate fields
    }

    /**
     * A new model is created, add a guid value
     *
     * @param   ORM   $model The model
     */
    public function on_create($model)
    {
        // Modify or update the appropriate fields
    }
}