2016-12-14 2 views
1

У меня есть p:datatable, который заполняется списком доменов объектовPrimefaces Datatable, фильтр на локализованном перечислении значений

Каждый объект домена имеет значение, которая привязана к enum PrivateIndustry: P, K или N, что соответствует значение базы данных.

эти значения затем представлены в p:dataTable через локализацию, labels_LOCALE.properties, чтобы сделать их доступными для человека, с синтаксисом com.package.PrivateIndustry.P/K/N.

Это работает хорошо для удобства чтения, но когда я использую PF('dataTableId').filter() фильтровать DataTable, я не могу фильтровать для локализованных значений, только значения чистых перечислений (т.е. P, K или N)

именно:

<p:column headerText="#{labels.header}" 
     filterBy="#{domainobject.privateIndustry}" filterStyle="display: none" 
     sortBy="#{domainobject.privateIndustry}" > 
     <h:outputText value="#{domainobject.privateIndustry}"/> 
    </p:column> 

Я могу исправить это, заполнив имена в объекте домена как String, используя ResourceBundle.getString("com.package.PrivateIndustry..."), но это кажется довольно ненужным и запутанным.

Можно ли разобрать filterBy="" с лучшим значением или сделать PF().filter() работать с данными на стороне клиента?

+1

Вы всегда можете реализовать пользовательские фильтры ... См. Документы PF – Kukeltje

ответ

0

Это путь я решил функциональность в коде, а не в XHTML:

при создании объектов предметной области, в конструкторе, вызвать метод, который генерирует строку, содержащую анализируемую строку из значения перечисления:

import java.util.ResourceBundle; 
import javax.faces.context.FacesContext; 

public class DomainObject { 
    private PrivateIndustry privateIndustry; 
    private String enumStringValue; 

    public void generateEnumStringValue() { 
     ResourceBundle rb= ResourceBundle.getBundle("labels",FacesContext.getCurrentInstance().getViewRoot().getLocale()); 
     this.enumStringValue = rb.getString("com.package.DomainObject.PrivateIndustry." + privateIndustry.name()); 
    } 
    public String getEnumStringValue() { 
     return emumStringValue; 
    } 

    public enum PrivateIndustry { 

     P("Private"), 

     N("Industry"), 

     K("Combined"); 
     private final String name; 

     PrivateIndustry(String name) { 
      this.name = name; 
     } 

     public String getName() { 
      return name; 
     }  
    } 
} 

, а затем, в фасоли:

public String getEnumStringValue(DomainObject domainObject) { 

    return domainObject.getEnumStringValue(); 
} 

и, наконец:

<p:column headerText="#{labels.header}" 
      filterBy="#{backingBean.getEnumStringValue(domainObject)}" 
      sortBy="#{backingBean.getEnumStringValue(domainObject)}"> 
    <h:outputText value="#{domainObject.privateIndustry}"/> 

</p:column>