Composant de recherche avancée

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • Composant de recherche avancée

    Bonjour,
    Je ne sais pas si je suis au bonne endroit pour poser cette question, mais bon ...
    Je développe un composant pour Joomla dans lequel je dois effectuer certaines recherches d'où une page de recherche avancée faisant appel à un Model/Book.php
    Code PHP:
     public function onBeforeBuildQuery($query$overrideLimits false)
    {
    /**
    * TMP FIX
    */
    $query->clear('from')->from($this->getTableName() . ' AS book');
    $this->setBehaviorParam('tableAlias''book');
    $outerGlue $this->input->get('_outerGlue');

    /**
    * /TMP FIX
    */

    if ($this->input->get('_resetState') == 1)
    {
    // Save the state we need to keep
    $limit $this->getState('limit');

    // Reset model and user state
    $this->clearState()->reset();
    \JFactory::getApplication()->setUserState(substr($this->getHash(), 0, -1), null);

    // Set back the saved state
    $this->input->set('limit'$limit);
    $this->setState('limit'$limit);
    }


    //Pour la recherche avancé
    //Recheche avancée titre et autre ...

    //Recherche dans la table __Copies
    if($this->input->get('advancedsearch') !=''){

    if (
    $this->input->get('copiesStatusId'))
    {
    $this->input->set('copies',
    array_merge(['statusId' => $this->input->get('copiesStatusId')],$this->input->get('copies', [], 'array') )
    );
    }
    if (
    $this->input->get('copiesLibraryId'))
    {
    $this->input->set('copies',
    array_merge(['libraryId' => $this->input->get('copiesLibraryId')],$this->input->get('copies', [], 'array') )
    );
    }
    if (
    $this->input->get('origin'))
    {
    $this->input->set('copies',
    array_merge(['origin' => $this->input->getString('origin')],$this->input->get('copies', [], 'array') )
    );
    }

    if (
    $this->input->get('location'))
    {
    $this->input->set('copies',
    array_merge(['location' => $this->input->getString('location')],$this->input->get('copies', [], 'array') )
    );
    }

    if (
    $this->input->get('statusBib'))
    {
    $this->input->set('copies',
    array_merge(['statusBib' => $this->input->getString('statusBib')],$this->input->get('copies', [], 'array') )
    );
    }
    //exclure les périodques;
    if ($this->input->get('hideperiodique') == 1)
    {
    $this->input->set('copies',
    array_merge(['hideperiodique' => $this->input->getString('hideperiodique')],$this->input->get('copies', [], 'array') )
    );
    }
    //todo les select peuvent être mis indépendement les uns des autres
    $select " AND " ;

    if ((
    $copies $this->getState('copies'))
    && 
    array_filter($copies))
    $sql '';
    if (!empty(
    $copies['number']))
    $sql .= ('(`copie`.`number` = "' $copies['number'] . '")' $select.'');

    if (!empty(
    $copies['cote']))
    $sql .= ('(`copie`.`cote` LIKE "' $copies['cote'] . '%")' $select.'');

    if (!empty(
    $copies['origin']))
    $sql .= ('(`copie`.`origin` LIKE "' $copies['origin'] . '%")' $select.'');

    if (!empty(
    $copies['location']))
    $sql .= ('(`copie`.`location` LIKE "' $copies['location'] . '%")' $select.'');

    if (!empty(
    $copies['statusId']))
    $sql .= ('(`copie`.`nglibrary_bookstatus_id` = "' $copies['statusId'] . '")' $select.'');

    if (!empty(
    $copies['libraryId']))
    $sql .= ('(`copie`.`nglibrary_library_id` = ' $copies['libraryId'] . ')' $select.'');

    if (!empty(
    $copies['statusBib']))
    $sql .= ('(`copie`.`status_bib` = "' $copies['statusBib'] . '")' $select.'');

    if (!empty(
    $copies['hideperiodique']))
    $sql .= ('(`copie`.`periodique` != "' $copies['hideperiodique'] . '")' $select.'');

    if(
    substr($sql,-3) == ' OR '){
    $sql substr($sql,0,-3);
    }else{
    $sql substr($sql,0,-4);
    }

    //Recherche dans la table __Books
    if (!empty($this->input->get('title')))
    {
    $sql2 ='';
    //j'enleve les prefixes du titre pour la recherche
    $title preg_replace ("#^(le |la |les |LE |LA |LES )#","",$this->input->get('title'));
    $this->input->set('title'$title);
    $this->input->set('subtitle'$title); //OR
    $this->input->set('coll5'$title); //OR autres titres
    $sql2 .= ('(`book`.`title` LIKE "%' $title '%") OR ');
    $sql2 .= ('(`book`.`subtitle` LIKE "%' $title '%") OR ');
    $sql2 .= ('(`book`.`coll5` LIKE "%' $title '%") OR ');

    if(
    substr($sql2,-3) == ' OR '){
    $sql2 substr($sql2,0,-3);
    }else{
    $sql2 substr($sql2,0,-4);
    }
    }

    //Requete SQL ?
    $sqli2 "((SELECT COUNT(*) FROM `#__nglibrary_books` AS book WHERE $sql2) >= '1')";
    $this->input->set('_outerGlue','AND');
    $sqli "((SELECT COUNT(*) FROM `#__nglibrary_copies` AS copie WHERE $sql) >= '1')";

    $query->Where($sqli2,$outerGlue);
    $query->Where($sqli);
    return;
    }
    }else{

    /**
    * Convert simple search to normal one
    */
    if ($search $this->input->get('search'null'string'))
    {

    if (
    $this->input->get('title') == 'Y')
    {
    //j'enleve les prefixes du titre pour la recherche
    $search preg_replace ("#^(le |la |les |LE |LA |LES )#","",$search);
    $this->input->set('title'$search);
    $this->input->set('subtitle'$search); //OR
    $this->input->set('coll5'$search); //OR autres titres
    }
    if (
    $this->input->get('isbn') == 'Y')
    {
    $this->input->set('isbn'$search);
    }

    if (
    $this->input->get('serie') == 'Y')
    {
    $this->input->set('serie'$search);
    }

    if (
    $this->input->get('collection') == 'Y')
    {
    $this->input->set('collection'$search);
    }

    if (
    $this->input->get('interest') == 'Y')
    {
    $this->input->set('coll7'$search);
    }

    if (
    $this->input->get('topic') == 'Y')
    {
    $this->input->set('coll6'$search);
    }

    if (
    $this->input->get('resume') == 'Y')
    {
    $this->input->set('resume'$search);
    }
    if (
    $this->input->get('cote') == 'Y')
    {
    $this->input->set('copies', ['cote' => $search]);
    }
    if (
    $this->input->get('editor') == 'Y')
    {
    $this->input->set('editor', ['title' => $search]);
    }
    if (
    $this->input->get('origin') == 'Y')
    {
    $this->input->set('copies',['origin' => $search]);
    }
    if (
    $this->input->get('author') == 'Y')
    {
    //Il faut creer une table avec chaque terme et effectuer une recherche de ceux ci
    $search preg_split("/[\s,]+/",$search);
    $this->input->set('authors', ['title' => $search]);
    }
    if (
    $this->input->get('exemplaire') == 'Y')
    {
    $this->input->set('copies', ['number' => $search]);
    }
    }



    /**
    * Manage createOn using 'days'
    */
    if ($this->input->get('days') >= 1)
    {
    $today date('Y-m-d');
    $days date('Y-m-d'strtotime($today' -'$this->input->get('days') .' days'));

    $created_on['method'] = 'between';
    $created_on['from'] = $days;
    $created_on['to'] = $today;

    $this->input->set('created_on'$created_on);
    }


    /**
    * Handle relations filter
    * - Level 1 relations, using FOF
    * - Level 2 relations, using Joomla
    */
    if (($editor $this->getState('editor'))
    && 
    array_filter($editor))
    {
    $this->whereHas('editor', function(\JDatabaseQuery $q) use ($editor) {
    $q->where('`title` = "' $editor['title'] . '"');
    });
    }

    if (
    $author_adv $this->getState('author_adv'))
    {
    //Il faut creer une table avec chaque terme et effectuer une recherche de ceux ci
    $authors preg_split("/[\s,]+/",$author_adv);
    $this->input->set('authors', ['title' =>$authors]);
    }

    if ((
    $authors $this->getState('authors'))
    && 
    array_filter($authors))
    {
    $this->whereHas('authors', function(\JDatabaseQuery $q) use ($authors)
    {
    if (!empty(
    $authors['title']))
    foreach (
    $authors['title'] as $searchauth)
    $q->extendwhere('AND','`title` LIKE "%' $searchauth '%"','OR');

    if (!empty(
    $authors['id']))
    $q->extendwhere('AND','`pivotTable`.`nglibrary_author _id` = ' $q->q($authors['id']) . '','OR');
    });
    }



    }


    Pourquoi est-ce qu'à partir de ce code le resultat fait systématiquement appel à la table book correspondant au $Query ?
    Voisi le resultat de la requete :

    SELECT *
    FROM nr3zk_nglibrary_books AS book
    WHERE ((SELECT COUNT(*)
    FROM `nr3zk_nglibrary_books` AS book WHERE (`book`.`title` LIKE "%tintin%") OR (`book`.`subtitle` LIKE "%tintin%") OR (`book`.`coll5` LIKE "%tintin%")) >= '1')
    OR
    ((SELECT COUNT(*) FROM `nr3zk_nglibrary_copies` AS copie WHERE (`copie`.`origin` LIKE "La Ferté Fresnel - Fonds Propre%") AND (`copie`.`nglibrary_library_id` = 2) ) >= '1')
    OR (`book`.`title` LIKE '%tintin%') OR (`book`.`subtitle` LIKE '%tintin%') OR (`book`.`coll5` LIKE '%tintin%')
    ORDER BY `title` ASC,`title` ASC LIMIT 20

    Si par hasard l'un d'entre vous avez un exemple de page de recherche avancée sur plusieurs tables SQL je suis preneur.
    merci à vous

  • #2
    bonnjour,
    quel devrais être le résultat?

    Quand à de la recherche multi critères, tu as regardé le code du composant de recherche avancé et ses plugins associés?

    Commentaire

    Annonce

    Réduire
    Aucune annonce pour le moment.

    Partenaire de l'association

    Réduire

    Hébergeur Web PlanetHoster
    Travaille ...
    X