今回は、Visualforceとカスタムボタンを用いて、関連リストにCSV出力用のボタンを設置してみました。
Visualforceの作成
まずはVisualforceを作成します。
後に取引先責任者オブジェクトでカスタムボタンを作成するので、「StandardController」に「Contact」を指定し、「extensions」には次に作成するApexコントローラのクラス名を指定します。
また、出力タイプはCSV形式なので「contentType」に「”text/csv;charset=Shift-JIS#{!fileName}」を指定します。
<apex:page StandardController="Contact" extensions="ContactCSVDownloadController" action="{!execute}" recordSetVar="contacts" sidebar="false" showHeader="false" contentType="text/csv;charset=Shift-JIS#{!fileName}" readOnly="true" title="Csv Download">
<apex:repeat value="{!headers}" var="item">
<apex:outputText value="{!item}"/>
</apex:repeat>
<apex:repeat value="{!bodies}" var="items">
<apex:repeat value="{!items}" var="item">
<apex:outputText value="{!item}"/>
</apex:repeat>
</apex:repeat>
</apex:page>
Apexコントローラの作成
続いてApexコントローラを作成します。
コントローラでは現在表示している取引先のレコードIdを「ApexPages.currentPage().getParameters().get(‘id’)」で取得し、そのIdを条件に関連する取引先責任者を取得しています。
その取得結果をListに詰め、Visualforce側に渡します。
また、コンストラクタを設置し引数にApexPages.StandardSetControllerを設定していますが、これがないとカスタムボタン作成時にVisualforceを選択できないので書いておきましょう。
public class ContactCSVDownloadController {
public String fileName {get; set;}
public List<String> headers {get; set;}
public List<List<String>> bodies {get; set;}
public ContactCSVDownloadController(ApexPages.StandardSetController controller){
}
public void execute(){
fileName = 'ContactList.csv';
fileName = EncodingUtil.urlEncode(fileName, 'UTF-8');
// get recordId
Id recordId = ApexPages.currentPage().getParameters().get('id');
// get Contact
List<Contact> conList = [Select Id, Name, Title, Email, Phone, Department, Age__c, Birthdate, IsActive__c From Contact
Where AccountId =: recordId Order by Id];
// get label
List<String> labelList = new List<String>();
labelList.add('Id');
labelList.add(Schema.SObjectType.Contact.fields.Name.label);
labelList.add(Schema.SObjectType.Contact.fields.Title.label);
labelList.add(Schema.SObjectType.Contact.fields.Email.label);
labelList.add(Schema.SObjectType.Contact.fields.Phone.label);
labelList.add(Schema.SObjectType.Contact.fields.Department.label);
labelList.add(Schema.SObjectType.Contact.fields.Age__c.label);
labelList.add(Schema.SObjectType.Contact.fields.Birthdate.label);
labelList.add(Schema.SObjectType.Contact.fields.IsActive__c.label);
// CSV header
headers = new List<String>();
for(Integer i = 0; i < labelList.size(); i++){
if(i > 0){
headers.add(',');
}
headers.add('\"' + labelList.get(i) + '\"');
}
headers.add('\r\n');
// CSV bodies
bodies = new List<List<String>>();
for(Contact con : conList){
List<String> items = new List<String>();
items.add('\"' + con.Id + '\"');
items.add(',');
items.add(con.Name == null ? '' : '\"' + con.Name + '\"');
items.add(',');
items.add(con.Title == null ? '' : '\"' + con.Title + '\"');
items.add(',');
items.add(con.Email == null ? '' : '\"' + con.Email + '\"');
items.add(',');
items.add(con.Phone == null ? '' : '\"' + con.Phone + '\"');
items.add(',');
items.add(con.Department == null ? '' : '\"' + con.Department + '\"');
items.add(',');
items.add(con.Age__c == null ? '' : '\"' + con.Age__c + '\"');
items.add(',');
items.add(con.Birthdate == null ? '' : '\"' +con.Birthdate.format() + '\"');
items.add(',');
items.add(con.IsActive__c == null ? '' : '\"' + con.IsActive__c + '\"');
items.add('\r\n');
bodies.add(items);
}
}
}
カスタムボタンの作成
今回は取引先詳細画面の取引先責任者関連リストにCSV出力用のボタンを表示します。
ということで、カスタムボタンは取引先責任者の設定から作成します。
設定 > オブジェクトマネージャ > 取引先責任者 >
ボタン、リンク、およびアクション > 新規ボタンまたはリンク
以下の内容でカスタムボタンを作成します。
- 表示の種類:リストボタン
- コンテンツソース:Visualforceページ
- コンテンツ:作成したVisualforceページ
カスタムボタンを作成したら、取引先詳細画面の取引先責任者関連リストにボタンを表示します。
取引先のページレイアウトの設定画面から関連リストのスパナマークをクリックします。
ボタンのセクションで先ほど作成したカスタムボタンを「選択したボタン」の枠に移動させます。
「OK」を押してページレイアウトを保存すれば設定完了です。
動作確認
CSVボタンを押下するとCSVファイルがダウンロードされました。
出力後の画面が真っ白になってしまうので、これは何とかしないといけませんね。。。
とりあえず今回は以上です。
コメント