# Primefaces commandButton in einem Dialog/Form/PanelGrid führt actionListener nicht aus



## SubSonniC (10. Jan 2014)

Hallo,

mein commandButton in Zeile 51 verarbeitet zwar update="..." aber führt nicht den actionListener aus. Ich weiß aber nicht warum. Vielleicht kann mir jemand auf die Sprünge helfen.

[XML]
<p:dialog header="Laborergebnisse" widgetVar="laborResultDialog"
				resizable="false" id="laborResultDlg">
				<h:form id="postParams"
					style="display: #{((orderPM.currentUser.isAdmin() or orderPM.currentUser.company.DType.equals('Clinic')) and (orderPM.selectedOrder.patient.gender == 'FEMALE')) ? '' : 'none'};">

					<panelGrid id="params" cellpadding="4"
						style="margin-left:5px; margin-bottom: 5px;">
					<p:row>


						<p:column>
							<hutputText value="Lebensphase:" />
						</p:column>
						<p:column style="padding-top:15px;">
							<p:selectOneMenu
								value="#{orderPM.selectedOrder.patient.lifePhase}"
								converter="ObjectConverter"
								onchange="onChangeLifePhase(jQuery(this).val(), 'postParams')">
								<f:selectItem itemLabel="-- Lebensphase auswählen" itemValue="" />
								<f:selectItems value="#{orderPM.lifePhases}" var="phase"
									itemLabel="#{phase.text}" itemValue="#{phase}" />
							</p:selectOneMenu>
						</p:column>

						<p:column id="postParamsPragnantWeekHeader"
							style="display:#{orderPM.selectedOrder.patient.lifePhase=='PRAGNANT' ? '' : 'none'};">
							<hutputText value="Schwangerschaftswoche:" />
						</p:column>
						<p:column id="postParamsPragnantWeekValue"
							style="padding-top:5px; display:#{orderPM.selectedOrder.patient.lifePhase=='PRAGNANT' ? '' : 'none'};">
							<h:inputText
								value="#{orderPM.selectedOrder.patient.pragnantWeek}" />
						</p:column>

						<p:column id="postParamsOvarialcyclePhaseHeader"
							style="display:#{orderPM.selectedOrder.patient.lifePhase!='PRAGNANT'  ? '' : 'none'};">
							<hutputText value="Menstruationszyklus:" />
						</p:column>
						<p:column id="postParamsOvarialcyclePhaseValue"
							style="padding-top:15px; display:#{orderPM.selectedOrder.patient.lifePhase!='PRAGNANT' ? '' : 'none'};">
							<p:selectOneMenu
								value="#{orderPM.selectedOrder.patient.ovarialcyclePhase}"
								converter="ObjectConverter">
								<f:selectItem itemLabel="-- Menstruationszyklus wählen"
									itemValue="" />
								<f:selectItems value="#{orderPM.ovarialcyclePhases}" var="phase"
									itemLabel="#{phase.text}" itemValue="#{phase}" />
							</p:selectOneMenu>
						</p:column>
						<p:column>
							<p:commandButton value="Parameter speichern"
								actionListener="#{orderPM.postsetOrderParams()}"
								title="Parameter speichern" update=":laborResultForm:laborResultList"/>
						</p:column>
						</p:row>
					</panelGrid>
				</h:form>


				<h:form id="laborResultForm">
					<p:dataTable id="laborResultList" var="laborResult"
						value="#{orderPM.selectedOrder.laborResults}"
						widgetVar="laborResultTable">

						<p:column headerText="Laborparameter">
							<hutputText value="#{laborResult.laborParam.shortname}" />
						</p:column>

						<p:column headerText="Untersuchungsergebniss">
							<hutputText
								value="#{laborResult.result} #{laborResult.laborParam.defaultValueUnit}" />
						</p:column>

						<p:column headerText="Referenzwert">
							<hutputText
								value="#{orderPM.getRefValueForResult(laborResult).valueUp} - #{orderPM.getRefValueForResult(laborResult).valueTo} #{laborResult.laborParam.defaultValueUnit}" />
						</p:column>

						<p:column headerText="Beschreibung">
							<hutputText
								value="#{orderPM.getRefValueForResult(laborResult).description} " />
						</p:column>

						<p:column headerText="Referenzwert">
							<p:commandButton value="Grafische Analyse" icon="ui-icon-star"
								update=":graphicalAnalyseDlg"
								oncomplete="graphicalAnalyseDialog.show()"
								actionListener="#{orderPM.createLaborResultChart(laborResult)}"
								title="Grafische Analyse der Laborergebnisse anzeigen">
							</p:commandButton>
						</p:column>



						<f:facet name="footer">
							<p:commandButton value="Exportieren nach LDT" icon="ui-icon-star" />
						</f:facet>

					</p:dataTable>
				</h:form>
			</p:dialog>
