Dependent Dropdownlistrow

maaf ne master ane tanya masalah yg mungkin udah sering d tanyaen di google,

ane mau bikin dependent dropdownlist tp g berhasil, mohon bantuanya lg…

coding ane gini :

DEPARTEMENTController.php


public function actionTakemanager()

	{

		$sql = 	"SELECT EMP_NAME FROM EMPLOYEE".

				"WHERE EMP_JOB_ID = 4";

				

		$command = Yii::app()->createCommand($sql);

		$data = $command->execute();

		

		$data = CHtml::listData($data,'EMP_ID','EMP_NAME');

		foreach($data as $value=>$name)

		  {

			echo CHtml::tag('option',

			array('value'=>$value),CHtml::encode($name),true);

		  }


	}

di formnya :


<?php echo $form->dropDownListRow($model,'DEPT_MGR_ID',CHtml::listData(EMPLOYEE::model()->findAll(), 'EMP_ID','EMP_NAME'),array(

			'prompt'=>'----- Pilih Manager -----',

			'ajax' => array(

				'type'=> 'POST',

				'url' => CController::createUrl('takemanager'),

				'update' => '#EMP_ID'

			)

			

			

		)); ?>

jadi maksud ane di ata mau mengfilter dropdown sehingga yang tampil di dropdown itu cuma nama employee yang punya jabatan manager aja.

coding diatas ane dapet dari google, tp blm ada yg berhasil… mohon bantuanya master.

Gan, ane bingung kalo dependent dropdown di sini maksudnya gimana? Setau ane kalo dependent dropdown melibatkan 2 dropdown ato lebih, tapi di sini ane cuma liat 1 dropdown. Mohon pencerahannya.

Kalo cuma pake 1 dropdown ane pikir gak perlu pake ajax call lagi. Agan tinggal modifikasi query untuk dropdown-nya.


EMPLOYEE::model()->findAll('EMP_JOB_ID = 4')

oh iy gan maaf, mksd ane gitu :D

jd


EMPLOYEE::model()->findAll('EMP_JOB_ID = 4')

di tempatin dmn gan?


trus untuk yg dependent dropdownlist ane yg bermasalah ini gan, untuk ngambil data departement setelah milih kantor :

di controller ane gini :




public function actionLoaddepartments()

	{

		$data=DEPARTMENT::model()->findAll('DEPT_OFFICE_ID=:DEPT_OFFICE_ID',

		array('DEPT_OFFICE_ID'=>(int)$_POST['DEPT_OFFICE_ID']));

		

		$data=CHtlm::listData($data,'OFFICE_ID','OFFICE_NAME');

		

		echo "<option value=''>----- Pilih Departemen -----</option>";

		foreach($data as $value=>$OFFICE_NAME)

		echo CHtml::tag('option', array('value'=>$value), CHtml::encode($OFFICE_NAME), true);

	}

