Bonjour,

je suis en train de coder (du moins d'essayer) un mini formulaire de recherche pour mon appli. Actuellement je me suis basé sur un autre topic présent sur GrafikArt mais qui n'est pas porté a solution.

J'aimerai que mes utilisateurs puissent rechercher des locaux (Enregistrés dans la bdd locaux).

J'ai donc, un formulaire :

        <?php echo $this->Form->create('Local',array('id' => 'textBox', 'type' => 'post','url' => array('controller' => 'locaux', 'action' => 'resultSearch'))); ?>
        <?php echo $this->Form->input('search', array('label'=>"",'placeholder'=>'SEARCH','id'=>'search')); ?>
        <?php echo $this->Form->end(); ?>

Et mon dans mon controller :

<?php
function resultSearch(){
            $search = debug($this->request->data['Local']['search']);
            $d['locaux'] = $this->Locaux->find('all', array(
                                                     'conditions' => array(
                                                                        'locaux.title LIKE'=>'%'.$search.'%',
                                                                        'locaux.description LIKE'=>'%'.$search.'%')
                                                            )
                                            );
            $this->set($d);
            $this->render('resultSearch');
    }
?>  

Mais cependant j'ai une erreur : Undefined index: Local

Et je n'ai aucune idée d'ou cela peux venir, j'ai retournée et reretourné le code dans plus ou moins tous les sens j'ai aucune idée... plz help....

Merci :D

6 réponses


Qu'est ce que donne un petit debug($this->request->data) ; ?

Salut PallMallShow, le débug donne cela, j'avais déjà essayé :

\src\Controller\LocauxController.php (line 166)
null

Pas beaucoup d'indication quoi :/

Si, une grosse indication ... Ca veut dire que request->data ne vaut rien. Donc tu essai d'accéder à une propriété qui n'existe pas!

Donc vérifie bien que $this->request->data correspond bien aux données transmises par formulaire.

PS : Le nom d'un model doit être au singulier, j'ai l'impression que tu l'a mis au pluriel. (Ca fait un bail que j'ai pas touché à Cake)

Bonsoir.
Vu la structure des dossiers d'après le debug (\src\Controller\LocauxController.php), il semblerait bien que ce soit sous la V3 de CakePHP, il serait donc bien de nous le préciser.
Ensuite, pour éviter de se retrouver avec des données qui n'ont pas été soumises, je te conseille de vérifier si des données ont bien été soumises avant de faire un debug dessus, car ce n'est pas étonnant d'avoir un retour du debug qui est null, si des données n'ont pas été soumises.
Pour terminer, si tu es bien sous la V3, je te recommande de vérifier dans la documentation comment doivent être faites les requêtes SQL.
Au passage, il est inutile de spécifier une vue de rendue, si c'est la même que l'action concernée.

D'accord, merci à vous deux, je vais regarder tout cela et reviendrai vers vous, et oui j'utilise bel et bien la v3.

Je regarde tout ca et je vous dit ! ;) Merci !

J'ai réussi ! Merci à vous ! Vous gérez ! ;)

J'ai donc reformulé toute la fonction dans le controller et au final ca donne cela :

Par contre j'ai cherché dans la Doc je n'ai pas trouvé la syntaxe exacte pour faire une recherche sur deux champs avec un OR :/
Controller :

function searchResult(){
// Si il n'y a aucune recherche on retourne tous les locaux
    if (!isset($this->request->query['locauxsearch'])) {
        $local = $this->Locaux->find('all');
                $this->set('local', $local);
                $this->set('_serialize', ['local']);
    }

    // si il y a une recherche on affiche les résultats
    else {
        // on enregistre la recherche dans une variable
        $search = $this->request->query['locauxsearch'];
        // On va chercher en BDD
        $local = $this->Locaux->find('all', array(
                                                     'conditions' => array(
                                                                        'locaux.title LIKE'=>'%'.$search.'%')
                                                            )
                                            );
                $this->set('local', $local);
                // Me sers a afficher la recherche dans la page des résultats
                $this->set('search', $search);
                $this->set('_serialize', ['local']);
    }
}

Et dans ma vue :

<?php foreach ($local as $loc): ?>
        <table>
            <tr>
                <td><?= h($loc->id) ?></td>
                ...

  ?>