Kohana/PHP-在将记录传递到视图之前向记录添加更多信息

Kohana/PHP-在将记录传递到视图之前向记录添加更多信息,php,kohana,kohana-orm,kohana-3.2,Php,Kohana,Kohana Orm,Kohana 3.2,场景:我将一个kohana记录集对象传递给一个视图,该视图将遍历每个记录并以适当的格式显示其值。在视图中,我必须用消息提醒用户。此警报只有在满足特定条件时才会激活,例如,view必须使用每条记录的date属性执行PHP datediff,并查看是否是向用户显示警报的最佳时间 我想的不是视图,而是在控制器内进行计算。但是,我认为在控制器内部使用循环是一个坏主意,循环遍历每个记录并进行计算,并将记录包装到包装器对象中,以及特定于视图的其他属性。我在模型中寻找的是一个回调函数,每次调用它时,都会获取一

场景:我将一个kohana记录集对象传递给一个视图,该视图将遍历每个记录并以适当的格式显示其值。在视图中,我必须用消息提醒用户。此警报只有在满足特定条件时才会激活,例如,view必须使用每条记录的
date
属性执行PHP datediff,并查看是否是向用户显示警报的最佳时间

我想的不是视图,而是在控制器内进行计算。但是,我认为在控制器内部使用循环是一个坏主意,循环遍历每个记录并进行计算,并将记录包装到包装器对象中,以及特定于视图的其他属性。我在模型中寻找的是一个回调函数,每次调用它时,都会获取一条记录。我可以在那里计算并返回对象。科哈纳是否有可能采用这种方法?如果没有,请告诉我什么是适合此要求的最佳解决方案


谢谢你的时间和关注。

的确,你的建议很好,我一直在使用它

我假设您有一个扩展ORM的模型。例如,您可以这样做

class Model_Example extends ORM {
    protected $_primary_key = 'id';
    protected $_table_name = 'example_table';
    // possibly relations, filters etc.

    function should_message_be_shown() {
        if( !$this->_loaded ) {
            throw new Kohana_Exception('Should only be called on loaded objects');
        }

        if( $this->date_created > ( time() - 3600 ) ) {
            return true;
        }
        return false;
    }

    function get_user_message() {
        if( !$this->_loaded ) {
            throw new Kohana_Exception('Should only be called on loaded objects');
        }

        return 'Hi ' . $this->user_name . '! This is your personal message';
    }
}
方法
应该显示消息()
使用类变量
Model\u Example::date\u created
。这假设您有一个名为
date\u created
的表列,该列包含UNIX时间戳。因此,在这个特定的示例中,如果记录是在最后一个小时内创建的,则返回true

我添加了一个检查,以查看记录是否已实际加载,否则将抛出一个异常

要完成此示例,您可以在控制器和视图中获取并使用模型,如下所示:

class Controller_Example extends Controller {
    function action_index() {
        $records = ORM::factory('Example')->where('something', '=', true)->find_all();
        $this->response->body(View::factory('example')
                ->set('examples', $records));
    }
}
和视图文件:

<div class="example-list">
    <?php foreach($examples as $example): ?>
        <div class="example-item">
            <h2><?php echo $example->title; ?></h2>
            <?php if($example->should_message_be_shown()): ?>
                <div class="message">
                    <?php echo $example->get_user_message(); ?>
                </div>
            <?php endif; ?>
        </div>
    <?php endforeach; ?>
</div>

谢谢,这正是我想要的!