di _form.php nya gini


	<div class="row-fluid">

				<div class="span4">

					<?php echo $form->dropDownListRow($model,'EMP_OFFICE_ID',CHtml::listData(OFFICE::model()->findAll(), 'OFFICE_ID','OFFICE_NAME', array('prompt'=>'Pilih Kantor',

					'ajax'=>array(

					'type'=>'POST',

					'url'=>CController::createUrl('EMPLOYEEController/loaddepartments'),

					'update'=>'#DEPT_ID',

					)

				)); 

				

				?>

				</div>

				

				<div class="span4">

					<?php echo $form->dropDownListRow($model,'EMP_DEPT_ID',CHtml::listData(DEPARTMENT::model()->findAll(), 'DEPT_ID','DEPT_NAME'),array('prompt'=>'----- Pilih Departement -----'

					

					)); ?>

				</div>

</div>

Di form-nya. Seperti kode yang sudah di-posting agan di paling atas. Itu tinggal di-edit aja.

Bermasalahnya di mana gan? Ada pesan error, gak? Apakah ID dropdown untuk departemen itu memang benar ‘DEPT_ID’?


'update'=>'#DEPT_ID',

Ane sarankan bagian yang itu dicek dulu (bisa memanfaatkan fasilitas Inspect Element di web browser).

yg ini barusan ane coba di formnya ada errornya :

Missing argument 3 for CHtml::listData(), called in C:\xampp\htdocs\att\protected\views\dEPARTMENT\_form.php on line 19 and defined

trus ane modif gini

EMPLOYEE::model()->findAll(‘EMP_JOB_ID = 4’, ‘EMP_NAME’)

tp yg muncul bukan employee yg punya job_id 4, malah yg punya job_id yg lain… ap yg salah ya? ???

agan rei, yg ini dropdownlistnya itemnya dah keluar bner, tpkok ndak masuk ke db y??ap karena bukan primary key?

Field DEPT_MGR_ID udah ditambahkan ke fungsi rules() di model, gan? Bisa coba dicek dulu waktu submit form apakah atribut yang bersangkutan sudah terisi atau belum.

udah gan, malah ini tadi sempat ng’hapus tabel department n buat baru + relasi…

udah di otak-atik di bolak-balik query nya jg ndak masuk k db…

Boleh liat kode untuk controller dan model (khususnya fungsi rules()) yang berkaitan, gan? Sekali lagi ane sarankan sebaiknya agan cek nilai atribut DEPT_MGR_ID waktu submit form (dengan memanfaatkan fungsi var_dump() ato fasilitas debugging).

coba ambil gan nilai POST dari dropdownnya:

$model->EMP_DEPT_ID = $_POST[‘EMP_DEPT_ID’];

trus set manual jgn lupa cek juga pake isset biar mastiin emang nilainya gak kosong.

semoga ngebantu.

Ini gan,

DEPARTMENTController


<?php


class DEPARTMENTController extends Controller

{

	/**

	 * @var string the default layout for the views. Defaults to '//layouts/column2', meaning

	 * using two-column layout. See 'protected/views/layouts/column2.php'.

	 */

	public $layout='//layouts/column2';


	/**

	 * @return array action filters

	 */

	public function filters()

	{

		return array(

			'accessControl', // perform access control for CRUD operations

		);

	}


	/**

	 * Specifies the access control rules.

	 * This method is used by the 'accessControl' filter.

	 * @return array access control rules

	 */

	public function accessRules()

	{

		return array(

			array('allow',  // allow all users to perform 'index' and 'view' actions

				'actions'=>array('index','view', 'creat', 'update','delete','gii'),

				'users'=>array('*'),

			),

			/*array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('create','update'),

				'users'=>array('@'),

			),

			array('allow', // allow admin user to perform 'admin' and 'delete' actions

				'actions'=>array('admin','delete'),

				'users'=>array('admin'),

			),

			array('deny',  // deny all users

				'users'=>array('*'),

			),*/

		);

	}


	/**

	 * Displays a particular model.

	 * @param integer $id the ID of the model to be displayed

	 */

	public function actionView($id)

	{

		$this->render('view',array(

			'model'=>$this->loadModel($id),

		));

	}


	/**

	 * Creates a new model.

	 * If creation is successful, the browser will be redirected to the 'view' page.

	 */

	public function actionCreate()

	{

		$model=new DEPARTMENT;


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['DEPARTMENT']))

		{

			$model->attributes=$_POST['DEPARTMENT'];

			if($model->save())

				$this->redirect(array('view','id'=>$model->DEPT_ID));

		}


		$this->render('create',array(

			'model'=>$model,

		));

	}


	/**

	 * Updates a particular model.

	 * If update is successful, the browser will be redirected to the 'view' page.

	 * @param integer $id the ID of the model to be updated

	 */

	public function actionUpdate($id)

	{

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['DEPARTMENT']))

		{

			$model->attributes=$_POST['DEPARTMENT'];

			if($model->save())

				$this->redirect(array('view','id'=>$model->DEPT_ID));

		}


		$this->render('update',array(

			'model'=>$model,

		));

	}


	/**

	 * Deletes a particular model.

	 * If deletion is successful, the browser will be redirected to the 'admin' page.

	 * @param integer $id the ID of the model to be deleted

	 */

	public function actionDelete($id)

	{

		if(Yii::app()->request->isPostRequest)

		{

			// we only allow deletion via POST request

			$this->loadModel($id)->delete();


			// if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser

			if(!isset($_GET['ajax']))

				$this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('admin'));

		}

		else

			throw new CHttpException(400,'Invalid request. Please do not repeat this request again.');

	}


	/**

	 * Lists all models.

	 */

	public function actionIndex()

	{

		$dataProvider=new CActiveDataProvider('DEPARTMENT');

		$this->render('index',array(

			'dataProvider'=>$dataProvider,

		));

	}


	/**

	 * Manages all models.

	 */

	public function actionAdmin()

	{

		$model=new DEPARTMENT('search');

		$model->unsetAttributes();  // clear any default values

		if(isset($_GET['DEPARTMENT']))

			$model->attributes=$_GET['DEPARTMENT'];


		$this->render('admin',array(

			'model'=>$model,

		));

	}


	/**

	 * Returns the data model based on the primary key given in the GET variable.

	 * If the data model is not found, an HTTP exception will be raised.

	 * @param integer the ID of the model to be loaded

	 */

	public function loadModel($id)

	{

		$model=DEPARTMENT::model()->findByPk($id);

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}


	/**

	 * Performs the AJAX validation.

	 * @param CModel the model to be validated

	 */

	protected function performAjaxValidation($model)

	{

		if(isset($_POST['ajax']) && $_POST['ajax']==='department-form')

		{

			echo CActiveForm::validate($model);

			Yii::app()->end();

		}

	}

}



