Bonjour tous le monde ,</br> Je suis un détbutant sur cakephp et j'ai rencontré un problème assez bizard sur un projet sur lequel je travaille actuellement.</br>
Le projet consiste à créer un site de cuisine avec plusieur recettes etc... </br>Un utilisateur peut accéder au site par deux maniére :
</br> 1/normale sans s'y connecter et donc peut voir les recettes voir leur classement par rapport leur note global et en rechercher par rapport au nom de la recettes ou par rapport au aliments utiliser dans celle-ci.</br>
2/En se connectant avec un username et un password et dans ce cas il aura en plus la possibilité de noter les recettes , de les ajouter au panier des favories et de voir/modifier son profil.
</br>
Le probléme que je rencontre en ce moment ce situe au niveau des views. en effet tous marche comme il le faut sauf pour 2 choses :
</br>1/ Je n'arrive pas à récupérer l'id de l'utilisateur dans les vues d'un autre controller que celles de UsersController. En effet la fontion "AuthComponent::user('id')" me retourne toujours null sur ses vues.
</br>2/ Pour la recherche des recettes on a 2 façons sois par le nom des recettes sois par les aliments utiliser dans les recettes et je dois afficher ses aliments sous une structure d'arbre et mon problème est qu'en fait cakephp plante et m'affiche cette erreur : " Maximum execution time of 30 seconds exceeded" !!!! Et je ne sais pas pourquoi !!!!
Voici les codes que j'ai réalisé et excuser moi si j'ai massacrer cake je ne suis q'un débutant :D :</br>
UsersController fonction login :</br>

function login(){

    $this->layout='conreg';

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

        if(!empty($this->request->data))
        {
            if($this->Auth->login())
            {
                $this->Session->setFlash("Bienvenue dans LC",'notif' );
                $this->redirect(array('controller' => 'accueils'));

            }
            else
            {
                $this->Session->setFlash("Erreur de connection",'notif');
            }
        }
        else
            {
               $this->Session->setFlash("Merci de saisir vos informations",'notif');
            }
    }

}

Le header du template ou j'ai besoin de l'id de utilisateur :

        <?php 
        if(AuthComponent::user('id')){ 

        ?>
            <ul class="li_con">
              <li id="head_con"><a href="http://localhost/Recette/Users/login"><?= $resultats['User']['username']; ?></a></li>
              <li id="head_ins"><a href="http://localhost/Recette/">S'inscrire</a></li>
              <li id="head_rech"><a href="#">Favorie</a></li>
            </ul>
        <?php }else{ ?>
            <ul class="li_con">
              <li id="head_con"><a href="http://localhost/Recette/Users/login">Connexion</a></li>
              <li id="head_ins"><a href="http://localhost/Recette/Users/register">S'inscrire</a></li>
              <li id="head_rech"><a href="#">Favorie</a></li>
            </ul>
        <?php } ?>

Code du AppController:

    public $components =array('Session','Cookie','Auth');

    public function beforeFilter()
{
    $this->Auth->allow('login','register','recherche','top','index');
}

Code de RecettesController pour le deusiéme probléme:

function recherche(){
$id=1;
$cmpt=1;

  //debug(AuthComponent::user('id'));
$arbre1=$this->chercherfils($id,$cmpt);
$arbre='<ul>'.$arbre1.'</ul>';
echo $arbre ;
}
 function chercherfils($id,$cmpt){
$arbre='';
$recherchefil=$this->requestAction('/AlimentsAliments/recherchefils/'.$id);
if(!empty($recherchefil)){
  $nom=$this->requestAction('/Aliments/recherchenom/'.$id);
  if($nom!=''){
    $arbre2='<li>
            <input type="checkbox" id="c"'.$cmpt.' />
            <i class="fa fa-angle-double-right"></i>
            <i class="fa fa-angle-double-down"></i>
            <label for="c1"> '.$nom.'<a href="">
            <i class="fa fa-folder-open"></i></a></label>
            <ul>';
  }else{
    $arbre2='<li>
            <input type="checkbox" id="c"'.$cmpt.' />
            <i class="fa fa-angle-double-right"></i>
            <i class="fa fa-angle-double-down"></i>
            <label for="c1"> erreur 
              <a href="">
              <i class="fa fa-folder-open"></i>
              </a>
            </label>
            <ul>';
  }
  foreach ($recherchefil as $key => $value) {
    $cmpt++;
    $id=$value['AlimentsAliment']['aliment2_id'];
    $arbre1=$this->chercherfils($id,$cmpt);
    $arbre=$arbre.$arbre1;
  }
  $arbre=$arbre.'</ul> </li>';
  $arbre=$arbre2.$arbre;
}else{
  $nom=$this->requestAction('/Aliments/recherchenom/'.$id);
  if($nom!=''){
    $arbre='<li>'.$nom.'</li>';
  }else{
    $arbre='<li>erreur
                <a href="">
                  <i class="fa fa-folder-open"></i>
                </a>
              </li>';
  }
}
return $arbre;
}

Pour le reste des fonctions dans les controller Aliments et AlimentsAliments se ne sont que des findAllbyid(); donc pas trop important pour encambrer le post avec :D

J'epsére que vous arriverai à trouver ou j'ai merdé :D merci d'avance :D

3 réponses


Bien le bonjour,

Tu ne peux pas utiliser le module Auth dans la vue. Pour pallier le problème, dans le AppController::initialize() tu peux écrire la ligne suivante :

        $this->set('authUser', $this->Auth->user());

Ainsi, dans toutes les vues, tu auras accès à la variable authUser où se trouvera toutes les informations d'un utilisateur enregistré.

Moi, par exemple, dans une vue :

            <?php if($authUser['role'] == 'admin'): ?>

Bien à toi.

PS: Stp regarde à ton ortographe, merci.

Je viens de tester ta proposition mais ça ne marche toujours pas d'ailleurs il ne reconnaît même pas la variable " authUser "!!!

Pour le problème du AuthComponent::user() j'ai trouvé d'où vient le problème ! en fait les pages autorisées à l'utilisateur sans connexion n'arrivent pas à voir la session ouverte ! la solution, que j'ai trouvée et qui n'est bien sur pas la plus jolie, est de créer en double ses pages là en autorisant l'une sans connexion et en demandant la connexion sur l'autre ( après il faut juste que je gère méticuleusement les liens entre les pages pour ne pas créer tout un bordel) .Toutefois comme je l'ai déjà dit au départ ce n'est pas la meilleure solution et je suis toujours à la recherche de celle-ci ! si vous avez des idées n'hésitez surtout pas à les partagées !!!!