[Salesforce]VisualforceからCSV出力

VisualforceからCSV出力することについて共有します。

1.Visualforce作成する。

Visualforceページ名 : VFTab

<apex:page contentType="text/csv;charset=Shift_JIS;#fileName.csv" standardController="Contact" recordSetVar="contacts">Id,Name
    <apex:repeat value="{!contacts}" var="con">
{!con.Id},{!con.Name}
    </apex:repeat>
</apex:page>

説明

① text/csv

CSV出力

② charset

Excelで開くためにシフトJISを指定

③ #fileName.csv

ファイル名指定

④ Id,Name

ヘッダ部

⑤ {!con.Id},{!con.Name}

データ部

Salesforceはデフォルトの文字コードUTF-8である。

2.Visualforceタブ作成、手順1.Visualforceページを設定する。

Visualforceタブ名:VFTab

3.動作確認するする。

手順2.で作成じたタブ「VFTab」を押下する。

「filename.csv」ファイルがダウンロードされることを確認する。

ファイル中身は以下のようです。

Id	Name
0030K00001p3ReGQAU	Barr Tim
0030K00001p3ReHQAU	Bond John
0030K00001p3ReJQAU	Boyle Lauren
0030K00001p3ReLQAU	Davis Josh
0030K00001p3ReQQAU	D'Cruz Liz
0030K00001rMwdWQAS	ddd
0030K00001p3ReCQAU	Forbes Sean
0030K00001p3ReRQAU	Frank Edna
0030K00001p3ReBQAU	Gonzalez Rose
0030K00001p3ReSQAU	Green Avi
0030K00001p3ReMQAU	Grey Jane
0030K00001p3ReOQAU	James Ashley
0030K00001rMylnQAC	jjj
0030K00001p3ReKQAU	Levy Babara
0030K00001p3ReUQAU	Llorrac Jake
0030K00001p3ReTQAU	Nedaerk Siddartha
0030K00001p3ReIQAU	Pavlova Stella
0030K00001p3RePQAU	Ripley Tom
0030K00001p3ReDQAU	Rogers Jack
0030K00001p3ReNQAU	Song Arthur

[WordPress]テーマアップロード

WordPressで無料/有料テーマをLocalにダウンロードしてから、WordPressのテーマにアップロードする手順を共有します。

1.テーマをダウンロードする。

今回は、以下のサイトにて有料テーマをダウンロードする。

https://themeforest.net/

Enfoldを購入する。

購入したEnfoldテーマXipファイルをLocalにダウンロードする。

2.ローカルにダウンロードしたEnfoldテーマのZipファイルを解凍する。

C:\xxx\themeforest-1234567-enfold-responsive-multipurpose-theme.zip

解凍すると、以下のようにフォルダー構成となる。

フォルダー: themeforest-1234567-enfold-responsive-multipurpose-theme

下位フォルダー:documentation

下位フォルダー: License

下位フォルダー: Licensing

enfold圧縮ファイル

pad圧縮ファイル

versionファイル

3.LocalのWordPressのテーマ画面からアップロードする。

外観 > テーマ > 新規追加 > テーマのアップロード

ここで、アップロードファイルは、手順2.のenfold圧縮ファイルを選択する。

有効化する。

[Salesforce]VSCodeによる開発

開発環境としてVSCodeのExtensionを用いることについて共有します。

  1. Salesforce CLIをインストール
sfdx plugins --core

2.VS Codeに拡張機能のインストール

https://marketplace.visualstudio.com/items?itemName=salesforce.salesforcedx-vscode

3.ローカルにプロジェクトを作成

コマンドパレットを開き(Widnowsの場合:Ctrl+Shift+P / Macのばあい:Cmd+Shift+P)、SFDX: Create Project with Manifestを選択し、プロジェクト名入力しEnterする。

保存場所を選択する。

例えば、Projectというフォルダ名を指定すると、指定したProjectフォルダの下に、入力したプロジェクト名のフォルダに新たに作成されます。