model DEPARTMENT


<?php


/**

 * This is the model class for table "DEPARTMENT".

 *

 * The followings are the available columns in table 'DEPARTMENT':

 * @property integer $DEPT_ID

 * @property string $DEPT_NAME

 * @property string $DEPT_MGR_ID

 * @property integer $DEPT_OFFICE_ID

 *

 * The followings are the available model relations:

 * @property EMPLOYEE $dEPTMGR

 * @property OFFICE $dEPTOFFICE

 * @property EMPLOYEE[] $eMPLOYEEs

 */

class DEPARTMENT extends CActiveRecord

{

	/**

	 * @return string the associated database table name

	 */

	public function tableName()

	{

		return 'DEPARTMENT';

	}


	/**

	 * @return array validation rules for model attributes.

	 */

	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

			array('DEPT_NAME, DEPT_OFFICE_ID', 'required'),

			array('DEPT_OFFICE_ID', 'numerical', 'integerOnly'=>true),

			array('DEPT_NAME', 'length', 'max'=>30),

			array('DEPT_MGR_ID', 'length', 'max'=>35),

			// The following rule is used by search().

			// @todo Please remove those attributes that should not be searched.

			array('DEPT_ID, DEPT_NAME, DEPT_MGR_ID, DEPT_OFFICE_ID', 'safe', 'on'=>'search'),

		);

	}


	/**

	 * @return array relational rules.

	 */

	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

			'dEPTMGR' => array(self::BELONGS_TO, 'EMPLOYEE', 'DEPT_MGR_ID'),

			'dEPTOFFICE' => array(self::BELONGS_TO, 'OFFICE', 'DEPT_OFFICE_ID'),

			'eMPLOYEEs' => array(self::HAS_MANY, 'EMPLOYEE', 'EMP_DEPT_ID'),

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'DEPT_ID' => 'ID Departemen',

			'DEPT_NAME' => 'Nama Departemen',

			'DEPT_MGR_ID' => 'Manager Departemen',

			'DEPT_OFFICE_ID' => 'Lokasi Kantor',

		);

	}


	/**

	 * Retrieves a list of models based on the current search/filter conditions.

	 *

	 * Typical usecase:

	 * - Initialize the model fields with values from filter form.

	 * - Execute this method to get CActiveDataProvider instance which will filter

	 * models according to data in model fields.

	 * - Pass data provider to CGridView, CListView or any similar widget.

	 *

	 * @return CActiveDataProvider the data provider that can return the models

	 * based on the search/filter conditions.

	 */

	public function search()

	{

		// @todo Please modify the following code to remove attributes that should not be searched.


		$criteria=new CDbCriteria;


		$criteria->compare('DEPT_ID',$this->DEPT_ID);

		$criteria->compare('DEPT_NAME',$this->DEPT_NAME,true);

		$criteria->compare('DEPT_MGR_ID',$this->DEPT_MGR_ID,true);

		$criteria->compare('DEPT_OFFICE_ID',$this->DEPT_OFFICE_ID);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}


	/**

	 * Returns the static model of the specified AR class.

	 * Please note that you should have this exact method in all your CActiveRecord descendants!

	 * @param string $className active record class name.

	 * @return DEPARTMENT the static model class

	 */

	public static function model($className=__CLASS__)

	{

		return parent::model($className);

	}

}

