salesforce 零基礎開發入門學習(六)簡單的數據增刪改查頁面的構建


VisualForce封裝了很多的標簽用來進行頁面設計,本篇主要講述簡單的頁面增刪改查。使用的內容和設計到前台頁面使用的標簽相對簡單,如果需要深入了解VF相關知識以及標簽,

可以通過以下鏈接查看或下載:

https://resources.docs.salesforce.com/200/latest/en-us/sfdc/pdf/salesforce_pages_developers_guide.pdf

下面以一個單一的表進行數據增刪改查。表結構如圖1所示。通過圖可以看出GOODS表自己定義的參數主要包括以下:

GoodsName__c,GoodsType__c,GoodsBrand__c,GoodsDescribe__c,GoodsPrice__c。

 

                       圖1

因為salesforce對於DML操作以及查詢是十分吝嗇的,所以對於DML操作能一條查詢搞定的最好別使用兩條,除非數據查詢需要,比如必要的觸發器等等。

VF每個頁面都是以<apex:page>標簽起始</apex:page>結束,每個VF頁面都有一個Controller用來控制其業務邏輯。本篇例子中主要用到的控件包括如下:

<apex:inputText>:輸入框,類似於HTML中的<input type="text"/>,綁定的value類型可以為任意類型;

<apex:inputFile>:輸入框,類似於HTML中的<input type="text"/>,區別上者為value類型必須是sObject類型;

<apex:commandButton>:按鈕,類似於<input type="button"/>;

<apex:selectList>:下拉框,類似於html中的<select>;

<apex:selectOptions>:下拉框下元素,類似於html中的<option>;

<apex:pageBlockTable>:表格元素,類似於html中的table。用法與jstl類似,可以指定items屬性綁定列表,var屬性指定變量;

<apex:column>:表格的列元素,用於顯示表格每一列的值;

<apex:commandLink>:鏈接,類似於html中的<a>標簽;

<apex:param>:參數傳遞使用,用於給Controller層傳遞參數,傳遞的參數通過鍵值對傳遞;

<apex:form>:表單元素,類似於html中的form表單。

后台的值在前台可以通過{!object}形式(是不是類似EL表達式)來獲取后台object的變量。

eg:后台聲明Integer i = 1;   前台通過{!i}便可以獲取到i的值。

如果想要獲取系統的變量,比如想要獲取某個當前元素的ID屬性,則可以通過{!$Compontent.currentElementId}

在<apex:commandLink>或者<apex:commandButton>標簽綁定事件時,action綁定的格式為{!function}

eg:在<apex:commandButton>標簽綁定的action為{!query},則當點擊按鈕后,會調用Controller層的query方法。

OK,以下為代碼部分以及顯示的樣式,通過add按鈕可以添加一行數據,輸入內容后點擊save即可保存數據,上方為搜索區域。如果需要一次性插入多條數據,可以多操作幾次add按鈕,每個都輸入內容后執行save操作。

注:本篇中只是采用最簡單的方式來實現頁面顯示數據表的增刪改查,沒有使用到類似js,ajax等。實際工作中經常會用到這些,具體例子以后詳細說明。如果需要學習相關知識,請查看官方文檔或上方PDF鏈接。

