mardi 31 mars 2015

JSF selectOneMenu ajax doesn't fire listener

The context is a form to add or modify an entry to/of a database table. Inside of it, I want to create a search/selection subform with :



  1. A search text input that request the database to fill a selectOneMenu

  2. The dynamically filled selectOneMenu to select a value

  3. A classic selectOneMenu with values hard-coded


So far I achieved to get the search text input to work only if I am modifying an existing entry (which id is passed via URL). It doesn't work if when I'm creating a new one.


The second problem is (in the case of modifying an entry, which is working already), when a value is chosen in the selectOneMenu, the listener seems to not be called. But with the selectOneMenu that have hard-coded values, it works fine.


Here is the subform code :



<h:form>
<h2>#{msg['addPeopleToFilm']}</h2>
<div class="inputWrapper">
<h:inputText id="search" value="#{beanPersonne.recherche}"
valueChangeListener="#{beanPersonne.searchStringChanged}" >
<f:ajax execute="search" render="output" event="valueChange" />
</h:inputText>
<label>#{msg['personSearch']}</label>
</div>

<div class="selectWrapper" >
<h:selectOneMenu value="#{beanFilm.idToAdd}" id="output" valueChangeListener="#{beanFilm.idToAddChanged}">
<f:selectItem itemLabel="#{msg['researchResults']} ›" itemSelected="true" itemDisabled="true" />
<f:selectItems
value = "#{beanPersonne.resultatsRechercheDynamique}"
var="personne"
itemValue="#{personne.idPersonne}"
itemLabel="#{personne.prenom} #{personne.nom}" />
<f:ajax execute="output" render="idToAdd" event="valueChange" />
</h:selectOneMenu>
</div>

<div class="selectWrapper" >
<h:selectOneMenu value="#{beanFilm.categoryChoice}" id="category" valueChangeListener="#{beanFilm.categoryChoiceChanged}">
<f:selectItem itemLabel="#{msg['type']} ›" itemSelected="true" itemDisabled="#{not empty beanFilm.categoryChoice}" />
<f:selectItem itemLabel="#{msg['actor']} ›" itemValue="0" />
<f:selectItem itemLabel="#{msg['producer']} ›" itemValue="1" />
<f:selectItem itemLabel="#{msg['director']} ›" itemValue="2" />
<f:ajax execute="category" render="categoryChoice" event="valueChange" />
<f:ajax execute="category" render="category" event="valueChange" />
</h:selectOneMenu>
</div>

<h:commandButton value="Test">
</h:commandButton>

<h2><h:outputText id="idToAdd" value="#{beanFilm.idToAdd}" /></h2>
<h2><h:outputText id="categoryChoice" value="#{beanFilm.categoryChoice}" /></h2>
</h:form>


And here is my bean:



public class BeanFilm implements Serializable {

private static final long serialVersionUID = 807253156212218187L;
private Film film = new Film();
private String recherche = new String();
private String idToAdd = new String();
private String categoryChoice = new String();
private List<Film> resultatsRechercheDynamique = new ArrayList<Film>();

public Film getFilm() {
return film;
}

public void setFilm(Film film) {
this.film = film;
}

public int getIdFilm() {
return film.getIdFilm();
}

public void setIdFilm(int id) {
film = DAOFilmJPA.getInstance().get(id);
}

public String getRecherche() {
return recherche;
}

public void setRecherche(String recherche) {
this.recherche = recherche;
}

public String getCheminAffiche() {
File file = new File(FacesContext.getCurrentInstance().getExternalContext().getRealPath("/affiches/" + film.getIdFilm() + ".png"));
if(file.exists())
return "affiches/" + film.getIdFilm() + ".png";

return "images/noimage.png";
}

public String enregistrer() {
DAOFilmJPA.getInstance().save(film);
return "filmSaveComplete";
}

public String doRecherche() {
return "toResultatsRecherche";
}

public List<Film> getResultatsRechercheNotPro() {
return DAOFilmJPA.getInstance().getFilmsParTitre(recherche);
}

public List<Film> getResultatsRechercheFilmPro() {
return DAOFilmJPA.getInstance().getFilmsParTitre(recherche);
}

public List<Personne> getResultatsRecherchePersonnePro() {
return DAOPersonneJPA.getInstance().getPersonnesParNom(recherche);
}

public String searchByTitle(String title)
{
recherche = title;
this.resultatsRechercheDynamique = getResultatsRechercheFilmPro();
return null;
}

public void searchStringChanged(ValueChangeEvent vce)
{
searchByTitle((String) vce.getNewValue());
}

public void idToAddChanged(ValueChangeEvent vce)
{
idToAdd = ((String) vce.getNewValue());
}

public void categoryChoiceChanged(ValueChangeEvent vce)
{
categoryChoice = ((String) vce.getNewValue());
}

public List<Film> getResultatsRechercheDynamique() {
return resultatsRechercheDynamique;
}

public void setResultatsRechercheDynamique(
List<Film> resultatsRechercheDynamique) {
this.resultatsRechercheDynamique = resultatsRechercheDynamique;
}

public String getIdToAdd() {
return idToAdd;
}

public void setIdToAdd(String idToAdd) {
this.idToAdd = idToAdd;
}

public String getCategoryChoice() {
return categoryChoice;
}

public void setCategoryChoice(String categoryChoice) {
this.categoryChoice = categoryChoice;
}
}

Aucun commentaire:

Enregistrer un commentaire