作成したProjectの下に以下のフォルダ、ファイルが作成されます。
.sfdx
.vscode
config
force-app
manifest
.forceignore
.gitignore
.prettierignore
.prettierrc
README.md
sfdx-project.json

4.組織に接続

表示> コマンドパレットから、SFDX: Authorize an Orgを選択、組織の種類(Sandbox/Production)を選択して、プロジェクト名称を入力する。

ブラウザが起動し、その組織にログインする。

アクセスを許可しますか? が表示される、「許可」ボタン押下する。

VSCodeで以下のように出力されれば接続できています。

Successfully authorized xxxx@xxx.xxx with org ID 00Dxxxxxxxxxxxxxxx
You may now close the browser

5.メタデータの取得とデプロイ

force-appのエクスプローラで右クリックするとSFDX: Retrieve Source from OrgとSFDX: Deploy Source to Orgが利用できる。
特定のフォルダやファイルに対してこのコマンドを選択すると、そのフォルダやファイルに対してのみ取得・デプロイされる。

6.ファイル保存時の自動デプロイを有効化する

.vscode/settings.jsonに"salesforcedx-vscode-core.push-or-deploy-on-save.enabled": trueを追加し、VS Codeを再起動する。

[Java]内部クラス(インナークラス)

内部クラスについて共有します。

1.内部クラスとは

内部クラスとは、クラスの中にクラスを定義する。

内部クラスはメンバーと同じように扱うことができます。メンバーのようにprivate、protected、publicといったアクセスレベルを付与することができます。

なお、内部クラスを持つクラスのことを外部クラスといいます。

2.内部クラス使い方

// 外部クラス
class OuterClass {
    private String str = "OuterClass Field";
    
    // 内部クラス
    class InnerClass {
        public void innerMethod() {
            System.out.println(str);
        }
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        // 外部クラスインスタンス生成
        OuterClass oc = new OuterClass();
        // 外部クラスオブジェクトから内部クラスインスタンス生成
        OuterClass.InnerClass ic = oc.new InnerClass();
        ic.innerMethod();
    }
 
}

3.staticな内部クラスの使い方

参考として、 staticな内部クラスから外部クラスの非staticなメンバーにはアクセスできません

// 外部クラス
class OuterClass {
    // staticフィールド
    private static String str = "OuterClass Field";
    
    // static内部クラス
    static class InnerClass {
        public void innerMethod() {
            System.out.println(str);
        }
    }
}
 
public class Main {
 
    public static void main(String[] args) {
        // static内部クラスインスタンス生成
        OuterClass.InnerClass ic = new OuterClass.InnerClass();
        ic.innerMethod();
    }
}

[Salesforce]Lightningコンポーネント削除

作成したLightningコンポーネントを削除する手順を共有します。

1.開発コンソル開く

2.コンポーネントコントローラ開いて、FileメニューでDeleteする。

3.コンポーネントヘルパー開いて、FileメニューでDeleteする。

4.コンポーネントCSS開いて、FileメニューでDeleteする。

5.コンポーネントを開いて、FileメニューでDeleteする。

[Salesforce]Lightningアクションのレコード作成

Lightningアクションのレコード作成について共有します。

1.アクション作成

例えば、取引先の新規アクションボタン押下する。

アクション種別 : レコードを作成

対象オブジェクト : 取引先責任者

表示ラベル : 取引先責任者作成

名前 : ContactCreate

保存ボタン押下する。

2.定義済み項目設定

アクションの定義済み項目セクションの新規ボタン押下する。

3.レイアウトを編集する

配置する。

4.アクションを配置する。

取引先 > ページアウト

5.動作確認する。

[WordPress]プラグインSearch Everything

WordPressブログサイトの中で検索するプラグインとしてSearch Everythingがよくつかわれているものの一つなので、共有する。

1.インストール、有効化

WordPress > ダッシュボード > プラグイン > 新規 > 検索欄に、「Search Everything」入力して検索する。

インストールして、有効化する。

2.配置されていることを確認する。

