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

対応付けおよびリストビューの作成

対応付けアプリケーション作成における次のステップは、マップとそれに対応する取引先のリストを表示する Visualforce ページの作成です。Visualforce ページは、Google マップオブジェクトのパネルを定義し、取引先のリストを表示するグループサブパネルを作成します。さらに、JavaScript を使用して取引先住所を取得し、顧客の優先度に基づいて色付けされたマーカーをマップに入力します。JavaScript は次のロジックを実行して、マップオブジェクトを設定します。

  • {!AddrArStr} 文字列配列から対応付ける住所を取得する
  • コントローラに定義された区切りを取得し、住所配列を解凍する
  • すべての取引先住所と現在のユーザに対し doAddLocationToMap をコールする
  • Account.CustomerPriority__c をキーとして使用し、緑、黄色、赤のうちどのマーカーを使用するかを決定する
  • $Resource.markers 静的リソースに保存されたカスタム画像マーカーを取得する

JavaScript コードは、複数の場所で参照する必要がある場合に備えて静的リソース内に配置しておくのが適切な方法です。MobileListView という静的リソースを作成します。

1swfobject.registerObject("clippy.codeblock-0", "9");    function addLoadEvent(func) { 
2       var oldonload = window.onload;
3       if (typeof window.onload != 'function') {
4          window.onload = func;
5       } else {
6          window.onload = function() {
7             oldonload();
8             func();
9            }
10        }
11     }
12
13     addLoadEvent(
14     function() {
15        if (GBrowserIsCompatible()) {
16           var my_geocoder = new GClientGeocoder();
17           var map = new GMap2(document.getElementById("map"));
18           var TC = new GMapTypeControl();
19           var bottomRight = new GControlPosition(G_ANCHOR_BOTTOM_RIGHT, new GSize(10,10));
20           var mCount =0;
21
22           map.addControl(new GSmallMapControl()); // Small arrows
23           map.addControl(TC, bottomRight);  // Map type buttons
24
25           function LTrim( value ) {
26              var re = /\s*((\S+\s*)*)/;
27              return value.replace(re, "$1");
28           }
29
30           function RTrim( value ) {
31              var re = /((\s*\S+)*)\s*/;
32              return value.replace(re, "$1");
33           }
34
35           // Remove leading and ending whitespaces
36           function trim( value ) {
37              return LTrim(RTrim(value));
38           }
39
40           function doAddLocationToMap(SiteName, Street, City, State, Zip, typ) {
41              var addr = Street + ", " + City + ", " + State + " " + Zip;
42              my_geocoder.getLatLng (addr, 
43              function(point) {
44                 if (point) {
45                    var mTag = '';
46                    var myIcon = new GIcon(G_DEFAULT_ICON);
47
48                    if(typ == 'self') {
49                       mTag = "<b>" + SiteName + "</b>" + "<br>" + City ;
50                       myIcon.image = "http://maps.google.com/mapfiles/arrow.png";
51                       myIcon.iconSize=new GSize(32,32);
52                    } else { 
53                       if(typ == 'acct') {
54                          mCount ++;
55                          var priAr = SiteName.split(":"); 
56                          var compName = priAr[0];  // company name
57                          var pri = trim(priAr[1]); // priority
58                          var acctId = priAr[2]; //account id
59                          var index = "";
60                          var imgName = "marker"; // default marker image
61                          var color = ""; 
62
63                          mTag = "<b>" + compName + "</b>" + "<br>"
64                                 + "Priority: " 
65                                 +  pri  + "<br>" + City ;
66                          // Set up marker colors based on priority
67                          if (pri == 'Medium') color="Yellow"; 
68                          else if (pri == 'High') color="Red"; 
69                          else if (pri == 'Low') color="Green";
70
71                          if(mCount>10){ // use default marker
72                             myIcon.image = 
73                                "http://maps.google.com/mapfiles/marker.png";
74                          } else { // use custom marker 1-10
75                             index = String(mCount);
76                             imgName = imgName + color + index + ".png";
77                             myIcon.image = "{!URLFOR($Resource.markers, 
78                                            'markers/" + imgName + "')}";  
79                          }
80
81                          document.getElementById(acctId).src = myIcon.image;
82                          myIcon.iconSize=new GSize(20,34);
83                       }
84                    }
85                    myIcon.shadowSize=new GSize(56,32);
86                    myIcon.iconAnchor=new GPoint(16,32);
87                    myIcon.infoWindowAnchor=new GPoint(16,0);
88                    markerOptions2 = { icon:myIcon };
89                    var marker = new GMarker(point, markerOptions2);
90                    map.setCenter(point, 8);
91                    map.addOverlay(marker);
92
93                    // Set up listener action to show info on click event
94                    GEvent.addListener(marker, "click", 
95                       function() { 
96                          marker.openInfoWindowHtml(mTag); 
97                       }) ;
98                 }
99              }
100              );
101           }
102
103           //Get accts and draw address
104           var arAllStr = '';
105           arAllStr = '{!AddrArStr}'; // Get all address recs 
106           var arLi = arAllStr.split("~::~"); // Split on line break delim
107           for (var i = 0; i < arLi.length-1; i++) {  
108              var arLiStr =arLi[i];
109              var arCols =arLiStr.split("~:~"); //Split  to get columns
110
111              if(arCols[1].length >0)
112                 doAddLocationToMap(arCols[0],arCols[1],arCols[2],
113                                    arCols[3],arCols[4],'acct');     
114           }
115
116           //Get user address and draw
117           doAddLocationToMap('{!$User.FirstName} {!$User.LastName}'
118                 +' (Me)','{!$User.Street}','{!$User.City}','
119                 {!$User.State}','{!$User.PostalCode}','self');
120        } 
121    }
122    );

