No Results
Search Tips:
- Please consider misspellings
- Try different search keywords
対応付けおよびリストビューの作成
対応付けアプリケーション作成における次のステップは、マップとそれに対応する取引先のリストを表示する 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 クラスを使用しないようにしてください。