ブログ画面右上の配置される。

[Salesforce]Lightning コンポーネント‐手順8:ヘルパー

Lightningコンポーネントのヘルパーについて共有します。

コンポーネント

<!-- 手順6 -->
<aura:component controller="LeadController" implements="force:appHostable">
<!--
<aura:component implements="force:appHostable">
-->
    <!-- 手順2 -->
	<aura:attribute name="target" type="String" default="world"/>
    <!-- 手順3 -->
    <aura:attribute name="switch" type="Boolean" default="false" />
    
    <!-- 手順1 -->
    <h1>Hello, Lightning Component!!</h1>
    
    <!-- 手順2 -->
    <h1>Hello, {!v.target}!</h1>
    
    <!-- 手順3 -->
    <h1>ボタンクリックでON/OFF</h1>

    <!-- 手順3 -->
    <aura:If isTrue="{!v.switch}">
        <p>ON</p>
        <aura:set attribute="else">
            <p>OFF</p>
        </aura:set>
    </aura:If>
    
    <!-- 手順3 -->
    <ui:button label="{!v.switch ? 'OFFにする' : 'ONにする' }" press="{!c.toggle}"/>


    <!-- 手順4 -->
    <ui:inputText aura:id="input" label="名前" value=""/>
    <ui:outputText aura:id="output" value=""/><br/>
    
    <ui:button aura:id="submit" label="設定" press="{!c.set}"/>
 
     <!-- 手順5 -->
    <div class="white">白</div>
    <h3>黒</h3>
    <ul>
        <li class="red">赤</li>
        <li class="blue">青</li>
        <li class="green">緑</li>
    </ul>  
    
    <!-- 手順6 -->
    <!-- Leadオブジェクトの配列を属性にもつ -->
    <aura:attribute name="leads" type="Lead[]"/>

    <!-- 表示ライフサイクル中に発火されるinitイベント購読 -->
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

    <h3>リード表示</h3>

    <ul>
        <aura:iteration items="{!v.leads}" var="lead">
            <li>
                <p>
                    {!lead.Company}<br/>
                    {!lead.LastName}
                </p>
            </li>
        </aura:iteration>
    </ul>  

    <!-- 手順7 -->
    <h3>リード登録</h3>

    <aura:attribute name="lead" type="Lead" default="{ 'sobjectType': 'Lead', 'LastName': '', 'Company': '' }"/>

    <form>
        <ui:inputText aura:id="company" label="会社名" value="{!v.lead.Company}" required="true"/>
        <ui:inputText aura:id="lastname" label="姓" value="{!v.lead.LastName}" required="true"/>
        <ui:button label="登録" press="{!c.createLead}"/>
    </form>

    <!-- 手順8 -->
    <h3>リード表示</h3>
    <ui:button label="更新" press="{!c.refresh}"/>
    <ul>
        <aura:iteration items="{!v.leads}" var="lead">
            <li>
                <p>
                    {!lead.Company}<br/>
                    {!lead.LastName}
                </p>
            </li>
        </aura:iteration>
    </ul>

</aura:component>

コンポーネントコントローラ

