MENU
Abo
某SIer勤務。
ITエンジニアです。
日々の学びをつらつらと書いています。
保有資格:
Salesforce認定アドミニストレーター  
Salesforce認定Platformデベロッパー
Salesforce認定上級Platformデベロッパー
カテゴリー
アーカイブ

【Visualforce】関連リストにCSV出力ボタンを設置

今回は、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ファイルがダウンロードされました。

出力後の画面が真っ白になってしまうので、これは何とかしないといけませんね。。。

とりあえず今回は以上です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

某SIer勤務。
Salesforceエンジニアです。
日々の学びをつらつらと書いています。
Certified Administrator
Certified Platform DeveloperⅠ
Certified Platform DeveloperⅡ
Certified Sales Cloud Consultant

コメント

コメントする

CAPTCHA


目次