Controller層代碼如下

  1 public with sharing class GoodsController {
  2        
  3        public List<GOODS__c> goodsList{get;set;}
  4        
  5        public List<SelectOption> goodsTypes = new List<SelectOption>();
  6        
  7    
  8        
  9        public GOODS__c goods{get;set;}
 10        
 11        public Boolean isStatus{get;set;}
 12        
 13        public String goodsName{get;set;}
 14        
 15        public String goodsType{get;set;}
 16        
 17        public Decimal goodsPriceStart{get;set;}
 18     
 19        public Decimal goodsPriceEnd{get;set;}
 20     
 21        public String goodsDescribe{get;set;}  
 22     
 23          
 24        
 25        public GoodsController() {
 26            goodsList = new List<GOODS__c>();
 27            refreshData();
 28        }
 29        
 30        
 31        
 32        
 33        public List<selectOption> getTypeNames() {
 34            goodsTypes.clear();
 35         goodsTypes.add(new SelectOption('手機','手機'));
 36            return goodsTypes;
 37        }
 38        
 39        
 40        //刷新數據作用
 41        public void refreshData() {
 42            Boolean isStatus = true;
 43            String goodsQueryString = 'SELECT   GoodsBrand__c,'+
 44                                       'GoodsDescribe__c,GoodsName__c, GoodsType__c, GoodsPrice__c,'+
 45                                        '  Id FROM Goods__c where IsDeleted = false limit 100';
 46            goodsList = Database.query(goodsQueryString);
 47        }
 48        
 49        public void save() {
 50            try {
 51                upsert goodsList;
 52            } catch(DmlException e) {
 53                ApexPages.addMessages(e);
 54            }
 55        }
 56        
 57        public void deleteGoods() {
 58            Id id = ApexPages.currentPage().getParameters().get('goodsId');
 59            Database.delete(id);
 60            refreshData();
 61        }
 62        
 63        public void add() {
 64            if(goodsList == null) {
 65                goodsList = new List<GOODS__c>();
 66            }
 67            GOODS__c goods2 = new GOODS__c();
 68            System.debug('-----------goodsList------------------'+goodsList);
 69            if(goodsList.size() == 0) {
 70                goodsList.add(goods2);
 71            } else {
 72                goodsList.add(0,goods2);
 73            }
 74        }
 75        
 76        public void query() {
 77            String goodsSql = 'SELECT GoodsBrand__c,'+
 78                               'GoodsDescribe__c,GoodsName__c , GoodsType__c, GoodsPrice__c,'+
 79                                ' Id FROM GOODS__c where IsDeleted = false ';
 80            if(goodsName.length() >0) {
 81                goodsName = '%' + goodsName + '%';
 82                goodsSql += ' and GoodsName__c like :goodsName ';
 83            }
 84            if(goodsType.length() > 0) {
 85                goodsType = '%' + goodsType + '%';
 86                goodsSql += ' and GoodsType__c like :goodsType';
 87            }
 88            if(goodsDescribe.length() > 0) {
 89                goodsDescribe = '%' + goodsDescribe + '%';
 90                goodsSql += ' and GoodsDescribe__c like :goodsDescribe';
 91            }
 92            
 93            if(String.valueOf(goodsPriceStart).length()>0) {
 94                goodsSql += ' and GoodsPrice__c >= :goodsPriceStart';
 95            }
 96            if(String.valueOf(goodsPriceEnd).length()>0) {
 97                goodsSql += ' and GoodsPrice__c <= :goodsPriceEnd';
 98            }
 99            goodsSql += ' limit 100';
100            goodsList = Database.query(goodsSql);
101            goodsName = goodsName.remove('%');
102            goodsDescribe = goodsDescribe.remove('%');
103            goodsType = goodsType.remove('%');
104        }
105}

58行中Id id = ApexPages.currentPage().getParameters().get('goodsId');解釋一下:

ApexPages為VF頁面的控制類,此句的意思為獲取當前頁面的Parameter中key為goodsId的value,goodsId在頁面中通過<apex:param>封裝。

