Visualforce Repeaters

salesforcevisualforce

Hi I am getting a headache with the visualforce repeater control:

 <apex:repeat value="{!productDetails}" var="o">
     <apex:pageBlockSectionItem >
         <apex:outputText style="label" value="Name:"></apex:outputText>
         <apex:outputLabel value="{!o.name}" /> 
     </apex:pageBlockSectionItem>

     <apex:pageBlockSectionItem >
         <apex:outputText value="{!o.ProductCode}"/>   
         <apex:outputText value="{!o.Family}" />  
     </apex:pageblockSection> 

     <apex:pageBlockSection> 
         <apex:outputText style="label" value="Quantity:"> </apex:outputText>
         <apex:inputText value="{!theList}"/>
     </apex:pageblockSection> 
 </apex:repeat>

What I am trying to do, is for each record in the product details list, generate a text box. This text box is bound to another field (theList.quantity). But I am finding that when I change the value in the last text box it sets the quantity in all the text boxes(obviously as they are bound to the same field).

So my question is whats the best way to have each textbox that is generated in the repeater have its own parameter value?

Or am I using the repeater in the wrong way?

EDIT(clarification):

For each product detail record(What I am iterating through) I want to have a textbox where a user can enter the quantity of products. The value of this textbox is unrelated to the product detail records.

My question is how can I generate unique parameters for each iteration of the textbox? Hopefully that makes sense.

Cheers

Best Answer

You need to use the var in the <apex:repeat> for each element in the productDetails list. For example:

<apex:repeat value="{!productDetails}" var="productDetail">
    <apex:pageBlockSection> 
        <apex:outputText style="label" value="Quantity:"> </apex:outputText>
        <apex:inputText value="{!productDetail.quantity}"/>
    </apex:pageblockSection> 
</apex:repeat>

That will set the the quantity property of each productDetail.

If you're really iterating over a parent of the productDetail in this example, then you'll need to change your controller to create a parent for each and then iterate over that. I'll write the example code as if you're iterating over a list of potential orders.

In your controller, you'll need to create an order for each of the products. I'm not sure if the parent is an SObject or a custom class, but I'll write the example as if it was a custom class.

public class Order {
    public Order(ProductDetail productDetail) {
        this.productDetail = productDetail;
    }

    public ProductDetail productDetail;
    public Integer quantity;
}

// I assume you've already implemented this getter or are setting it some other way.
public ProductDetail[] productDetails {
    get {
        if (productDetails == null) {
            productDetails = ...;
        }
        return productDetails;
    }
    set;
}

public Order[] orders {
    get {
        if (orders == null) {
            orders = new Order[]{};
            for (ProductDetail productDetail: productDetails) {
                orders.add(new Order(productDetail);
            }
        }
        return orders;
    }
    set;
}

Now, in your VisualForce page you can iterate over the Order list and have the user set the quantity.

<apex:repeat value="{!orders}" var="order">
    ...
    <apex:outputtext style="label" value="Name:"></apex:outputText>
    <apex:outputLabel value="{!order.productDetail.name}" /> 
    ...
    <apex:inputText value="{!order.quantity}"/>
    ....
</apex:repeat>

Back in your controller, only save the orders that have a quantity of more than zero (or whatever other criteria you have in mind).

Related Topic