[英]Lithium: Run filter after find() to format output
我想从模型中指定字段的输出,因此在$_schema
添加了一个date
键:
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')
);
?>
我将时间作为无符号整数存储在db中( time()
输出)。
我希望我的基本模型格式化任何具有date
键以供输出的字段。 我认为最好的选择就是在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);
}
?>
这似乎不起作用。 当我执行全部查找时,此过滤器似乎被击中了两次。 第一次, $entity
包含结果的count()
,仅在第二次命中时,它才包含Records
对象。
我究竟做错了什么? 我该如何改变它,以便简单地<?= $tag->created; ?>
<?= $tag->created; ?>
在我看来会以我想要的方式格式化日期吗? 从本质上讲,这需要是一种“后过滤器”。
编辑
如果可以找到访问当前模型实体对象的方法(不是完整的命名空间路径,$ self包含该路径),则可以解决我的问题。
不管您的after find过滤器有什么小修正,我都会以不同的方式进行。
每次进行查找时,即使您不想显示日期格式,也将覆盖日期格式,而只是进行诸如比较日期等的业务逻辑...
由于您只想在视图中格式化输出(我们不是在谈论API的json响应动态格式化等),为什么不使用helper方法呢?
另一种方法是在模型(或BaseModel)中添加一个实例方法,称为created_at()
。 然后,您将使用<?= $entity->created_at() ?>
从视图中调用它。您仍然可以强制从$ _schema提取格式,或者将其作为参数传递,等等。
当我们正在谈论在您的视图中呈现数据时,助手似乎更干净。
我正在阅读OP的问题,因为find过滤器执行两次。 如果正确,那么为什么不检查一下$ entity是否包含记录集呢?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.