-2

我已经设置了这种通过 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 更新时发送的示例 URL,末尾的数字是模型 ID:

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

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

在此服务器上找不到请求的 URL /cmsadmin/myObject/ajaxUpdate。

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

我尝试过不带$id参数重载相同的方法,但 PHP 不支持重载,如本线程所述:Yii 框架模型中的方法重载

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

==== 附加信息 ====

主文件

<?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>',
...
4

2 回答 2

2

我有同样的问题,但我通过了id=0插入和id=1更新。确保 id 字段设置为自动递增,因此它不是必需的。

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

于 2012-12-10T04:29:16.783 回答
1

您可以像 Boniface 建议的那样,将 0 作为 id 传递,但您必须将函数更改为

if($id == 0)

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

或者您可以不传递任何内容(或 0)而只使用

if(!$id) {
    $model = new MyObject;
于 2012-12-10T04:37:31.463 回答