Bonjour,
Voilà je voudrais installer un système de recherche sur l'ensemble des pages d'un site. J'ai vu qu'il existait des Plugins qui permettaient de mettre cela en place, mais je ne sais pas trop par ou commencé :
Pour infos je me suis arreter sur Search de FriendofCake
1 - Ce Plugin me permettra-t-il d'avoir un simple système de recherche ?
2 - Pour l'essayer j'ai commence l'installation en suivant les infos
3 - Mais dès qu'il faut entrer dans le code, je coince un peu :
Déjà je remarque que l'installation du Plugin ce fait dans vendor/firendsofcake/ , ne devrait-il pas être dans le dossier Plugins ?
Ensuite en suivant la doc il faut attacher le plugin à un Table : Est-ce qu'il faut que je créais un controller / table Search ? ou bien je le rattache à la table sur laquelle je souhaite faire des recherches ?
Bref, c'est le premier plugin que je souahite installer et je galère un poquito !
Une petite clé pour m'ouvrir la voie ?
Merci

7 réponses


Bonsoir.

Ce Plugin me permettra-t-il d'avoir un simple système de recherche ?

Pour un simple système de recherche, tu n'as pas forcément besoin d'un plugin, bien que tu puisses l'utiliser si tu le souhaite, il est plutôt prévu pour des recherches assez poussée.
Tu peux très bien pour l'instant faire ton système de recherche via une simple requête dans ta table et plus tard utiliser le plugin si tu veux faire des recherches plus poussées lorsque tu auras bien pris en main le plugin.

Déjà je remarque que l'installation du Plugin ce fait dans vendor/firendsofcake/ , ne devrait-il pas être dans le dossier Plugins ?

Non, pas obligatoirement, les plugins externes peuvent très bien se situer dans le dossier vendor, les plugins situés dans le dossier plugins sont plutôt ceux que tu crées toi même par exemple, ou bien des thèmes que tu crées toi même.
Il faut que tu penses que tout se qui se trouve dans le dossier vendor, sont des ressources externes, autant les librairies externes que des ressources spécifiques pour CakePHP.
Si tu regardes bie le fichier composer.json du plugin, tu remarqueras que la valeur de type est __cakephp_plugin, le framework sera par conséquence capable de faire le lien.
Pour ce qui concerne la table, tu n'as pas besoin de créer une table, tu as juste besoin de le rattacher aux classes
*Table__ dans lesquelles tu veux utiliser le plugin.

Merci pour cette réponse. Oui effectivement, je peux faire un formulaire vite fait avec requête et je penses que c'est ce que je vais faire. J'ai toujours du mal à comprendre les docs. Que ce soit celle de cake ou celle que l'on trouve sur Git. Je n'ai pas une âme de dev et j'ai loupé des choses... Grrr

Ola.
Du coup j'ai créer une tite fonction pour mon formulaire de recherche.

function resultSearch(){

            if($this->request->is('post'))
            {   
                $validTest = TRUE;
                $this->set('validTest',$validTest);
                $search = $this->request->data['Service']['search'];
                $search_optim = preg_replace("#[^a-zÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ?0-9]#i","", $search);
                $this->set('search', $search);

                if(isset($search) && ($search != NULL))
                {
                    $this->Service->set($this->request->data);
                    if ($this->Service->validates()) 
                    {   
                        $search_results = $this->Service->find('all', array(
                        'conditions' => array(
                            'OR' => array(
                                'title LIKE' => '%' . $search_optim . '%', 
                                'type LIKE' => '%' . $search_optim . '%',
                                'description LIKE' => '%' . $search_optim . '%',
                                'process_intro LIKE' => '%' . $search_optim . '%',
                                'process_content LIKE' => '%' . $search_optim . '%',
                                'process LIKE' => '%' . $search_optim . '%',
                                'original LIKE' => '%' . $search_optim . '%',
                                'support_final LIKE' => '%' . $search_optim . '%',
                                'option LIKE' => '%' . $search_optim . '%',
                                'work LIKE' => '%' . $search_optim . '%',
                            )
                            )
                        ));

                        $nb_resultats = count($search_results);

                        $this->set('search_results', $search_results);
                        $this->set('nb_resultats', $nb_resultats);
                    }
                    else 
                    {
                        $validTest = FALSE;
                        $this->set('validTest',$validTest);
                        $this->Session->setFlash('Attention, ce champ ne doit comporter que des données alphanumériques de 3 lettres minimum !','error');
                    }
                }
            }
    }

