ciao a tutti,
dopo aver fatto un form, vorrei valicate i campi.
Ho messo un campo obbligatorio, e se cerco di fare il Submit “classico”, mi rileva l’errore perché è vuoto.
Se invece faccio con Ajax, non mi rileva l’errore.
Per effettuare una validazione con Ajax, devo fare delle regole "speciali" ? Per il resto mi salva tutto a dovere ajax, quindi è implementato correttamente
Grazie
questo è l inizio della view dove cè la form
<?php
$form = $this->beginWidget('CActiveForm', array(
'id' => 'profilo-form',
'enableAjaxValidation' => true, //ATTIVO AJAX
'enableClientValidation' => true, //ATTIVO LA VALIDAZIONE CLIENT
'focus' => array($model, 'nome'), //DOVE SI POSIZIONA IL CURSORE
//'clientOptions'=>array('validateOnSubmit'=>TRUE),
));
?>
<div class="row">
<?php echo $form->labelEx($model, 'nome'); ?>
<?php echo $form->textField($model, 'nome'); ?>
<?php echo $form->error($model, 'nome'); ?>
</div>
<?php
echo CHtml::ajaxSubmitButton(
'Submit request', array('welcome/ajax'), array(
//'type' =>'POST',
'update' => '#myDiv',
'type' => 'POST',
'beforeSend' => 'function(){
$("#myDiv").addClass("loading");}',
'complete' => 'function(){
$("#myDiv").removeClass("loading");}',
)
);
?>
nel controller
protected function performAjaxValidation($model) {
// echo "OK ".$_POST['ajax']."<br/>";
// echo "OK ".$_POST['ajax']."<br/>";
if (isset($_POST['ajax']) && $_POST['ajax'] === 'profilo-form') {
echo CActiveForm::validate($model);
Yii::app()->end();
}else{
echo "NO";
}
}
public function actionAjax() {
echo "salvo";
$model = new Profilo;
$model->tbl_users_id = Yii::app()->user->id;
$this->performAjaxValidation($model);
// uncomment the following code to enable ajax-based validation
if (isset($_POST['Profilo'])) {
$model->attributes = $_POST['Profilo'];
//echo "===>".$model->save();
if ($this->salvo_db($model, $this->check_esistenza_utente())) {
echo"Salvato nel DB";
//$this->redirect('profilo');
}
}
}
e nel model come regola ho:
array('nome','required'),
così facendo mi arriva sempre all’echo Salvato nel DB. anche se lascio bianco nome
sembra che non mi entri mai in
if (isset($_POST['ajax']) && $_POST['ajax'] === 'profilo-form') {
mdomba
(Maurizio Domba Cerin)
January 25, 2012, 9:41am
4
sara perche usi il ajaxSubmitButton… io non lo mai usato nei form…
Per vedere che dati manda il ajax request e epr vedere cosa viene restituito dal ajax request devi usare un programa come firebug
grazie, se faccio
echo CActiveForm::validate($model);
mi stampa correttamente l’errore Nome cannot be blank.
sto usando Firebug, e quando faccio Submit mi restituisce 302 Found
mdomba
(Maurizio Domba Cerin)
January 25, 2012, 9:50am
6
In firebug… guarda la console view… e li che puoi vedere che dati sono stati mandati e quali sono stati ricevuti
ho due chiamate a una Post e una Get a /welcome/Ajax
e mi stampa quello che c’e nell’else
possibile che il problema sia
if (isset($_POST['ajax']) && $_POST['ajax'] === 'profilo-form') {
quello che ho per il submit non ajax è questo
$model = new Profilo;
if (isset($_POST['Profilo'])) {
$model->attributes = $_POST['Profilo'];
$model->tbl_users_id = Yii::app()->user->id;
if ($model->validate()) {
echo"Valida " . $model->tbl_users_id;
$this->salvo_db($model, $this->check_esistenza_utente());
// form inputs are valid, do something here
//return;
}
}
$this->render('profilo', array('model' => $model));
e funziona correttamente
mdomba
(Maurizio Domba Cerin)
January 25, 2012, 11:09am
9
Con firebug puoi vedere che dati sono statti mandati… hai guardato se che la variabile "ajax" e se ha il valore "profilo-form"
Una cosa non capisco… nella view usi il ajaxSubmitButton() - vuol dire che tutto viene mandato tramite ajax… e poi scrivi "per il submit non ajax"…
ciao e grazie per la risposta
Il non Ajax lo tengo come test, per vedere che il form funzioni.
Questo è quello che mi viene in Firebug, la variabile ajax effettivamente non la vedo, ma come faccio a impostarla?
Grazie ancora
Appena carico la pagina la console mi dice:
L’utilizzo di getAttributeNodeNS() è deprecato. Al suo posto utilizzare getAttributeNS().
se al posto di
if (isset($_POST['ajax']) && $_POST['ajax'] === 'profilo-form') {
metto
if (isset($_POST['Profilo'])) {
diciamo che funziona, anche se non mi da l’allert come il submit normale, ma mi fa l’echo dell’errore
come faccio a impostare
if (isset($_POST['ajax']) && $_POST['ajax'] === 'profilo-form') {
e inoltre è possibile far stampare gli errori come quando faccio il submit normale?
ovvero
<?php echo $form->errorSummary($model); ?>
Grazie mille
mdomba
(Maurizio Domba Cerin)
January 25, 2012, 9:40pm
12
il valore ajax e setato nel codice jquery.yiiactiveform.js… vedi se questo file e stato incluso…
per farla breve… prova a fare il CRUD del tuo modelo con Gii… alla form generata aggiungi "enableAjaxvalidation" => true e vedi come funziona…
ciao e grazie del tuo tempo.
Ho fatto cme hai detto e ho creato un CRUD e tutto sembra andare.
il js lo chiama, e lo chiama anche nella mia pagina. devo aver fatto qualcosa di sbagliato nella mia pagina, ora cerco di analizzare le differenze.
La differenza è che nel CRUD viene chiamato
CHtml::submitButton
e di conseguenza viene caricata una pagina, ma quello che vorrei io , è che tutto sia fatto come fa
CHtml::ajaxSubmitButton
ti faccio sapere se ho risolto
molto gentile