Я пытался использовать виджет, который позволяет мне делать зависимые выпадающие списки без необходимости писать какой-либо javascript самостоятельно, но что-то не работает, и я уверен, что это как-то связано с URL.
My Controller Action
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;
}
Выпадающий родительский вид My View
<?=
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
],
])
?>
Второе выпадающее меню My View
<?=
$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 и практического шаблона yii2, который можно найти на github, но результат тот же.
С таким URL просто выдает ошибку 404.
Когда я добавляю префикс «? R =» к параметру url, на самом деле кажется, что он находит действие контроллера, но на самом деле это не так, потому что я попытался использовать имя другого контроллера, который не существует, и не было выдано никакой ошибки.
И, кстати, я использую пространства имен расширений или моделей, которые мне нужно использовать в верхней части файлов, где мне нужно их использовать.
Обновление (03.11.2014)
Проблема с именами действий в случае верблюда рассматривается как обратная совместимость проблема в течение yii2.
Когда вы определяете действие контроллера с именем actionSayHelloWorld
Вы можете вызывать его только в URL с идентификатором: <conroller name>/say-hello-world
,
====================================
Я испытываю некоторые проблемы с именем, вызывающим действия контроллера самостоятельно.
Когда мой контроллер Person
имеет действие actionGreetHelloWord
Я не могу вызвать его из URL, это всегда приведет к 404. Однако, когда я изменяю имя действия на actionGreethelloworld
Я могу назвать это с помощью URL person/greethelloworld
(все строчные, включая g приветствия).
Поэтому я думаю, что ваша проблема будет решена, когда вы измените имя действия на Getmunicipioslist
и создайте URL с / as:
'url'=>Url::to('region-estados/getmunicipioslist'),
или же
'url'=>\yii::$app->getUrlManager()->createUrl('region-estados/getmunicipioslist'),
Чтобы избежать большой работы, вы можете сначала изменить имя действия в вашем контроллере и ввести URL (.../region-estados/getmunicipioslist'
) для контроллера и действия в адресной строке и, если это работает, внесите изменения в ваше представление.
Я не знаю, может ли yii по умолчанию найти контроллеры с -
в его названии.
хорошо я понял, что Yii2 проверит это так:
actionGetMunicipiosList => get-municipios-list
Надеюсь, поможет 😉
Итак, вы действительно были на что-то здесь. Я собирался отказаться от Yii2 … У меня все еще есть сомнения по этому поводу, но я думаю, что буду использовать его, если мне когда-нибудь понадобится.
Я изменил название действия контроллера на
Getmunicipioslist
и называть это как Url::to(['region-estados/getmunicipioslist'])
Тем не менее, я не думаю, что имеет смысл не позволять людям придумывать имена функций, мы делаем это по какой-то причине, это делает наш код более читабельным для других и для нас самих, но не для этого.
Благодарю.