2011-01-24 2 views
2

J'ai une application avec une table appelée projets que je voudrais pouvoir rechercher. Je préférerais utiliser une méthode existante pour appeler le modèle pour obtenir les résultats de la requête. Donc mon format d'URL est juste example.com/projects/id/slug et pour ALL project juste example.com/projects. J'aimerais avoir un formulaire de recherche qui transmet les mots-clés à la méthode sous forme de chaîne.

Je sais que CI ne permet pas _GET $ par défaut:

Depuis le manuel de CodeIgniter sur la sécurité:

GET, POST et COOKIE données

données GET est tout simplement interdit par CodeIgniter, car le système utilise des segments d'URI plutôt que des chaînes de requête URL (sauf si l'option de chaîne de requête est activée dans y notre fichier de configuration). Le tableau GET global est désactivé par la classe d'entrée lors de l'initialisation du système.

Ma question est comment puis-je utiliser des segments d'URI de cette manière avec plusieurs mots-clés? Est-ce que je peux faire quelque chose comme search/keyword + secondkeywordword + thirdkeyword? L'utilisation d'un formulaire existe-t-il quand même pour obtenir des mots-clés d'une zone de texte dans le format ci-dessus?

Merci,

Billy

Répondre

3

Si vous vouliez le faire comme ça ...

Vous pouvez tout simplement faire quelque chose comme ça, en supposant il y a plusieurs entrées de poste et ils sont seulement pour la recherche, il pourrait ressembler à ceci

function search(){ 

    $url = $this->uri->segment(2); 

    if(empty($url)){ 
     if((isset($_POST) && (!empty($_POST)) 
     { 
     $search_seg = ''; 

     foreach($_POST as $k => $v){ 
      // I always make sure to use the CI post w/ 
      // TRUE set in the second param so as to XSS filter the user input 
      $var = $this->input->post($k, TRUE); 
      // Just incase the user input had a plus in it? 
      $var = str_replace('+', '%20', $var) 
      // Concatenate the search string 
      $search_seg .= $var . '+'; 
     } 

     // Make the url, use substr() to strip the last + off the end 
     $search_seg = 'search/' . substr($search_seg, 0, -1); 

     /* Make sure CI's URL helper is enabled 
      $this->load->helper('url'); if it hasn't been loaded 
      This will give the illusion that the form post went to this URL, 
      thus doing what you're looking for... */ 
     redirect($search_seg, 'location'); 

     }else{ 
     // There was no post, do whatever 
     } 
    }else{ 
     $search_arr = explode('+', $url); 
    } 

ce qui précède devrait faire à peu près exactement ce que vous avez décrit, bien qu'il existe des façons de recréer le tableau $ _GET et toujours les utiliser avec les URL de style de CI, bien que ce soit un peu plus compliqué

INFORMATIONS COMPLÉMENTAIRES:

S'il n'y a qu'un champ de recherche et que, disons, les termes sont séparés par des espaces, alors vous pouvez le faire comme ceci (avec peut-être un peu de filtrage regex) ...remplacer la boucle foreach($_POST as $k => $v)... avec ceci:

$keywordinput = $this->input->post('keywords', TRUE); 
$keywordinput = trim($keywordinput); 

$keywords = explode(' ', $keywordinput); 

foreach($keywords as $word){ 
    if(!empty($word)){ 
     $word = str_replace('+', '%20', $var) 
     $search_seg .= $word . '+'; 
    } 
} 
+0

merci, je vais avoir un essai à ce – iamjonesy

+0

Bien comment pourrais-je obtenir le texte d'entrée dans la uri? Si j'utilise GET alors il sort comme? Keywords = – iamjonesy

+0

ne pas utiliser GET, utilisez POST. le point de ce qui précède est que si vous utilisez le code ci-dessus et utilisez action = "www.yoursite.com/search/" method = "POST" alors il faudra les mots-clés, les séparer avec +, puis rediriger vers l'uri complet , que vous pouvez ensuite utiliser pour montrer tout ce que vous voulez montrer à l'uri correct ... il suffit de lire l'exemple et de réaliser comment cela fonctionne – tgriesser

0

en utilisant $ _POST pourrait être une meilleure option pour les requêtes complexes, mais cela peut fonctionner, mais nécessite l'URI d'avoir un ordre spécifique des paramètres (il peut y avoir de meilleures façons)

/*controller/method/params = search/do_search/Ross/Red/Male */ 

function do_search($name, $colour, $gender) 
{ 
    $this->db->or_where('name', $name); 
    $this->db->or_where('colour', $colour); 
    $this->db->or_where('gender', $gender); 
    // etc 
} 

pas très prorogeable ou flexible, mais pour simples recherches, il pourrait être suffisant.

0

si vous voulez que votre URL pour être comme ça -

search/keyword+secondkeyword+thirdkeyword? 

et veulent aussi qu'il soit bookmarkable puis en utilisant javascript est seule option que je suppose.

utilisation de javascript vous pouvez définir les paramètres de recherche dans url après # si l'URL finale sera quelque chose comme ça -

search#keyword+secondkeyword+thirdkeyword 

Si vous utilisez cette approche qui signifie que vous chargerez votre résultat de recherche par ajax-à-dire chaque temps où une URL est rencontrée, vous obtiendrez des mots-clés de recherche après hash d'URL par javascript. charger les résultats par ajax et afficher les résultats. Si les critères de recherche sont modifiés, chaque fois que vous avez besoin d'ajouter le nouveau mot-clé à l'url après hachage en utilisant javascript.

Basic code javascript pour obtenir les paramètres dans l'URL après # est comme ci-dessous -

var parameters = window.location.hash; 
Questions connexes