2010-09-28 16 views
5

Ho appena iniziato con cakePHP e le cose non stanno andando così bene finora.Emissione di un collegamento ipertestuale da un controller in cakePHP

Ho un controller che gestisce la conferma delle email degli utenti. Al momento della registrazione, l'utente riceve un'e-mail con un codice di conferma in un link. A seconda del codice di conferma che danno, il controller fornisce risposte di testo diverse. Una di queste risposte include un collegamento ipertestuale per accedere.

Sto provando a utilizzare l'helper Html, ma nonostante l'ho caricato in $ helper in cima alla classe, l'ho fatto funzionare solo se poi utilizzo App :: import e quindi lo istanziamo.

Tutto sembra eccessivo semplicemente creare un collegamento ipertestuale! Quante volte devo caricare la stessa classe?

Ovunque guardo sul Web, continua a dirmi che è una cattiva idea utilizzare un helper in un controller, ma in quale altro modo dovrei ottenere il collegamento?

così ho

var $helpers = array('Html'); 

nella parte superiore del controller, e:

if (isset($this->User->id)) { // Check the user's entered it right 
    // Do some stuff to remember the user has confirmed 
    // This is to load the html helper - supposedly bad form, but how else do I make the link? 
    App::import('Helper', 'Html'); 
    $html = new HtmlHelper(); 
    $this->set('message', __("Your email address has been confirmed.", TRUE)." ".$html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login"))); 
} else { 
    $this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE)); 
} 

nel metodo confermano del controller e

<div> 
    <?php echo $message;?> 
</div> 

nella vista per l'uscita del risultante messaggio

Sicuramente sto sbagliando da qualche parte - qualcuno può spiegare come?

risposta

3

L'idea è che tutti i dati necessari per il rendering della pagina vengono inviati alla vista con set, quindi qualsiasi logica condizionale o formattazione viene eseguita nella vista con gli helper, quindi inviare i risultati dell'intera query quando appropriato (supponiamo di aver bisogno per modificare un link per includere il nome dello schermo dell'utente, avrai a portata di mano).

in azione di controllo

$this->set('user', $this->User); 

in considerazione (questo è leggermente diverso a seconda se il vostro in < = 1.2 o 1,3

if ($user->id) //available because of Controller->set 
{ 
    //1.2 
    $link = $html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login")); 
    //1.3 
    $link = $this->Html->link(__("Please log in", TRUE), array('controller' => "users", 'action' => "login")); 
    echo __("Your email address has been confirmed.", TRUE)." $link"; 
} 
else 
{ 
    $this->set('message', __("Please check your mail for the correct URL to confirm your account", TRUE)); 
} 

+0

Aaah, ok! Questo ha un po 'più senso. Era l'idea di passare i dati completi dell'utente alla vista che non avevo ricevuto. Ho visto la vista molto più "stupida". Grazie per la buona illustrazione chiara. – Hippyjim

+0

Ho pensato $ this-> User era come risultato della query piuttosto che un modello. Vostro diritto, dovreste fare $ user = $ this-> User-> find() quindi $ this-> set ('user', $ user), quindi l'utente sarebbe una matrice di risultati nella vista. –

+0

Sì, ho capito che sono i dati, piuttosto che il modello: il passaggio del modello potrebbe mettere in pericolo tutti i tipi di cattivi riferimenti circolari, giusto? (per non parlare della rottura del MVC) – Hippyjim

15

Non dovresti usare Helpers in il Controller. Come sottolineato da @Lincoln, dovresti costruire il collegamento nella Vista. Puoi costruire l'URL nel Controller, poiché un URL i s fondamentalmente dati, ma un link è un'implementazione HTML (medium-specific) di un URL.

In entrambi i casi, è necessario creare un completo (incluso l'host) se si desidera inviarlo in un'e-mail. Il modo più universale è quello di utilizzare Router::url:

$fullUrl = Router::url(array('controller' => ...), true); // 'true' for full URL 

fare questo sia il Controller o la vista. Per creare un collegamento, utilizzare questo nella vista:

echo $html->link('Title', $fullUrl); 
0

Quello che si sta tentando di fare dovrebbe essere fatto con SessionComponent.$ this-> Session-> setFlash ('il tuo messaggio qui');

e nel proprio layout con l'helper di sessione inserisci $ this-> Session-> flash();

Informazioni sugli URL desiderati nel controller, Router :: url è corretto come ha detto l'inganno, ma non è possibile utilizzarlo poiché non è necessario creare html in un controller.

ciò che si vuole fare è utilizzare la sessione :: setFlash() metodo di cui sopra e poi li reindirizza utilizzando

$ this-> redirect (array ('controllore' => "utenti", 'action' = > "login"));

+0

Grazie per i puntatori - ma in questo caso il flash non è sufficiente, in quanto c'è più di un singolo "div" da compilare - ho solo ridotto il codice per l'esempio. Ad ogni modo, lasciare che la vista gestisca la logica del display ha molto più senso per me, e ho ottenuto il funzionamento del codice. – Hippyjim

Problemi correlati