2010-12-13 36 views
4

Le cadre de jeu a une fonction dans la vue de créer une URL conviviale SEO via la fonction slugify(). Il ne semble pas y avoir de fonction "unllugify", alors comment chercher des modèles à partir du paramètre slugified?Jouez! Framework: Comment rechercher un élément à partir d'une URL "slugify()"?

Si, par exemple, j'ai un modèle de blog qui a une propriété de titre réglé sur « Bonjour tout le monde », slugify produirait « bonjour monde ». Si j'effectue ensuite une requête Blog.find("byTitle", title) où le titre est le titre slugifié, il ne retournera aucun résultat. Comment pouvez-vous rechercher un modèle en utilisant la limace fournie?

Répondre

14

Il ne semble pas être une méthode, mais je ne suis pas surpris. Slugify supprime les caractères de la chaîne et unslugify ne sait pas où le mettre avant.

Par exemple, si vous regardez l'URL de cette question, il est

stackoverflow.com/questions/4433620/play-framework-how-do-i-lookup-an-item-from-a-slugify-url 

Il a supprimé l'exclamation (!), les parenthèses et les citations du titre de cette question. Comment une méthode Unslugify sait-elle comment et où remettre ces caractères?

L'approche que vous voulez prendre est d'inclure également l'ID, tout comme l'URL stackoverflow a.

Si vous voulez prendre le même format que l'URL stackoverflow, votre itinéraire serait

GET /questions/{id}/{title}    Question.show() 

Ensuite, dans votre action, vous auriez ignorer le titre, et simplement faire Blog.findById(id);

Vous avez alors une URL conviviale pour le référencement, ainsi qu'une bonne approche REST pour accéder à l'article du blog.

+6

Juste pour souligner, le paramètre slugified existe * uniquement * pour les moteurs de recherche. Votre site devrait fonctionner de la même manière avec ou sans. –

+0

C'était comme ça que j'étais déjà allé, merci pour la validation de mon approche! –

+0

Est-il possible que quelqu'un sait avoir l'URL incluent automatiquement le titre slugified, ou est-ce besoin d'être spécifié lors de chaque URL est générée. c'est-à-dire @ {Blog.show (id, title.slugify)}. Merci. –

2

En fait, vous pouvez: vous devez stocker la chaîne slugified dans votre base de données.

Dans votre modèle :

//import ... ; 

import play.templates.JavaExtensions; 

@Entity 
public class Product extends Model{ 
    public String name; 
    public String slug; 

    @PrePersist 
    @PreUpdate 
    void pre_update(){ 
     this.slug = JavaExtensions.slugify(this.name); 

     // Prevent duplicates 
     Long dup_slug = Product.count("bySlug", this.slug); 
     if(dup_slug>0){ this.slug += "_"+this.id; } 
    } 
} 

Dans votre contrôleur :

public static void show(String prod_slug) { 
    Product prod = Product.find("bySlug", prod_slug).first(); 
    notFoundIfNull(prod); 
    renderText("Product: <a href='/products/"+prod.slug+"'>"+prod.name+"</a>"); 
} 

S'il vous plaît rappelez-vous de définir vos itinéraires:

# Products 
GET  /products/        Products.index 
GET  /products/{prod_slug}     Products.show