but.... our problem is a little bit more complicated as we want to use column definitions for a datatable. with c:set the value will not be displayed because it refers to the "var" attribute of the datatable. here a short sample
so first datatable doesn't display data and 2nd datatable displays the data but we can't implement a loop for each column inside datatable.
is there any other solution?
here a short sample
TestView.xhtml
import at.sozvers.kgkk.faces.ViewScoped;
import jakarta.annotation.PostConstruct;
import jakarta.inject.Named;
@ViewScoped
@Named("testView")
public class TestView implements Serializable
{
private static final long serialVersionUID = 4290918565613185179L;
private List<Product> products = new ArrayList<>();;
@PostConstruct
public void init()
{
if (products.isEmpty())
{
products.add(new Product(1000, "f230fh0g3", "Bamboo Watch"));
products.add(new Product(1001, "nvklal433", "Black Watch"));
products.add(new Product(1002, "zz21cz3c1", "Blue Band"));
}
}
public List<Product> getProducts()
{
return products;
}
public void setProducts(List<Product> products)
{
this.products = products;
}
}
test.xhtml
<h:head>
<title>PF TEST VIEW</title>
</h:head>
<h:body id="body">
<!-- bean and dto definitions -->
<ui:param name="bean" value="#{testView}" />
<ui:param name="DTO_List" value="#{bean.products}" />
<ui:param name="count_columns_max" value="3" />
<ui:param name="updateViewSpecificComponents" value="#{datatableId}" />
<h:form id="form">
<!-- initialize all columns for 1st datatable -->
<c:forEach begin="1" end="#{count_columns_max}" var="idx">
<c:set var="#{'column'.concat(idx).concat('_label')}" value="" scope="view" />
<c:set var="#{'column'.concat(idx).concat('_value')}" value="" scope="view" />
</c:forEach>
<!-- define view specific columns for 1st datatable -->
<c:set var="column1_label" value="Id" scope="view" />
<c:set var="column1_value" value="#{data.id}" scope="view" />
<c:set var="column2_label" value="Code" scope="view" />
<c:set var="column2_value" value="#{data.code}" scope="view" />
<c:set var="column3_label" value="Name" scope="view" />
<c:set var="column3_value" value="#{data.name}" scope="view" />
<ui:param name="datatable_rowKey" value="#{data.id}" />
<ui:param name="datatableId" value="dataTable1" />
<h2>DATATABLE 1: with c:set vor value</h2>
<p></p>
<div>
<p:dataTable id="#{datatableId}" value="#{DTO_List}" var="data" rowKey="#{datatable_rowKey}">
<c:forEach begin="1" end="#{count_columns_max}" var="idx">
<p:column headerText="#{viewScope['column' += idx += '_label']}">
<h:outputText value="#{viewScope['column' += idx += '_value']}" />
</p:column>
</c:forEach>
</p:dataTable>
</div>
<!-- initialize all columns for 2nd datatable -->
<c:forEach begin="1" end="#{count_columns_max}" var="idx">
<c:set var="#{'column'.concat(idx).concat('_label')}" value="" scope="view" />
<ui:param name="#{'column'.concat(idx).concat('_value')}" value="" />
</c:forEach>
<!-- define view specific columns for 2nd datatable -->
<c:set var="column1_label" value="Id" scope="view" />
<ui:param name="column1_value" value="#{data.id}" />
<c:set var="column2_label" value="Code" scope="view" />
<ui:param name="column2_value" value="#{data.code}" />
<c:set var="column3_label" value="Name" scope="view" />
<ui:param name="column3_value" value="#{data.name}" />
<ui:param name="datatable_rowKey" value="#{data.id}" />
<ui:param name="datatableId" value="dataTable2" />
<h2>DATATABLE 2: with ui:param for value</h2>
<p></p>
<div>
<p:dataTable id="#{datatableId}" value="#{DTO_List}" var="data" rowKey="#{datatable_rowKey}">
<p:column headerText="#{viewScope['column1_label']}">
<h:outputText value="#{column1_value}" />
</p:column>
<p:column headerText="#{viewScope['column2_label']}">
<h:outputText value="#{column2_value}" />
</p:column>
<p:column headerText="#{viewScope['column3_label']}">
<h:outputText value="#{column3_value}" />
</p:column>
</p:dataTable>
</div>
</h:form>
</h:body>