プログラマ38の日記

主にプログラムメモです。

Salesforce:Lightning ホームページの割り当てに対応するメタデータ

ホームページの割り当てがメタデータでどう出力されているかのメモです。

 

まずホームページの割り当ては次の3パターンです。

  • デフォルトのホームページ
  • アプリケーション別割り当て
  • アプリケーションおよびプロファイル別割り当て

 

それぞれのメタデータについて次でした。

デフォルトのホームページ

f:id:crmprogrammer38:20200513080712p:plain

メタデータには出力されないようです。

 

アプリケーション別割り当て

f:id:crmprogrammer38:20200513080750p:plain
→アプリケーションのメタデータ、actionOverrides タグで standard-home に対して出力されます。

 

アプリケーションおよびプロファイル別割り当て

f:id:crmprogrammer38:20200513080830p:plain
→アプリケーションのメタデータ、profileActionOverrides タグで standard-home に対して出力されます。

 

最後に

調べている途中で気が付いたのですが、ホームページも、Lightningレコードページと同様に、「Flexipage」メタデータなので、Lightningレコードページの割り当てと同様のメタデータ出力になります。

Salesforce:Lightning 「コミュニティ レコードの詳細」でのforce:hasSObjectName の動き

結論としては、Lightningページでは、force:hasSObjectName インタフェースは利用できますが、

