Salesforce学习之路(六)利用Visualforce Page实现页面的动态刷新功能
Visualforce是一个Web开发框架,允许开发人员构建可以在Lightning平台上本地托管的自定义用户界面。其框架包含:前端的界面设计,使用的类似于HTML的标记语言;以及后端的控制器,使用类似于Java的Apex语言。
哪些版本支持Visualforce?
众所周知,Salesforce分为多个版本,不同的版本功能之间存在一定的差异,而支持Visualforce的版本:Contact Manager,Group,Professional,Enterprise,Unlimited,Performance和Developer Edition。
Visualforce的优势?
作为Markup语言,Visualforce有如下优点:
- 与其他基于Web的用户界面技术集成:因为Visualforce markup最终呈现的是HTML格式,所以开发人员可以将visualforce markup与标准的HTML, JavaScript,Flash一起使用。
- MVC开发模式:Visualforce通过视图,控制器模式,开发人员可以轻松拆分和构建用户界面的外观和应用程序的业务逻辑。
- 托管平台:Visualforce页面完全由Lightning平台编译和呈现,因此无论显示或编辑的数量如何,它都与Salesforce标准页面的性能相同。
- 可自动升级:升级Lighnting平台的其他组件时,无需重新Visualforce页面。由于页面作为元数据存储的,所以它会与系统的其余部分一起自动升级。

Visualforce页面有两个主要元素组成:Markup和Controller
- Markup:Visualforce标签,HTML,JavaScript或嵌入在单个控件中的任何其他基于Web的代码组成 <apex:page >标签。这里定义了页面中使用的用户界面组件以及它们的显示方式。
- Controller:是一组指令,用于与指定的Markup进行交互,为其提供数据访问和修改,使用类似与Java的Apex语言。
一般说来,不涉及sObject的数据处理(增删改查)时,仅Markup部分便已足够;若涉及sObject的数据处理,则需创建一个控制器(class类),并将该类与View绑定。
Markup
在这里创建一个下拉菜单选择并动态刷新的案例。
<!--对于单Visualforce Page,所有的Page都必须包含在一个Page内-->
<apex:page controller="SP_FilterConditionPageController">
<!--from:Visualforce页面的一部分,允许用户输入和提交按钮的表单-->
<apex:form >
<!--outputlabel:输入输出字段的标签-->
<apex:outputlabel value="Site Name" for="siteValue" />
<!--selectList:选项列表,允许用户选择一个值或多个值-->
<apex:selectList value="{!siteName}" size="1" id="siteValue" multiselect="false">
<!--selectOptions:作为selectList的子组件,提供选择对象的集合-->
<apex:selectOptions value="{!siteItems}"/>
</apex:selectList>
<apex:outputlabel value="Display Months" for="values2" />
<apex:selectList value="{!displayMonth}" size="1" id="values2" multiselect="false">
<apex:selectOptions value="{!monthItems}"/>
</apex:selectList>
<!--commandButton:输入元素的按钮,按钮执行有控制器定义,收到响应后刷新页面-->
<apex:commandButton value="Apply" action="{!apply}" rerender="out" status="status"/>
</apex:form> <!--outputPanel:将组件组合在一起进行AJAX刷新-->
<apex:outputPanel id="out">
<!--显示AJAX更新请求状态的组件-->
<apex:actionstatus id="status">
<apex:facet name="stop">
</apex:facet>
</apex:actionstatus>
</apex:outputPanel>
</apex:page>
{!**}: 表示controller中的变量。
controller类
服务端的控制器类,为前端界面的下拉菜单提供数据,并在选择数据后修改对象对应的字段值。
注意:按钮Action的响应必须为PageReference.
public with sharing class SP_FilterConditionPageController {
String displayMonth;
String siteName;
String currentDisplayMonth;
//获取当前页面的对象ID
Id accountId = ApexPages.CurrentPage().getparameters().get('id');
public String getDisplayMonth() {
if(displayMonth == null) {
List<Account__c> accounts = [select Display_Months__c, Display_Site__c
from Account__c
where id = :accountId limit 1];
displayMonth = accounts[0].Display_Months__c;
}
return displayMonth;
}
public void setDisplayMonth(String displayMonth) {
this.displayMonth = displayMonth;
}
public String getSiteName() {
return siteName;
}
public void setSiteName(String siteName) {
this.siteName = siteName;
}
public PageReference apply() {
if(displayMonth != null || siteName != null){
List<Account__c> accounts = [select Display_Months__c, Display_Site__c
from Account__c
where id = :accountId limit 1];
for(Account__c account: accounts) {
if(displayMonth != null) {
account.Display_Months__c = displayMonth;
}
if(siteName != null) {
account.Display_Site__c = siteName;
}
}
if(Schema.sObjectType.Account__c.isUpdateable()) {
//更新对象
update accounts;
}
}
//根据当前对象ID,产生新的页面
PageReference pageRef = new pageReference('/' + accountId);
pageRef.setRedirect(true);
return pageRef;
}
public List<SelectOption> getSiteItems() {
List<SelectOption> options = new List<SelectOption>();
List<Sites__c> sites = [select WebEx_URL__c, Site_Status__c, Lockdown_Flag__c
from Sites__c
where Account__c = :accountId];
for(Sites__c site: sites){
if(site.Site_Status__c == 'inactive' || site.Lockdown_Flag__c == 'Not Available') {
continue;
}
options.add(new SelectOption(site.Webex_URL__c, site.Webex_URL__c));
}
return options;
}
public List<SelectOption> getMonthItems() {
List<SelectOption> options = new List<SelectOption>();
options.add(new SelectOption('Last 6 Months', 'Last 6 Months'));
options.add(new SelectOption('Last 12 Months', 'Last 12 Months'));
options.add(new SelectOption('Last 18 Months', 'Last 18 Months'));
options.add(new SelectOption('Last 24 Months', 'Last 24 Months'));
options.add(new SelectOption('Last 36 Months', 'Last 36 Months'));
return options;
}
}
在上述案例中,前端界面在下拉框中选择对应的site Name和 Display Name值,点击Apply按钮时,将结果保存至数据库,生成新的页面返回,这样便可达到动态刷新页面的效果。
具体的前端界面如下:

