Yii2 Ajax请求不起作用

时间:2014-11-01 03:19:09

标签: php ajax http-status-code-404 yii2

我一直在尝试使用一个小部件,它允许我做依赖下拉列表而不必自己编写任何javascript,但有些东西不起作用,我很确定它与url有关。

我的控制器操作

public function actionGetMunicipiosList() {
    $out = [];
    if (isset($_POST['depdrop_parents'])) {
        $parents = $_POST['depdrop_parents'];
        if ($parents != null) {
            $cat_id = $parents[0];
            $out = RegionMunicipios::getMunicipioList($cat_id);
            echo Json::encode(['output'=>$out, 'selected'=>'']);
            return;
        }
    }
    echo Json::encode(['output'=>'', 'selected'=>'']);
}

我从另一个模特打电话的功能

public function getMunicipioList($cat_id){
    $muni = RegionMunicipios::find()->where(['estados_id' => $cat_id])->asArray()->all();
    $data = \yii\helpers\ArrayHelper::map($muni, 'id', 'descripcion');
    /*foreach ($muni as $i => $m) {
        $data[] = ['id' => $m['id'], 'name' => $m['descripcion']];
    }*/
    return $data;
}

我的观点的家长下拉

<?= 
    Select2::widget([
        'model' => $model,
        'attribute' => 'estados_id',
        'data' => ArrayHelper::map(RegionEstados::find()->all(),'id','descripcion'),
        'options' => [
            'placeholder' => 'Seleccione', 
            'id'=>'regionparroquias-estados_id'
        ],
        'pluginOptions' => [
            'allowClear' => true
        ],
    ])
?>

我的观点第二次下拉

<?= 
$form->field($model, 'municipios_id')->widget(DepDrop::classname(), [
    'type'=>DepDrop::TYPE_SELECT2,
    #'data'=>ArrayHelper::map(RegionMunicipios::find()->where(['estados_id' => $model->estados->id])->all(),'id','descripcion'),
    'options'=>[
        'id'=>'regionparroquias-municipios_id', 
        'placeholder'=>'Seleccione'
    ],
    'pluginOptions'=>[
        'depends'=>[Html::getInputId($model, 'estados_id')],
            'url'=>Url::to(['?r=region-estados/GetMunicipiosList']),
            'loadingText'=>'Cargando...',
            'initialize'=>($model->isNewRecord) ? false : true,
        ]
    ]
);
?>

我试过用yii2 basic和可以在github上找到的yii2实用样板来做到这一点,但结果是一样的。 使用这样的URL只会抛出错误404。 当我将前缀'?r ='附加到url参数时,它实际上似乎找到了控制器操作,但它确实没有,因为我尝试使用另一个不存在的控制器的名称并且没有抛出错误。

顺便说一下,我正在使用我需要在我需要使用它们的文件顶部使用的扩展或模型的命名空间。

3 个答案:

答案 0 :(得分:2)

更新(2014年11月3日)

驼峰案例动作名称的问题被视为向后兼容性issue within yii2。 当您定义名为actionSayHelloWorld的控制器操作时,您只能在具有超额ID的网址中调用它:<conroller name>/say-hello-world

====================================

我遇到了一些问题,我自己调用控制器操作。 当我的控制器Person有操作actionGreetHelloWord时,我无法从网址中调用它,它将始终生成404.但是,当我将操作名称更改为actionGreethelloworld时,我可以将其命名为用person/greethelloworld形成网址(全部小写,包括问候语)。

因此,当您将操作名称更改为Getmunicipioslist并使用/ as创建网址时,我认为您的问题将得到解决:

'url'=>Url::to('region-estados/getmunicipioslist'), 要么 'url'=>\yii::$app->getUrlManager()->createUrl('region-estados/getmunicipioslist'),

为了避免太多工作,您可以先在控制器中更改操作名称,然后在地址栏中键入控制器和操作的URL(.../region-estados/getmunicipioslist'),如果可以,请在视图中进行更改

我不知道yii默认情况下是否可以找到名称中带有-的控制器。

答案 1 :(得分:1)

我发现Yii2会像这样验证它:

actionGetMunicipiosList =&gt; get-municipios-list

希望它有所帮助;)

答案 2 :(得分:0)

好的,所以你真的在这里做点什么。我正要放弃Yii2 ......我仍然怀疑它,但我想如果我需要的话我会用它。

我将控制器操作的名称更改为 Getmunicipioslist

并将其称为Url::to(['region-estados/getmunicipioslist'])

我仍然认为不让人们使用函数名称是有意义的,我们这样做是有原因的,它使我们的代码更易于被其他人和我们自己阅读,无论如何。

感谢。