Bonjour,

Je travaille en [CakePHP 2.3.4] sur une application web de stockage de données type documentation, informations etc. essentiellement sous forme de texte, et parfois de fichiers joints (pdf ou zip).

Ces informations peuvent être de type "formations" (modèle "Training"), "livres" (modèle "Book"), etc.

J'ai également des tables de données associables à un document par l'utilisateur qui stocke un nouveau document.
Du style "niveau de maturité du document" (modèle "Maturity"), "logiciel" (modèle "Software"), etc.

Par exemple une formation peut être de niveau de maturité id:2 name:"2 - dispensée au moins une fois" et concerner les logiciels id:X name:MS WORD et id:Y name:MS EXCEL

Le stockage/affichage fonctionne bien pour le moment.

Au vu de mon niveau, ça se corse quand je veux faire une page de recherche dans ces données.

J'ai créé un controller SearchesController.php.
J'utilise quelques lignes de code trouvées sur le net pour le formulaire+recherche dans la BDD.
J'arrive à envoyer des résultats de recherche à ma vue Searches/index.ctp.

Pour l'instant la recherche marche pour :
-du contenu appartenant à la table explorée : si le mot recherché appartient au contenu de la formation
Code : Sélectionner tout - Visualiser dans une fenêtre à part
'Training.content LIKE' => '%' . $value . '%'
- du contenu appartenant à une table liée en belongsTo : si le mot recherché appartient à la description en toutes lettres du niveau de maturité
Code : Sélectionner tout - Visualiser dans une fenêtre à part
'Maturity.name LIKE' => '%' . $value . '%'
Dans ces cas j'ai pris soin de charger le modèle Training et de mettre la récursivité à 1.

Ce que j'aimerais faire mais je ne sais pas comment il faut s'y prendre :
- rechercher du contenu appartenant à une table liée en hasAndBelongsToMany
Par exemple si l'utilisateur tape "MS EXCEL" dans le formulaire de recherche, j'aimerai pouvoir aller chercher via les tables softwares et softwares_trainings quelles formations (trainings) sont rattachées au logiciel (software) MS EXCEL

Auriez-vous quelques pistes ?

Merci !
Stéphane.

Mon SearchesController.php intégral :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
 
<?php
App::uses('AppController','Controller');
class SearchesController extends AppController{
 
	public $uses = array('Training', 'Instruction');
 
    public $components = array('Paginator');
 
    public $paginate = array(
        'limit' => 5,
        /*'contain' => array('Category.name', 
                            'Type.name', 
                            'Type.shortcutname', 
                            'Maturity.name', 
                            'Maturity.shortcutname', 
                            'Duration.name', 
                            'Duration.shortcutname', 
                            'Selftraining.name',
                            'Selftraining.shortcutname', 
                            'User.firstname', 
                            'User.lastname', 
                            'User.username'),*/
        'order' => array(
            'Training.created' => 'desc'
        )
    );
 
	public function index() {
 
		$this->loadModel('Trainings'); //'Trainings', 
        $this->Training->recursive = 1;
        //$this->Instruction->recursive = 1;
 
        $this->Paginator->settings = $this->paginate;
 
        $conditions = array();
 
        //Transform POST into GET
 
 
        if(($this->request->is('post') || $this->request->is('put')) && isset($this->data['Filter'])){
                $filter_url['controller'] = $this->request->params['controller'];
                $filter_url['action'] = $this->request->params['action'];
                // We need to overwrite the page every time we change the parameters
                $filter_url['page'] = 1;
                // for each filter we will add a GET parameter for the generated url
                foreach($this->data['Filter'] as $name => $value){
                        if($value){
                                // You might want to sanitize the $value here
                                // or even do a urlencode to be sure
                                $filter_url[$name] = urlencode($value);
                        }
                }       
                // now that we have generated an url with GET parameters, 
                // we'll redirect to that page
                return $this->redirect($filter_url);
        }
        //debug($this->request);
 
         else {
                // Inspect all the named parameters to apply the filters
                foreach($this->params['named'] as $param_name => $value){
                        // Don't apply the default named parameters used for pagination
                        if(!in_array($param_name, array('page','sort','direction','limit'))){
                                // You may use a switch here to make special filters
                                // like "between dates", "greater than", etc
                                if($param_name == "searchInput"){
                                        $conditions['OR'] = array(/*
                                            array('Category.name LIKE' => '%' . $value . '%'),
                                            array('Instruction.category_id LIKE' => '%' . $value . '%'),
                                            array('Instruction.category_id LIKE' => '%' . $value . '%'),*/
                                            array('Training.content LIKE' => '%' . $value . '%'),
                                            array('Training.goal1 LIKE' => '%' . $value . '%'),
                                            array('Training.goal2 LIKE' => '%' . $value . '%'),
                                            array('Training.goal3 LIKE' => '%' . $value . '%'),
                                            array('Training.goal4 LIKE' => '%' . $value . '%'),
                                            // ceci marche array('Maturity.name LIKE' => '%' . $value . '%')//
                                            array('Software.name LIKE' => '%' . $value . '%')
                                        );
                                } //else {
                                  //      $conditions['Training.'.$param_name] = $value;
                                //}                                       
                                $this->request->data['Filter'][$param_name] = $value;
                        }
                }
        }
 
        //$searches = $this->Paginator->paginate('Instruction', $conditions);
        $searches = $this->Paginator->paginate('Training', $conditions);
        $this->set(compact('searches'));
 
        // Pass the search parameter to highlight the text
        $this->set('searchInput', isset($this->params['named']['searchInput']) ? $this->params['named']['searchInput'] : "");
 
	}
 
 
}
?>