[/XML]


----------



## redJava99 (10. Jan 2014)

Am xhtml ist nichts auszusetzen.
- Ist der Dialog selbst noch in ein h:form eingebettet?
- Wie sieht dein OrderPM aus?

Was mir sonst noch auffällt - ist vielleicht nützlich: 
In den selectOneMenus kannst du für die f:selectItems das Attribut noSelectOption verwenden. Dann brauchst du den value nicht künstlich leer setzen und im Backend aufwendig validieren. In Kombination mit dem required-Attribut des selectOneMenus wird dann schon im Frontend validiert, bevor die Bean überhaupt was gesendet bekommt ;-)
Sieht dann etwa so aus:
[XML]<p:selectOneMenu required="true" ...>
    <f:selectItem itemLabel="- auswählen -" noSelectOption="true" />
    <f:selectItems ... />
</p:selectOneMenu>
[/XML]


----------



## SubSonniC (13. Jan 2014)

Hi,

erstmal vielen Dank für die Infos.

Nein der Dialog ist selbst nur in  

[XML]
<ui:composition template="/WEB-INF/templates/layout_with_menu.xhtml">
		<ui:define name="content">
                         .....
                </ui:define>
</ui:composition>
[/XML]

eingeschlossen.

Hier nochmals auszüglich die orderPM.



```
@Named("orderPM")
@ViewScoped
public class OrderPM implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@EJB
	private OrderService orderService;
	@EJB
	private UserService userService;
	@EJB
	private ClinicService clinicService;
	@EJB
	private LaborService laborService;
	@EJB
	private LaborResultService laborResultService;
	@EJB
	private LaborProfileService laborProfileService;
	@EJB
	private LaborParamService laborParamService;
	@EJB
	private SecurityService securityService;
	@EJB
	private PdfService pdfService;

	@Inject
	private transient Logger logger;
	@Inject
	private ApplicationPM applicationPM;

	// Selected Orders that will be removed
	private Order[] selectedOrders = {};
	// Lazy loading Order list
	private LazyOrderDataModel lazyModel;
	// Creating new Order
	private Order newOrder = new Order();
	// Selected Order that will be updated
	private Order selectedOrder;
	// Available Order list
	private List<Order> orderList;

	// Available Labor list
	private List<Labor> laborList;
	private List<Clinic> clinicList;

	// Available Labor list
	private List<LaborProfile> laborProfileList;

	// All available LaborParams for select
	private List<LaborParam> laborParamList;

	// Selected LaborParams to filter table by Order.laborParams
	// private List<LaborParam> selectedLaborParamList;

	private Permission resourcePermission;

	private PMUser currentUser;
	private Order currentOrder;

	private Gender[] genders;
	private OvarialcyclePhase[] ovarialcyclePhases;
	private LifePhase[] lifePhases;
	
	private LaborResultChart laborResultChart;
	
	private PMUser selectedUser;
	private List<PMUser> userList;
	
	// Die für eine Untersuchung notwendige Anzahl an Standards je untersuchtem Laborparameter.
	// Wird bei der Fertigstellung der Untersuchung ausgewertet und auf die Aufträge bzw. ihre 
	// Laborergebnisse (LaborResult) anteilig verteilt.
//	private HashMap<LaborParam,String> analysedLaborParamStandards = new HashMap<LaborParam,String>();
//	private Examination examination=new Examination();
	private HashMap<LaborParam,Integer> analysingLaborParamsAndStandards = new HashMap<LaborParam,Integer>();


	// private List<LaborParam> analysingLaborParams=new
	// ArrayList<LaborParam>();

	@PostConstruct
	private void init() {
		logger.debug("Initialize OrderPM"); // logger
		currentUser = applicationPM.getCurrentUser(); // currentUser
		lazyModel = new LazyOrderDataModel(orderService, currentUser); // Initialisieren des LazyDataModels mit Filteroptionen bezüglich des angemeldeten Benutzers
		resourcePermission = securityService.getResourcePermission(Resource.ORDER); // Zugriffsrechte für Resource ORDER
		
		this.laborProfileList = laborProfileService.findWithNamedQuery(LaborProfile.FIND_ALL); // Laborprofilliste
		this.laborParamList = laborParamService.findWithNamedQuery(LaborParam.FIND_ALL); // Laborparameterliste
		this.genders = Gender.values(); // Geschlechter
		this.ovarialcyclePhases = OvarialcyclePhase.values(); // Menstruationszyklen
		this.lifePhases = LifePhase.values();
		
		if(currentUser.isAdmin()){
			try{
				this.orderList = orderService.findWithNamedQuery(Order.FIND_ALL); // Alle Aufträge
				this.laborList = laborService.findWithNamedQuery(Labor.FIND_ALL); // Alle Labore
				this.clinicList = clinicService.findWithNamedQuery(Clinic.FIND_ALL); // Alle Kliniken
			}catch(Exception e){
				logger.error(e.getCause().getMessage());
			}
			
			// Für Filteroption nach Benutzer und dessen LaborParameter
			this.selectedUser=currentUser;
			try{
				// Liste der Auswählbaren Benutzer für Admins
				this.userList= userService.findWithNamedQuery(PMUser.FIND_ALL);
			} catch(Exception e){
				logger.error(e.getCause().getMessage());
			}
			
		// Falls der angemedete Benutzer kein Admin ist
		} else {
			String companyType = currentUser.getCompany().getDType(); // Labor oder Klinikbenutzer ?
			
			// Falls klinikbenutzer
			if (companyType.equals("Clinic")) {
				// Finde nur Aufträge bezüglich der zu Grunde liegenden Klinik den Benutzers
				Map<String, Clinic> queryParams = new HashMap();
				Clinic clinic = (Clinic) currentUser.getCompany();
				queryParams.put("clinic", clinic);
				try{
					this.orderList = orderService.findWithNamedQuery(Order.FIND_BY_CLINIC, queryParams);
					this.laborList = laborService.findWithNamedQuery(Labor.FIND_ALL); // Alle Labore stehen dem Klinikbenutzer zur Auswahl
				}catch(Exception e){
					logger.error(e.getCause().getMessage());
				}
			
			// Falls Laborbenutzer
			} else if (companyType.equals("Labor")) {
				Labor labor = (Labor) currentUser.getCompany();
				try{
					// Finde alle Aufträge bezüglich des zu Grunde liegenden Labors des Benutzers und miot Status != NEW
					this.orderList = orderService.findByNativeQuery("select * from orders where labor_id="+labor.getId().toString()+ " and orderstate != 'NEW';"); 
					// Es steht nur das eigene Labor zur Verfügung
					this.laborList = laborService.findByNativeQuery("select * from companies where id="+labor.getId()); 
				} catch(Exception e){
					logger.error(e.getCause().getMessage());
				}
				
				// Für Filteroption nach Benutzer und dessen LaborParameter
				this.selectedUser=currentUser;
				Map<String, Labor> queryParams = new HashMap();
				queryParams.put("labor", labor);
				try{
					// Liste der Auswählbaren Benutzer für Laborbenutzer
					this.userList= userService.findWithNamedQuery(PMUser.FIND_ALL_BY_LABOR, queryParams);
				} catch(Exception e){
					logger.error(e.getCause().getMessage());
				}
			}
		}
		logger.debug("END Initialize OrderPM");
	}


	public void postsetOrderParams() {
		System.out.println("######################################");
		logger.debug("BEGIN OrderPM.postsetOrderParams()");
		try {
			orderService.update(this.selectedOrder);
		} catch (Exception e) {
			FacesContext context = FacesContext.getCurrentInstance();
			context.addMessage(null, new FacesMessage("Fehler", e.getCause()
					.getMessage()));
		}

		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(
				"Parameter erfolgreich gespeichert"));
		logger.debug("END OrderPM.postsetOrderParams()");
	}
	


}
```


----------



## NoXiD (14. Jan 2014)

schlägt auf deiner Seite irgendwo eine Validation fehl? Das kann auch zu merkwürdigen Ereignissen in PF kommen, ansonsten versuch mal beim CommandButton 
	
	
	
	





```
process="@this"
```
 hinzuzufügen...


----------



## SubSonniC (15. Jan 2014)

Soweit ich das erkennen kann schlägt hier nichts fehl.

Was mir aufgefallen ist, ist dass sobald ich den Button anklicke, die init() Methode der Bean ausgerührt wird. Aber er kommt niemals in die entscheidende Methode postsetOrderParams().

Ein process="@this" hat da auch keine Abhilfe gebracht.

Grüße


----------

