この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

Apex コントローラでの内部クラスの使用

前のレッスンでは、Visualforce カタログページ用のカスタムコントローラを作成しました。ただし、コントローラはカスタムオブジェクトをデータベースから直接ビューに渡します。これは最適な方法とはいえません。このレッスンでは、MVC デザインパターンをより正確に使用するようにコントローラをリファクタリングし、さらにページにいくつか機能を追加します。

  1. [StoreFrontController] をクリックして、ページのコントローラコードを編集します。
  2. クラスの定義を次のように修正し、[Quick Save (適用)] をクリックします。
    1swfobject.registerObject("clippy.codeblock-0", "9");
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17public class StoreFrontController {
    18
    19
    20
    21    List<DisplayMerchandise> products;
    22
    23    
    24
    25    public List<DisplayMerchandise> getProducts() {
    26
    27        if(products == null) {
    28
    29            products = new List<DisplayMerchandise>();
    30
    31            for(Merchandise__c item : [
    32
    33                    SELECT Id, Name, Description__c, Price__c, Total_Inventory__c 
    34
    35                    FROM Merchandise__c]) {
    36
    37                products.add(new DisplayMerchandise(item));
    38
    39            }
    40
    41        }
    42
    43        return products;
    44
    45    }
    46
    47    
    48
    49    // Inner class to hold online store details for item
    50
    51    public class DisplayMerchandise {
    52
    53
    54
    55        private Merchandise__c merchandise;
    56
    57        public DisplayMerchandise(Merchandise__c item) {
    58
    59            this.merchandise = item;
    60
    61        }
    62
    63
    64
    65        // Properties for use in the Visualforce view
    66
    67        public String name {
    68
    69            get { return merchandise.Name; }
    70
    71        }
    72
    73        public String description {
    74
    75            get { return merchandise.Description__c; }
    76
    77        }
    78
    79        public Decimal price {
    80
    81            get { return merchandise.Price__c; }
    82
    83        }
    84
    85        public Boolean inStock {
    86
    87            get { return (0 < merchandise.Total_Inventory__c); }
    88
    89        }
    90
    91        public Integer qtyToBuy { get; set; }
    92
    93    }
    94
    95}
  3. [Catalog (カタログ)] をクリックしてページの Visualforce コードを編集します。
  4. 列定義を、新しい内部クラスのプロパティ名を処理するように変更します。既存の列定義を次のコードで置き換えます。
    1swfobject.registerObject("clippy.codeblock-1", "9");
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17<apex:column headerValue="Product">
    18
    19    <apex:outputText value="{!pitem.Name}"/>
    20
    21</apex:column>
    22
    23<apex:column headerValue="Condition">
    24
    25    <apex:outputText value="{!pitem.Condition}"/>
    26
    27</apex:column>
    28
    29<apex:column headerValue="Price">
    30
    31    <apex:outputText value="{!pitem.Price}"/>
    32
    33</apex:column>
    34
    35
    outputField コンポーネントは自動的に sObject 項目を処理しますが、カスタムクラスはまったく処理しません。outputText はどの値も処理します。
  5. [��存] をクリックして変更を保存し、ページを再読み込みします。
    価格列が currency として書式設定されなくなりました。
  6. 価格の outputText タグを次のコードに変更します。
    1<apex:outputText value="{0,number,currency}">
    2
    3    <apex:param value="{!pitem.Price}"/>
    4
    5</apex:outputText>
    outputText コンポーネントを使用して、異なるデータ型を自動的に書式設定できます。
  7. コードが、次のようになっていることを確認して、[保存] をクリックします。
    1swfobject.registerObject("clippy.codeblock-3", "9");
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17<apex:page controller="StoreFrontController" tabStyle="Merchandise__c">
    18
    19
    20
    21    <apex:pageBlock title="Our Products">
    22
    23
    24
    25        <apex:pageBlockSection columns="1">
    26
    27
    28
    29            <apex:pageBlockTable value="{!products}" var="pitem">
    30
    31                <apex:column headerValue="Product">
    32
    33                    <apex:outputText value="{!pitem.Name}"/>
    34
    35                </apex:column>
    36
    37                <apex:column headerValue="Condition">
    38
    39                    <apex:outputText value="{!pitem.Condition}"/>
    40
    41                </apex:column>
    42
    43                <apex:column headerValue="Price" style="text-align: right;">
    44
    45                    <apex:outputText value="{0,number,currency}">
    46
    47                        <apex:param value="{!pitem.Price}"/>
    48
    49                    </apex:outputText>
    50
    51                </apex:column>
    52
    53            </apex:pageBlockTable>
    54
    55
    56
    57        </apex:pageBlockSection>
    58
    59
    60
    61    </apex:pageBlock>
    62
    63
    64
    65</apex:page>
    カタログページは次のようになります。カスタムコントローラを使用した商品カタログページ (カート追加前)

もうひとこと...

  • DisplayMerchandise クラスは、すでにデータベースに存在する Merchandise__c 型をラップし、新しいプロパティとメソッドを追加します。コンストラクタを使用すると、既存の Merchandise__c レコードを渡すことで新しい DisplayMerchandise インスタンスを作成できます。これで、インスタンス変数 productsDisplayMerchandise インスタンスのリストとして定義されます。
  • getProducts() メソッドは、Merchandise__c レコードを返すクエリ (SOQL クエリをコールする角括弧内のテキスト) を実行します。その後、クエリから返されたレコードを反復処理し、DisplayMerchandise 商品のリストに追加して、そのリストを返します。