visualforceで選択肢を自作
visualforceの備忘録...
visualforceにカスタムで選択肢を作成して値を取得。
1.取引先責任者のページにvisualforceへ遷移するカスタムボタンを設置。
2.遷移したページに選択リストを表示して取得した値を表示。
使ったのはSelectOptionクラス
コントローラ拡張(呼び方合ってるのか。。)で選択肢のリストを用意してVF側で呼び出す。
VF内で直接CSSを書いてしまってるが、ちゃんと作る時は静的リソースに分けて作ります。
gistc1f05db85e260e5aab61b6de7490654c
gist5300ab2df3f8611ea6bdde3d87ec7b46
実際の画面は。。。
こんな感じで表示されます。ラジオボタンで作成(selectRadio)
VFのタグで、layoutを指定しないとデフォルトは横配置になります(layout="lineDirection")。今回はpageDirectionで縦に配置。
そして、どれか選択してボタンを押したら赤字で選択肢のvalueを表示したのが下。
こんな感じです。
実際は選択されていないでボタンを押した場合の処理なども考慮する必要があるかと思います。
今回はあくまでサンプルなので割愛。
カスタムコントローラで作っても良かったのですが、標準コントローラも利用しつつこのページをベースにあれこれやってみようと思います。
コミュニティでの相対パスの取扱い
委託先にコミュニティのライセンスを付与して、社内画面と同じものを提供して運用しています。
※salesforceライセンスは高いので、使用用途が決まっていればコミュニティライセンスで費用を抑えることができるため
ところがvisualforceページ上に相対パスでリンクを作成している箇所でエラーページに飛んでしまう。(社内からは問題なく遷移できた)
調べたところ、、
内部ユーザでは正常に動作しているカスタムボタンやリンクが
相対パスを使用して定義しているにも関わらずエラーとなります。
これはコミュニティ上ではURLにコミュニティ名がを必要とするためとなります。
Visualforce ページのURLへ遷移する場合の比較例
- 内部ユーザ用のURL : /apex/<Visualforceページ名>
例. /apex/VFPage- コミュニティ用のURL : <コミュニティ名>/apex/<Visualforceページ名>
例. /cp01/apex/VFPage
というヘルプを発見。
元の拡張コントローラに、urlからgetpathでコミュニティを判定。
遷移先を可変するように対応しました。
以下のようにしても対応できるようです。
カスタムボタン、カスタムリンクのURL記載箇所に以下の様に数式を組み込む事で対応できます。
※VFPage は Visualforce ページ名です。
{!IF( $Site.Prefix <> null, URLFOR($Site.Prefix + "/apex/VFPage"), URLFOR("/apex/VFPage"))}
処理内容としては、$Site.Prefix がコミュニティ名を定義するグローバル変数となるため
この変数の有無に応じて、遷移先のURLを適切なものへ振り分けています。
SOSLを試してみた(ついでにPhone型も)
SOSL(Salesforce Object Search Language)を使ったことがなかったので試してみました。
salesforceのドキュメントに沿ってコードをちょっと作成。
取引先のレコードを2件、電話を「0311111111」「03-1111-1111」で登録。
取引先責任者のレコードを1件、電話を「0311111111」で登録。
検索対象にする取引先責任者の電話を「0311111111」でSOSLを下記のコードで実行。検索項目は電話のみを指定しました。
結果は以下のようになりました。
SOSLは取得するオブジェクトも指定できるので、指定した順番にオブジェクトを用意して格納するみたいです。
ここで気になったので、Accountの2件の電話と検索元の電話を比較してみたところ以下のようになりました。
Phone型の番号は比較には使えないのか。。。
Phone型の番号を使って比較処理とかするのであれば、入力ルールを統一しないといけないかもしれません。 文字型にしてハイフンを削除する処理をすれば使えるかもしれませんが。
Phone型の扱い方についてドキュメントあれば欲しい。。。
今回試したコードは以下のとおりです。
gistffa2987d573f6baf1bf00ae142b6694f
レコードタイプをSOQLで取得する
APEXのテストクラスなどでテストデータを作成する際に
レコードタイプが複数あるオブジェクトのデータを作る時には
SOQLでそのオブジェクトのレコードタイプを取得してfor文で作成すると楽。
List<Recordtype> rectype = [SELECT Id, Name, SObjectType FROM RecordType WHERE SObjectType = '●●'];
※●●の部分にオブジェクトのAPIを入れれば良い(取引先ならAccount)。
テストデータのRecordtypeIdに取得したIdをセットすれば全レコードタイプのテストデータが作れる。
レコードタイプごとに選択肢の制限などかけてる場合は要注意。。。
入力規則とか一括でON・OFF切り替えできないかな。。。
県庁所在地の緯度経度
ずっと書いていなかったので、これからはできるだけ書き留めていく。。。。
たまたま県庁所在地の緯度経度をMapに格納する必要があったのでいつか再利用するときに書き留めておく。。
それぞれの緯度経度はLocationクラスに格納しているので、キー名で呼び出してgetLaitude()、getLongitude()で取得可能。
共通部分をテンプレートにする
visualforceでPDFを複数パターン作ることになりました。
共通部分は使いまわした方がメンテナンス性も向上するので調べたところ、
「composition 」が使えそうだったのでテスト。
共通部分のページを部品として、PDFにするページで呼び出す感じかな。。。
↓↓ まず部品になるページを作成 ↓↓
↓↓ こちらで上のページを呼び出す ↓↓
呼び出すときは、template="●●"の●●にテンプレートとなるページ名を指定すると。
こんな感じかな。
さて、やるか。。連休終わるな。。
参考