必見!コミュニティクラウド(Napili)で記事を表示する Lightning コンポーネントを作ってみた
こんにちは。
今回はコミュニティクラウド(Napili)+ナレッジを使って記事を表示させたいのですが、
標準コンポーネント(記事コンテンツ)ではレイアウトに自由度が無く、
今回求めている物が表現できなかったので自作する事にしました。
今回は以下の環境で検証しました。
・コミュニティテンプレート: カスタマーサービス (Napili)
・記事を表示するページ: テンプレートページ (Article Detail)
1.サンプル記事を作成
まずは、検証用に記事を作ります。
今回は↓↓↓な感じにしました。記事内容はカスタム項目(リッチテキストエリア)で作成しています。
2.標準コンポーネントで表示してみる
とりあえず、カスタマイズ無しの標準ページで表示してみました。
問題無く表示されますね。(当たり前ですが・・・)
3.カスタムコンポーネントを作る
Apex コントローラ
まず、Apex コントローラを作りました。
今回コンポーネントを組み込む Article Detail のページは、URL 内に記事のURL名 (urlName) を受け取ります。
なので、この URL名を引数に、記事を取得する関数を実装します。
今回は記事タイトルと記事内容を表示させますので、これらを取得します。
ArticleViewTestController.cls
public class ArticleViewTestController { /** * ナレッジより記事データを取得 * * 引数:URL名 */ @AuraEnabled public static type1__kav getArticleDetail( String urlName ) { List<type1__kav> articleList = [ SELECT Title, detail__c FROM type1__kav WHERE PublishStatus = 'online' AND urlName = :urlName ]; if ( articleList.isEmpty() ) return null; return articleList[0]; } }
※ type1_kav は今回作成した記事タイプのオブジェクト
マークアップとコントローラ
記事表示のレイアウトですが、今回はタイトルと記事内容を表形式で表示してみます。
マークアップのソースは↓↓↓な感じになりました。
※画面パラメータ用の属性 urlName、記事タイトル・内容用の属性 title、detail を定義。
※初期処理のイベントをハンドリング。
articleViewTest.cmp
<aura:component controller="ArticleViewTestController" implements="forceCommunity:availableForAllPageTypes" access="global"> <aura:attribute name="urlName" type="String" default="" access="global" /> <aura:attribute name="title" type="String" /> <aura:attribute name="detail" type="String" /> <aura:handler name="init" action="{!c.doInit}" value="{!this}" /> <table border="1"> <caption>Lightning コンポーネントで記事を表示</caption> <tr> <td>記事タイトル</td> <td><ui:outputText value="{!v.title}" /></td> </tr> <tr> <td>記事詳細</td> <td><ui:outputRichText value="{!v.detail}" /></td> </tr> </table> </aura:component>
↓↓↓はコントローラのソースです。初期表示の処理を実装しています。
URL名を元に記事を取得し、タイトルと記事内容を設定します。
articleViewTestController.js
({ /** * 初期表示 */ doInit : function(component, event, helper) { // URL名を取得 var urlName = component.get('v.urlName'); if ( urlName == '' ) return; // Apex コントローラ呼び出し(記事データを取得) var action = component.get("c.getArticleDetail"); action.setParams({ 'urlName' : urlName }); action.setCallback(this, function(response){ var state = response.getState(); if (component.isValid() && state === "SUCCESS") { var article = response.getReturnValue(); if ( article != null) { // 記事データを設定 component.set("v.title", article['Title']); component.set("v.detail", article['detail__c']); } } }); $A.enqueueAction(action); } })
デザインリソース
突然ですが、コンポーネントにURL名を引き渡すにはどうしたら良いでしょう?
参考までに標準の「記事コンテンツ」のコンポーネントを確認しました。
「記事コンテンツ」のコンポーネントを選択すると、プロパティが表示され、URL名の属性に “{!urlName}” が設定されています。
どうやらこの urlName はページのURLに含まれている、記事のURL名の様です。
カスタムコンポーネントでも、同様のプロパティ属性を提供すれば、URL名の受け渡しが出来そうです。
コミュニティビルダー上にプロパティ属性を表示させるには、デザインリソースを作成します。
今回はURL名のみ渡せれば良いので、属性 “urlName” のみ定義します。
(属性名はマークアップで定義したものと合わせる必要があります)
articleViewTest.design
<design:component label="記事表示テスト"> <design:attribute name="urlName" label="URL名"/> </design:component>
4.カスタムコンポーネントを配置する
作成したカスタムコンポーネントを Article Detail のページに配置します。
配置したコンポーネントを選択すると、デザインリソースで定義したプロパティ属性が表示されました。
標準コンポーネントに習って “{!urlName}” を設定します。
5.カスタムコンポーネントで表示してみる
実際にコミュニティで表示されるか確認します。
うまくいきました! 今回は、記事タイトルと記事内容のみの表示となりましたが、標準コンポーネントでは他にも関連項目が色々表示されている様です。
これらの表示方法についても調べていきたいと思います。