({
    toggle: function(component, event, helper) {
   	//-- 手順3 --
    	var status = component.get("v.switch");
        component.set("v.switch", !status);

    },
    
      set: function(component, event, helper) {
	  	//-- 手順4 --

        // 入力コンポーネントから属性値取得
        var inputValue = component.find("input").get("v.value");

        // 入力コンポーネントへ属性値セット
        var output = component.find("output");
        output.set("v.value", inputValue);


        // コンポーネントの属性値取得(仕組みを把握するためのコードでこの変数"target"は利用しない)
        var target = component.get("v.target");

        // コンポーネントの属性値セット
        component.set("v.target", inputValue);
    }, 
    
    
    doInit: function(component, event, helper) {
    	//-- 手順6 --
	    // initイベント処理
        // Apexコントローラのアクションを取得
        var action = component.get("c.findAll");
        // Apexコントローラ処理後のコールバック設定
        action.setCallback(this, function(a){
            component.set("v.leads", a.getReturnValue());
        });
        // 実行アクションキューに追加
        $A.enqueueAction(action);
    },
    
        createLead: function(component, event, helper) {
        //-- 手順7 --

        var isValid = true;
        var company = component.find("company");
        var lastName = component.find("lastname");


        // エラークリア
        //company.setValid("v.value", true);
        //lastName.setValid("v.value", true);

        if ($A.util.isEmpty(company.get("v.value"))) {
            // エラーセット
            //company.setValid("v.value", false);
            //company.addErrors("v.value", [{message:"会社名を入力してください。"}]);
            isValid = false;
        }
        if ($A.util.isEmpty(lastName.get("v.value"))) {
            // エラーセット
            //lastName.setValid("v.value", false);
            //lastName.addErrors("v.value", [{message:"姓を入力してください。"}]);
            isValid = false;
        }


        if (isValid) {
            var lead = component.get("v.lead");
            var action = component.get("c.create");
            action.setParams({
                "ld": lead
            });

            action.setCallback(this, function(a){
                // Salesforce1イベント発火(トーストメッセージ表示)
                /*
                var toastEvent = $A.get("e.force:showToast");
                if (action.getState() === 'SUCCESS') {
                    toastEvent.setParams({
                        "title": "Success",
                        "message": "正常に登録が完了しました"
                    });
                    company.set("v.value", "");
                    lastName.set("v.value", "");
                } else {
                    toastEvent.setParams({
                        "title": "Error",
                        "message": "エラーが発生しました"
                    });
                }
                toastEvent.fire();
                */
            });

            $A.enqueueAction(action);
        }
    },
    
    doRefreshInit: function(component, event, helper) {
        helper.getLeads(component);
    },
    refresh: function(component, event, helper) {
        helper.getLeads(component);
    },
})

ヘルバー

({
    getLeads: function(component) {
    var action = component.get("c.findAll");
    action.setCallback(this, function(a){
        component.set("v.leads", a.getReturnValue());
    });
    $A.enqueueAction(action);
}
})

動作確認する。

https://[ yourdomain ]/c/CreateComponentAppliction.app
例えば、
https://testdaeheuitest-test11-dev-ed.lightning.force.com/c/CreateComponentAppliction.app

結果

エラーあし

[Salesforce]Lightning コンポーネント‐手順7:データ登録

データ登録内容を共有します。

Apexコントローラ

public class LeadController {

	//手順6
    @AuraEnabled
    public static List<Lead> findAll() {
        return [SELECT Id, LastName, Company FROM Lead ORDER BY LastModifiedDate DESC LIMIT 50];
    }
     
    //手順7 
    @AuraEnabled
    public static Lead create(Lead ld) {
        insert ld;
        return ld;
    }
}

コンポーネント

