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

时间:2014-07-29 13:14:10

标签: php kohana kohana-orm kohana-3.2

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

我在想的是代替视图进行计算,我会在控制器内部进行。但是,我相信在控制器内部有一个循环,它遍历每个记录并进行计算并将记录包装在包装器对象中以及特定于视图的其他属性,这是一个坏主意。我正在寻找像模型中的回调之类的东西,每次调用时都会调用一条记录。我可以在那里做我的计算并返回对象。 Kohana可以采用这种方法吗?如果没有,请告诉我什么是符合此要求的最佳解决方案?

感谢您的时间和关注。

1 个答案:

答案 0 :(得分:1)

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

我假设你有一个扩展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';
    }
}

方法should_message_be_shown()使用类变量Model_Example::date_created。这假设您有一个名为date_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>