Ho trovato una "soluzione" (trovo l'approccio sporco, ma funziona) per un different question (molto simile a questo). Quell'altra domanda ha funzionato con elementi e viste, però. Pubblicherò qui l'intera soluzione per vedere se aiuta qualcuno (anche se preferisco che qualcun altro abbia un approccio diverso).
Quindi, innanzitutto: modificare i nomi di creazione per le due forme.
I moduli dovrebbero funzionare, guardare e inviare alle stesse azioni, quindi nessun danno fatto.
Secondo passo: non ho il codice di azione, quindi ho intenzione di spiegare ciò che deve essere fatto in generale
public function login() {
if ($this->request->is('post')) {
//we need to change the request->data indexes to make everything work
if (isset($this->request->data['Login'] /*that's the name we gave to the form*/)) {
$this->request->data['User'] = $this->request->data['Login'];
unset($this->request->data['Login']); //clean everything up so all work as it is working now
$this->set('formName', 'Login'); //we need to pass a reference to the view for validation display
} //if there's no 'Login' index, we can assume the request came the normal way
//your code that should work normally
}
}
Stessa cosa per la registrazione (solo bisogno di cambiare 'Login' a "Registrazione").
Ora, le azioni dovrebbero comportarsi normalmente, dal momento che non ha idea che abbiamo modificato i nomi dei moduli nella vista (ci siamo assicurati che cambiando gli indici nell'azione). Ma, se ci sono errori di convalida, la vista sarà verificare la presenza di loro in
$this->validationErrors['Model_with_errors']
che e 'Model_with_errors' (in questo caso 'utente') non saranno visualizzati nei rispettivi forme perché abbiamo cambiato i nomi. Quindi dobbiamo anche modificare la vista. Oh! Suppongo che entrambe le forme siano in una vista denominata index.ctp
, ad esempio, ma se si trovano su file separati (se si utilizza un elemento o simile), si consiglia di aggiungere le righe di codice per tutti i file
//preferably in the first line of the view/element (index.ctp in this example)
if (!empty($this->validationErrors['User']) && isset($formName)) {
$this->validationErrors[$formName] = $this->validationErrors['User'];
}
Con ciò, copiamo la convalida del modello dell'utente al modulo falso, e solo quello. Si noti che se si dispone di un terzo modulo in quella vista per lo stesso modello e si utilizza il tipico $this->form->create('User')
, gli errori di convalida verranno visualizzati anche per quello stesso, a meno che non si cambi il nome del modulo per quel terzo.
Ciò dovrebbe funzionare e convalidare solo il modulo con il nome corretto.
Trovo questo un approccio disordinato perché implica modifiche alla vista del controller. Penso che tutto debba essere fatto dal controller, e la vista non dovrebbe nemmeno battere ciglio sui problemi di convalida ... Il problema è che la funzione render
di Controller.php
deve essere sostituita ... Può essere effettuata nel AppController
, ma per ogni aggiornamento di Cakephp, dovrai fare attenzione a copiare la nuova funzione di rendering di Controller.php
in quella che la sostituisce in AppController
. Il vantaggio di tale approccio, tuttavia, è che la "caratteristica" sarebbe disponibile per ogni modulo senza doversi preoccupare di cambiare le visualizzazioni.
Beh, non è solo che sia comunque mantenibile, quindi meglio lasciar perdere se è solo per questo caso ... Se qualcuno è interessato a come gestirlo solo dal lato controller, però, commenta e io ' Lo pubblicherò.
Ho lo stesso problema. Hai trovato una soluzione per questo problema? – gonzo
Non ho ancora trovato alcuna soluzione –
come risolvere questo problema. Per favore aiutatemi –