<!-- 手順6 -->
<aura:component controller="LeadController" implements="force:appHostable">
<!--
<aura:component implements="force:appHostable">
-->
    <!-- 手順2 -->
	<aura:attribute name="target" type="String" default="world"/>
    <!-- 手順3 -->
    <aura:attribute name="switch" type="Boolean" default="false" />
    
    <!-- 手順1 -->
    <h1>Hello, Lightning Component!!</h1>
    
    <!-- 手順2 -->
    <h1>Hello, {!v.target}!</h1>
    
    <!-- 手順3 -->
    <h1>ボタンクリックでON/OFF</h1>

    <!-- 手順3 -->
    <aura:If isTrue="{!v.switch}">
        <p>ON</p>
        <aura:set attribute="else">
            <p>OFF</p>
        </aura:set>
    </aura:If>
    
    <!-- 手順3 -->
    <ui:button label="{!v.switch ? 'OFFにする' : 'ONにする' }" press="{!c.toggle}"/>


    <!-- 手順4 -->
    <ui:inputText aura:id="input" label="名前" value=""/>
    <ui:outputText aura:id="output" value=""/><br/>
    
    <ui:button aura:id="submit" label="設定" press="{!c.set}"/>
 
     <!-- 手順5 -->
    <div class="white">白</div>
    <h3>黒</h3>
    <ul>
        <li class="red">赤</li>
        <li class="blue">青</li>
        <li class="green">緑</li>
    </ul>  
    
    <!-- 手順6 -->
    <!-- Leadオブジェクトの配列を属性にもつ -->
    <aura:attribute name="leads" type="Lead[]"/>

    <!-- 表示ライフサイクル中に発火されるinitイベント購読 -->
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

    <h3>リード表示</h3>

    <ul>
        <aura:iteration items="{!v.leads}" var="lead">
            <li>
                <p>
                    {!lead.Company}<br/>
                    {!lead.LastName}
                </p>
            </li>
        </aura:iteration>
    </ul>  

    <!-- 手順7 -->
    <h3>リード登録</h3>

    <aura:attribute name="lead" type="Lead" default="{ 'sobjectType': 'Lead', 'LastName': '', 'Company': '' }"/>

    <form>
        <ui:inputText aura:id="company" label="会社名" value="{!v.lead.Company}" required="true"/>
        <ui:inputText aura:id="lastname" label="姓" value="{!v.lead.LastName}" required="true"/>
        <ui:button label="登録" press="{!c.createLead}"/>
    </form>


</aura:component>

コンポーネントコントローラ

({
    toggle: function(component, event, helper) {
   	//-- 手順3 --
    	var status = component.get("v.switch");
        component.set("v.switch", !status);

    },
    
      set: function(component, event, helper) {
	  	//-- 手順4 --

        // 入力コンポーネントから属性値取得
        var inputValue = component.find("input").get("v.value");

        // 入力コンポーネントへ属性値セット
        var output = component.find("output");
        output.set("v.value", inputValue);


        // コンポーネントの属性値取得(仕組みを把握するためのコードでこの変数"target"は利用しない)
        var target = component.get("v.target");

        // コンポーネントの属性値セット
        component.set("v.target", inputValue);
    }, 
    
    
    doInit: function(component, event, helper) {
    	//-- 手順6 --
	    // initイベント処理
        // Apexコントローラのアクションを取得
        var action = component.get("c.findAll");
        // Apexコントローラ処理後のコールバック設定
        action.setCallback(this, function(a){
            component.set("v.leads", a.getReturnValue());
        });
        // 実行アクションキューに追加
        $A.enqueueAction(action);
    },
    
        createLead: function(component, event, helper) {
        //-- 手順7 --

        var isValid = true;
        var company = component.find("company");
        var lastName = component.find("lastname");


        // エラークリア
        //company.setValid("v.value", true);
        //lastName.setValid("v.value", true);

        if ($A.util.isEmpty(company.get("v.value"))) {
            // エラーセット
            //company.setValid("v.value", false);
            //company.addErrors("v.value", [{message:"会社名を入力してください。"}]);
            isValid = false;
        }
        if ($A.util.isEmpty(lastName.get("v.value"))) {
            // エラーセット
            //lastName.setValid("v.value", false);
            //lastName.addErrors("v.value", [{message:"姓を入力してください。"}]);
            isValid = false;
        }


        if (isValid) {
            var lead = component.get("v.lead");
            var action = component.get("c.create");
            action.setParams({
                "ld": lead
            });

            action.setCallback(this, function(a){
                // Salesforce1イベント発火(トーストメッセージ表示)
                /*
                var toastEvent = $A.get("e.force:showToast");
                if (action.getState() === 'SUCCESS') {
                    toastEvent.setParams({
                        "title": "Success",
                        "message": "正常に登録が完了しました"
                    });
                    company.set("v.value", "");
                    lastName.set("v.value", "");
                } else {
                    toastEvent.setParams({
                        "title": "Error",
                        "message": "エラーが発生しました"
                    });
                }
                toastEvent.fire();
                */
            });

            $A.enqueueAction(action);
        }
    }
})

動作を確認する。

