2009-04-03 12 views
1

J'implémente une zone de recherche en utilisant CodeIgniter, mais je ne suis pas sûr de la façon dont je devrais passer les paramètres de recherche. J'ai trois paramètres: la chaîne de recherche; catégorie de produit; et l'ordre de tri. Ils sont tous facultatifs. Actuellement, j'envoie les paramètres via $_POST à une méthode temporaire, qui transmet les paramètres au formulaire URI standard. Cela fonctionne bien. J'utilise un format URI bizarre si:CodeIgniter: URI et formulaires

http://site.com/products/search=computer,sort=price,cat=laptop 

Quelqu'un at-il un meilleur/plus propre format des choses en passant par? Je pensais de le passer dans la méthode des produits comme arguments, mais comme les paramètres sont optionnels, les choses seraient malpropres. Devrais-je le sucer, et il suffit d'activer les méthodes $_GET? Merci d'avance!

Répondre

3

chaînes de requête

Vous pouvez enable query strings in CodeIgniter pour permettre à un plus standard fonction de recherche.

Config.php

$config['enable_query_strings'] = FALSE; 

Une fois activé, vous pouvez accepter ce qui suit dans votre application:

http://site.com/products/search?term=computer&sort=price&cat=laptop 

L'avantage est que l'utilisateur trouvera facile à modifier l'URL pour modifier rapidement leur recherche et votre recherche utilise une fonctionnalité de recherche commune. L'inconvénient de cette approche est que vous allez à l'encontre de l'une des décisions de conception de l'équipe de développement CodeIgniter. Cependant, mon opinion personnelle est que ceci est OK à condition que les chaînes de requête ne soient pas utilisées pour la majeure partie de votre contenu, uniquement pour des cas particuliers tels que les requêtes de recherche.

+2

Le seul problème que je vois est que cela ne fonctionne pas bien avec la classe de pagination intégrée. Aucun conseil? –

0

Si vous utilisez un nombre fixe de paramètres, vous pouvez leur affecter une valeur par défaut et l'envoyer au lieu de ne pas envoyer le paramètre du tout. Par exemple

http://site.com/products/search/all/somevalue/all 

Ensuite, le contrôleur vous pouvez ignorer le paramètre si (paramètre == 'all'.)

Class Products extends Controller { 
... 

    // From your code I assume that this your structure. 
    function index ($search = 'all', $sort = 'price', $cat = 'all') 
    { 
     if ('all' == $search) 
     { 
      // don't use this parameter 
     } 
     // or 
     if ('all' != $cat) 
     { 
      // use this parameter 
     } 
     ... 
    } 
    ... 
} 
1

Une meilleure approche et la méthode des développeurs CI destinées, est d'ajouter tous vos paramètres de recherche à l'URI au lieu d'une chaîne de requête comme ceci:

http://site.com/products/search/term/computer/sort/price/cat/laptop 

Vous pouvez ensuite analyser tous les segments URI à partir du 3ème segment ("term") dans un tableau de paires clé => valeur avec la fonction uri_to_assoc($segment) de la classe URI.

Class Products extends Controller { 
... 

    // From your code I assume you are calling a search method. 
    function search() 
    { 
     // Get search parameters from URI. 
     // URI Class is initialized by the system automatically. 
     $data->search_params = $this->uri->uri_to_assoc(3); 
     ... 
    } 
    ... 
} 

Cela vous donne un accès facile à tous les paramètres de recherche et ils pourraient être dans un ordre quelconque dans l'URI, comme une chaîne de requête traditionnelle.

$data->search_params serait maintenant contenir un tableau de vos segments URI:

Array 
(
    [term] => computer 
    [sort] => price 
    [cat] => laptop 
) 

En savoir plus sur ici l'URI Classe: http://codeigniter.com/user_guide/libraries/uri.html