Bonsoir,

Suite aux tutos développer sont site de A à Z, j'aimerais intégrer un moteur de recherche.

Voici le code de la page /view/layout/default.php :

<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title><?php echo isset($title_for_layout)?$title_for_layout:'totoCie'; ?></title> 
    <!--<link rel="stylesheet" href="../../webroot/css/bootstrap.min.css">-->
    <link rel="stylesheet" href="<?php echo Router::webroot('css/bootstrap.min.css'); ?>">
    </head> 
    <body>       

        <div class="topbar" style="position:static"> 
          <div class="topbar-inner"> 
            <div class="container"> 
              <h3><a href="#">totoCie</a></h3> 
              <ul class="nav nav-pills">

                <?php $pagesMenu = $this->request('Pages','getMenu'); ?>
                <?php foreach($pagesMenu as $p): ?>
                    <li><a href="<?php echo Router::url('pages/view/id:'.$p->id.'/slug:'.$p->slug); ?>" title="<?php echo $p->name; ?>"><?php echo $p->name; ?></a></li> 
                <?php endforeach; ?>

                <li><a href="<?php echo Router::url('posts/index'); ?>">Actualités</a></li>
                <li><a href="<?php echo Router::url('pages/contact'); ?>">Me Contacter</a></li>
                <li>
                    <form method="post" action="<?php echo Router::url('pages/recherche'); ?>" class="navbar-search pull-left">                    
                        <input type="search" class="search-query" placeholder="Chercher sur totoCie">
                    </form></li>
              </ul>
            </div> 
          </div> 
        </div> 

        <div class="container" style="padding-top:60px;">           
            <?php echo $this->Session->flash(); ?>
            <?php echo $content_for_layout; ?>

        </div>

    </body> 
    <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> 
</html>

J'ai ajouté ce code pour la page de recherche dans le fichier /config/conf.php :

<?php
class Conf{

    static $debug = 1; 
    static $databases = array(
        'default' => array(
            'host' => 'localhost',
            'database'  => 'tuto',
            'login' => 'root',
            'password'  => ''
        )
    );
}
Router::prefix('cockpit','admin');
Router::connect('','posts/index');
Router::connect('contact','pages/contact');
Router::connect('veriformrdv','pages/veriformrdv');
Router::connect('recherche','pages/recherche');
Router::connect('cockpit','cockpit/posts/index');
Router::connect('page/:slug-:id','pages/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('blog/:slug-:id','posts/view/id:([0-9]+)/slug:([a-z0-9\-]+)');
Router::connect('blog/category/:slug','posts/category/slug:([a-z0-9\-]+)');
Router::connect('blog/*','posts/*');

Quand je tape un mot dans le moteur de recherche ça me renvoi sur la page recherche sur laquelle il n'y a rien de plus que ça :

<legend>Résultats de recherche</legend>

Donc pour l'instant j'ai l'affichage du menu qui est correct et juste "Résultats de recherche" mais au moins je passe d'une page à une autre sans encombre.

Je pensais ajouter dans la page /core/Model.php la fonction de recherche en m'inspirant de la function find :

public function recherche(,){

    }

Code de la fonction find :

/**
    * Permet de récupérer plusieurs enregistrements
    * @param $req Tableau contenant les éléments de la requête
    **/
    public function find($req = array()){
        $sql = 'SELECT ';
        if(isset($req'fields'])){
            if(is_array($req'fields'])){
                $sql .= implode(', ',$$req'fields']);
            }else{
                $sql .= $req'fields']; 
            }
        }else{
            $sql.='*';
        }
        $sql .= ' FROM '.$this->table.' as '.get_class($this).' ';
        // Liaison
        if(isset($req'join'])){
            foreach($req'join'] as $k=>$v){
                $sql .= 'LEFT JOIN '.$k.' ON '.$v.' '; 
            }
        }
        // Construction de la condition
        if(isset($req'conditions'])){
            $sql .= 'WHERE ';
            if(!is_array($req'conditions'])){
                $sql .= $req'conditions']; 
            }else{
                $cond = array(); 
                foreach($req'conditions'] as $k=>$v){
                    if(!is_numeric($v)){
                        $v = '"'.mysql_real_escape_string($v).'"'; 
                    }

                    $cond] = "$k=$v";
                }
                $sql .= implode(' AND ',$cond);
            }
        }
        if(isset($req'order'])){
            $sql .= ' ORDER BY '.$req'order'];
        }

        if(isset($req'limit'])){
            $sql .= ' LIMIT '.$req'limit'];
        }
        $pre = $this->db->prepare($sql); 
        $pre->execute(); 
        return $pre->fetchAll(PDO::FETCH_OBJ);
    }

Ma question est SUIS-JE SUR LA BONNE PISTE ? ou y a t'il d'autre choses à prendre en considération avant de ma lancer dans le codage de la fonction recherche ?

N'y aurait il pas un tuto sur ce site pour ajouter un moteur de recherche au tuto "Développer son site de A à Z" ???

4 réponses


Tu paux aussi tout simplement faire un controller "Search", une view "Search" avec une fonction index($search)

Ta fonction index prendrait un argument le mot rechercher par exemple, et tu modifie ta fonction find qui se trouve dans /core/Model.php

tu lui ajouter une condition avec un array('like' => '%'.$search.'%');

par exemple tu gagnera beaucoup de temps en utilisant le MVC.

cdt

Salut.

Merci bcp c'est le genre de réponse que j'espérais. C'est pour moi une bonne piste.

Je vais partir dans ce sens la plutôt ce sera parfait..

Merci encore.

j'ai codé ça il y a deux jour pour la recherche de personne en base et comme dit plus haut j'ai ajouté une vue search

function search(){  
if(isset($_GET'q'])){
$q = $_GET'q'];
}
        $this->loadModel('Clients');
        $d'clients'] = $this->Clients->find(array(
            'conditions' => array('etatclient'=>'etatclient = 0','nom'=>'(nom LIKE "'.$q.'%" OR prenom LIKE "'.$q.'%")'),
            ));
        $this->Session->setFlash("Résultat de votre recherche");
        $this->set($d);
}

Super gentil Merci bien vais m'en inspirer.