2013-05-21 4 views
6

Ho due moduli su un'unica pagina: modulo di accesso e modulo di registrazione. Quando invio il modulo di registrazione, convalida entrambi: campi modulo che sono in accesso e registrazione. Come posso gestire la cosa, se sia in forma hanno lo stesso modello (modello di utente)Modulo multiplo con lo stesso nome di modello su cakephp a pagina singola

forma Registrati

<?php echo $this->Form->create('User', array('url' => array('controller' => 'users', 'action' => 'add'))); ?> 
<?php echo $this->Form->input('username', array('label' => false, 'div' => false, 'class' => 'reg_input'));?> 
<?php echo $this->Form->input('email', array('label' => false, 'div' => false, 'class' => 'reg_input'));?> 
<?php echo $this->Form->input('password', array('label' => false, 'div' => false, 'class' => 'reg_input'));?> 
<?php echo $this->Form->input('confirm_password', array('type' => 'password', 'label' => false, 'div' => false, 'class' => 'reg_input'));?> 
<?php echo $this->Form->submit(__('Submit', true), array ('class' => 'reg_button', 'div' => false)); 
    echo $this->Form->end();?> 

e modulo di login è sotto

<?php echo $this->Form->create('User', array('controller' => 'users', 'action' => 'login'))?> 
    <?php echo $this->Form->input('User.username',array('label'=>false,'div'=>false, 'class' => 'reg_input'));?> 
    <?php echo $this->Form->input('User.password',array('label'=>false,'div'=>false, 'class' => 'reg_input'));?> 
    <?php echo $this->Form->submit(__('Log in', true), array ('class' => 'reg_button', 'div' => false)); ?> 
    <?php echo $this->Form->end();?> 

Quando ho presentare il modulo di registrazione convalida entrambe le forme , Voglio convalidare solo il modulo di registrazione.

Come posso gestirlo?

enter image description here

+0

Ho lo stesso problema. Hai trovato una soluzione per questo problema? – gonzo

+0

Non ho ancora trovato alcuna soluzione –

+0

come risolvere questo problema. Per favore aiutatemi –

risposta

0

Il metodo create sul modulo di login manca il tasto 'url' per creare l'attributo action. Ho provato a ricreare questo, una volta risolto e non potevo. Forse lo risolverà?

+0

Lo provo già, ma non ho avuto alcun successo –

2

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

+0

+1 Ho lavorato per me .. – Rohan210

+0

@Nunser, ho provato questa soluzione ma ho mancato l'errore della tabella degli accessi. – Garry

+0

senza dare un'occhiata al tuo codice, la causa più probabile è che non cambi il nome dei dati inviati alla tabella originale che dovrebbe essere. Il codice che ho scritto per il controller è dove succede, è necessario passare i dati che provengono da 'form-> create ('Login')' all'utente (come nell'esempio che ho inserito nella risposta). Se dici che è così, allora ho bisogno del codice per eseguire il debug di più, o aprire una nuova domanda o creare una chat e invitare :) (Non garantisco il tempo che ho a disposizione, però: S) – Nunser

1

È possibile duplicare il modello e modificare il suo nome e definire $ useTable come lo stesso nome tabella.

Esempio:

class Registration extends AppModel { 

public $useTable = 'users'; 

si definisce l'azione in form-> create come Nunser per il modulo di login

<?php 
    echo $this->Form->create('User',array(
     'url' => array(
      'controller' => 'Users', 
      'action' => 'login', 
      'user' => true 
     ), 
     'inputDefaults' => array(
      'div' => false, 
      'label' => false 
     ), 
     'novalidate'=>true, 
    )); 
?> 

e il modulo di registrazione

<?php 
    echo $this->Form->create('Registration',array(
     'url' => array(
      'controller' => 'Users', 
      'action' => 'validation_registration', 
      'user' => false 
     ), 
     'inputDefaults' => array(
      'div' => false, 
      'label' => false 
     ), 
     'novalidate'=>true, 
    )); 
?> 

nel controller definire un metodo per la convalida della registrazione e il più importante definisce il rendering

public function validation_registration(){ 
    $this->loadModel('Registration'); 

      if($this->request->is('post')){ 

       if($this->Registration->save($this->request->data)){ 

        --- code --- 
       }else{ 
        --- code --- 
       } 
      } 

      $this->render('user_login'); 
} 

Ci scusiamo per il mio inglese! Buona giornata ! : D