次のコードは、対応付けアプリケーションのリンク先ページを定義します。

1swfobject.registerObject("clippy.codeblock-1", "9");<apex:page controller="mapController" showHeader="false">
2    <apex:composition template="iuivf" />
3    <script src="{!myKey}" type="text/javascript"> </script>
4    <apex:includeScript value="{!$Resource.MobileListView}"/>
5
6
7    <ul title="Accounts" selected="true" id="home" >
8      <!-- Draw user name at top of panel -->
9        <li class="group">
10            User: {!$User.FirstName} {!$User.LastName}
11        </li>
12
13        <!-- Create panel for Google Maps object -->
14        <div class="panel" style="padding: 10px;"  >
15              <div id="map" style="width: 300px; height: 300px;">
16                  </div>
17        </div>
18
19        <!-- Create group sub-panel to display list -->
20        <li class="group">Accounts</li>
21
22        <!-- Draw accounts, one per row -->
23        <apex:repeat value="{!MyAccts}" var="p" >
24           <li>
25              <a href="accountDetail?id={!p.Id}" >
26                 <img id="{!p.Id}"
27                      src="http://maps.google.com/mapfiles/marker.png"/>
28                 {!p.Name}
29              </a>
30           </li>
31        </apex:repeat>
32    </ul>
33</apex:page>
34

ページのマークアップは、<apex:composition> コンポーネントを使用して、テンプレートを参照します。テンプレートは、iUI フレームワークを利用して、iPhone のようなスタイルをページに適用します。iUI フレームワークは、$Resource.IUI 静的リソースから組み込まれます。テンプレートを定義することによって、iPhone プラットフォーム用に作成するすべての Visualforce ページに簡単に同じスタイルを適用できます。

次のマークアップは、テンプレートとして使用される iuivf ページを定義します。

1swfobject.registerObject("clippy.codeblock-2", "9");<!--
2*   Page definition: iuivf
3*   Visualforce template for iUI includes needed for
4*   using the iui framework <http://code.google.com/p/iui/>
5*   in any Visualforce page.
6-->
7
8<apex:page>
9    <meta name="viewport" content="width=320; initial-scale=1.0;
10       maximum-scale=1.0; user scalable=0;"/>
11    <apex:includeScript value="{!URLFOR($Resource.IUI, 'iui-0.13/iui/iui.js')}" />
12    <apex:styleSheet value="{!URLFOR($Resource.IUI, 'iui-0.13/iui/iui.css')}" />
13
14    <style> #home { position: relative; top: 0px; } </style>
15
16</apex:page>

テンプレートについては、次の点に注意してください。

  • マークアップは、iUI ライブラリの #home スタイルを上書きします。そうすることで、ページ上部に目立ったギャップを作ることなく Salesforce Classic にアプリケーションが表示されるようにしています。
  • マークアップは、class="Toolbar" 要素の使用を回避します。Salesforce Classic に組み込まれたブラウザでは、ページの上部にナビゲーションツールバーが表示されるため、2 つ目のツールバーを表示するとユーザを混乱させる可能性があります。iUI フレームワークに提供されるボタンスタイルを使用する場合は、ボタンを表示するために Toolbar クラスを使用しないようにしてください。