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.
- 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.