2011-07-05 10 views
3

私の最初の投稿です:)私はCRUDモジュールに問題があります。リストにフィルタを追加したいが、ファクトリモデルを理解するのに成功していない。私はこのコードを持っている:フィルタリングcrud list problem play!フレームワーク

@With(Secure.class) 
public class Contacts extends CRUD { 


public static void list(int page,String search,int origine,String searchFields, String orderBy, String order) { 
    ObjectType type = ObjectType.get(getControllerClass()); 
    notFoundIfNull(type); 
    if (page < 1) { 
     page = 1; 
    } 

    //System.out.println(type); 

    List<Model> contacts = Model.Manager.factoryFor(Contact.class).fetch((page - 1) * getPageSize(), getPageSize(), orderBy, order, searchFields == null ? new ArrayList<String>() : Arrays.asList(searchFields.split("[ ]")), search, (String) request.args.get("where")); 
    System.out.println(contacts); 

    List<Model> objects = type.findPage(page, search, searchFields, orderBy, order, (String) request.args.get("where")); 
    Long count = type.count(search, searchFields, (String) request.args.get("where")); 
    Long totalCount = type.count(null, null, (String) request.args.get("where")); 


    // Liste des origines 
    List<Origine> origines = Origine.find("order by nom asc").fetch(); 
    List<Employe> employes = Employe.find("order by nom asc").fetch(); 

    try { 
     render(type, objects, count, totalCount, page, orderBy, order, origines,employes); 
    } catch (TemplateNotFoundException e) { 
     render("CRUD/list.html", type, objects, count, totalCount, page, orderBy, order, origines, employes); 
    } 
} 

}

私はどのように私はそれを行うことができ出願された「原産地」と「employe」を検索したいですか?ご協力ありがとうございました。 :)

+0

フィルタのどのような行うことを期待していない...のObjectType幅なし成功事例のテストしていますか? – mandubian

+1

たぶん私は良い言葉を使っていないかもしれません...それは、検索データにもっとフィールドを追加しています。たとえば、私はContactを持っています。この表には、Employe(OnetoMany)、Origineとの関係があります。私は特定のEmployeとのすべての連絡先を表示したい(SQLはSELECT * FROM Contactと等しいです。id_employe = my_post_value) –

+0

JPAPlugin.JPAModelLoaderクラスの関数fetchおよびgetSearchQueriesを見ましたか?検索フィールドが分​​析されます! – mandubian

答えて

1

私は自分のコードで進歩する!あなたの助言は役に立ちました!今私はCRUDを拡張する新しいクラスRechercheを作成しました。連絡先やCompteや他のクラスのRechercheを拡張したいので、私は動的フィールドでフィールド "Contact"を変更したいと思います!私は

