Ajax-Validierung Im Modalen Fenster

Hallo,

bei mir soll der Benutzer "Transport" in dropDownList von "Section" auswählen, wenn er nichts Passendes findet, dann neu erstellen. Dabei will ich Ajax benutzen, und im modalen Fenster sollte Ajax-Validierung laufen.

Die Seite Yii 1.1: CJuiDialog and AjaxSubmitButton verspricht mir es zu erledigen.

Leider funktioniert der Code nicht

  • Es fehlte JS-Action-Yii-Bibliothek.

  • Er speichert doppelte Einträge in der DB jedes mal, als ich von der Eingabefeld zu einer anderen Eingabefeld wechsele.

  • Ajax-Validierung funktioniert nicht.

  • Wenn ich auf "Abschicken" klicke, wird das modale Fenster geschlossen (auch mit leeren Pflichtveldern).

  • Wenn ich alles ausfülle, und einer neuer Eintrag wird in der DB gespeichert, die Auswahlliste wird nicht mit Ajax aktualisiert.

Ich habe auch weitere Einleitungen (YII » How to use AJAX form validation ) angeschaut, leider erfolglos.

Mit


'enableClientValidation'=>true,

werden Warnungen ausgegeben, aber


<?php echo $form->errorSummary($model); ?>

wird immer leer.

Hier ist meiner Code.

protected/views/section/_create.php




...

	<div class="row">

		<?php echo $form->labelEx($model,'transport_id'); ?>

		<div id="transport">

			<?php echo $form->dropDownList($model,'transport_id',CHtml::listData(Transport::model()->my()->findAll(), 'id', 'name', 'type'),array('prompt'=>'Bitte wählen')); ?>

			<?php echo CHtml::ajaxLink(Yii::t('transport',CREATE_NEW),

			                           $this->createUrl('/transport/addnew'),

			                           array('onclick'=>'$("#transportDialog").dialog("open"); return false;',

			                                 'update'=>'#transportDialog'),array('id'=>'showTransportDialog'));?>

			<div id="transportDialog"></div>

		</div>

	</div>

...



protected/controllers/TransportController.php




...

	public function actionAddnew() {

		$model=new Transport;


		// Ajax Validation enabled

		$this->performAjaxValidation($model);


		// Es verchindert doppelte Einträge in der DB, und gespeichert wird nur, wenn man auf "Submit" klickt.

		if(!(array_key_exists('ajax', $_POST) AND

		     $_POST['ajax'] == 'transport_form') AND

		   isset($_POST['Transport'])) {


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

			$model->user_id=Yii::app()->user->id;


			if($model->save()) {

				//Return an <option> and select it

				echo CHtml::tag('option',array (

                                'value'=>$model->id,

                                'selected'=>true),

				     CHtml::encode($model->name),true);

				exit;

			}

		}


		// JS-Bibliotheken nachladen

		Yii::app()->clientScript->scriptMap['jquery.js'] = false;

		Yii::app()->clientScript->scriptMap['jquery.min.js'] = false;


		$this->renderPartial('createDialog',array('model'=>$model),false,true);

	}

...



protected/views/transport/createDialog.php




<?php

$this->beginWidget('zii.widgets.jui.CJuiDialog',

                   array(

                   		'id'=>'transportDialog',

                   		'options'=>array(

                   			'title'=>Yii::t('Transport',TRANSPORT.' '.CREATE_NEW),

                   			'autoOpen'=>TRUE,

                   			'modal'=>'true',

                   			'width'=>'auto',

                   			'height'=>'auto',

)));

?>


<div class="form span-14" id="transportDialogForm">


<?php $form=$this->beginWidget('CActiveForm', array(

    'id'=>'transport_form',

    'enableAjaxValidation'=>true,

//	'enableClientValidation'=>true,

)); 

//I have enableAjaxValidation set to true so i can validate on the fly the

?>

	<p class="note">Fields with <span class="required">*</span> are required.</p>


	<?php echo $form->errorSummary($model); ?>


<?php

if (isset($charging->section_id)) {

	echo $form->hiddenField($model,'section_id',array('value'=>$charging->section_id));

} ?>


	<div class="row">

		<?php echo $form->labelEx($model,'type'); ?>

		<?php echo $form->dropDownList($model,'type',$model->getTypeOfTransportsAsArray(), array('prompt' => 'Bitte wählen')); ?>

		<?php echo $form->error($model,'type'); ?>

		<div id="Transport_type" class="errorMessage" style="display:none"></div>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'type_of_fuel'); ?>

			<span id="row_Transport_type_of_fuel">

<?php

		echo '				Wählen Sie bitte zuerst das Verkehrsmitteltyp.<br /><br />';

?>

			</span>

		<?php echo $form->error($model,'type_of_fuel'); ?>

		<div id="Transport_type_of_fuel" class="errorMessage" style="display:none"></div>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'name'); ?>

		<?php echo $form->textField($model,'name',array('size'=>30,'maxlength'=>250)); ?>

		<?php echo $form->error($model,'name'); ?>

		<div id="Transport_name" class="errorMessage" style="display:none"></div>

	</div>


	<div class="row">

		<?php echo $form->labelEx($model,'licence_number'); ?>

		<?php echo $form->textField($model,'licence_number',array('size'=>30,'maxlength'=>250)); ?>

		<?php echo $form->error($model,'licence_number'); ?>

	</div>


	<div class="row">

		<div class="span-9">

			<?php echo $form->labelEx($model,'fuel_consumption'); ?>

			<?php echo $form->textField($model,'fuel_consumption',array('size'=>30,'maxlength'=>255)); ?>

			<span id="fuel_unit_ajax"><?php echo $model->fuel_unit; ?></span>

			<?php echo $form->error($model,'fuel_consumption'); ?>

		</div>

		<div class="span-5 last">

			<?php echo $form->labelEx($model,'distance'); ?>

			<?php echo $form->textField($model,'distance',array('size'=>6,'maxlength'=>255)); ?>

			<?php echo $form->error($model,'distance'); ?>

		</div>

	</div>


	<div class="row buttons">

		<?php echo CHtml::ajaxSubmitButton(Yii::t('transport',CREATE_NEW),CHtml::normalizeUrl(array('transport/addnew','render'=>false)),array('success'=>'js: function(data) {

						if(data.status=="success"){

	                        $("#transport_id").append(data);

    	                    $("#transportDialog").dialog("close");

						}

                    }'),array('id'=>'closeTransportDialog')); ?>

	</div>


<?php $this->endWidget(); ?>


</div>


<?php $this->endWidget('zii.widgets.jui.CJuiDialog');?>



“$form->dropDownList($model,‘type_of_fuel’” wird später mi JS nachgeladen.

  1. Hat schon jemand eine alternative Lösung?

2.a. Wie kann ich Ajax-Validierung zum laufen kriegen?

2.b. Wie kann ich div#transport in protected/controllers/TransportController.php mit diesem modalen Fenster aktualisieren?

P.S. Ich verwende Yii 1.1.15.