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