public static function getParentGroup()
{
return ArrayHelper::map(self::find()->where(['parent_id' => null])->all(), 'id', 'name');
}
<?= $form->field($model, 'group')->dropDownList(Catalog::getParentGroup(),
[
'prompt' => 'Выбрать группу...',
'onchange' => '
$.post(
"'.Url::toRoute('/products/create').'",
{id : $(this).val()},
function(data){
$("select#podgroup").html(data).attr("disabled", false)})'
]) ?>
class AjaxController extends Controller
{
public function actionAjaxCatalog()
{
if(Yii::$app->request->isAjax){
$id = Yii::$app->request->post('id');
$subcategories = ArrayHelper::map(Caralog::find()->select(['name', 'id'])->where('parent_id=:id', [':id' => $id])->all(), 'id', 'name');
return $subcategories;
}
return false;
}
}
<?= $form->field($model, 'group')->dropDownList(Catalog::getParentGroup(),
[
'prompt' => 'Выбрать группу...',
'onchange' => '
$.post(
"'.Url::toRoute('/ajax/ajax-catalog').'",
{id : $(this).val()},
function(data){
$("select#podgroup").html(data).attr("disabled", false)})'
]) ?>
<?= $form->field($model, 'podgroup')->dropDownList($model->isNewRecord ? [] : Catalog::getSubGroup($model->parent_id),
[
'prompt' => 'Выбрать подгруппу...',
'disabled' => $model->isNewRecord ? "disabled" : false
'onchange' => '
$.post(
"'.Url::toRoute('/ajax/ajax-catalog').'",
{id : $(this).val()},
function(data){
$("select#name").html(data).attr("disabled", false)})'
]) ?>
<?= $form->field($model, 'name')->dropDownList($model->isNewRecord ? [] : Catalog::getSubGroup($model->parent_id),
[
'prompt' => 'Выбрать подгруппу...',
'id' => '$products',
'disabled' => $model->isNewRecord ? 'disabled' : false
]) ?>
dropDownList($model->isNewRecord ? [] : Catalog::getSubGroup($model->parent_id)
public function actionCreate($id = 0) // этот id не нужен, Вы ничего не предаёте через $_GET
{
$model = new Product();
$id = (int)Yii::$app->request->post('id');
// куча массивов не нужна
$products = [];
$categories = [];
$subcategories = [];
// эти запросы можно вынести в отдельные методы модели Catalog
// этим запросам не место в контролере ProductController
// действие actionCreate() должно создавать только продукт и ничего не должно получать.
$catalog = Catalog::find()->all() // запрос № 1;
$categories = ArrayHelper::index (Catalog::find() // этот запрос № 2 лишний
->where(['.parent_id' => "NULL"]) // в таблице есть поле с именем .parent_id? Это ошибка, поэтому и не работает
->all(), 'id');
if(array_key_exists($id, $categories))
{
$subcategories = ArrayHelper::index (Catalog::find() // этот запрос № 3 лишний
->where(['.parent_id' => $id]) // в таблице есть поле с именем .parent_id? Это ошибка, поэтому и не работает
->all(), 'id');
}
if(array_key_exists($id, $subcategories))
{
$products = ArrayHelper::index (Catalog::find() // этот запрос № 4 лишний
->where(['.parent_id' => $id]) // в таблице есть поле с именем .parent_id? Это ошибка, поэтому и не работает
->all(), 'id');
}
if ($model->load(Yii::$app->request->post()) && $model->save())
{
return $this->redirect(['index', 'id' => $model->id]);
}
return $this->render('index', [
'products' => $products, // это не нужно
'categories' => $categories, // это не нужно
'subcategories' => $subcategories, // это не нужно
'products' => $products, // это не нужно
'items' => $model, // это не нужно
'id' => $model->id, // это не нужно
'org' => Organization::getOrgListByUserId(Yii::$app->user->id)
]);
}
public function actionCreate()
{
$product = new Product();
if ($product->load(Yii::$app->request->post()) && $product->save())
{
return $this->redirect(['index', 'id' => $product->id]);
}
return $this->render('index', [
'product' => $product
'org' => Organization::getOrgListByUserId(Yii::$app->user->id) // в это не вникал, но думаю, что надо тоже вынести в отдельный метод, скорей всего в модели User или подставлять в форме напрямую
]);
}
Мне например не понятно из вашего примера
я так понимаю выделяется идентификатор выбранного значения для дальнейшей передачи в action
но мне не совсем понятна строка
$("select#regions").html(data).attr("disabled", false)
/* отслеживаем изменения в выпадающем списке с id countries */
$("#countries").on("change", function(){
var ID = $(this).val() /* получаем выбранное значение */
$.ajax({
url: 'patch/to/php/file', /* отправляем на сервер через ajax */
type: 'POST' /* методом $_POST */
data: {id: ID}, /* выбранное значение */
/* обрабатываем ответ сервера, в responce html код, который содержит <option> c нужными значениями */
success: function(responce){
/* подставляем в выпадающий список с id regions полученный от сервера html и меняем атрибут disabled c true на false, то есть, включаем выпадающий список */
$("#regions").html(responce).attr("disabled", false)
}
})
})
public function actionListRegions()
{
if(Yii::$app->request->isAjax) // проверяем, что данные пришли через ajax
{
$id = (int)Yii::$app->request->post('id'); // получаем из массива $_POST полученный id countries
// получаем из базы данных нужные regions на основе id countries со статусом "активен", сортируем по алфавиту
$regions = Regions::find()
->where('status=:status',[':status' => Regions::STATUS_ACTIVE])
->andWhere('country_id=:id', [':id' => $id])
->orderBy('name_ru')
->all();
// формируем первый option со значением по умолчанию
$this->option = '<option value="0">Выберите регион...</option>';
// перебираем в цикле все записи и добавляем к первому option
foreach($regions as $region){
$this->option .= '<option value="'.$region->id.'">'.$region->name_ru.'</option>';
}
}
// возвращаем ответ клиенту, этот ответ попадает в success: function(responce)
return $this->option;
}
<select name="countries" id="countries" onchange="function(){/* тут jquery из примера выше */}"
<select name="regions" id="regions" disabled="disabled">
onchange="function(){/* тут jquery из примера выше */}"
$form->field($model, 'countries_id')->dropDown(
$items,
// options[] для передачи дополнительных параметров для select
[
'onchange' => 'function(){ ..... }'
]
)
The tag options in terms of name-value pairs.
For the list of available options please refer to the $options parameter of yii\helpers\Html::activeDropDownList().
If you set a custom id for the input element, you may need to adjust the $selectors accordingly.
name => value
[
// name => value
'id' => 'selector'
// name => value
'onclick' => 'function(){ ....}',
// name => value
'onchange' => 'function(){ ... }',
// name => value
'onclick' => 'alert("click!!!")'
]
<select id="countries-id" class="form-control" name="Countries[id]" onchange="
$.post(
"/zahoron/admin/ajax/list-regions",
{id : $(this).val()},
function(data){
$("select#regions").html(data).attr("disabled", false)
}
)
">
<option value="">Выбрать страну...</option>
<option value="2">Россия</option>
<option value="3">Украина</option>
<option value="4">Китай</option>
</select>
error_reporting(E_ALL);
Без фамильярностей!!!