[Salesforce]カスタムボタンのエディタでPC・モバイル判定

2016年11月24日木曜日

Salesforce Visualforce カスタムボタン

作成したVisualforceページをカスタムボタンから表示するときに、 同じボタンからPC版とモバイル版(Salesforce1)で違うページを表示したい場合にどうしたらよいのか?
と調べていたところ、全く出てこなかったのでメモ的な意味も含めて書いていく。

表示するページを切り替えたいと思った場合、多くの方はクッション用のVisualforceページを作成し、
その中でPC用ページとモバイル用ページの呼び出しを切り替えようと考えるのではないかと思う。

しかし、今回はクッションページを作るのが面倒というのに加えて、 カスタムボタンのURLパラメータを本命のページで使用したかったので カスタムボタンでモバイルの判定をしてしまおうと考えた。

今回は、取引先のページレイアウトにカスタムボタンを追加して、PCとモバイルで表示されるページが別のものになるか実験していく。

色々調べてみたところ、どうやら $User.UITheme なるものがVisualforce内で使用することができるらしい。
Visualforce 開発者ガイド - $User.UITheme および $User.UIThemeDisplayed

似たようなものが、カスタムボタンの編集画面のエディタで使えそうだと思い見てみると、
差し込み項目の種類 → $User
項目の挿入 → UITheme
というものを発見!



これを使ってモバイルならmobilePageを、それ以外ならpcPageを表示するようにしてみる。
上記の開発者ガイドを参考にすると、$User.UITheme の値が Theme4t となる場合はSalesforce1と判定されるみたい。
なので、Theme4t となる場合にmobilePageが表示されるようにURLを記述してみた。



構文エラーは無いのでこれでいけると思いきや、ボタンを押したら以下のようなエラーが…



何が悪かったのかと、このページのURLを確認してみると以下のようになっていた。

https://ap2.salesforce.com/servlet/%2Fapex%2FpcPage?retURL=0012800000kvBhN

%2Fってなんだ?と思ったら、どうやらシングルクォーテーション「'」で囲まれたスラッシュ「/」は
文字コードに置き換わってしまうらしい。

ただ、よくよく考えると「/apex/」までは共通なので、
そこはIF文の外に出せば問題なさそうということに気付き以下のように書き換えて再チャレンジ。



すると、今度は無事にPC用のページが表示された!



そして、モバイルのSalesforce1アプリからカスタムボタンを押してみると、ちゃんとモバイル用のページが表示されている。



こんな感じで、カスタムボタンだけでPCかモバイルかの判定ができた!