public class Recherche extends CRUD { 


public static List findPage(int page, String search, String searchFields, String orderBy, String order, String where) throws ClassNotFoundException{ 

    int pageLength = getPageSize(); 
    String q = "from Contact where 1=1 "; 
    if (search != null && !search.equals("")) { 
     String searchQuery = getSearchQuery(); 
     if (!searchQuery.equals("")) { 
      q += " and (" + searchQuery + ")"; 
     } 
     q += (where != null ? " and " + where : ""); 
    } else { 
     q += (where != null ? " and " + where : ""); 
    } 

    /** 
    * Ajout des champs auxiliaires 
    */ 
    List<Property> fields = Contact.Manager.factoryFor(Contact.class).listProperties(); 

    String qaux = ""; 
    List<Integer> relationArray = new ArrayList<Integer>(); 

    for (Property field : fields) { 
     if(field.isRelation){ 

      if(request.params.get(field.name) != null){ 
       int requestArg = Integer.parseInt(request.params.get(field.name)); 

       if(requestArg != 0){ 
        if (!qaux.equals("")) { 
         qaux += " and "; 
        } 
        relationArray.add(requestArg); 
        qaux += " "+field.name+"_id = ?"+(relationArray.size()+1)+" "; 
       } 
      } 
     } 
    } 
    if(!qaux.equals("")){ 
     q+= " and ("+qaux+") "; 
    } 
    /** 
    * Fin ajout champs auxiliaires 
    */ 


    if (orderBy == null && order == null) { 
      orderBy = "nom"; 
      order = "ASC"; 
    } 
    if (orderBy == null && order != null) { 
      orderBy = "nom"; 
    } 
    if (order == null || (!order.equals("ASC") && !order.equals("DESC"))) { 
      order = "ASC"; 
    } 
    q += " order by " + orderBy + " " + order; 
    Query query = Contact.em().createQuery(q); 
    if (search != null && !search.equals("") && q.indexOf("?1") != -1) { 
     query.setParameter(1, "%" + search.toLowerCase() + "%"); 
    } 

    // Champs auxiliaires 
    for (int i = 0; i < relationArray.size(); i++) { 
     query.setParameter((i+2), relationArray.get(i)); 
    } 


    query.setFirstResult((page - 1) * pageLength); 
    query.setMaxResults(pageLength); 

    return query.getResultList(); 
} 


public static Long count(String search, String searchFields, String where) { 
    String q = "select count(c.id) from Contact c where 1=1 "; 

    if (search != null && !search.equals("")) { 
     String searchQuery = getSearchQuery(); 
     if (!searchQuery.equals("")) { 
      q += " and (" + searchQuery + ")"; 
     } 
     q += (where != null ? " and " + where : ""); 
    } else { 
     q += (where != null ? " and " + where : ""); 
    } 
    /** 
    * Ajout des champs auxiliaires 
    */ 
    List<Property> fields = Contact.Manager.factoryFor(Contact.class).listProperties(); 

    String qaux = ""; 
    List<Integer> relationArray = new ArrayList<Integer>(); 

    for (Property field : fields) { 
     if(field.isRelation){ 

      if(request.params.get(field.name) != null){ 
       int requestArg = Integer.parseInt(request.params.get(field.name)); 

       if(requestArg != 0){ 
        if (!qaux.equals("")) { 
         qaux += " and "; 
        } 
        relationArray.add(requestArg); 
        qaux += " "+field.name+"_id = ?"+(relationArray.size()+1)+" "; 
       } 
      } 
     } 
    } 
    if(!qaux.equals("")){ 
     q+= " and ("+qaux+") "; 
    } 

    /** 
    * Fin ajout champs auxiliaires 
    */ 


    Query query = Contact.em().createQuery(q); 
    if (search != null && !search.equals("") && q.indexOf("?1") != -1) { 
     query.setParameter(1, "%" + search.toLowerCase() + "%"); 
    } 
    // Champs auxiliaires 
    for (int i = 0; i < relationArray.size(); i++) { 
     query.setParameter((i+2), relationArray.get(i)); 
    } 

    return Long.decode(query.getSingleResult().toString()); 
} 


public static void list(int page,String search,int origine,String searchFields, String orderBy, String order) throws ClassNotFoundException { 
    ObjectType type = ObjectType.get(getControllerClass()); 
    notFoundIfNull(type); 

    if (page < 1) { 
     page = 1; 
    } 

    List<Contact> objects = Contacts.findPage(page, search, searchFields, orderBy, order, (String) request.args.get("where")); 
    Long count = Contacts.count(search, searchFields, (String) request.args.get("where")); 
    Long totalCount = Contacts.count(null, null, (String) request.args.get("where")); 


    // Liste des origines 
    List<Origine> origines = Origine.find("order by nom asc").fetch(); 
    // Liste des employes 
    List<Employe> employes = Employe.find("order by nom asc").fetch(); 
    // Liste des villes 
    List<Ville> villes = Ville.find("order by nom asc").fetch(); 

    try { 
     render(type, objects, count, totalCount, page, orderBy, order, origines,employes,villes); 
    } catch (TemplateNotFoundException e) { 
     render("CRUD/list.html", type, objects, count, totalCount, page, orderBy, order, origines, employes,villes); 
    } 
} 


private static String getSearchQuery() { 
    List<Property> fields = Contact.Manager.factoryFor(Contact.class).listProperties(); 

    ObjectType type = ObjectType.get(getControllerClass()); 
    notFoundIfNull(type); 



    String q = ""; 
    for (Property field : fields) { 
     if(field.isSearchable){ 
      if (!q.equals("")) { 
       q += " or "; 
      } 

      q += "lower(" + field.name + ") like ?1"; 
     } 
    } 
    return q; 
} 

は}

+0

あなたのために働いていればあなた自身の答えを受け入れることができます。 – ripper234

関連する問題