• salesforce-Visualforce-7.自定义控制器(Custom Controllers)


    一、自定义控制器简介

    自定义控制器包含可在 Visualforce 页面使用的自定义逻辑和数据操作。例如,自定义控制器可以检索要显示的项目列表、调用外部 Web 服务、验证和插入数据等等 — 所有这些操作都将对使用它作为控制器的 Visualforce 页面可用。
    控制器通常检索要在 Visualforce 页面中显示的数据,并包含响应页面操作(如单击按钮)的代码。

    毕竟众口难调,并非所有 Web 应用程序都是标准的。当想要覆盖现有功能、通过应用程序自定义导航、使用调用或 Web 服务,或者需要更好地控制访问页面信息的方式时,借助 Visualforce,这一切都游刃有余。可以使用 Apex 编写自定义控制器,并从头到尾完全控制应用程序的逻辑。

    二、创建使用自定义控制器的 Visualforce 页面

    通过在 < apex:page> controller 属性中引用控制器类的名称,将自定义控制器添加到 Visualforce 页面。
    当页面使用了自定义控制器时,不能再使用标准控制器。页面使用不同的属性来设置自定义控制器。

    • apex:
    public class ContactsListWithController {
        private String sortOrder = 'LastName';
        public List<Contact> getContacts() {
            List<Contact> results = Database.query(
                'SELECT Id, FirstName, LastName, Title, Email ' +
                'FROM Contact ' +
                'ORDER BY ' + sortOrder + ' ASC ' +
                'LIMIT 10'
            );
            return results;
        }
        public void sortByLastName() {
            this.sortOrder = 'LastName';
        }
        public void sortByFirstName() {
            this.sortOrder = 'FirstName';
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • Visualforce page:
    <apex:page controller="ContactsListWithController">
        <apex:form>
            <apex:pageBlock title="Contacts List" id="contacts_list">
                <!-- Contacts List -->
                <apex:pageBlockTable value="{! contacts }" var="ct">
                    <apex:column value="{! ct.FirstName }"/>
                    <apex:column value="{! ct.LastName }"/>
                    <apex:column value="{! ct.Title }"/>
                    <apex:column value="{! ct.Email }"/>
                </apex:pageBlockTable>
            </apex:pageBlock>
        </apex:form>
    </apex:page>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 代码解析:

    在该页面上,Visualforce 将表达式转换为对控制器的 getContacts() 方法的调用。该方法返回联系人记录列表,这正符合 apex:pageBlockTable 的预期。

    getContacts() 方法称为 getter 方法,这是一种通用模式
    其中 Visualforce 标记中的 {! someExpression } 自动连接到控制器中名为 getSomeExpression() 的方法。这是页面访问需要显示的数据的最简单方法。

    • 预览结果:
      在这里插入图片描述

    三、在自定义控制器中创建操作方法以响应页面上的用户输入

    显示数据固然重要,但对任何网页应用来说,响应用户行为都是必不可少的。借助自定义控制器,可以通过编写操作方法来响应用户活动,在页面上创建大量的自定义操作。

    • Visualforce page:
    <apex:page controller="ContactsListWithController">
        <apex:form>
            <apex:pageBlock title="Contacts List" id="contacts_list">
                <!-- Contacts List -->
                <apex:pageBlockTable value="{! contacts }" var="ct">
                    <apex:column value="{! ct.FirstName }">
                        <apex:facet name="header">
                            <apex:commandLink action="{! sortByFirstName }"
                                reRender="contacts_list">First Name
                            </apex:commandLink>
                        </apex:facet>
                    </apex:column>
                    <apex:column value="{! ct.LastName }">
                        <apex:facet name="header">
                            <apex:commandLink action="{! sortByLastName }"
                                reRender="contacts_list">Last Name
                            </apex:commandLink>
                        </apex:facet>
                    </apex:column>
                    <apex:column value="{! ct.Title }"/>
                    <apex:column value="{! ct.Email }"/>
                </apex:pageBlockTable>
            </apex:pageBlock>
        </apex:form>
    </apex:page>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 预览结果:通过点击FirstName,LastName来实现排序在这里插入图片描述
    • 代码分析:

    新标记向每个 < apex:column> 组件添加了两个嵌套组件。< apex:column> 本身有一个纯文本标题,但我们想让标题变成可点击的效果。

    < apex:facet> 允许我们自定义列标题的内容。我们想要的是一个调用正确操作方法的链接。链接是使用 < apex:commandLink> 组件创建的,将 action 属性设置为引用控制器中操作方法的表达式。

    (请注意,与 getter 方法相比,操作方法名称与引用操作方法的表达式相同。)

    单击链接会触发控制器中的操作方法。操作方法更改私有变量的排序,然后重新显示表。重新显示表时,会重新评估 {! contacts },通过刚设置的排序重新运行查询。最终结果是按照用户点击请求的顺序重新排列表格。

    Tips

    名字和姓氏列的标题文本在此标记中是硬编码。但是,如果用户并非都使用英文怎么办?标准 Salesforce 用户界面具有所有标准对象字段名称的翻译版本,可以为自定义对象提供自己的译文。

    如何访问字段名称的翻译版本?不是纯文本,试试这个标记
    < apex:outputText value="{! $ObjectType.Contact.Fields.FirstName.Label }"/>
    这是引用字段标签的正确方法,即使您的组织都使用相同的语言,如果更改了字段名称,字段标签也会自动更新。

    getter 方法将数据从控制器提取到页面。相应的 setter 方法可将值从页面提交回控制器。与 getter 方法一样,setter 方法也使用“set”前缀。此外,这两种都只是带实际参数的方法。

    getter 和 setter 的替代方法是使用 Apex 属性。属性是变量与 getter 和 setter 方法的组合,其语法可以更清楚地将它们组合在一起。引用自定义对象的简单属性可以这样声明。

    public MyObject__c myVariable { get; set; } 
    
    • 1

    通过省略 get 或者 set,属性可以是公共的或私有的,也可以是只读的,甚至是只写的。除了简单地保存和检索值之外,还可以为 get 或 set 方法创建实现。

    属性是 Apex 的通用功能,并非 Visualforce 所特有。Apex 是一种完整的编程语言,它不仅是构建复杂 Visualforce 页面的天然合作伙伴,还用于多种 Lightning 平台开发环境。

    Visualforce 请求和响应的生命周期起初可能看起来很复杂。特别要注意的是,要清楚 getter 或 setter(使用属性的情况下)的调用没有特定的顺序,因此不能在它们之间引入执行顺序依赖关系。

    • 其他示例:
      • Visualforce page:NewCaseList
    <apex:page controller="NewCaseListController">
        <apex:repeat value='{! newCases}' var="case">
            <ul>
                <li>
                     <apex:outputLink value="{! URLFOR($Action.Case.View,case.Id)}">
                         {! case.Id}
                    </apex:outputLink>
                </li>
            </ul>
        </apex:repeat>
    </apex:page>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • apex: NewCaseListController
    public class NewCaseListController {
        public List<Case> getNewCases(){
            List<Case> caseList= [select Id,CaseNumber from Case where status = 'New'];
            return caseList; 
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    Resources

    Creating Your First Custom Controller
    Custom Controllers and Controller Extensions
    Apex Developer Guide
    “Just Enough Code—Introduction to Controllers and Extensions,” in Visualforce in Practice
    Apex Template: Visualforce Controller
    A Real Controller for Visualforce Charting

  • 相关阅读:
    【智能算法】覆盖算法
    We’re sorry but XXX doesn’t work properly without JavaScript enabled(解决方案汇总)
    图的基本概念以及相关定义
    【计算机网络】https协议
    NX二次开发UF_CAM_ask_opt_template_object 函数介绍
    SAP系统里的统驭科目
    ZZCMS201910代码审计
    odoo 15 会员模块的使用
    如何现实笔记本已连接的密码
    NX二次开发-NX客户机与服务器FTP上传下载文件
  • 原文地址:https://blog.csdn.net/nihaixiao/article/details/125472836