Cette fonction est accessible depuis mon controller Services. Cependant si je veux utiliser cette fonction n'importe ou dans le site est afficher le résultat dans un élement comment puis-je faire ?
Merci

Si je comprends bien, tu utilises la V2 de CakePHP.
Si tu veux pouvoir utiliser le système de recherche que tu as créé sans devoir recopier le code à chaque action dans laquelle tu veux l'utiliser, tu pourrais par exemple créer un composant : CakePHP V2 » Créer un component.
De cette manière, lorsque tu voudras utiliser le composant, il te suffira d'y faire appel, par exemple :

public function myAction()
{
    $this->MyComponent->search();
}

En ayant bien sùr déclaré avant le composant, soit dans le controller voulu, ou bien dans l'AppController.
Ou alors, tu crées la fonction dans ton AppController, mais il ne faudra pas que tu nommes une fonction dans les autres controller de la même manière et au lieu d'utiliser $this->Service directement, il te faudra d'abord charger le moèle avant, soit :

// code ...
$this->loadModel('Service');
$this-Service->set($this->request->data);
// suite du code ...

Bonjour,
Peittes questions complémentaires pour poursuivre, j'ai créé fianlement un Composant donc je déposerai le code prochainement.
Je peux fouiller les tables souhaitées avec l'aide du formulaire. Mais je rencontre 2 soucis :
1 - Un soucis de charset puisque je récupère le mot du formulaire avec un point d'intérogation dans un losange. Du coup vers ou je pourrai m'orienter, avec notepad++ j'ai encoder le composant et le reste en utf-8 (sans BOM)... :/
2 - Une autre question concernant la logique de recherche. Comme cité plus haut pas de soucis pour récup des données d'une table. Mais j'aimerai savoir si il est possible de récupérer l'url d'un page du site en fonction des mots recherchés ?
Mercizavous :)

Un soucis de charset puisque je récupère le mot du formulaire avec un point d'intérogation dans un losange.

Est-ce que tu as bien défini dans le head de ton layout le meta pour le charset ?

<meta charset="utf-8">

j'aimerai savoir si il est possible de récupérer l'url d'un page du site en fonction des mots recherchés ?

Je ne comprends pas trop ce que tu demandes, car si ta recherche concerne un enregistrement de ta base de données et que celui-ci à une vue pour l'afficher, il te suffit dans l'affichage du résultat de ta recherche, d'ajouter un lien vers cette vue avec les paramêtres nécessaires, exemple :

echo $this->Html->link($post->title, ['controller' => 'Posts', 'action' => 'show', 'id' => $post->id]);

Si tu ne veux pas avoir à créer le tableau d'url pour le lien, tu peux toujours créer un champ virtuel dans le model concerné, ce qui t'évitera par exemple de devoir modifier le tableau d'url dans chaque page dans laquelle tu l'affiches, dans le cas où un jour tu veuilles modifier les paramètres utilisées dans celle-ci ou bien si tu changes l'action concernée.

Ola, et merci pour ton retour....
Pour le problème de charset, c'est la fonction strlower que j'utilise dans mon composant qui me posait problème..
Pour ce qui est de l'autre question, je vais me faire taper sur les doigts (ahihi), mais pour certains contenus, j'ai pas vraiment respecté la liaison table controller... J'ai fait une table générale 'Contents' que j'appelle sur certains controller :/
D'ou la question, voir si il n'y à pas un moyen qu'un script repère un mot dans le contenu d'une page et du coup affiche l'url de celle-ci avec :

$this->request->here

par exemple
PS : c'est pour peaufiner un peu le moteur de recherche, car pour la plupart du contenu interessant j'ai respecter Mr Cake !
Remerci