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