从default.ctp访问静态方法

时间:2013-03-06 08:21:08

标签: cakephp cakephp-2.0

class Cat extend AppModel{
   public static function getCat($medium=NULL){
       $allcat = $this->Cat->find('all', array('contain' =>false,
                'conditions' => array('Cat.c_medium' => $medium), 
                 'order' => array('Cat.c_name' => 'asc')));
       return $allcat;
   }
}

我想从default.ctp访问此方法,例如Cat::getCat('eng'); 但这不行,请帮助我。

错误: - Fatal error: Class 'Cat' not found in C:\xampp\htdocs\app\View\Layouts\default.ctp on line 100

3 个答案:

答案 0 :(得分:6)

您需要App :: uses()要在文件中使用的类。 对于视图,通常最好在最顶层的控制器中执行此操作:

 <?php
     App::uses('Cat', 'Model');

现在可以在所有控制器操作及其视图中访问Cat模型 - 尤其是通过静态访问(对于非静态访问,ClassRegistry :: init()通常会处理包含本身)。

但在你的情况下,你在这里滥用静态方法。 您应该只为非查询方法静态访问模型。

这里的方法首先应该是静态的。 使用控制器调用此方法并将结果传递给视图。

答案 1 :(得分:2)

您的代码中存在一些错误;

  1. class Cat extend AppModel应为class Cat extendS AppModel(不是扩展中的额外's')
  2. 无法在静态方法中使用$this。静态方法没有要引用的类的“实例”,因此$this将产生错误
  3. 您正在使用$this->Cat->find(...) Cat模型本身,它应该只是$this->find(...)
  4. 通常,您不会访问“视图”或“布局”中的“模型”。模型在Controller中使用,结果通过提供为“viewVars”;

    传递给视图

    //您的控制器

    class MyController extends AppController {
        // Specify the Models you want to use
        public $uses = array('Cat');
    
    
        public function my_action()
        {
           $this->set('my_view_var_name', $this->Cat->getCat('eng'));
        }
    }
    

    //视图(app / View / My / my_action.ctp):

    debug($my_view_var_name);
    

    通过ClassRegistry :: init()

    如果您想要,可以在任何地方获取模型的实例,也可以在视图/布局中获取;

    ClassRegistry::init('ModelName');
    

    //在app / View / Layout / default.ctp

    $cats = ClassRegistry::init('Cat')->getCat('eng');
    debug($cats);
    

答案 2 :(得分:0)

我正在使用此代码 -

试试这个

<?php
  $cats = ClassRegistry::init('Cat')->getCat('eng');
  pr($cats);
?>