nah kemarin query nya yg di form juga sempat ane ubah yang asalnya ‘EMP_NAME’ ane ubah ke ‘EMP_ID’, tetep ndak masuk, tp waktu ane masuk update data nilainya di situ ada…


<?php echo $form->dropDownListRow($model,'DEPT_MGR_ID', CHtml::listData(EMPLOYEE::model()->findAll(),'EMP_JOB_ID = 4', 'EMP_NAME'), array('prompt'=>'-----Pilih Manager-----')); ?>

yg itu di taru’ controllernya y gan?

yup betul gan, kalo dari script agan di fungsi create tgl ditambah aja:

if(isset($_POST[‘DEPARTMENT’]) && isset($_POST[‘EMP_DEPT_ID’]))

{

&#036;model-&gt;attributes=&#036;_POST['DEPARTMENT'];


&#036;model-&gt;EMP_DEPT_ID = &#036;_POST['EMP_DEPT_ID'];


     if(&#036;model-&gt;save())


        &#036;this-&gt;redirect(array('view','id'=&gt;&#036;model-&gt;DEPT_ID));

}

Field DEPT_MGR_ID perlu ditambahin ke rules, gan.




public function rules()

{

   return array(

      array('DEPT_NAME, DEPT_OFFICE_ID, DEPT_MGR_ID', 'required'),

      ....

   );

}



Jujur ane ga tau extension bootstrap mana yang agan pake, tapi apa yang kode dropdown-nya itu yakin udah bener? Data manajernya sudah terfilter sebagaimana seharusnya?

yakin gan udah bener, beberapa dropdownlist ane jg sama kyk gtu, tp ndak ada masalah untuk submit data nya…

untuk datanya juga udah terfilter dengan benar…

klo yg ini :




public function rules()

{

   return array(

      array('DEPT_NAME, DEPT_OFFICE_ID, DEPT_MGR_ID', 'required'),

      ....

   );

}



berarti harus required donk nanti jadinya?

ane pake extention yg twitter bootstrap gan twitter bootstrap

Kalo gak mau jadi required ya tinggal pake safe, gan.




public function rules()

{

   return array(

      array('DEPT_MGR_ID', 'safe'),

      ....

   );

}



paling cobain kya kata agan rei aja, coba di cetak aja isi data $_POST nya gan, biar liat data managernya keisi apa kosong.

trus coba cek lagi relasi tablenya gan, kayanya kalo emang berelasi tapi data untuk foreign key nya kosong bakal ada info error gan.