VF頁面代碼如下:

  1 <apex:page controller="GoodsController" showHeader="false">
  2     <!-- <script>
  3         function query123(goodsName) {
  4             
  5             var goodsName = document.getElementById(goodsName).value; 
  6             console.log('goodsName:'+goodsName);
  7             Visualforce.remoting.Manager.invokeAction( 
  8                 '{!$RemoteAction.GoodsController.queryForName}', 
  9                 goodsName, 
 10                 function(result, event){ 
 11                     console.log('aaa');
 12                     if (event.status) { // Get DOM IDs for HTML and Visualforce elements like this 
 13                     } else if (event.type === 'exception') { 
 14                     } else { 
 15                     } 
 16                 }, 
 17                 {escape: false} 
 18             );  
 19         } 
 20     </script>-->
 21     <apex:messages />
 22     <apex:form >
 23         <apex:pageBlock title="GOODS">
 24             <apex:pageBlockSection title="query goods">
 25                 <apex:inputText value="{!goodsName}" tabIndex="4" label="goodsName"
 26                     id="goodsName" />
 27                 <apex:selectList multiselect="false" size="1" value="{!goodsType}"
 28                     label="goodsType:">
 29                     <apex:selectOptions value="{!typeNames}">
 30                     </apex:selectOptions>
 31                 </apex:selectList>
 32                 <apex:inputText value="{!goodsPriceStart}" tabIndex="3"
 33                     label="goodsPriceStart" />
 34                 <apex:inputText value="{!goodsPriceEnd}" tabIndex="5"
 35                     label="goodsPriceEnd" />
 36                 <apex:inputText value="{!goodsDescribe}" tabIndex="1"
 37                     label="goodsDescribe" />
 38                 <apex:commandButton value="query" action="{!query}"
 39                     />
 40             </apex:pageBlockSection>
 41             
 42             <!-- <apex:pageBlockSection title="query goods By Name Via JS">
 43                 <apex:inputText label="goodsName" id="goodsName1" />
 44                 <apex:commandButton value="query" onclick="query123('{!$Component.goodsName1}')"
 45                     styleClass="centerStyle" />
 46             </apex:pageBlockSection> -->
 47             
 48             <apex:pageBlockTable value="{!goodsList}" var="goods" id="resultGoods">
 49                 <apex:column headervalue="goodsName">
 50                     <apex:inputField value="{!goods.GoodsName__c}"/>
 51                 </apex:column>
 52                 <apex:column headervalue="goodsPrice">
 53                     <apex:inputField value="{!goods.GoodsPrice__c}" />
 54                 </apex:column>
 55                 <apex:column headervalue="goodsType">
 56                     <apex:inputField value="{!goods.GoodsType__c}" />
 57                 </apex:column>
 58                 <apex:column headervalue="goodsDescribe">
 59                     <apex:inputField value="{!goods.GoodsDescribe__c}" />
 60                 </apex:column>
 61                 <apex:column headervalue="delete?">
 62                     <apex:commandLink value="delete" action="{!deleteGoods}">
 63                         <apex:param name="goodsId" value="{!goods.Id}"></apex:param>
 64                     </apex:commandLink>
 65                 </apex:column>
 66             </apex:pageBlockTable>
 67             
 68             <!-- <apex:pageBlockTable value="{!goodsList}" var="goods" rendered="{!goodsList == null || goods == null}">
 69                 <apex:column colspan="7">
 70                     <apex:outputText value="no records"/>
 71                 </apex:column>
 72             </apex:pageBlockTable> -->
 73             
 74             <apex:pageBlockSection >
 75                 <apex:commandButton value="add" action="{!add}" />
 76                 <apex:commandButton value="save" action="{!save}" />
 77             </apex:pageBlockSection>
 78             <apex:pageMessages />
 79         </apex:pageBlock>
 80     </apex:form>
 81 </apex:page>

其中,VF代碼中注釋的內容為通過js和ajax請求后台,后台方法已省略,格式為

1 @RemoteAction
2 
3 public static List<GOODS__c> queryForName(String goodsName) {
4 
5 }

@RemoteAction標簽是必不可少的,聲明此方法用於js和后台交互。使用此標簽則方法必須是static類型。

其中返回類型可以為任意類型或者void類型,有興趣的童鞋可以自行完善。

本篇中涵蓋的知識點並不多,包括頁面的基本標簽內容,如何與后台交互,如果通過inputField綁定sObject的屬性實現數據的簡潔操作。

本篇內容如果有錯誤的地方請多多指教,也希望內容可以幫助初學者。下一篇將描述一下VF中數據分頁相關知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM