Yii - 使用单一方法进行AJAX更新/创建

时间:2012-12-10 04:24:07

标签: php ajax yii overloading

我已经设置了这种通过AJAX更新模型的方法,并试图通过创建一个新模型来扩展它,如果它不存在的话。

public function actionAjaxUpdate($id = null)
{
    if($id === null)
        $model = new MyObject;
    else
        $model = $this->loadModel($id);

    if(isset($_POST['MyObject']))
    {
        $model->attributes = $_POST['MyObject'];
        $model->save();
    }
}

通过AJAX更新时发送的示例网址,最后的数字是型号ID:

/admin/myObject/ajaxUpdate/1
/admin/myObject/ajaxUpdate/2
/admin/myObject/ajaxUpdate/3
...

这里的问题是,虽然在提供ID时更新工作正常,但创建新模型不起作用。由于新项目的ID尚不存在,因此URL路由将返回404:

  

在此未找到请求的URL / cmsadmin / myObject / ajaxUpdate   服务器

解决这个问题的好方法是什么?

我尝试重载不带$id参数的相同方法,但PHP不支持重载,如本主题所述:Method overloading in a model of Yii framework

如果需要任何其他信息,请发表评论。

====其他信息====

main.php

<?php
$backend = dirname(dirname(__FILE__));
$frontend = dirname($backend);
Yii::setPathOfAlias('admin', $backend);

return array(
    'basePath' => $frontend,
    'controllerPath' => $backend . '/controllers',
    'viewPath' => $backend . '/views',
    'runtimePath' => $backend . '/runtime',

    'components' => array(
        'urlManager' => array(
            'urlFormat' => 'path',
            'showScriptName' => false,
            'caseSensitive' => false,
            'appendParams' => true,
            'rules' => array(
                'admin/<controller:\w+>/<action:\w+>/<id:\d+>'=>'/<controller>/<action>',
                'admin/<controller:\w+>/<action:\w+>'=>'/<controller>/<action>',
...

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,但我通过id=0插入了id=1进行更新。确保id字段设置为自动递增,因此不需要。

现在检查id是否为1然后插入else更新记录。

答案 1 :(得分:1)

你可以像Boniface建议的那样做,传递0作为id,但你必须将你的功能改为

if($id == 0)

这样,如果你传递0作为id,它将检测到并创建一个新对象。

或者你可以传递任何东西(或0)并只使用

if(!$id) {
    $model = new MyObject;