2013-04-15 34 views
1

我目前在聯繫人記錄中嵌入了一個Visualforce頁面,該頁面顯示所有與chexckbox有效的活動,指示聯繫人是否爲活動的成員(如果選中,則聯繫人爲成員)。我也有一個命令按鈕來保存更改。使用頂點生成visualforce碼:重複喜歡像這樣:Salesforce/Apex - 保存動態複選框數量

<apex:repeat value="{!campaignWrappers}" var="cm"> 
    <div class="MailingRow"> 
    <apex:outputText styleClass="CampaignLabel" value="{!cm.c.Name}" ></apex:outputText> 
    <apex:inputCheckbox styleClass="CampaignCheck" value="{!cm.selected}" /> 
    </div> 
</apex:repeat>

我的問題是,什麼是去傳遞複選框值到控制器的最佳方式?理想情況下,我希望僅傳遞已更改的複選框,將已從選中狀態變爲未選中狀態的複選框傳遞給第二個列表,其中包含從未選中狀態變爲已選中狀態的複選框。然後我可以插入和刪除這些列表。

這是一個應該在複選框上使用actionSupport標籤的情況嗎?

<apex:actionSupport event="onChange" action="{!updateChangeList}" />

回答

1

整個收集將被髮送回服務器(因此所有複選框的狀態)。 Salesforce和其他與網絡相關的語言並沒有太大差別(例如Get $_POST from multiple checkboxes),主要區別在於,通常您會使用名稱以[]結尾的變量,並且SF將使用名稱中某處增加數字的唯一名稱。

如果你真的想建立2個列表 - 也許一些JavaScript魔法添加/刪除2個隱藏文本字段的內容......但有點混亂。

當表單被提交併且您的updateChangeList()被調用時,您可以迭代CampaignWrappers的集合並與之前的值進行比較。無論是在1以上變量存儲在包裝以前的值&將其暴露給用戶,或者你還是會基於什麼是在競選知道:

Set<Id> campaignsToBeAddedTo = new Set<Id>(); 
Set<Id> campaignsToBeRemovedFrom = new Set<Id>(); 

for(CampaignMember cm : campaignWrappers){ 
    if(cm.selected && cm.c.CampaignMembers.isEmpty(){ 
     // is ticket but wasn't a member before 
     campaignsToBeAddedTo.add(cm.c.Id); 
    } else if (!cm.selected && !cm.c.CampaignMembers.isEmpty()){ 
     // not ticked but used to be a member 
     campaignsToBeRemovedFrom.add(cm.c.Id); 
    } 
} 

你甚至可以優化它有點(就像放isEmpty()檢查輔助變量)。或者閱讀可能產生「副作用」的setter方法。無論如何,當表單數據將被反序列化時,所有類似的循環都會爲您運行。 http://blogs.developerforce.com/developer-relations/2008/06/property-access.html是一個很好的起點(這是古老的,我知道。基本上在這篇博客文章之前,我們必須爲我們想在VF中使用的每個變量編寫Boolean getSelected()void setSelected(Boolan b))。

最後但並非最不重要 - 鏈接到page execution order

+0

感謝您的信息eyescream。我有點困惑。因此,在每個複選框上使用actionSupport並不是前進的方向,相反,我會對我的commandbutton執行一個操作,該操作根據上面的示例執行邏輯操作。我需要爲每個複選框設置一個ID,以便我可以在控制器中識別它們嗎?我無法像這樣在Visualforce中設置ID:id = {!cm.c.id},因爲它必須是文字? – Ronnie

+0

ActionSupport不是魔術棒;)這是一個AJAX快捷方式,可以提交整個表單並執行操作。把它當作用戶選擇一個複選框的瞬間點擊一下隱藏的按鈕。關鍵是它會成爲網絡流量。如果你想一個接一個地發送它們 - 當然可以。你可以但不必設置ID。他們會自動設置「id」和「name」。只要不用擔心,假設當方法體輸入時,所有的變量都會被解析等等,隨時可以使用 – eyescream

+0

感謝您的詳細解釋eyescream! – Ronnie

2

您可以使用聯繫人對象的包裝類來存儲聯繫人的當前和新狀態,以檢查聯繫人是否爲廣告系列的成員。

public class ContactWrapper 
{     
public Boolean checked{ get; set; }    
public Contact con { get; set;}      

public AccountSKUWrapper() 
{     
    con = new Contact();     
    checked = false;    
}      

public ContactWrapper(Contact c) 
{     
    con= c;     
    checked = c.selected;    
}        

}

使用選擇領域,我們可以識別聯繫人是否是活動的一員,檢查在包裝變量有助於識別VF頁給出什麼樣的輸入。創建ContactWrapper列表並使用重載構造函數「ContactWrapper(Contact c)」初始化每個ContactWrapper對象。

<apex:repeat value="<ContactWrapper Object>" var="cm"> 
    <div class="MailingRow"> 
    <apex:outputText styleClass="CampaignLabel" value="{!cm.con.Name}" ></apex:outputText> 
    <apex:inputCheckbox styleClass="CampaignCheck" value="{!cm.checked}" /> 
    </div> 
</apex:repeat> 

保存按鈕點擊過程中,按照以下步驟:檢查與選定字段不同的選中變量的值。

Create 2 list **CHANGEDCONTACTLIST** and **UNCHANGEDCONTACTLIST** and then Loop through the list of ContactWrapper 

begin loop 
1.If checked differs then load **CHANGEDCONTACTLIST** with Contact Wrapper object as this need to be updated in Contact object; in order to update selected field of contact. 

2.Else load **UNCHANGEDCONTACTLIST**. 
end loop 

最終使用這兩個列表CHANGEDCONTACTLISTUNCHANGEDCONTACTLIST。你可以插入或刪除dml。

我相信這裏沒有使用ActionSupport標籤,因爲所有需要的值都將使用(讀/寫)使用ContactWrapper列表的getter和setter。

public List<ContactWrapper> wrapper {get;set;}