https://[ yourdomain ]/c/CreateComponentAppliction.app
例えば、
https://testdaeheuitest-test11-dev-ed.lightning.force.com/c/CreateComponentAppliction.app

結果

登録される。

[Salesforce]Lightning コンポーネント‐手順6:データの一覧表示

Lightningコンポーネントのデータのリスト表示を共有します。

Apexコントローラ

public class LeadController {

    @AuraEnabled
    public static List<Lead> findAll() {
        return [SELECT Id, LastName, Company FROM Lead ORDER BY LastModifiedDate DESC LIMIT 50];
    }
        
}

コンポーネント

<!-- 手順6 -->
<aura:component controller="LeadController" implements="force:appHostable">
<!--
<aura:component implements="force:appHostable">
-->
    <!-- 手順2 -->
	<aura:attribute name="target" type="String" default="world"/>
    <!-- 手順3 -->
    <aura:attribute name="switch" type="Boolean" default="false" />
    
    <!-- 手順1 -->
    <h1>Hello, Lightning Component!!</h1>
    
    <!-- 手順2 -->
    <h1>Hello, {!v.target}!</h1>
    
    <!-- 手順3 -->
    <h1>ボタンクリックでON/OFF</h1>

    <!-- 手順3 -->
    <aura:If isTrue="{!v.switch}">
        <p>ON</p>
        <aura:set attribute="else">
            <p>OFF</p>
        </aura:set>
    </aura:If>
    
    <!-- 手順3 -->
    <ui:button label="{!v.switch ? 'OFFにする' : 'ONにする' }" press="{!c.toggle}"/>


    <!-- 手順4 -->
    <ui:inputText aura:id="input" label="名前" value=""/>
    <ui:outputText aura:id="output" value=""/><br/>
    
    <ui:button aura:id="submit" label="設定" press="{!c.set}"/>
 
     <!-- 手順5 -->
    <div class="white">白</div>
    <h3>黒</h3>
    <ul>
        <li class="red">赤</li>
        <li class="blue">青</li>
        <li class="green">緑</li>
    </ul>  
    
    <!-- 手順6 -->
    <!-- Leadオブジェクトの配列を属性にもつ -->
    <aura:attribute name="leads" type="Lead[]"/>

    <!-- 表示ライフサイクル中に発火されるinitイベント購読 -->
    <aura:handler name="init" value="{!this}" action="{!c.doInit}"/>

    <h3>リード表示</h3>

    <ul>
        <aura:iteration items="{!v.leads}" var="lead">
            <li>
                <p>
                    {!lead.Company}<br/>
                    {!lead.LastName}
                </p>
            </li>
        </aura:iteration>
    </ul>  
</aura:component>

コンポーネントコントローラ

({
    toggle: function(component, event, helper) {
   	//-- 手順3 --
    	var status = component.get("v.switch");
        component.set("v.switch", !status);

    },
    
      set: function(component, event, helper) {
	  	//-- 手順4 --

        // 入力コンポーネントから属性値取得
        var inputValue = component.find("input").get("v.value");

        // 入力コンポーネントへ属性値セット
        var output = component.find("output");
        output.set("v.value", inputValue);


        // コンポーネントの属性値取得(仕組みを把握するためのコードでこの変数"target"は利用しない)
        var target = component.get("v.target");

        // コンポーネントの属性値セット
        component.set("v.target", inputValue);
    }, 
    
    
    doInit: function(component, event, helper) {
    	//-- 手順6 --
	    // initイベント処理
        // Apexコントローラのアクションを取得
        var action = component.get("c.findAll");
        // Apexコントローラ処理後のコールバック設定
        action.setCallback(this, function(a){
            component.set("v.leads", a.getReturnValue());
        });
        // 実行アクションキューに追加
        $A.enqueueAction(action);
    }
})

動作確認する。

https://[ yourdomain ]/c/CreateComponentAppliction.app
例えば、
https://testdaeheuitest-test11-dev-ed.lightning.force.com/c/CreateComponentAppliction.app

結果