Повторители Visualforce - PullRequest
       8

Повторители Visualforce

3 голосов
/ 07 марта 2012

Привет У меня болит голова с помощью повторителя Visualforce:

 <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>

Я пытаюсь создать текстовое поле для каждой записи в списке сведений о продукте. Это текстовое поле связано с другим полем (theList.quantity). Но я обнаружил, что когда я изменяю значение в последнем текстовом поле, он устанавливает количество во всех текстовых полях (очевидно, поскольку они привязаны к одному и тому же полю).

Итак, мой вопрос: каков наилучший способ, чтобы каждое текстовое поле, генерируемое в повторителе, имело свое собственное значение параметра?

Или я использую ретранслятор неправильно?

РЕДАКТИРОВАТЬ (уточнение):

Для каждой подробной записи о продукте (то, через что я перебираю) я хочу иметь текстовое поле, в котором пользователь может ввести количество продуктов. Значение этого текстового поля не связано с подробными записями о продукте.

Мой вопрос: как я могу генерировать уникальные параметры для каждой итерации текстового поля? Надеюсь, это имеет смысл.

Приветствия

Ответы [ 2 ]

3 голосов
/ 07 марта 2012

Вам необходимо использовать var в <apex:repeat> для каждого элемента в списке productDetails. Например:

<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>

Это установит свойство quantity каждого productDetail.

Если вы действительно перебираете родительский элемент productDetail в этом примере, то вам нужно изменить контроллер, чтобы создать родительский элемент для каждого, а затем перебрать его. Я напишу пример кода, как будто вы перебираете список потенциальных заказов.

В вашем контроллере вам нужно будет создать заказ для каждого из продуктов. Я не уверен, является ли родительский объект SObject или пользовательским классом, но я напишу пример, как если бы это был пользовательский класс.

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;
}

Теперь на вашей странице VisualForce вы можете перебирать список Order, и пользователь может задать количество.

<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>

Вернувшись в контроллер, сохраните только orders, у которого quantity больше нуля (или любые другие критерии, которые вы имеете в виду).

2 голосов
/ 07 марта 2012

Самый простой способ сделать это - добавить настраиваемое поле к объекту, через который вы повторяете. Однако я понимаю, что в некоторых случаях это нежелательно.

Возможно, вы могли бы использовать для этого собственный объект Apex (не пользовательский объект Salesforce). Вы можете сделать это, добавив вложенный класс в свой контроллер или расширение.

Например:

public class MyClass 
{
    public class MyProductDetail
    {
        public string Name {get;set;}
        public string Family {get;set;}
        public string ProductCode {get;set;}
        public integer Quantity {get;set;} // theList
    }

    public List<MyProductDetail> MyProductDetails {get;set;}
}

Вам нужно было бы пройтись по всем подробным записям вашего Продукта (возвращенным из SOQL) и добавить их в список MyProductDetails. Однако, получив это, вы можете использовать повторитель Visualforce для отображения каждого из них и сохранения введенных количественных данных для каждой записи.

<apex:repeat value="{!MyProductDetails}" 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="{!o.Quantity}"/>
    </apex:pageblockSection> 
</apex:repeat>

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...