Lithium: запустить фильтр после find () для форматирования вывода - PullRequest
0 голосов
/ 27 марта 2012

Я хотел указать вывод поля из моей модели, поэтому я добавил ключ date к своему $_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')
    );
?>

Я храню свое время как целое число без знака в БД (вывод 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; ?> на мой взгляд форматировало дату так, как я хочу? По сути, это должно быть своего рода «после фильтра».

EDIT

Если мне удастся найти способ доступа к объекту сущности текущей модели (а не к полному пути в пространстве имен, который содержит $ self), я, вероятно, смогу решить мою проблему.

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Независимо от небольшого исправления для фильтра после поиска, я бы сделал это по-другому.

Каждый раз, когда вы делаете поиск, вы переопределяете формат даты, даже если вы не хотите отображать его, а выполняете только бизнес-логику, например сравнение дат и т. Д. *

Поскольку вы хотите отформатировать вывод только в своих представлениях (речь не идет о форматировании ответов json на лету для API и т. Д.), Почему бы не использовать вспомогательный метод ?

Другой способ - добавить метод экземпляра в вашу модель (или BaseModel), который называется created_at(). Затем вы будете вызывать его из вида с <?= $entity->created_at() ?> Вы по-прежнему можете принудительно использовать формат, извлеченный из вашей $ _schema, или передать его как параметр и т. Д. ...

Помощник выглядит чище, когда мы говорим о представлении данных в ваших представлениях.

0 голосов
/ 27 марта 2012

Я читаю проблему ОП, поскольку фильтр поиска выполняется дважды.Если это так, то почему бы просто не проверить, содержит ли сущность $ набор записей?

...