使用CakePHP 2.0中的ajax发布到控制器

时间:2012-02-29 12:03:58

标签: php ajax cakephp cakephp-2.0

当我发布到此控制器时,我将其作为响应回复:Fatal error: Call to a member function find() on a non-object in /app/Controller/AppController.php on line 26这可能与明确使用$this->data()有关。我正在使用CakePHP save without form 根据那里的建议,但由于我没有使用表单发送数据(因此不使用$this->request->data()),我想知道$this->data()的替换是什么,所以我可以得到这工作。

我的数据库表是submissions_favorites

这是我的SubmissionFavorite模型:

class SubmissionFavorite extends AppModel {

    var $name = 'SubmissionFavorite';

    var $belongsTo = array(
        'User' => array(
            'className' => 'User'
        )
    );

}

这是AjaxController(我要发布的内容):

class AjaxController extends AppController {

    var $layout = 'ajax';  // uses an empty layout
    var $autoRender = false; // renders nothing by default
    var $uses = 'SubmissionFavorite';

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->loginRedirect = array('controller' => 'home', 'action' => 'index');
        $this->Auth->allow('addFavorite');
        $this->Auth->flashElement = 'flash_error';
    }

public function addFavorite() {
    $this->autoRender = false;

    $this->data['SubmissionFavorite']['user_id'] = $this->Session->read('Auth.User.id');
    $this->data['SubmissionFavorite']['submission_id'] = $_POST['id'];
    $this->data['SubmissionFavorite']['when'] = DboSource::expression('NOW()');

    $message = array('success' => 'success');

    $toReturn = json_encode($message);

    if ($this->RequestHandler->isAjax()) {
        if ($this->Session->read('Auth.User')) {
            $this->SubmissionFavorite->save($this->data);
            return $toReturn;
        } else {
            $login = array('login' => 'Please log in to add favorites');
            return json_encode($login);
        }
    }
}

我的AppController中的第26行是:

protected function getSubmissionCount() {
    $totalSubmissions = $this->Submission->find('count');
    return $totalSubmissions;
}

这与其他任何东西完全无关。当我在AjaxController中编写新方法时,我甚至没有向AppController添加任何东西,所以我不确定它是如何相关的(或者为什么我甚至在该文件中收到错误)。

2 个答案:

答案 0 :(得分:1)

尝试更改所有

var $name = 'SubmissionFavorite';

到:

public $name = 'SubmissionFavorite';

同时更改:var $uses = 'SubmissionFavorite';

至:public $uses = array ('SubmissionFavorite');

答案 1 :(得分:1)

首先,遵循蛋糕约定,您应该将模型命名为SubmissionsFavorite(注意Submission和Favorite之间的s)。这是因为您的表名由2个单词组成,甚至表示其他2个表之间的关系。

另外,你不能在AppController上做$ this-> Submission-> ...而不告诉蛋糕什么是“提交”。看一下这个链接,看看如何初始化Submission模型并在AppController上使用它:Can I use one model inside of a different model in CakePHP?

问候。