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 ...
随机推荐
- 微服务学习.net5+consul
趁着刚过完年,还没有开始做业务的时候,学习下consul 概念自己去官网看,这里只讲下具体实现 官网下载https://www.consul.io/downloads 我下载的是Windows版本 启 ...
- 零信任三大技术之SDP
SDP概述 SDP Software Defined Perimeter(软件定义边界),2013 年由云安全联盟 CSA提出. SDP 设计基本原则 1.信息隐身:隐藏服务器地址.端口,使之不被扫描 ...
- 关于 HTTP 后端人员需要了解的 20+ 图片!
前言 当您网上冲浪时,HTTP 协议无处不在.当您浏览网页.获取一张图片.一段视频时,HTTP 协议就正在发生. 本篇将尽可能用简短的例子和必要的说明来让您了解基础的 HTTP 知识. 目录: 什么是 ...
- .Net Core 3.1浏览器后端服务(四) 你眼中的依赖注入与我相同吗?
一.前言 DI-Dependency Injection 依赖注入 IoC-Inversion of Control 控制反转 近几年这依赖注入. 控制反转已成为软件开发中不可或缺的一部分,那么该怎么 ...
- 肝了很久,冰河整理出这份4万字的SpringCloud与SpringCloudAlibaba学习笔记!!
写在前面 不少小伙伴让我整理下有关SpringCloud和SpringCloudAlibaba的知识点,经过3天的收集和整理,冰河整理出这份4万字的SpringCloud与SpringCloudAli ...
- 如何使用python爬取网页动态数据
我们在使用python爬取网页数据的时候,会遇到页面的数据是通过js脚本动态加载的情况,这时候我们就得模拟接口请求信息,根据接口返回结果来获取我们想要的数据. 以某电影网站为例:我们要获取到电影名称以 ...
- C++的指针,引用,指向指针的引用和Java中的引用
#include <iostream> #include<algorithm> using namespace std; class Test { public: Test(i ...
- DataFocus小学堂|客户分析之复活客户分析
复活客户分析 什么是"复活客户"?如何进行"复活客户分析"呢?今天,我们借助DataFocus系统,来了解一种简单的复活客户分析. 1.何为复活客户 复活客户, ...
- gpfdist原理解析
gpfdist原理解析 前言:gpfdist作为批量向postgresql写入数据的工具,了解其内部原理有助于正确使用以及提供更合适的数据同步方案.文章先简要介绍gpfdist的整体流程,然后针对重要 ...
- 2018.8.30 nowcoder oi赛制测试1
2018.8.30 nowcoder oi赛制测试1 普及组难度,发现了一些问题 A 题目大意:求斐波那契数列\(f(k-1)f(k+1)-f(k)^2\),范围极大 打表可得规律 其实是卡西尼恒等式 ...