CasCade Dropdown in Yii2 with DepDrop widget

CasCade Dropdown in Yii2 with DepDrop widget

DepDrop widget Yii2

با استفاده از این پلاگین شما می توانید dropdown های ,وابسته به هم و در چند سطح داشته باشید .

مثال پر کاربرد آن استفاده از آن در فورم های ثبت نام برای دریافت محل زندگی افراد می باشد.به صورت casCade یا همان آبشاری .
به این صورت که کاربر ابتدا کشور خود را انتخاب می کند
سپس بر اساس گزینه انتخابی استان های آن کشور در دراپ دانی دیگر نمایش داده می شود
پس از تعیین استان بر اساس استان انتخابی شهر های آن در دراپ دان دیگر نمایش داده می شود.

برای نصب DepDrop widget Yii2 :
روش اول:

اجرا کد زیر در مسیر کامپوزر :

$ composer require kartik-v/yii2-widget-depdrop "@dev"

یا

$ php composer.phar require kartik-v/yii2-widget-depdrop "@dev"

روش دوم :
قرار دادن کد زیر در فایل composer.json و سپس اجرای دستور composer update در کامپوزر:

"kartik-v/yii2-widget-depdrop": "@dev"

کد بالا در composer.json قسمت require قرار میگیرد.
مانند کد زیر :

"require": {
"php": ">=5.4.0",
"yiisoft/yii2": ">=2.0.4",
"yiisoft/yii2-bootstrap": "*",
"yiisoft/yii2-swiftmailer": "*",
"mohammad-mahdy/yii2-jdate": "*",
"yiisoft/yii2-jui": "^2.0",
"kartik-v/yii2-widget-depdrop": "@dev"
},

و سپس در کامپوزر :

composer update

CasCade Dropdown in Yii2 with DepDrop widget
پس از نصب ویجت برای استفاده در فورم خود به صورت زیر عمل می کنیم:
نکته:هدف ما این است که دسته بندی هایی که parent_id آنها null هست را در دراپ دان آول
سپس دسته بندی های گزینه انتخاب شده را در دراپ دان دوم
و در آخر دسته بندی های گزینه ی انتخابی آخر را نمایش دهیم.

ابتدا ویجت را صدا می زنیم :
روش اول : اگر kartik yii2-widgets را قبلا نصب نکرده اید به صورت زیر :

use kartik\depdrop\DepDrop ;

در صورتی که از kartik yii2-widgets استفاده کرده اید به صورت زیر صدا بزنید:

use kartik\widgets\DepDrop;

سپس لیست دسته بندی هایی که parent_id آنها null هست را در قالب آرایه در دراپ دان اول قرار می دهیم:

<?php use yii\helpers\ArrayHelper; $depdrop= app\models\BuyCat::find()->where('parent_id is NULL')->All();
$depdrop = ArrayHelper::map($depdrop, 'id', 'title');

echo $form->field($model, 'cat_id[0]')->dropDownList($depdrop, ['id' => 'cat-id']);
?>

هنگامی که کاربر دراپ دان اول را انتخاب نماید id آن که در این جا cat-id هست
از طریق url ای که در دراپ دان دوم قرار دادیم به یک اکشن از کنترلر ما ارسال می شود.
تصویر زیر نتیجه ی مرحله اول کار ما می باشد:

CasCade Dropdown in Yii2 with DepDrop widget
CasCade Dropdown in Yii2 with DepDrop widget

در مرحله بعد DropDown دوم را قرار می دهیم:

echo $form->field($model, 'cat_id[1]')->widget(DepDrop::classname(), [
'options' => ['id' => 'subcat-id'],
'pluginOptions' => [
'depends' => ['cat-id'],
'placeholder' => 'Select...',
'url' => Url::to(['/site/subcat'])
]
]);

در کد بالا با استفاده از depends گزینه انتخابی دراپ دوم دریافت می شود:با id آن که cat-id می باشد
با استفاده از url به اکشن subcat در کنتلر site ارسال می شود.
توجه داشته باشید که با استفاده از id دراپ دان دوم subcat-id گزینه ی انتخابی این دراپ دان به دراپ دان سوم می رود.

CasCade Dropdown in Yii2 with DepDrop widget
اکنون در اکشن subcat کد زیر را قرار می دهیم.
که بر اساس گزینه ی ارسال شده لیست دسته بندی های آن را در قالب یک آرایه به صورت json باز می گرداند

use yii\helpers\Json;
public function actionSubcat() {
$out = [];
if (isset($_POST['depdrop_parents'])) {
$parents = $_POST['depdrop_parents'];
if ($parents != null) {
$cat_id = $parents[0];
$out = [];
$d = "";
$all = \app\models\BuyCat::find()->where(["parent_id" => $cat_id])->all();
foreach ($all as $key => $value) {
$out[] = [
'id' => $value->id, 'name' => $value->title
];
if ($key == 0) {
$d = $value->id;
}
}
echo Json::encode(['output' => $out, 'selected' => $d]);
return;
}
}
echo Json::encode(['output' => '', 'selected' => '']);
}
CasCade Dropdown in Yii2 with DepDrop widget
CasCade Dropdown in Yii2 with DepDrop widget

اینکار را برای دراپ دان سوم نیز انجام می دهیم .

ابتدا در فورم دراپ دان سوم را قرار می دهیم:

echo $form->field($model, 'cat_id[2]')->widget(DepDrop::classname(), [
'options' => ['id' => 'subcat-id2'],
'pluginOptions' => [
'depends' => ['subcat-id'],
'placeholder' => 'Select...',
'url' => Url::to(['/site/prod'])
]
]);

سپس در کنترلر اکشن prod که در دراپ دان سوم اشاره شده است را در کنترلر قرار می دهیم

public function actionProd() {
$out = [];
if (isset($_POST['depdrop_parents'])) {
$ids = $_POST['depdrop_parents'];
$cat_id = empty($ids[0]) ? null : $ids[0];
$subcat_id = empty($ids[1]) ? null : $ids[1];
if ($cat_id != null) {
$all = \app\models\BuyCat::find()->where(["parent_id" => $cat_id,])->all();
$out = [];
foreach ($all as $key => $value) {
$out[] = [
'id' => $value->id, 'name' => $value->title
];
}
echo Json::encode(['output' => $out, 'selected' => ""]);
return;
}
}
echo Json::encode(['output' => '', 'selected' => '']);
}

و در نهایت تصویر زیر :

CasCade Dropdown in Yii2 with DepDrop widget
CasCade Dropdown in Yii2 with DepDrop widget

برای آشنایی بیشتر با این ویجت و مشاهده ی مثال های دیگر به لینک زیر مراجعه کنید :
DepDrop Widget

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *