در فریمورک Yii یکی از فیلدهایی که در فرم ها استفاده می شود، فیلد DropDownList هست که در خروجی تگ های HTML کد مربوط به قسمت <select> را به همراه <option> های مربوط به آن را تولید می کند.
حتما برای شما هم پیش آمده که بخواهید هنگام استفاده از این نوع لیست ها، با تغییر مقدار آن، اطلاعاتی در قسمتی از صفحه بدون اینکه کل صفحه به سرور ارسال شود، به صورت AJAX، تغییر کند یا به روز شوند. مثال معروف برای این مطلب این است که مثلا شما یک لیست از نام استان ها دارید، و می خواهید هنگامی که کاربر استان مورد نظر خودش را انتخاب می کند در لیست بعدی آن شهرهای مربوط به آن استان فهرست شوند تا وی بتواند شهر خود را از داخل آن انتخاب کند.
یا کاربر با انتخاب یک گزینه در لیست، در کادر مقابل آن یک سری اطلاعات تغییر کرده و به وی نمایش داده شوند.
اجازه بدید تا این نوشته را با مثال انتخاب استان، تغییر لیست شهرها بیشتر و کاربردی توضیح بدیم.
همانطور که در بالا هم بیان شد، یک لیست کشویی داریم حاوی نام استان ها به همراه ID آن ها که با انتخاب یک گزینه آن از طرف کاربر، در لیست بعدی شهرهای مربوط به آن استان به صورت Ajax فهرست می شوند.کد مربوط به لیست نام استان ها به این صورت نوشته می شود:
echo $form->dropDownList($model, 'state_id', array(1 => 'Tehran', 2 => 'Tabriz', 3 => 'Kh Razavi'), array( 'ajax' => array( 'type' => 'POST', //request type 'url' => Yii::app()->createUrl('currentController/dynamiccities'), //url to call. 'update' => '#city_id', //selector to update 'data'=>array('state_id'=>'js:this.value'), )));
و در پایین آن هم لیست مربوط به شهرها وجود دارد که البته خالی است:
//empty since it will be filled by the other dropdown echo $form->dropDownList($model,'city_id',array());
حالا برای پر کردن لیست شهرها بر اساس ID استان انتخاب شده، زمانی که لیست استان ها تغییر کند، ID استان انتخاب شده توسط AJAX به کنترلر مربوطه آن ارسال شده و نام شهرهای آن استان توسط آن کنترلر از دیتابیس گرفته شده و به از طریق AJAX به این صفحه باز گردانده شده و در لیست مربطو به شهرها قرار داده می شوند.
کد مربوط به اکشن کنترلر مربوطه:
public function actionDynamiccities() { $data=Location::model()->findAll('state_id=:state_id', array(':state_id'=>(int) $_POST['state_id'])); $data=CHtml::listData($data,'id','name'); foreach($data as $value=>$name) { echo CHtml::tag('option', array('value'=>$value),CHtml::encode($name),true); } }
خوب همه چیز آماده است. فقط بعد از اجرا آن ممکن است با خطای ۴۰۴ مواجه شوید و آن هم به دلیل کنترل های امنیتی Yii برای کنترلرهایش می باشد. برای برطرف شدن این مشکل، کافی است در کنترلر مربوطه، در متد accessRules
نام اکشن بالا را به رکورد مربوطه همانند زیر اضافه کنید تا دسترسی لازم به آن اکشن اعمال شود:
array('allow', // allow authenticated user to perform 'create' and 'update' actions 'actions'=>array('create','update','dynamiccities'), 'users'=>array('@'), ),
خوب این تمام کاری بود که باید انجام می شد. دقت داشته باشید برای انتخاب فیلدی که قراره بسته به تغییر اطلاعات لیستی به صورت AJAX تغییر کند، همان طور که در مثال بالا هم مشاهده کردید، باید id آن در html به عنوان مقدار به کلید update در آرایه فیلد DropDownList داده شود.
The post ایجاد لیست های وابسته به هم در Yii appeared first on دست نوشته های یک تازه کار.