Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/06/2011, 18h03   #1
Invité de passage
 
Inscription : mars 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 60
Points : 1
Points : 1
Par défaut Comment faire une recherche sur plusieurs tables

Bonjour,
J'ai essayé d'appliquer le même principe de la recherche utilisée dans le tutoriel de Jobeet.
Le seule différence est que je veux faire une recherche sur plusieurs tables et non pas une seule(le cas de jobeet).
Pouvez vous me m'aider par vos idées pour savoir comment je peux faire un moteur de recherche sur plusieurs tables de la base de données pour obtenir un résultat satisfaisant?
Merci.
farhaenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/06/2011, 18h27   #2
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Au pire tu peux toujours créer un vue de données au niveau de MySQL masi ce n'est qu'une façon de contourner le problème.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 11h25   #3
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
Toute tes données sont chargés à l'écran et tu voudrais faire un tri avec un champ recherche, c'est ca ?
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 11h30   #4
Invité de passage
 
Inscription : mars 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 60
Points : 1
Points : 1
Bonjour,
J'ai un probléme de réaliser le moteur de recherche via une seule table dans la BDD(pour le moment.
En effet,j'ai ajouté la classe suivante à mon fichier projectConfiguration.class.php:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    // for compatibility / remove and enable only the plugins you want
    $this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
  }
  static protected $zendLoaded = false;
 
  static public function registerZend()
  {
    if (self::$zendLoaded)
    {
      return;
    }
 
    set_include_path(sfConfig::get('sf_lib_dir').'/vendor'.PATH_SEPARATOR.get_include_path());
    require_once sfConfig::get('sf_lib_dir').'/vendor/Zend/Loader/Autoloader.php';
    Zend_Loader_Autoloader::getInstance();
    self::$zendLoaded = true;
  }
}
.
Ensuite,j'ai ajouté le code suivant à mon fichier AnapathTable.class.php:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
static public function getLuceneIndex()
{
  ProjectConfiguration::registerZend();
 
  if (file_exists($index = self::getLuceneIndexFile()))
  {
    return Zend_Search_Lucene::open($index);
  }
  else
  {
    return Zend_Search_Lucene::create($index);
  }
}
 
static public function getLuceneIndexFile()
{
  return sfConfig::get('sf_data_dir').'/anapath.'.sfConfig::get('sf_environment').'.index';
}
.
Ensuite j'ai ajouté le script suivant à mon fichier Anapath.class.php:
Code :
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
public function save(Doctrine_Connection $conn = null)
{
  $conn = $conn ? $conn : AnapathTable::getConnection();
  $conn->beginTransaction();
  try
  {
    $ret = parent::save($conn);
 
    $this->updateLuceneIndex();
 
    $conn->commit();
 
    return $ret;
  }
  catch (Exception $e)
  {
    $conn->rollBack();
    throw $e;
  }
}
public function updateLuceneIndex()
{
  $index = AnapathTable::getLuceneIndex();
 
  // remove existing entries
  foreach ($index->find('pk:'.$this->getId()) as $hit)
  {
    $index->delete($hit->id);
  }
 
 
 
  $doc = new Zend_Search_Lucene_Document();
 
  // store anapath primary key to identify it in the search results
  $doc->addField(Zend_Search_Lucene_Field::Keyword('pk', $this->getId()));
 
  // index anapath fields
  $doc->addField(Zend_Search_Lucene_Field::UnStored('poids', $this->getPoids, 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('gleason', $this->getGleason(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('gleason_max', $this->getGleasonMax(), 'utf-8'));
  $doc->addField(Zend_Search_Lucene_Field::UnStored('gleason_tertiaire', $this->getGleasonTertiaire(), 'utf-8'));
 
  // add anapath to the index
  $index->addDocument($doc);
  $index->commit();
}
public function delete(Doctrine_Connection $conn = null)
{
  $index = AnapathTable::getLuceneIndex();
 
  foreach ($index->find('pk:'.$this->getId()) as $hit)
  {
    $index->delete($hit->id);
  }
  return parent::delete($conn);
}
J'ai ajouté dans mon fichier routing.yml:
Code :
1
2
3
anapath_search:
  url:   /search
  param: { module: anapath, action: search }
Ensuite dans le fichier action.class.php j'ai ajouté:
Code :
1
2
3
4
5
6
7
8
9
public function executeSearch(sfWebRequest $request)
  {
    if (!$query = $request->getParameter('query'))
    {
      return $this->forward('anapath', 'index');
    }
 
    $this->anapaths = Doctrine::getTable('Anapath') ->getForLuceneQuery($query);
  }
.
J'ai ajouté aussi le template searchSuccess.php:
Code :
1
2
3
<div id="anapaths">
  <?php include_partial('anapath/list', array('anapaths' => $anapaths)) ?>
</div>
Le fichier AnapathTable.Class.php est modifié de la façon suivante:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public function getForLuceneQuery($query)
{
  $hits = $this->getLuceneIndex()->find($query);
 
  $pks = array();
  foreach ($hits as $hit)
  {
    $pks[] = $hit->pk;
  }
 
  if (empty($pks))
  {
    return array();
  }
 
  $q = $this->createQuery('j')
    ->whereIn('j.id', $pks)
    ->limit(20);
  //$q = $this->addActiveJobsQuery($q);
 
  return $q->execute();
}
.
Enfin dans le layout,j'ai ajouté:
Code :
1
2
3
4
5
6
7
8
9
<li <?php if($sf_user->getAttribute('menu') == 3) echo 'class="active"'; ?>><a href="<?php echo url_for('@anapath_search') ?>">Search</a>
 
<form action="<?php echo url_for('@anapath_search') ?>" method="get">
  <input type="text" name="query" value="<?php echo $sf_request->getParameter('query') ?>" id="search_keywords" />
  <input type="submit" value="search" />
 
</form>
 
			</li>
.
Mon probléme est que la recherche ne s'exécute pas.Toujours l'erreur "Action "search/index" does not exist." s'affiche.
Pourriez vous m'aider pour résoudre ce probléme et pour faire fonctionner le moteur de recherche?
farhaenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 11h44   #5
Membre à l'essai
 
Homme
Développeur Web
Inscription : avril 2011
Messages : 40
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2011
Messages : 40
Points : 23
Points : 23
Tu dois avoir un fichier qui s'appelle IndexSuccess dans ton dossier template. Sinon ca ne marche pas. Même un fichier vide ca fera l'affaire.
micky86 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 11h48   #6
Invité de passage
 
Inscription : mars 2011
Messages : 60
Détails du profil
Informations forums :
Inscription : mars 2011
Messages : 60
Points : 1
Points : 1
Ci joint l'arborescence de mon module anapath qui contient l'action search.
Images attachées
Type de fichier : png arborescence_anapath.PNG (7,8 Ko, 7 affichages)
farhaenis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 17h47   #7
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Dans ton contrôleur (action.class.php ) ton action s'appelle Shearch (executeSearch).

Soit tu la renommes Index (executeIndex) soit tu renommes ton url.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h32.


 
 
 
 
Partenaires

Hébergement Web