IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Input de recherche et action associée [1.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de blasil64
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 324
    Par défaut Input de recherche et action associée
    Bonjour à tous,
    J'aimerais pouvoir faire une recherche sur mon futur site web. j'avais lu il y 3 mois le tutoriel de Jobeet sur la recherche et je me demandais s'il n'y avait que cette solution où si on pouvait avoir mieux ou plus facile ? Parce que j'avoue qu'il est assez long et complexe je trouve à réaliser avec cet outil de Zend...

    Merci d'avance pour vos réponses !

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    Je ne vois pas des milliers de possibilités.

    Soit tu utilises un outils comme le lucent, un peu lourd, mais performant et local.

    Soit tu utilise google ou un de ces copains limités à ton site (mais avec leur pub où tu ne touchera pas un centime)

    Soit tu développe un moteur de recherche simplifier qui convient pour ton appli.


    Après c'est une question de choix qui aura une réponse différente suivant l'application développée.

  3. #3
    Membre éclairé Avatar de blasil64
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 324
    Par défaut
    Bonjour. Merci pour tes réponses !

    Je me suis donc lancé avec Lucent. Très intéressant.

    Par contre, je n'ai pas tout à fait ce que je désire... En effet, si je tape le titre d'un film, rien ne s'affiche en résultat (ou si je cherche qu'un seul mot), et si je laisse mon input vide, j'obtiens tous mes films, mais pas avec le template rechercheSuccess...

    Je vous montre mon code si vous avez une idée d'où cela pourrait venir. Je ne met pas le routing.

    Le projectconfiguration :
    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
    <?php
    class ProjectConfiguration extends sfProjectConfiguration
    {
      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;
      }
     
     
      public function setup()
      {
        $this->enablePlugins('sfDoctrinePlugin', 'sfDoctrineGuardPlugin');
      }
    }?>
    Le filmTable.class.php :
    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
    <?php
     
    class FilmTable extends Doctrine_Table
    {
     
      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').'/film.'.sfConfig::get('sf_environment').'.index';
      }
     
     
     
    	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('f')
    		->whereIn('f.id', $pks)
    		->limit(20);
    	  $q = $this->addActiveJobsQuery($q);
     
    	  return $q->execute();
    	}
    }?>
    Le film.class.php :
    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
    class Film extends BaseFilm
    {
    	public function save(Doctrine_Connection $conn = null)
    	{
    	  $conn = $conn ? $conn : $this->getTable()->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 = $this->getTable()->getLuceneIndex();
     
    	  // remove existing entries
    	  foreach ($index->find('pk:'.$this->getId()) as $hit)
    	  {
    		$index->delete($hit->id);
    	  }
     
    	  $doc = new Zend_Search_Lucene_Document();
     
    	  // store job primary key to identify it in the search results
    	  $doc->addField(Zend_Search_Lucene_Field::Keyword('pk', $this->getId()));
     
    	  // index job fields
    	  $doc->addField(Zend_Search_Lucene_Field::UnStored('titre', $this->getTitre(), 'utf-8'));
    	  $doc->addField(Zend_Search_Lucene_Field::UnStored('realisateur', $this->getRealisateur(), 'utf-8'));
    	  $doc->addField(Zend_Search_Lucene_Field::UnStored('acteurs', $this->getActeurs(), 'utf-8'));
    	  $doc->addField(Zend_Search_Lucene_Field::UnStored('resume', $this->getResume(), 'utf-8'));
    	  $doc->addField(Zend_Search_Lucene_Field::UnStored('critique', $this->getCritique(), 'utf-8'));
     
    	  // add job to the index
    	  $index->addDocument($doc);
    	  $index->commit();
    	}
     
     
    	public function delete(Doctrine_Connection $conn = null)
    	{
    	  $index = $this->getTable()->getLuceneIndex();
     
    	  foreach ($index->find('pk:'.$this->getId()) as $hit)
    	  {
    		$index->delete($hit->id);
    	  }
     
    	  return parent::delete($conn);
    	}
    }?>
    Mon action de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function executeRecherche(sfWebRequest $request)
      {
    	if (!$query = $request->getParameter('query'))
        {
          return $this->forward('film', 'index');
        }
        $this->films = Doctrine::getTable('Film') ->getForLuceneQuery($query);
      }
    Mon rechercheSuccess.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Recherche du film 
    		<?php foreach ($films as $film):?>
    			<a href="<?php echo url_for('film/show?id='.$film->getId()) ?>">
    			<img src="<?php echo $film->getAffiche() ?>" width="120" height="160" title="Affiche du film" alt="Affiche du film"/>
    					<a/>
    				<a href="<?php echo url_for('film/show?id='.$film->getId()) ?>">
    					<?php echo $film->getTitre(); ?>
    				<a/><br/>
    				...
    		<?php endforeach; ?>
    Et pour finir, l'input de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <form action="<?php echo url_for('@recherche') ?>" method="GET" id="recherche_form">
    			<input class="input" type="text" name="query" value="<?php echo $sf_request->getParameter('query') ?>" id="search_keywords" />
    			<input type="submit" value="Rechercher"/><br/>
    		</form>

    Merci d'avance pour vos réponses !

  4. #4
    Invité
    Invité(e)
    Par défaut
    Désolé, ça peut sembler idiot comme question mais bon :

    Vu que l'indexation est effectuée au moment de la sauvegarde, est-ce que tu as bien été re-sauvegarder un de tes film sur lequel faire le test ?

  5. #5
    Membre éclairé Avatar de blasil64
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 324
    Par défaut
    Quand tu parles de sauvegarde, est-ce qu'une insertion avec phpMyAdmin réalise une sauvegarde ? Car j'ai tout réinséré avec des insert en mode SQL sous phpMyAdmin...

    Merci pour ta réponse !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Non La mise à jour de l'index est faite via la surcharge de la méthode save() dans ton modèle.
    Il faut donc que ce soit Doctrine qui sauvegarde l'objet. Soit via un module généré par l'admin générator, soit via un doctrine:data-load.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche d'action via CVS sous Eclipse
    Par apqmwnqmap dans le forum Eclipse Java
    Réponses: 7
    Dernier message: 12/09/2012, 11h02
  2. enlever une Action associée à un JButton
    Par tanguy.L dans le forum Composants
    Réponses: 3
    Dernier message: 05/05/2008, 10h41
  3. recherche mutlicritere+ action sur ligne
    Par oscar.cesar dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 21/03/2008, 06h34
  4. Recherche entreprise ou association pour un site web
    Par DreammyKetty dans le forum Stages
    Réponses: 5
    Dernier message: 07/01/2008, 01h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo