Lithium: Run filter after find() to format output

Posted by Housni on Stack Overflow See other posts from Stack Overflow or by Housni
Published on 2012-03-27T17:51:22Z Indexed on 2012/03/28 5:30 UTC
Read the original article Hit count: 181

Filed under:
|

I wanted to specify the output of a field from within my model so I added a date key to my $_schema:

models/Tags.php

<?php
    protected $_schema = array(
        'id'       => array('type' => 'integer', 'key'  => 'primary'),
        'title'    => array('type' => 'string'),
        'created'  => array('type' => 'integer', 'date' => 'F jS, Y - g:i a'),
        'modified' => array('type' => 'integer')
    );
?>

I store my time as an unsigned integer in the db (output of time()).

I want my base model to format any field that has the date key for output. I thought the best place to do that would be right after a find:

extensions/data/Model.php

<?php
    static::applyFilter('find', function($self, $params, $chain) {
        $schema = $self::schema();
        $entity = $chain->next($self, $params, $chain);

        foreach ($schema as $field => $options) {
            if (array_key_exists('date', $options)) {
                //format as a date
                $params['data'][$field] = $entity->formatDate($field, $options['date']);
            }
        }
        return $entity;
    });


    public function formatdate($entity, $field, $format, $timezone = 'Asia/Colombo') {
        $dt = new \DateTime();
        $tz = new \DateTimeZone($timezone);
        $dt->setTimestamp($entity->$field);
        $dt->setTimezone($tz);
        return $dt->format($format);
    }

?>

This doesn't seem to be working. When I execute a find all, this filter seems to get hit twice. The first time, $entity contains a count() of the results and only on the second hit does it contain the Records object.

What am I doing wrong? How do I alter this so that simply doing <?= $tag->created; ?> in my view will format the date the way I want? This, essentially, needs to be an 'after filter', of sorts.

EDIT

If I can find a way to access the current model entity object (not the full namespaced path, $self contains that), I can probably solve my problem.

© Stack Overflow or respective owner

Related posts about php

Related posts about lithium