Salesforce学习之路(六)利用Visualforce Page实现页面的动态刷新功能的更多相关文章
- Salesforce学习之路-developer篇(三)利用Visualforce Page实现页面的动态刷新案例学习
Visualforce是一个Web开发框架,允许开发人员构建可以在Lightning平台上本地托管的自定义用户界面.其框架包含:前端的界面设计,使用的类似于HTML的标记语言:以及后端的控制器,使用类 ...
- Salesforce学习之路(十三)Aura案例实战分析
Aura相关知识整合: Salesforce学习之路(十)Aura组件工作原理 Salesforce学习之路(十一)Aura组件属性<aura:attribute /> Salesforc ...
- Salesforce学习之路-developer篇(四)Visualforce结合Reports展示图表
Salesforce作为一款CRM系统,个人觉得最重要的环境便是在于数据的展示和联动,而Salesforce也本身提供了相当强大的功能,Report在展示图表的方面十分强大,前段时间更是宣布以157亿 ...
- Salesforce学习之路(七)Visualforce结合Reports展示图表
Salesforce作为一款CRM系统,个人觉得最重要的环境便是在于数据的展示和联动,而Salesforce也本身提供了相当强大的功能,Report在展示图表的方面十分强大,前段时间更是宣布以157亿 ...
- Salesforce学习之路-developer篇(二)利用Jenkins和Bitbucket实现Salesforce的CI/CD功能
上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...
- Salesforce学习之路(四)利用Jenkins和Git实现Salesforce的CI/CD功能
上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...
- Salesforce学习之路(三)利用VS Code结合Git开发Salesforce
在前面说了一些有关Admin的知识,但实际开发运用中,仅凭Admin的配置很难满足项目的定制化需求,因此基于CRM的二次开发则应运而生. 由于国内资料相对较少,所以很多入门新手无处下手,那这里就简单介 ...
- Salesforce学习之路-developer篇(一)利用VS Code结合Git开发Salesforce
Part 1: 从Git中克隆代码到本地 git clone https://github.com/git/git Part 2: 在VS Code中安装Salesforce和Git插件 在VS Co ...
- Salesforce学习之路-developer篇(五)一文读懂Aura原理及实战案例分析
1. 什么是Lightning Component框架? Lightning Component框架是一个UI框架,用于为移动和台式设备开发Web应用程序.这是一个单页面Web应用框架,用于为Ligh ...
随机推荐
- javascript 十大经典排序
首先生成一个数字数组: let arr = Array.from({length:20},x=>{return Math.ceil(Math.random()*10**2)}) console. ...
- JS相关基础
1. ES5和ES6继承方式区别 ES5定义类以函数形式, 以prototype来实现继承 ES6以class形式定义类, 以extend形式继承 2. Generator了解 ES6 提供的一种异步 ...
- 维格表2月更新:智能图表上线,唤醒全量工作数据堪比AI
你是否曾经想过,你的维格表数据有朝一日变化出如科幻电影般的数据图表? 你是否感到厌倦,对当前的后台系统密密麻麻的数据累觉不爱? 你是否一直期待,拥有一个专属大数据 BI 看板,让你的规划如有神助,挥斥 ...
- linux查看目录文件以及子目录文件大小的命令
可以使用以下命令,不过如果文件比较多,因为是递归统计大小的的,所以结果出来的会比较慢,需要等待. du -h --max-depth=1 * 以下是命令的说明 du [-abcDhHklmsSx] [ ...
- 微信小程序:如何删除所有的console.log?
使用vscode正则匹配,手动去除 1.用vscode打开微信小程序项目 2.Edit-----replace in Files 1. console.log()加了分号 console\.log\( ...
- TkMybatis添加对象后返回数据的id
在实体类的id属性上加上下面的注解 //导入的包import javax.persistence.GeneratedValue; @GeneratedValue(generator = "J ...
- 保证软件开发过程遵循ISO 26262功能安全标准的十个主要进阶步骤
保证软件开发过程遵循ISO 26262功能安全标准的十个主要进阶步骤 为保障汽车软件质量,使软件开发符合ISO 26262功能安全标准,需要我们对开发流程做出改进,并与2018年的更新同步. 本视频课 ...
- 你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床
你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床 经过前面两弹的介绍,相信大家对图床都不陌生了吧, 但是小魔童觉得这样做法还是不方便,使用 ...
- POJ-3159(差分约束+Dijikstra算法+Vector优化+向前星优化+java快速输入输出)
Candies POJ-3159 这里是图论的一个应用,也就是差分约束.通过差分约束变换出一个图,再使用Dijikstra算法的链表优化形式而不是vector形式(否则超时). #include< ...
- git的工作管理和基础操作
git的工作管理和基础操作 在本地创建git仓库管理我们的代码 初次使用git,先在本地配置一些基础信息 $ git config -l $ git config --global user.name ...