繁体   English   中英

锂:在find()之后运行过滤器以格式化输出

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM