Question

OminiFaces's 'o:methodParam' does now work for me as below. How can I use another way? I don't know what I am missing in it. It can work with <h:commandButton> and <a4j:jsFunction> without using Seam , When Seam is used it does not work with <a4j:jsFunction>.

Development Eviroment is RichFaces 4. Seam 2.3 OminiFaces 1.2 JBoss 7.1.1

@Name("DataTableBacking")
public class DataTableBacking {

    Department[] items = {new Department("AAA", "AAA"), new Department("BBB", "BBB"), new Department("CCC", "CCC")};

    public Department[] getItems() {
        return items;
    }

    public void action(Department action) {
        System.out.println("Action called with:" + action.getName());
    }

}

datatable.xhtml

<h:html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:richm="http://developmentTutorials.com/java">
        <h:body>
            <h:form>
            <h1>Data Table</h1>
                <rich:dataTable id="departmentTable" value="#{DataTableBacking.items}" var="dep" style="width:100%">
                    <rich:column style="width:100px;text-align:center;">
                        #{dep.name}
                        <richm:confirmLink actionBeanMethod="#{DataTableBacking.action(dep)}" render="departmentTable"/>
                    </rich:column>
                </rich:dataTable>
            </h:form>
        </h:body>
</h:html>

In tag lib, confirmation.xml

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <o:methodParam name="methodParam" value="#{actionBeanMethod}" />

    <a4j:commandLink value="delete" onclick="#{rich:component('confirmation')}.show();return false" />

    <h:commandButton value="direct" action="#{methodParam}" />

    <a4j:jsFunction name="submit" action="#{methodParam}" render="#{render}" />

    <rich:popupPanel id="confirmation" width="250" height="150">
        <f:facet name="header">Confirmation</f:facet>
        <h:panelGrid>

            <h:panelGrid columns="1">
                <h:outputText value="Are you sure?" style="FONT-SIZE: large;" />
            </h:panelGrid>

            <h:panelGroup>
                <input type="button" value="OK" onclick="#{rich:component('confirmation')}.hide(); submit(); return false" />
                <input type="button" value="Cancel" onclick="#{rich:component('confirmation')}.hide(); return false" />
            </h:panelGroup>
        </h:panelGrid>
    </rich:popupPanel>

</ui:composition>
Was it helpful?

Solution

I'm not entirely sure about the null value. If data would be absent after the post-back (an often recurring mistake) the method should not be called at all.

You do have a bug in your code though, and that's that a4j:jsFunction will create a function and assign it to a js variable named submit, and this will be the same for every row.

So submit=function(){RichFaces.ajax("j_idt15:departmentTable:0:j_idt18" ... for the first row, submit=function(){RichFaces.ajax("j_idt15:departmentTable:1:j_idt18" ... for the second row, and so on.

Your dialog will then always call the one from the last row. So, possible, is there a null as the last value in the list that you feed the table?

Using the following slightly simplified code, I get the passed parameter in the action method:

@ManagedBean
public class DataTableBacking {

    String[] items = {"A", "B"};

    public String[] getItems() {
        return items;
    }

    public void action(String action) {
        System.out.println("Action called with:" + action);
    }

}

datatable.xhtml:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:richm="http://developmentTutorials.com/java"
>
    <h:head/>
    <h:body>

        <h:form>
            <rich:dataTable id="departmentTable" value="#{dataTableBacking.items}" var="dep" style="width:100%">
                <rich:column style="width:100px;text-align:center;">
                    #{dep}
                    <richm:confirmLink actionBeanMethod="#{dataTableBacking.action(dep)}" render="departmentTable"/>
                </rich:column>
            </rich:dataTable>
        </h:form>

    </h:body>
</html>

confirmation.xhtml:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <o:methodParam name="methodParam" value="#{actionBeanMethod}" />

    <a4j:commandLink value="delete" onclick="#{rich:component('confirmation')}.show();return false" />

    <h:commandButton value="direct" action="#{methodParam}" />

    <a4j:jsFunction name="submit" action="#{methodParam}" render="#{render}" />

    <rich:popupPanel id="confirmation" width="250" height="150">
        <f:facet name="header">Confirmation</f:facet>
        <h:panelGrid>

            <h:panelGrid columns="1">
                <h:outputText value="Are you sure?" style="FONT-SIZE: large;" />
            </h:panelGrid>

            <h:panelGroup>
                <input type="button" value="OK" onclick="#{rich:component('confirmation')}.hide(); submit(); return false" />
                <input type="button" value="Cancel" onclick="#{rich:component('confirmation')}.hide(); return false" />
            </h:panelGroup>
        </h:panelGrid>
    </rich:popupPanel>

</ui:composition>

I added the direct call via a h:commandButton to validate that the expression does make it correctly to the Facelet tag. In this example, when I click the delete link and confirm, I get the last element (B) as expected in the action() method for both rows.

I used JBoss AS 7.1.1, OmniFaces 1.2 Snapshot and RichFaces 4.0.0. The OmniFaces version shouldn't matter too much as I didn't make any changes to the methodParam between those versions (I'm the author of that particular part).

Which server and with which versions of OmniFaces and RichFaces are you using?

Edit

Per the comments, changing the String into a Department:

DataTableBacking.java:

@ManagedBean
public class DataTableBacking {

    Department[] items = {new Department(), new Department()};

    public Department[] getItems() {
        return items;
    }

    public void action(Department action) {
        System.out.println("Action called with:" + action);
    }

}

Department.java:

public class Department {

}

(all the other code the same as before)

This should and (at my side) indeed does not make any difference. When you changed the String array into a Department one, did you do it in the same way as I did? Can you show your full backing bean?

OTHER TIPS

I try to fix this problem with javascript. It can be unsuitable solution. The datatable pass row Index as parameter because of I would like to get id of <h:commandButton> for each row of datatable. JavaScript will click the <h:commandButton> when the user click OK button in ConfirmationBox.

confirmation.xml

    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:rich="http://richfaces.org/rich"
    xmlns:a4j="http://richfaces.org/a4j" 
    xmlns:o="http://omnifaces.org/ui"
    xmlns:of="http://omnifaces.org/functions"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <o:methodParam name="methodParam" value="#{actionBeanMethod}" />
    <a4j:commandLink value="#{value}" onclick="#{rich:component('confirmation')}.show();return false"/>

    <h:commandButton id="commandButton" value="direct" action="#{methodParam}" style="display:none;"/>

    <rich:popupPanel id="confirmation" width="250" height="150">
        <f:facet name="header">Confirmation</f:facet>
        <h:panelGrid>

            <h:panelGrid columns="1">
                <h:outputText value="Are you sure ?" style="FONT-SIZE: large;" />
            </h:panelGrid>

            <h:panelGroup>
                <input type="button" value="OK" onclick="document.getElementById('#{index}:commandButton').click();#{rich:component('confirmation')}.hide();return false;" />
                <input type="button" value="Cancel" onclick="#{rich:component('confirmation')}.hide(); return false" />
            </h:panelGroup>
        </h:panelGrid>
    </rich:popupPanel>

    </ui:composition>

In datatable;

    <rich:dataTable id="departmentTable" value="#{DataTableBacking.items}" var="dep" style="width:100%" rowKeyVar="index">
        <rich:column style="width:100px;text-align:center;">
            <f:facet name="header">
                <h:outputText value="Name"/>
            </f:facet>
            #{dep.name}
            <richm:confirmLink value ="Delete" index="tableForm:departmentTable:#{index}" actionBeanMethod="#{DataTableBacking.action(dep)}" render="departmentTable"/>
        </rich:column>
    </rich:dataTable>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top