コミュニティ レコードの詳細ページでは使えませんでした。(Spring'20時点)

 

コミュニティのページで次のようなコンポーネントを作成した場合

 

<aura:component implements="force:hasSObjectName,force:hasRecordId,forceCommunity:availableForAllPageTypes" access="global" >
<aura:attribute name="sObjectName" type="String" />
<aura:attribute name="recordId" type="String" />

・・・・・

attributeの値は次のようになります。

 

var recordId = component.get("v.recordId");
値が正しくとれる。

var sObjectName = component.get("v.sObjectName");
値がnullになる。 

 

なので、コミュニティ レコードの詳細ページで、特定のオブジェクトの時の表示を行う際は別途Apexコントローラを用意して、Lightning Componentで呼び出しする必要があります。

[Apex Controller]

global class SampleController {

    

    @AuraEnabled

    public static String getSobjectName(String recordId){

        try{

            Id sobjid = (Id)recordId;

            return sobjid.getSobjectType().getDescribe().getName();

        }   catch(Exception e) {

            return null;

        }

    }

}

[JS Controller]

({

  doInit: function(component, event, helper) {

    var recordId = component.get("v.recordId");

    var fetchEventAction = component.get("c.getSobjectName");

    fetchEventAction.setParams({ recordId: recordId });

    fetchEventAction.setCallback(this, function(response) {

      var fieldName = response.getReturnValue();

      component.set("v.sObjectName", fieldName);

    });



    $A.enqueueAction(fetchEventAction);

  }

})

 

例えば、コミュニティで特定のオブジェクトの時はパス(lightning:path)を表示したいといった場合には、上記の方法で取得したオブジェクト名で制御をすることになります。

Salesforce: レコードのフォローを自動化する

レコードのフォローを自動化するには、

ConnectApi.ChatterUsers.follow(String communityId, String userId, String subjectId)

を使います。

 

実際使ってみて気づいた点をメモしておこうと思います。

 

  1. 内部ユーザが外部ユーザのuserIdを指定できるが、外部ユーザが内部ユーザのuserIdを指定するとエラーとなる。
  2. communityIdは、userIdのユーザ種別に応じてセットの内容を変える必要がある。

 

1.内部ユーザが外部ユーザのuserIdを指定できるが、外部ユーザが内部ユーザのuserIdを指定するとエラーとなる。

レコードの新規作成時に対象のユーザ(内部ユーザとコミュニティユーザ)がレコードをフォローするというトリガを作りました。
内部ユーザがトリガを実行すれば正しく動作しますが、コミュニティユーザがトリガが実行すると「System.NoAccessException: アクセス権がありません: アクセス権がないため要求を実行できません。」が発生しました。

コミュニティユーザはそのユーザは参照できるように設定してもこのエラーは解消できませんでした。

外部ユーザが外部ユーザのuserIdを指定する場合はエラーになりませんでした。

 

2.communityIdは、userIdのユーザ種別に応じてセットの内容を変える必要がある。

内部ユーザのレコードのフォローを自動化するには、

ConnectApi.ChatterUsers.follow(null , 内部ユーザのID, レコードのID);

となります。

 

内部ユーザのレコードのフォローを自動化するには、

 

ConnectApi.ChatterUsers.follow(外部ユーザのコミュニティID , 外部ユーザのID, レコードのID);

となります。

外部ユーザのコミュニティIDは、ネットワーク(Network)オブジェクトから取得したものをセットします。

 

最後に

レコードのフォローの自動化は、様々な状況に対応させるには難しさを感じました。
例えば、社内ユーザに限定して動作させたりといったように用途を限定すれば比較的に簡単に使えそうだなと思いました。

 

 

Salesforce: Lightning Component上で取得できるユーザ情報

Apexコントローラをコールしてしまえば必要な情報は取得できますが、Apexコントローラをコールしないでも次の情報が取得できます。

 

var userinfo = $A.get("$SObjectType.CurrentUser");

var userId = userinfo.Id;
var userEmail = userinfo.Email;
var isChatterEnabled = userinfo.isChatterEnabled;

 

現時点(2020\5/1)では、上記のユーザID、メール、チャッター有効の3項目だけですが、プロファイル名、ロール名、氏名など取得できる項目が今後増えていくといいなと思います。

 

Salesforce: URLパラメータによるLEX新規作成画面の初期値セット

URLパラメータで新規作成画面の初期値がセットできるようになりました。

 

https://ドメイン/lightning/o/Account/new?recordTypeId=[レコードタイプID]&defaultFieldValues=Name=初期値1,Sic=初期値2,BillingState=初期値3

 

上記は取引先(Account)の例です。別のオブジェクトの場合、AccountではなくてそのオブジェクトのAPI名を指定します。

レコードタイプを指定する場合はrecordTypeIdに指定したいレコードタイプIDを指定します。指定しない場合デフォルト指定しているレコードタイプになります。

項目の初期値をセットするには、項目のAPIに初期値をセットします。
日付項目の形式は、2020-01-01 で、日付/時間項目の形式は、2020-01-01T00:00:00.000Z のデータローダおなじみの形式でした。そして、連動関係の連動項目には初期値は入りませんでした。

 

使い方や動きは「e.force:createRecord」イベントと同じです。(連動関係の連動項目に初期値が入らないところを含め)

 

Trailheadでは数式で使うということでしたが、コピー機能のような感じで使うのだと理解しています。

Salesforce: Lightningページ上に配置したコンポーネントでよく使う aura:hander

Lightningページで、Lightning Componentを組み込んだ際に、初期表示を行ったり、変更やレコードの登録のタイミングでLightning Componentの内容を更新するといった制御が必要です。

 

そんな時には aura:hander を使いますが、個人的によく使うのは次の3つです。

 

[Lightningページ上のLightning Componentでよく使うハンドラー]

  1. <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
  2. <aura:handler event="force:refreshView" action="{!c.doRefreshView}" />
  3. <aura:handler event="force:showToast" action="{!c.doShowToast}" />

 

1つ目の name="init" は、画面の初期表示用ハンドラーで、ヘルプ上 valueInit で記載されています。
2つ目の event="force:refreshView" は、例えば詳細画面で値を変更した時に、Lightning Componentを更新するといった場合にこのハンドラーを使います。画面のすべてのデータ登録/更新でforce:refreshViewのイベントを受信できるわけではないので注意が必要です。(どのタイミングでこのイベントを受信できるかは下記にまとめました)
3つ目の event="force:showToast" は、例えば、「○○が登録されました。」といったトースト表示のタイミングでLightning Componentを更新するといった場合にこのハンドラーを使います。こちらはトースト表示されると動くのでわかりやすいです。(こちらも、どのタイミングでこのイベントを受信できるかは下記にまとめました)

         イベントを受信できるタイミング

操作 name="init" event="force:refreshView" event="force:showToast" 備考
初期表示      
chatterの投稿       投稿のイベントは受信できなかった
関連レコード     標準の関連レコードコンポーネント
活動   標準の活動コンポーネント
所有者の変更    
レコードタイプの変更 name="init"を最後に受信する
編集画面から保存      
関連リストから登録      
関連リストから更新    ○  
関連リストから削除      

 

関連リストの登録、削除はevent="force:showToast"でしか受信できないので注意です。

Salesforce: 動的に作成したコンポーネントとの値のやりとり(cmp.getReference)について

「lightning:overlayLibrary」をはじめとして、動的に作成したコンポーネントと、それを表示する元のコンポーネントとで値のやり取りをしたい場合があります。

 

例えば、javascriptのconfirmでは、

var result = window.confirm('ボタンをクリックしてください');

のように、確認ダイアログのクリックしたボタンの結果でtrue/falseが返ってきます。

 

これを「lightning:overlayLibrary」で行う場合次のようになります。

  1. 元のコンポーネントの変数の参照を確認ダイアログに渡す
  2. 確認ダイアログで渡された変数の参照にどのボタンをクリックしたのかの結果をセットする
  3. 元のコンポーネント側で変数の値を取得する

ここで変数の参照を渡すというのが出てきますが次の書き方になります。
{ パラメータ : component.getReference("v.変数名") }

これはattributeの参照なので v.変数の参照 ですが、Contoroller のfunction の参照であれば c.functionの関数名 となります。

 

このあたりの制御は、次の記事の記載内容で使っています。

 

crmprogrammer38.hatenablog.com