[Risolto] Refresh Di Un Form Senza Fare Il Submit

ho una form che aggiunge ‘utenti’, circa

ma la sto facendo come ce l’ha chiesta un cliente a cui non piacciono le cose semplici…

username: ___

password: ____

email :____

bla bla bla ____

bla bla bla12____

[crea utente]

richiesta: il campo password NON è editabile: devo fare un pulsante [genera password] che la genera secondo certe regole.

Quindi devo fare il submit del form, ma senza scatenare la validazione dei dati, perchè sennò l’utente vede una fila di campi obbligatori con l’errore che non può essere nullo…

come si disabilita la validazione eseguendo il submit con un pulsante invece di un altro ?

oppure : c’è modo di fare il submit eseguendo invece di actionCreate … actionGeneratePassword … ma facendo comunque vedere la form, con i dati già inseriti dall’utente, e la nuova password, senza eseguirne la validazione ?

EDIT: se ve lo state chiedendo: NO … non posso fare una chiamata ajax … si scontra con l’RBAM, se si chiama così, abbiamo già provato … non avendo la sessione la chiamata ajax riceve il form di login …eh eh …

non puoi semplicemente non far validare i campi sul model?

si certo, ma come si fa ?

  1. come capisco che è stato premuto ‘genera pwd’ invece di ‘crea utente’ ?

    – posso vedere se ho tra i POST yt0 invece di yt1, che sono i due pulsanti —

  2. come faccio nel model in questo caso a non eseguire la validazione?

Per la precisione vorrei capire se è possibile che questa logica, essendo logica, venga messa nel controller, poi il controller potrà anche dire al model di non validare i dati, ma come !??

bè… il pulsante genera pwd potrebbe solo fare una chiamata ajax a una action che genera la password e in questo modo non è un submitbutton, altrimenti potresti gestire il tuo post: posto che il tuo submitbutton per la password si chiama ‘pwd’ se tra il post ti trovi la key ‘pwd’ vuol dire che è stato cliccato quindi non devi validare ma solo generare la pass e rinviare tutto alla pagina.

Secondo me è meglio la chiamata ajax che ti gestisci con jquery e che ti popola da sola il campo…

non puoi mettere due pulsanti… con name differente?

il pulsante premuto lo trovi nel post.

nel controller verifichi da che pulsante arriva la chiamata.

-se bottone genera password… fai quello che devi fare… nn ho capito…

-se bottone crea utente, ci incolli dentro il codice… if(isset($_POST[‘Model’])) $model->attributes $model->save. la validazione avviene in questo punto.

perdona la mia completa ignoranza in maniera, sono 4 giorni solo che ci lavoro con Yii…

DOVE nel controller intercetto quale pulsante effettua la chiamata ?! Perchè so come leggere dal post il pulsante premuto, ma dove?, in che metodo del controller ?

Lo chiedo perchè actionCreate viene eseguito ogni volta che viene caricata la pagina, e li posso cmq fare la verifica, ma come faccio a dire ‘se premuto tasto genera allora NON eseguire la validazione dei dati ?’ !?

Em… se tu vuoi che un campo non sia considerato nella validazione, non metterlo required.

Se vuoi che assuma un certo valore casuale, fallo, ma nel controller appena prima di salvare il dato.

Visto che non deve essere scritto dall’utente ma generato casualmente, non c’è nemmeno bisogno che tu lo inserisca all’interno del form. A che serve mostrare una cosa che, … non serve?

quello che dice sensorario lo trovo condivisibile, cmq

per tornare alla tua richiesta,

dovresti fare una cosa del genere




public function actionCreate()

	{

		$model=new Utente;


		// Uncomment the following line if AJAX validation is needed

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


		if(isset($_POST['Utente']) && isset($_POST['Utente']['salva']))

		{

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

			if($model->save())

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

		}


		if(isset($_POST['Utente']) && isset($_POST['Utente']['genera_pwd']))

		{

			codice.


		}


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

			'model'=>$model,

		));

	}



