Hi,陌生的朋友,欢迎来看我的笔记,如果你觉得对你有帮助,千万记得点个赞哦~ 不过其实我也只是个小白,目前在自学Java和Salesforce,所以如果你发现任何有遗漏错误的地方,欢迎交流指正!
一、需求阐述
这个Task的需求非常简单,就是要求写一个页面,在这个页面上可以新建Account和Contact,并且每个Account可以对应多个Contact。
二、逻辑梳理
简单分析之后,我们发现要实现这个功能,页面中至少要包括三个Button:Add,Delete,Save。
- Add:用于添加多条Contact。
- Delete:删除Contact,显示在每一条Contact之后。
- Save:保存。
这个程序最核心的逻辑是:一个Account有多个Contact。如何实现呢?非常简单!即在做插入操作之前,把页面中所有的Contact的AccountId字段赋值为当前Account的Id。
其次是删除的逻辑:我们会通过一个内部类,实现在添加Contact的时候有一个数字与之对应。在点击删除按钮时,我们把这个数字通过<apex:param>传到后台,然后程序找到对应的Contact,并把它从Contact列表remove掉。
三、代码实现
1.Controller
public with sharing class addContact {
ApexPages.StandardController sc;
public Account acct{set; get;}
public Integer marker = 2;
public Integer selectedContact{set; get;}
public List<WrapperClass> lContacts{get; set;}
public addContact(ApexPages.StandardController controller){
this.acct = (Account)controller.getRecord();
sc = controller;
lContacts = new List<WrapperClass>();
Contact c = new Contact();
lContacts.add(new WrapperClass(c, 1));
}
public PageReference addAContact(){
Contact c = new Contact();
lContacts.add(new WrapperClass(c, marker));
marker = marker + 1;
return null;
}
public PageReference saveAccount(){
Database.SaveResult sr = Database.insert(acct, false);
Id idey = sr.getId();
List<Contact> contacts = new List<Contact>();
for (WrapperClass wc : lContacts){
Contact c = new Contact();
c.LastName = wc.c.LastName;
c.FirstName = wc.c.FirstName;
c.AccountId = idey;
contacts.add(c);
}
insert contacts;
return null;
}
public PageReference deleteContact(){
Integer x = -1;
for (WrapperClass wc : lContacts){
x++;
if (wc.counter == selectedContact) {
System.debug('-->selected contact:' + selectedContact + ' position:' + x);
break;
}
}
lContacts.remove(x);
return null;
}
public class WrapperClass{
public Integer counter{get; set;}
public Contact c{get; set;}
public WrapperClass(Contact cntc, Integer i){
this.counter = i;
this.c = cntc;
}
}
}
2.VF Page
<apex:page id="addContact" standardController="Account" extensions="addContact">
<apex:form id="myForm">
<apex:panelGrid columns="2">
Account Name<apex:inputField value="{!account.Name}"/>
</apex:panelGrid>
<apex:repeat value="{!lContacts}" var="x">
<apex:panelGrid columns="8">
First Name:<apex:inputField value="{!x.c.FirstName}"/>
Last Name:<apex:inputField value="{!x.c.LastName}"/>
Lead Source:<apex:inputField value="{!x.c.leadSource}"/>
<apex:commandButton action="{!deleteContact}" style="Button" value="Delete" reRender="myForm" immediate="true">
<apex:param value="{!x.counter}" name="selected" assignTo="{!selectedContact}"/>
</apex:commandButton>
</apex:panelGrid>
</apex:repeat>
<apex:commandButton value="Add Contact" action="{!addAContact}" reRender="myForm" immediate="true"/>
<apex:commandButton value="Save" action="{!saveAccount}"/>
</apex:form>
</apex:page>
3.效果
四、知识点回顾
1.PageReference
A PageReference is a reference to an instantiation of a page. Among other attributes, PageReferences consist of a URL and a set of query parameter names and values.
PageReference的作用 :
- 查看或设置页面的参数的值
- 导航到新的页面(很明显,在下面的代码中,PageReference的作用是导航到新的页面)
如何实例化一个页面?
- Page.existingPageName
- PageReference pageRef = new PageReference('partialURL');
- PageReference pageRef = new PageReference('fullURL');
- PageReference pageRef = ApexPages.currentPage();
下面的代码中return null表示在触发了addAContact这个方法之后,返回到当前的页面(刷新当前的页面)。
public PageReference addAContact(){
Contact c = new Contact();
lContacts.add(new WrapperClass(c, marker));
marker = marker + 1;
return null;
}
更多用法请参考官方文档PageReference Class。
2.<apex:param>
Basically the apex:param tag is used to pass values from the Visualforce Page to the Apex Controller.
<apex:param>的作用:
- 把参数从VF页面传到Controller
常见实例:删除记录
下列表格显示了在数据库中的潜在客户,当用户点击Delete按钮时,相应的记录就会从数据库中删除。
代码实现:
public class ApexParamDemoController{
//Property to hold the Id of the Record to be Deleted
public Id RecordToDelete {get; set;}
//Query all the Leads from the Database
public List<Lead> AllLeads{
get{ return [SELECT Id, Name FROM Lead]; }
}
//Delete the Record from the Database
public void deleteRecord(){
DELETE new Lead(Id = RecordToDelete);
}
}
<apex:page controller="ApexParamDemoController">
<apex:form id="form">
<apex:pageBlock>
<apex:pageBlockTable value="{!AllLeads}" var="Lead">
<apex:column value="{!Lead.Name}"/>
<apex:column>
<apex:commandButton value="Delete" action="{!deleteRecord}" reRender="form">
<apex:param name="leadToDelete" value="{!Lead.Id}" assignTo={!RecordToDelete}"/>
</apex:commandButton>
</apex:column>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
同理,在本次试验中,<apex:param>会通过assignTo属性把该条记录的counter值传给controller中的变量selectedContact。用户在触发deleteContact后,程序会遍历contact列表中的所有记录,如果某条记录的counter和selectedContact相等,就删除这条记录并刷新页面。
<apex:commandButton action="{!deleteContact}" style="Button" value="Delete" reRender="myForm" immediate="true">
<apex:param value="{!x.counter}" name="selected" assignTo="{!selectedContact}"/>
</apex:commandButton>
public PageReference deleteContact(){
Integer x = -1;
for (WrapperClass wc : lContacts){
x++;
if (wc.counter == selectedContact) {
System.debug('-->selected contact:' + selectedContact + ' position:' + x);
break;
}
}
lContacts.remove(x);
return null;
}
更多用法请参考官方文档apex:param。
五、总结
懒得写了~~
参考:https://success.salesforce.com/answers?id=90630000000hfRmAAI