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学习之路-developer篇(三)利用Visualforce Page实现页面的动态刷新案例学习的更多相关文章

  1. Salesforce学习之路(六)利用Visualforce Page实现页面的动态刷新功能

    Visualforce是一个Web开发框架,允许开发人员构建可以在Lightning平台上本地托管的自定义用户界面.其框架包含:前端的界面设计,使用的类似于HTML的标记语言:以及后端的控制器,使用类 ...

  2. Salesforce学习之路-developer篇(四)Visualforce结合Reports展示图表

    Salesforce作为一款CRM系统,个人觉得最重要的环境便是在于数据的展示和联动,而Salesforce也本身提供了相当强大的功能,Report在展示图表的方面十分强大,前段时间更是宣布以157亿 ...

  3. Salesforce学习之路-developer篇(二)利用Jenkins和Bitbucket实现Salesforce的CI/CD功能

    上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...

  4. Salesforce学习之路-developer篇(一)利用VS Code结合Git开发Salesforce

    Part 1: 从Git中克隆代码到本地 git clone https://github.com/git/git Part 2: 在VS Code中安装Salesforce和Git插件 在VS Co ...

  5. Salesforce学习之路-developer篇(五)一文读懂Aura原理及实战案例分析

    1. 什么是Lightning Component框架? Lightning Component框架是一个UI框架,用于为移动和台式设备开发Web应用程序.这是一个单页面Web应用框架,用于为Ligh ...

  6. Salesforce学习之路-developer篇(五)Aura组件原理及常用属性

    很喜欢曾经看到的一句话:以输出倒逼输入.以输出的形式强制自己学习,确实是高效的学习方式,真的很棒.以下仅为个人学习理解,如有错误,欢迎指出,共同学习. 1. 什么是Lightning Componen ...

  7. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  8. 我的web安全工程师学习之路——规划篇

    据网上收集的web安全工程师需要掌握哪些技能,职位要求以及如何入门,加上学习网易推出的web安全工程师微专业课程,为了进一步学习,所以给自己做了一些小小规划,也希望给同样想成为web安全工程师的同仁们 ...

  9. Vue学习之路第一篇(学习准备)

    1.开发工具的选择 这个和个人的开发习惯有关,并不做强求,厉害的话用记事本也可以.但是我还是建议用人气比较高的编辑工具,毕竟功能比较全面,开发起来效率比较高. 我之前写前端一直用的是sublimete ...

随机推荐

  1. ubuntu中rc.local不执行问题

    解决思路概括起来如下: 1.首先排除脚本自身问题,可以手动点杠执行下试试, 2.脚本确定没问题后,放到开机启动程序引用的路径下,办法如下 2.1.查看系统的运行级别 2.2.到对应运行的rcX.d的目 ...

  2. POJ 1077 Eight (BFS+康托展开)详解

    本题知识点和基本代码来自<算法竞赛 入门到进阶>(作者:罗勇军 郭卫斌) 如有问题欢迎巨巨们提出 题意:八数码问题是在一个3*3的棋盘上放置编号为1~8的方块,其中有一块为控制,与空格相邻 ...

  3. CodeForces 931E Game with String

    Game with String 题意:有一个字符串,可以选择从第K位开始,将[K,len(s)-1]的字符都移到前面去,现在给你一个首字母,你可以再选择一位进行观察,然后猜测这个K的值是多少, 现在 ...

  4. UVA - 10480 Sabotage 最小割,输出割法

    UVA - 10480 Sabotage 题意:现在有n个城市,m条路,现在要把整个图分成2部分,编号1,2的城市分成在一部分中,拆开每条路都需要花费,现在问达成目标的花费最少要隔开那几条路. 题解: ...

  5. CodeForces 804C Ice cream coloring

    Ice cream coloring 题解: 这个题目中最关键的一句话是, 把任意一种类型的冰激凌所在的所有节点拿下来之后,这些节点是一个连通图(树). 所以就不会存在多个set+起来之后是一个新的完 ...

  6. hdu6333 Harvest of Apples 离线+分块+组合数学(求组合数模板)

    Problem B. Harvest of Apples Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K ...

  7. 【Offer】[29] 【顺时针打印矩阵】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 例如,如果输入如下矩阵:  则依次打印出数字1,2,3,4,8,12, ...

  8. 更改mac电脑图片默认存储位置

    1.创建存储位置screenshot 2.打开terminal 3.defaults write com.apple.screencapture location ~/Desktop/screensh ...

  9. python串口工具的使用!!!!一定要加timeout=!!!!

    不指定timeout参数的话,就各种报错,如下: 而前面的串口,波特率则不需要指明.

  10. android中的后退键——onBackPressed()的使用

    转自:http://blog.sina.com.cn/s/blog_5085156c0101725e.html 很多网友不明白如何在Android平台上捕获Back键的事件,Back键是手机上的后退键 ...