Purtroppo ribadisco che NON è possibile fare una chiamata ajax, in quanto si scontra con l’RBAC ed altre regole aziendali …

La password generata deve essere visibile, perchè va comunicata al nuovo utente, in quanto solo un operatore potrà crearli, genererà la password, se la segna, e viene salvata criptata. Richiesta del cliente … fastidiosissima … ma richiesta del cliente.

@st4nny: la validazione quindi viene effettuata come conseguenza della chiamata ‘$model->save()’ ? Se si, era proprio proprio quello che stavo cercando.

Questa affermazione è strana:

Se deve essere visibile, … mostrala:

Quando richiami il metodo save() viene controllato che il model sia corretto. Se non lo è, ci sono dei problemi. Può essere utile sapere che passando $model->save(false); la "validazione" viene bypassata ed il model viene salvato anche se non "completo".

Le regole di validazione si impostano nella funzione rules del model, dato che tu non accetti la password come input, togli la regola di validazione.

La password generala subito:


public function actionCreate()

        {

                $model=new Utente;

                $model->password=//generapassword;

E nella view la mostri:


Ecco la tua password: <?php echo $model->password?>

Grazie per queste due info:

  • save(false) non esegue le validazione

  • il controllo sul $_POST va messo nell’action create.

Vi chiedo una ultima cosa: c’è modo di dare un name decente ai pulsanti ?

Genera viene chiamato in $_POST come ‘yt0’ e Salva come ‘Yt1’. E’ vero che non me ne frega nulla, ma per partire bene, vorrei fare tutto a regola d’arte

Io sono sempre stato soddisfatto di Yt1, tanto non devo controllare il valore.

Comunque non capisco, perche’ devi mettere un bottone con scritto “Genera”, non puoi semplicemente generarla a priori e mandarla?

O non puoi generarla con una funzione javascript? E ancora non capisco che differenza ci sia a livello di RBAC tra una funzione ajax e un submit, sono esattamente la stessa cosa.

devi leggere la documentazione:

http://www.yiiframework.com/doc/api/1.1/CHtml#submitButton-detail

il secondo parametro corrisponde alle opzioni html:




<?php echo CHtml::submitButton('Genera Pwd', array('name' => 'gen_pwd')); ?>



cmq se sei nella pagina create e non usi ajax è normale che i controlli li devi

fare nell’action create, è la base di MVC.

Per il discorso MVC ammetto la mia ignoranza :-[

[s]Per il ‘name’ mi sono spiegato male, so come cambiare di per se il ‘name’, l’avevo visto questo metodo nelle api, ma fatto sta che viene trasmesso come campo $_POST col nome ‘yt0’ o ‘yt1’… vorrei cambiare questo, perchè controllare nel codice in questo modo mi fa proprio schifo, per far capire a quello dopo di me cosa sto facendo devo commentare spiegando cos’è yt0…




if(isset($_POST["yt0'])) {. ...




[/s]

scusate era una cretinata … cambia davvero il name, funziona,… :D

@Zaccaria

Ho provato via Ajax, a chiamare users/user/generatePassword, creando una nuova “actionGeneratePassword” e di per se funzionava. Quando l’altro collega ha messo in piedi l’RBAC mi ha “venduto la cosa” dicendomi che via ajax non viene passata la sessione, e il sistema di Yii effettivamente mi restituiva invece che gli 8 caratteri in chiaro, l’html della pagina di login.

Mi ha venduto che avrebbe dovuto autorizzare in qualche modo, che credo neppure lui sa, visto che siamo tutti all’inizio, dicevo, avrebbbe dovuto autorizzare un utente non loggato ad accedere a quella action specifica e assolutamente non è da fare… cosa vuoi che ti dica… e poi il cliente è abituato ad usare un software vecchio di 11 anni e desidera le sue vecchie schifose abitudine, le preferisce ad una interfaccia utente nuova, dinamica e flessibile, …