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
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