[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

結果

[Salesforce]Lightning コンポーネント‐手順5:CSS

LightningコンポーネントでCSSについて共有します。

<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>    
</aura:component>

CSS

.THIS {
	background-color: white;
}

.THIS .white {
    background-color: white;
}

.THIS .red {
    background-color: red;
}

.THIS .blue {
    background-color: blue;
}

.THIS .green {
    background-color: green;
}

動作確認する。

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

結果

[Salesforce]Lightning コンポーネント‐手順4:入力値表示

手順3の続きとして、入力値表示を共有します。

コンポーネント

<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}"/>
    
</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);
    }
})

動作確認する。

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

[Salesforce]Lightning コンポーネント‐手順3:コンポーネントコントローラ

コンポーネント

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

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

コントローラ

({
    toggle: function(component, event, helper) {
        var status = component.get("v.switch");
        component.set("v.switch", !status);
    }
})

動作確認する。

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

初期画面は以下のように表示される。

Hello, Lightning Component!!
Hello, world!
ボタンクリックでON/OFF
OFF
「ONにする」ボタン

「ONにする」ボタン押下時以下のように表示される。

Hello, Lightning Component!!
Hello, world!
ボタンクリックでON/OFF
OFF
「OFFにする」ボタン

[Salesforce]Lightning コンポーネント‐手順2:コンポーネント属性

前回手順1の続きとして、Lightningコンポーネント属性を共有します。

属性を追加する。

<aura:component implements="force:appHostable">
	<aura:attribute name="target" type="String" default="world"/>
    <h1>Hello, Lightning Component!!</h1>
    <h1>Hello, {!v.target}!</h1>
</aura:component>

説明:


	<aura:attribute name="target" type="String" default="world"/>

属性

<h1>Hello, {!v.target}!</h1>

属性と関連されている。

動作確認する。

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

結果

Hello, Lightning Component!!
Hello, world!

[Salesforce]Lightning コンポーネント‐手順1:コンポーネント作成

Lightningコンポーネント作成例を共有します。

1.Lightningコンポーネント作成

Eclipseでの開発の場合には、Lightning Bundleを選択する。

CreateComponent.cmp

作成すると、以下のモジュールも作成されます。

CreateComponent.cmp-meta.xml

CreateComponent.css

CreateComponentController.js

CreateComponentHelper.js

CreateComponentRenderer.js

CreateComponent.cmp編集

<aura:component implements="force:appHostable">
    <h1>Hello, Lightning Component!!</h1>
</aura:component>

解説

implements="force:appHostable"

: コンポーネントをSalesforce1のナビゲーションメニューで使用できるようにする。

implements="flexipage:availableForAllPageTypes"

: LightningアプリケーションビルダーやLightningページタブに表示できるように する。

動作確認するために、Lightning Application作成する。

CreateComponentAppliction.app

以下のモジュールも作成される。

CreateComponentAppliction.app-meta.xml

CreateComponentAppliction.css

CreateComponentApplictionController.js

CreateComponentApplictionHelper.js

CreateComponentApplictionRenderer.js

Applicaionを編集する。

<aura:application>
	<c:CreateComponent/>
</aura:application>

以下のURLで確認する。

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

画面上に以下のように表示される。

Hello, Lightning Component!!

[Salesforce]EclipseでForce.com IDEバージョンアップ

EclipseでForce.com IDEのバージョンアップする手順を共有します。

Eclipse > Help > Check the updates > Force.com IDE チェック > Nextボタン押下

Eclipse再起動

今回は、以前Force.com IDEバージョンが36.xxだったので、38.xxにアップした。

[Salesforce]Lightning コンポーネント対応のEclipseのForce.com IDEバージョン

EclipseのForce.comでSalesforceのLightningコンポーネントを開発するためのForce.comのバージョンは以下です。

Force.com IDE v37.0とその以降バージョン

参考URL

https://developer.salesforce.com/docs/atlas.en-us.eclipse.meta/eclipse/eclipse_lightning_setup.htm

[Salesforce]Lightning Design System

Lightning Design Systemを使ってVisualforceでLightning雰囲気のページ作成するのを共有する。

現在Salesforceの主なページ作成はVisualforceページですが、Salesforceが提供しているCSSフレームワーク Lightning Design System を使ってみる。

開発コンソル画面を開き、Visualforce ページ作成する。

