Bonjour,
voila je suis débutant sous cakePhp, et je souhaiterai faire un systeme de login depuis une lightbox jquery.
Dans mon controller UsersController.php j'ai une action login et une vue login.ctp.
J'aimerai integrer cette vue dans une div qui sera appelé en Jquery, comment dois je faire?
Car un include en php ne fonctionne pas.

6 réponses


Shadow
Réponse acceptée

Est ce que ton système de login fonctionnait déjà ? Pouvait tu te logger auparavant ?

Car la mise en place d'un système de login via le composants Auth est assez particulier..
Il y a tout un système d'autorisation à mettre en place pour autoriser un utilisateurs à accéder à certaines pages..

J'avoue que me première mise en place d'un login via Auth à été très longue :P

Ce lien m'avais bien aidé en tout cas : http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html

Peut-être que ton problème viens du fait que tu créé ton formulaire de login en html et non via les helpers... Je l'ai appris à mes dépends que les formulaires et les models sont étroitement liés...

Exemple :

<div class="users form">
<?php echo $this->Form->create('User', array('url' => array('controller' => 'users', 'action' => 'login'))); ?>
    <fieldset>
        <legend>Please enter your username and password</legend>
        <?php
            echo $this->Form->input('username', array('label' => 'Identifiant'));
            echo $this->Form->input('password', array('label' => 'Mot de passe');
    ?>
    </fieldset>
<?php echo $this->Form->end('Login'); ?>
</div>

Bonjour,

Si ta modal est capable d'aller chercher une page externe, plutôt qu'un élément de ta page, tu peut tenter d'appeler la page '/users/login' de cette façon via l'appel fait par la modal.

NB : pense à créer dans ce cas un layout particulier (éventuellement vide et ne contenant que <?php echo $content_for_layout; ?>) pour éviter d'avoir ton site complet dans ta modal.

Je ne vois pas d'autre solution 'propre' pour le moment, mais si ce que je viens de te donner ne marche pas, j'étudierai la question plus en détail.

Re,

En fait il y à une autre solution que m'est venu... : http://book.cakephp.org/2.0/en/views.html#elements

<u>1er temps :</u>
Dans View > Elements tu créer une vue (login.ctp par exemple) contenant ton formulaire de login pointant, lors du submit, vers /users/login.

<u>2ème temps :</u>
Dans ton layout :

<div id="id_pour_modal">
    <?php echo $this->element('login'); /* qui appellera l'élément login.ctp créé précédemment */ ?>
</div>

<u>3ème temps :</u>
Y'a plus qu'a cacher la div contenant le formulaire via css et l'appeler avec la modal

Voila deux solutions qui répondront à ton problème je l'espère.

Tiens moi au courant si cela fonctionne.

EDIT : cela te permet, en gérant bien, d'avoir un fallback ... en effet si le js n'est pas encore initialisé et que le lien appelant ta modal contient en attribut href '/users/login' alors les gens cliquant trop tôt sur le lien ouvrant la modal iront sur la page 'normal' plutôt que de charger l'élément.

En notant aussi que dans la première idée la fonction load de jQuery peut aider ( 3ème solution ;) )

$('#je_recois_le_formulaire').load('users/login #id_du_formulaire');
duffJohn
Auteur

Bonjour,
alors voilà je suis en peu en galère :s
J'ai essayé la solution 2 qui me paraissait plus facile a mettre en oeuvre...
Alors voici mon code:

le layout.ctp:

....
<div id="login-box" class="login-popup">
    <?php echo $this->element('login'); /* qui appellera l'élément login.ctp créé précédemment */ ?>
</div>

Dans View/Elements/ j'ai créé login.ctp:

<?php $this->set('title_for_layout',"Connexion"); ?>
<a href="#" class="close"><?php echo $this->Html->image('close_pop.png', array('alt' => 'CakePHP','class'=>'btn_close'))?></a>
<form method="post" class="signin" action="users/login">
    <fieldset class="textbox">
        <label class="username">
            <span>Pseudo</span>
            <input id="username" name="username" value="" type="text" autocomplete="on" placeholder="Votre pseudo">
        </label>
        <label class="password">
            <span>Mot de passe</span>
            <input id="password" name="password" value="" type="password" placeholder="Votre mot de passe">
        </label>
        <button class="submit button" type="submit">Connexion</button>
        <p>
        <?php echo $this->Html->link("Mot de passe oublié ?",array('action'=>'password','controller'=>'users')); ?>
        </p>        
    </fieldset>
</form>

Et dans UsersController.php:

function login(){
        $this->autoRender = false;
        if($this->request->is('post')){
            if($this->Auth->login()){
                $this->User->id = $this->Auth->user("id");
                $this->User->saveField('lastlogin',date('Y-m-d H:i:s'));
                $this->Session->setFlash("Vous etes maintenant connecté","notif");
                $this->redirect('/');
            }
            else{
                $this->Session->setFlash("Erreur de connexion","notif",array('type'=>'Flasherror'));
            }
        }
    }

Que je mette $this->autoRender = false; ou $this->autoRender = true; On se retrouve quand même sur la page users/login...

Mais ca ne me connecte pas :s

D'où vient mon erreur?

Merci en tout cas d'avoir déjà répondu :)

duffJohn
Auteur

Super oui c'est bien ca!
Le formulaire doit etre créé via les helpers! Je suis étonné mais bon c'est bien la solution!

Merci beaucoup Shadow :)

De rien ;)