<apex:page showHeader="false" standardStylesheets="false" sidebar="false" applyHtmlTag="false" applyBodyTag="false" docType="html-5.0">
  <html xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" lang="ja">
    <head>
      <meta charset="utf-8" />
      <meta http-equiv="x-ua-compatible" content="ie=edge" />
      <title>Salesforce Lightning Design System</title>
      <meta name="viewport" content="width=device-width, initial-scale=1" />
      <!-- Import the Design System style sheet -->
      <apex:slds />
    </head>
 
    <apex:remoteObjects >
      <apex:remoteObjectModel name="Contact" fields="Id,Name,Title,LastModifiedDate,PhotoUrl"/>
    </apex:remoteObjects>
 
    <body>
      <!-- REQUIRED SLDS WRAPPER -->
      <div class="slds-scope">
        <!-- MASTHEAD -->
        <p class="slds-text-heading--label slds-m-bottom--small">Salesforce Lightning Design System </p>
        <!-- / MASTHEAD -->
        <!-- PAGE HEADER -->
        <div class="slds-page-header">
          <!-- LAYOUT GRID -->
          <div class="slds-grid">
            <!-- GRID COL -->
            <div class="slds-col slds-has-flexi-truncate">
              <!-- HEADING AREA -->
              <!-- MEDIA OBJECT = FIGURE + BODY -->
              <div class="slds-media slds-no-space slds-grow">
                <div class="slds-media__figure">
                  <svg aria-hidden="true" class="slds-icon slds-icon-standard-contact">
                    <use xlink:href="{!URLFOR($Asset.SLDS, 'assets/icons/standard-sprite/svg/symbols.svg#contact')}"></use>
                  </svg>
                </div>
                <div class="slds-media__body">
                  <p class="slds-text-title--caps slds-line-height--reset">Contacts</p>
                  <h1 class="slds-page-header__title slds-m-right--small slds-align-middle slds-truncate" title="My Contacts">顧客リスト</h1>
                </div>
              </div>
              <!-- / MEDIA OBJECT -->
              <!-- /HEADING AREA -->
            </div>
            <!-- ACTION BUTTONS -->
            <div class="slds-col slds-no-flex slds-grid slds-align-top">
              <div class="slds-button-group" role="group">
                <button class="slds-button slds-button--neutral">Add Contact </button>
                <button class="slds-button slds-button--neutral">More </button>
              </div>
            </div>
            <!-- / ACTION BUTTONS -->
          </div>
          <!-- / LAYOUT GRID -->
        </div>
        <!-- / PAGE HEADER -->
        <!-- PRIMARY CONTENT WRAPPER -->
        <div class="myapp slds-p-horizontal--medium">
          <ul id="contact-list" class="slds-has-dividers--bottom-space"></ul>
        </div>
        <!-- / PRIMARY CONTENT WRAPPER -->
 
        <!-- FOOTER -->
        <footer role="contentinfo" class="slds-p-around--large">
          <!-- LAYOUT GRID -->
          <div class="slds-grid slds-grid--align-spread">
            <p class="slds-col">Salesforce Lightning Design System Example</p>
            <p class="slds-col">© Your Name Here</p>
          </div>
          <!-- / LAYOUT GRID -->
        </footer>
        <!-- / FOOTER -->
      </div>
      <!-- / REQUIRED SLDS WRAPPER -->
 
 
<!-- JAVASCRIPT -->
<script>
  (function() {
    'use strict';
    var contact = new SObjectModel.Contact();
    var contactList = document.getElementById('contact-list');
 
function createTile (record) {
  return [
    '<li class="slds-item">',
      '<div class="slds-tile slds-media">',
        '<div class="slds-media__figure">',
          '<img class="slds-avatar slds-avatar--medium" src="', record.get('PhotoUrl'), '" alt="" />',
        '</div>',
        '<div class="slds-media__body">',
          '<h3 class="slds-truncate" title="', record.get('Name'), '"><a href="javascript:void(0);">', record.get('Name') ,'</a></h3>',
          '<div class="slds-tile__detail slds-text-body--small">',
            '<p class="slds-truncate">', record.get('Title') ,'</p>',
          '</div>',
        '</div>',
      '</div>',
    '</li>'
  ].join('');
}
 
    contact.retrieve(
      { orderby: [{ LastModifiedDate: 'DESC' }], limit: 10 },
      function(error, records) {
        if (error) {
          alert(error.message);
        } else {
          contactList.innerHTML = records.map(createTile).join('');
        }
      }
    );
  })();
 
</script>
<!-- / JAVASCRIPT -->
    </body>
  </html>
</apex:page>

簡単な解説です。

・ Lightning Design SystemのSVGアイコン使用宣言

xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"

・ Lightning Design Systemのスタイル、アセットをVisualforceページにインポート

<apex:slds />

・ 「Contact」へアクセスし、javascriptで呼び出 し

<apex:remoteObjectModel name="Contact" fields="Id,Name,Title,LastModifiedDate,PhotoUrl"/>

・ Lightning Design Systemの適用範囲

<div class="slds-scope">...</div>

[Salesforce] Lightning ExperienceのURL遷移


navigateToURLによるページ画面に遷移する例 は以下です。

//Component: LightningNavigate
<aura:component implements="force:appHostable">
    <div id="aura-page">
        <div class="container">
            <ui:button label="gotoURL" press="{!c.gotoURL}" />
        </div>
        <div class="container">
            <ui:button label="navigate" press="{!c.navigate}" />
        </div>
    </div>
</aura:component>

//Controller
({
    gotoURL : function(component, event, helper) {
        helper.gotoURL(component);
    },
    navigate : function(component, event, helper) {
        helper.navigate(component);
    }
})

//Helper
({
    gotoURL : function (component, event) {
        var urlEvent = $A.get("e.force:navigateToURL");
        urlEvent.setParams({
          "url": "/006/o"
        });
        urlEvent.fire();
    },
    navigate : function(component,event) {
        var address = '/Salesforce.com+Inc/@37.793779,-122.39448,17z/';
        var urlEvent = $A.get("e.force:navigateToURL");
        urlEvent.setParams({
          "url": 'https://www.google.com/maps/place/' + address
        });
        urlEvent.fire();
    }
})

//App
<aura:application >
    <c:LightningNavigate />
</aura:application>