Salesforce ナレッジ開発者ガ イド バージョン 34.0, Summer ’15 @salesforcedocs 最終更新日: 2015/5/21 © Copyright 2000–2015 salesforce.com, inc. All rights reserved. Salesforce およびその他の名称や商標は、salesforce.com, inc. の登録商標です。本ドキュメントに記載されたその他の商標は、各社に所有権があります。 目次 第 1 章: Salesforce ナレッジでの開発の概要 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Salesforce ナレッジ API オブジェクト . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 第 2 章: 開発組織の設定 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 第 3 章: Visualforce タグを使用した検索ページの作成 . . . . . . . . . . . . . . . . . . . . . . 13 Visualforce を使用して記事リストを作成する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 ページネーションを Visualforce 記事リストに追加する . . . . . . . . . . . . . . . . . . . . . . . . . 16 検索項目を [Visualforce Article Search (Visualforce 記事検索)] ページに追加する . . . . . . . . . 19 検索条件を [Visualforce Article Search (Visualforce 記事検索)] ページに追加する . . . . . . . . 23 [Last Updated Promotions (最後に更新されたプロモーション)] ボックスを [Visualforce Article Search (Visualforce 記事検索ページ)] に追加する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 第 4 章: Apex および REST API を使用した記事の管理 . . . . . . . . . . . . . . . . . . . . . . 39 PublishingService クラス . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 PublishingService メソッド . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 記事のマスタバージョンをアーカイブする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 翻訳に関連するタスクを割り当てる . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 マスタ記事に関連するタスクを割り当てる . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 記事のマスタバージョンを削除する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 記事の翻訳バージョンを削除する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 マスタ記事のオンラインバージョンを編集する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 記事のマスタバージョンを公開する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 記事のアーカイブバージョンを復元する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 記事のメタデータを取得する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 記事のバージョンを取得する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 マスタバージョンのメタデータ要素を検索する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 翻訳バージョンのメタデータ要素を検索する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 翻訳記事のバージョンを完了に設定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 翻訳記事のバージョンを未完了に設定する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 記事の翻訳を申請する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 記事のマスタバージョンを非公開にする . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 翻訳記事のオンラインバージョンを非公開にする . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Salesforce Object Query Language を使用して参照統計を更新する . . . . . . . . . . . . . . . . . 64 Salesforce Object Search Language を使用して検索キーワードを追跡する . . . . . . . . . . . . 64 Salesforce Object Search Language を使用して記事の参照統計を更新する . . . . . . . . . . . . 64 第1章 トピック: • Salesforce ナレッジ API オブジェクト Salesforce ナレッジでの開発の概要 Salesforce ナレッジは、ユーザが内容 (記事とも呼ばれる) を簡単に作成および管理で き、必要な記事の検索と表示をすばやく実行できる知識ベースです。組織内のSalesforce ナレッジの設定が完了したら、ユーザは [記事の管理] タブを使用して記事の書き込 み、編集、公開、アーカイブを行ったり、[記事] タブを使用して公開記事の検索と 表示を行ったりできます。カスタマーポータルまたはパートナーポータルでSalesforce ナレッジが有効になっている場合、顧客およびパートナーは記事にアクセスできま す。Web サイト訪問者が記事を参照できるよう、公開知識ベースを作成することも できます。 このガイドは、会社のニーズに応じて Salesforce ナレッジをカスタマイズする開発者 を対象としています。Visualforce タグを使用した記事の検索ページを理解して作成で きるようにいくつかの例が記載されています。 1 Salesforce ナレッジでの開発の概要 Salesforce ナレッジ API オブジェクト Salesforce ナレッジ API オブジェクト Salesforce ナレッジでは、記事およびデータカテゴリを使用します。記事には、知識ベースで入手できるように する会社の商品およびサービスに関する情報が取り込まれます。Salesforce ナレッジでは、データカテゴリは、 階層的にカテゴリグループにまとめられた一連の条件です。知識ベースの記事は、複数のカテゴリにしたがっ て分類できます。ユーザは必要な記事を見つけやすくなります。たとえば、営業地域や事業単位で記事を分類 するには、「営業地域」と「事業単位」という 2 つのカテゴリグループを作成します。「営業地域」カテゴリ グループでは、「全営業地域」を最上位として、第 2 レベルに「北米」、「アジア」というように、地理的階 層を最大 5 レベルに構成することができます。作成者がカテゴリを記事に割り当てます。管理者は、データカ テゴリを使用して記事へのアクセスを制御します。 データカテゴリは、システム管理者が定義した値で、記事を知識ベース内で論理サブグループに整理するとき に役立ちます。たとえば、[記事] タブから、最も関連性の高いデータカテゴリを選択して、記事のリストを絞 り込むことができます。このセクションでは、記事およびデータカテゴリの Salesforce ナレッジ API オブジェク トと、それらを操作するリソースをリストします。 記事 記事には、知識ベースで入手できるようにする会社の商品およびサービスに関する情報が取り込まれます。知 識ベースの記事を 1 つ以上のデータカテゴリに分類することにより、ユーザは必要な記事を見つけやすくなり ます。管理者は、データカテゴリを使用して記事へのアクセスを制御します。 記事は記事タイプに基づいており、記事タイプは次に依存しています。 • セクションの内容を整理する記事タイプ。 • 記事を表示する記事タイプのテンプレート。 どの記事も公開サイクルで管理されます。 記事タイプ Salesforce ナレッジのすべての記事は 1 つの記事タイプに割り当てられます。記事のタイプは、記事が含む コンテンツのタイプ、外観、および記事にアクセスできるユーザを特定します。たとえば、単純な FAQ の 記事タイプには、[質問] および [回答] の 2 つのカスタム項目があり、記事マネージャが FAQ の記事の作 成または更新時にそこにデータを入力します。より複雑な記事タイプでは、複数のセクションに分かれた 多数の項目が必要な場合があります。レイアウトおよびテンプレートを使用することで、管理者は特定の コンテンツに対して最も効果的な方法で記事タイプを構築できます。記事タイプへのユーザのアクセスは 権限によって制御されます。各記事タイプについて、管理者は「作成」、「参照」、「編集」、または「削 除」権限をユーザに与えることができます。たとえば、記事マネージャが内部ユーザには FAQ を参照、作 成、編集できるようにするけれども、パートナーユーザには FAQ の参照のみを可能にする場合などです。 記事タイプレイアウト 記事タイプレイアウトを使用して、管理者は記事に表示される項目を構成するセクションを作成し、ユー ザが表示および編集可能な項目を選択できます。記事タイプごとに 1 つのレイアウトが使用可能です。管 理者は、記事タイプの詳細ページからレイアウトを変更します。 記事タイプテンプレート 記事タイプテンプレートでは、記事タイプレイアウトでのセクションの表示方法を指定します。記事タイ プは、その 4 つのチャネルそれぞれに異なるテンプレートを使用できます。たとえば、FAQ の記事タイプの [カスタマーポータル] チャネルをタブテンプレートに割り当てると、FAQ のレイアウトのセクションが、顧 2 Salesforce ナレッジでの開発の概要 Salesforce ナレッジ API オブジェクト 客が FAQ の記事を表示するときにタブとして表示されます。目次テンプレートの場合は、レイアウトで定 義したセクションが、記事が表示されたときに 1 つのページにハイパーリンクと共に表示されます。Salesforce は、タブと目次の 2 つの標準記事タイプテンプレートを提供します。カスタムテンプレートは Visualforce で 作成できます。 チャネル チャネルとは、記事を利用可能にする媒体を指します。Salesforce ナレッジでは、記事を利用可能にできる チャネルを 4 つ提供しています。 • 内部アプリケーション: Salesforceのユーザが、ロールの表示設定に応じて [記事] タブで記事にアクセスで きます。 • カスタマー: [記事] タブがコミュニティまたはカスタマーポータルで使用可能な場合、顧客が記事にアク セスできます。カスタマーユーザは、取引先でのマネージャのロール表示設定を継承します。コミュニ ティでは、カスタマーコミュニティまたはカスタマーコミュニティプラスライセンスを持つユーザのみ が記事を使用できます。 • パートナー: [記事] タブがコミュニティまたはカスタマーポータルで使用可能な場合、パートナーが記事 にアクセスできます。パートナーユーザは、取引先でのマネージャのロール表示設定を継承します。コ ミュニティでは、パートナコミュニティライセンスを持つユーザのみが記事を使用できます。 • 公開知識ベース: 記事は、AppExchange から Salesforce ナレッジのサンプル公開知識ベースアプリケーショ ンを使用して公開知識ベースを作成することで、匿名ユーザに公開できます。公開知識ベースの作成に は、サイトおよび Visualforce が必要です。 • 自分の Web サイト。会社の Web サイト経由でユーザが記事を使用できます。 公開サイクル Salesforce ナレッジ記事は公開サイクルの作成から削除までの段階を移行していきます。公開サイクルには、 3 つの異なる状況があります。Draft は、新しい記事が作成されるか既存の記事が更新される段階です。 状況が Online である記事は、公開済みで、他のチャネルで利用できるようになったドラフト記事です。 最後に、公開記事がサイクルの最終段階になると、Archived 状況に移行するか、または Draft に戻り後 続のバージョンで更新されます。 次の表に、記事を操作する API リソースのリストを示します。 名前 型 説明 記事タイプ __DataCategorySelection Object 記事を分類するデータカテゴリを表します。 記事タイプ__ka Object バージョンとは関係なく特定の記事タイプの記事へのア クセスを提供します。このオブジェクトは参照のみであ るため、SOQL 句または WITH DATA CATEGORY DataCategorySpec SOSL 句では使用できません。詳細 は、「KnowledgeArticle」を参照してください。 記事タイプ__kav Object バージョンに応じて特定の記事タイプのすべての記事へ のアクセスを提供します。このオブジェクトは、 KnowledgeArticleVersion で使用可能な項目へのアクセスを提 供します。詳細は、「KnowledgeArticleVersion」を 参照してください。 3 Salesforce ナレッジでの開発の概要 Salesforce ナレッジ API オブジェクト 名前 型 説明 記事タイプ__Feed Object 記事の詳細ページに表示されるフィード内の単一フィー ド項目を表します。 記事タイプ__ViewStat Object 特定の記事タイプの記事の参照回数の統計情報を提供し ます。詳細は、「KnowledgeArticleViewStat」を参 照してください。 記事タイプ__VoteStat Object 特定の記事タイプの記事の加重評価を 1 - 5 のスケールで 提供します。詳細は、「KnowledgeArticleVoteStat」 を参照してください。 CaseArticle Object Case と KnowledgeArticle との間の関連を表します。 FeedComment Object ユーザがフィードに追加したコメントを表します。ユー ザがフィードに追加したコメントを表します。 FeedItem Object FeedItem は、レコードフィードの変更 (テキスト投稿、リ ンク投稿、およびコンテンツ投稿を含む) などのフィー ドのエントリを表します。 KnowledgeArticle Object バージョンとは関係なく記事へのアクセスを提供しま す。このオブジェクトは参照のみであるため、SOQL 句ま たは WITH DATA CATEGORY DataCategorySpec SOSL 句で は使用できません。 KnowledgeArticleVersion Object バージョンに応じて、すべての記事タイプを対象に記事 の標準項目のグローバルな参照を提供します。 KnowledgeArticleViewStat Object すべての記事タイプを対象に指定記事の参照回数に関す る統計情報を提供します。 KnowledgeArticleVoteStat Object すべての記事タイプを対象に指定記事の加重評価を 1 - 5 のスケールで提供します。 NewsFeed Object ユーザのホームの単一フィード項目を表します。Chatter フィードでは、ユーザがフォローするレコードに対する 最新の変更が表示されます。 UserProfileFeed Object ユーザプロファイルフィードを表します。このフィード は、フィード内で追跡可能なレコードに対するユーザに よるすべてのアクションを追跡します。このフィード は、ユーザプロファイルページに表示されます。 WITH DATA CATEGORY filteringExpression SOQL 句 公開サイクルおよびデータカテゴリの状況に応じて記事 を分類します。詳細は、『Force.com SOQL および SOSL リ ファレンス』を参照してください。 4 Salesforce ナレッジでの開発の概要 Salesforce ナレッジ API オブジェクト 名前 型 説明 WITH DATA CATEGORY DataCategorySpec SOSL 句 カテゴリに基づいて記事を検索します。詳細は、 『Force.com SOQL および SOSL リファレンス』を参照してく ださい。 KnowledgeArticleVersion での SOQL および SOSL • クエリで 1 つ以上の主キー ID を指定する場合を除き、必ず PublishStatus の値は 1 つだけ指定します。 セキュリティをサポートするために、PublishStatus の値が Draft の記事は「記事の管理」権限を持つ ユーザにのみ表示されます。 • アーカイブ済み記事のバージョンは、articletype_kav オブジェクトに保存されます。アーカイブ済み記事の バージョンをクエリするには、記事の Id を指定し、sLatestVersion='0' を設定します。 • 必ず Language の値は 1 つだけ指定します。ただし、SOQL では、Id または KnowledgeArticleId に対す る条件がある場合、複数の Language を指定できます。 データカテゴリ データカテゴリは、カテゴリグループ別に編成され、次のことを実行できます。 • ユーザによるレコードの分類および検索。 • システム管理者によるレコードへのアクセスの管理。 データカテゴリは、Salesforce ナレッジ (記事) およびアンサーコミュニティ (質問) で使用できます。 データカテゴリと記事 Salesforce ナレッジでは、各カテゴリグループ内の 5 段階階層のデータカテゴリをサポートします。知識ベー スの記事は、複数のカテゴリに従って分類できます。ユーザは必要な記事を見つけやすくなります。たと えば、営業地域や事業単位で記事を分類するには、「営業地域」と「事業単位」という 2 つのカテゴリグ ループを作成します。「営業地域」カテゴリグループでは、「全営業地域」を最上位として、第 2 レベル に「北米」、「アジア」というように、地理的階層を構成することができます。 以下の図は、ラップトップの商談に関する記事の、知識ベース管理者のビューを示します。記事の編集ペー ジを使用して、知識ベース管理者は Product カテゴリグループの Laptops、および Geography カテゴ リグループの USA で記事を分類しました。 5 Salesforce ナレッジでの開発の概要 Salesforce ナレッジ API オブジェクト 次の図は、[記事] タブで公開されている同じ記事を検索するエージェントを示します。エージェントは、 Products および Geography ドロップダウンリストで、それぞれ Laptops および USA を選択します。 次の表に、データカテゴリを操作する API リストを示します。 名前 型 説明 記事タイプ __DataCategorySelection Object 記事カテゴリへのアクセスを許可します。 QuestionDataCategorySelection Object 質問カテゴリへのアクセスを許可します。 WITH DATA CATEGORY filteringExpression SOQL 句 公開サイクルおよびデータカテゴリの状況に応じて記事 を分類します。詳細は、『SalesforceSOQL および SOSL リファ レンス』を参照してください。 6 Salesforce ナレッジでの開発の概要 Salesforce ナレッジ API オブジェクト 名前 型 説明 WITH DATA CATEGORY DataCategorySpec SOSL 句 カテゴリに基づいて記事を検索します。詳細は、 『Salesforce SOQL および SOSL リファレンス』を参照してく ださい。 describeDataCategoryGroups() コール 要求で指定されたオブジェクトで使用できるカテゴリグ ループを取得します。 describeDataCategoryGroupStructures() コール 要求で指定されたオブジェクトで使用できるカテゴリグ ループとそのデータカテゴリ構造を返します。 describeDataCategoryGroups Apex メソッド 指定したオブジェクトに関連するカテゴリグループのリ ストを返します。『Force.com Apex コード開発者ガイド』 を参照してください。 describeDataCategoryGroupStructures Apex メソッド 要求で指定されたオブジェクトのデータカテゴリ構造と 共に使用可能なカテゴリグループを返します。『Force.com Apex コード開発者ガイド』を参照してください。 7 第2章 開発組織の設定 このガイドのサンプルでは、特定のカテゴリグループ、カテゴリ、および記事タイ プを参照します。これらのサンプルを変更せずに使用するには、以下に示す記事タ イプ、データカテゴリ、記事、カスタムアプリケーションのパラメータを使用して 開発組織を作成する必要があります。自分の開発組織のカテゴリや記事タイプでサ ンプルを更新することもできます。 記事タイプ 次の表では、サンプルで使用される 2 つの記事タイプについて説明します。サンプ ルを変更せずに使用するには、これらの記事タイプを開発組織に追加します。記事 タイプを追加する方法についての詳細は、Salesforce オンラインヘルプの「記事タイ プの定義」を参照してください。 パラメータ 提示 プロモーション 表示ラベル Offer (提示) Promotion (プロモーション) API 名 Offer__kav Promotion__kav カスタム項目 1 • 項目表示ラベル: • 項目表示ラベル: Start Reference (リファレンス) Date (開始日) カスタム項目 2 カスタム項目 3 カスタム項目 4 • API 名: Reference__c • API 名: Start_Date__c • 型: text • 型: date/time • 項目表示ラベル: Description (説明) • 項目表示ラベル: End Date (終了日) • API 名: Description__c • API 名: End_Date__c • 型: rich text area • 型: date/time • 項目表示ラベル: Launch • 項目表示ラベル: Date (開始日) Description (説明) • API 名: Launch_Date__c • API 名: Description__c • 型: date • 型: rich text area • 項目表示ラベル: Size (サ なし イズ) • API 名: Size__c • 型: picklist 8 開発組織の設定 パラメータ 提示 プロモーション • 値は次のとおりです。 – XS – S – M – L – XL – XXL カスタム項目 5 • 項目表示ラベル: Data Sheet (データシート) なし • API 名: Data_Sheet__c • 型: file データカテゴリ コードサンプルのカスタマイズされた検索ページでは、[Fashions (ファッション)]、 [Stores (店舗)]、および [Products (商品)] カテゴリグループを使用します。次の表に、こ れらのカテゴリグループで使用されるカテゴリの詳細を示します。API を使用する と、一意の名前でカテゴリを選択できます。これらのカテゴリをサンプルの組織に 追加する際は、括弧内に記載された一意のカテゴリ名を設定してください。 Fashions (ファッション) Stores (店舗) Products (商品) All (All) All (All) All (All) • Rockers (Rockers) • Online store (Online_Store) • Men (Men) • Late 50's/early 60's (Late_50_s_early_60_s) • US (US) – Shoes (Shoes_m) – San Francisco (San_Francisco) – Jackets (Jackets_m) • Futuristic (Futuristic) • Grunge (Grunge) – New-York (New_York) – Shirts (Shirts_m) • Old Hollywood (Old_Hollywood) • Asia (Asia) – Hong-Kong (Hong_Kong) • The 80's (The_80_s) • French Chic (French_Chic) – Tokyo (Tokyo) • Flashy Disco (Flashy_Disco) • Gothic (Gothic) • Europe (Europe) – Trousers (Trousers_m) – Hats (Hats_m) • Women (Women) – Shoes (Shoes_w) – Jackets (Jackets_w) – Trousers (Trousers_w) – Paris (Paris) – Skirts (Shirts_w) – London (London) – Hats (Hats_w) • Children (Children) 9 開発組織の設定 Fashions (ファッション) Stores (店舗) Products (商品) – Shoes (Shoes_k) – Trousers (Trousers_k) – Jackets (Jackets_k) 記事 記事を作成すると、サンプルの検索ページをより現実的なものにすることができま す。このセクションのコンテンツを使用して .csv ファイルを作成し、サンプル組 織にインポートします。 提示およびプロモーションの各記事タイプの .csv ファイルを作成する手順は、次 のとおりです。記事をインポートする方法については、 Salesforce オンラインヘルプ の「記事をインポート」を参照してください。 1. 記事タイプの項目名をカンマで区切って .csv ファイルの最初の行に入力しま す。項目間にスペースを追加しないでください。 2. 値の内容を切り取って項目名の下に貼り付けます。 3. ファイルを保存して .csv ファイルを Salesforce ナレッジにインポートします。 メモ: インポート後に記事を公開する必要があります。公開されていない記事 は、カスタム検索ページに表示されません。 提示記事 次に、提示記事タイプの記事のコンテンツを示します。箇条書きに記載されている のは、使用可能な項目です。その下の各行が、その項目値です。 • Title • Summary • URLName • datacategorygroup.Fashions • datacategorygroup.Stores • datacategorygroup.Products • channels • Reference__c • Description__c • Launched_Date__c • Size__c • Data_Sheet__c Aviator Jacket,5 Zippers,,The_80_s+Grunge,San_Francisco+Paris+London,Jackets_m,,,,,, Army Jacket,Men's Grenade jacket for snowboarding,,Grunge,US,Jackets_m,,,,,, 10 開発組織の設定 Futuristic Boots,Integrates state-of-the-art biotechnics,,Futuristic,All,Shoes_w,,,,,, 60s Mini Skirt,Go back with this mini skirt,,Late_50_s_early_60_s,All,Skirts_w,,,,,, Dotted 80's Skirt,Who said you were a material girl?,,The_80_s,All,Skirts_w,,,,,, 80's Punk Skirts,London Calling!,,The_80_s+Grunge,US,Skirts_w,,,,,, French Design shoes,Magnifique!,,French_Chic,All,Shoes_w,,526398,,,, Vintage Platform Shoes,Get high!,,The_80_s,All,Shoes_w,,,,,, Metallic Jacket,We need you for vintage army!,,The_80_s+Futuristic,All,Jackets_m,,,,,, Gothic Boots,Are you from the Adam's family?,,Gothic,All,Shoes_w,,,,,, Motorcycle Jacket,Live to ride, ride to live!,,Rockers,US,Jackets_m,,,,,, Men's Leather Pants,Hey man!,,Late_50_s_early_60_s,US+Europe,Trousers_m,,,,,, Retro Disco Jacket,Saturday's night fever!,,Flashy_Disco,US+Europe,Jackets_m,,,,,, French Beret,Red beret,,French_Chic,All,Hats_m+Hats_w,,,Beret_DataSheet.htm,2010-02-25,S, プロモーション記事 次に、プロモーション記事タイプの記事のコンテンツを示します。箇条書きに記載 されているのは、使用可能な項目です。その下の各行が、項目の値です。 • Title • URLName • datacategorygroup.Fashions • datacategorygroup.Stores • datacategorygroup.Products • channels • Start_Date__c • End_Date__c,Description__c 60's Pants,,Late_50_s_early_60_s,US+Europe,Trousers_m+Trousers_w,,,, French Trousers,,French_Chic,All,Trousers_w,,,, Futuristic Flip-Flops,,Futuristic,US,Shoes_w,,,, Green Kids Gogo Boots,,The_80_s+Futuristic,All,Shoes_k,,,, Dark Shirts,,Gothic,All,Shirts_m,,,, Christmas Tree Skirts,,Late_50_s_early_60_s,US,Skirts_w,,,, Leather Rocker Jacket,,Rockers,US,Jackets_m,,,, ナレッジのカスタムアプリケーション Salesforce 知識ベースのカスタムアプリケーションを作成する手順は、次のとおりで す。 1. [設定] で、[作成] > [アプリケーション] をクリックします。 11 開発組織の設定 2. 内容を紹介するスプラッシュページが表示される場合は、[次へ]をクリックしま す。 3. [新規] をクリックします。 新規カスタムアプリケーションウィザードが表示されます。 4. [アプリケーションの表示ラベル] 項目に「Knowledge」(ナレッジ) と入力します。 5. [説明] 項目に「My Custom Knowledge Base」(私のカスタム知識ベース) と入 力します。 6. [次へ] をクリックします。 7. [次へ] をクリックします。 8. [ホーム]、[記事]、[記事の管理] タブを選択して、[次へ] をクリックします。 9. [プロファイルへの割り当て] ページで、標準ユーザプロファイルおよびシステム 管理者プロファイルの横にある [参照可能] チェックボックスをオンにします。 10. [保存] をクリックします。 ブラウザの右上隅にあるアプリケーションメニューにナレッジカスタムアプリケー ションが表示されます。このアプリケーションを選択して、コードサンプルを実行 します。 12 第3章 トピック: • Visualforce を使用し て記事リストを作 成する • ページネーション を Visualforce 記事 リストに追加する • 検索項目を [Visualforce Article Search (Visualforce 記事検索)] ページに 追加する • • 検索条件を [Visualforce Article Search (Visualforce 記事検索)] ページに 追加する [Last Updated Promotions (最後に 更新されたプロ モーション)] ボック スを [Visualforce Article Search (Visualforce 記事検 索ページ)] に追加す る Visualforce タグを使用した検索ページの 作成 本番組織へのリリース時にテストクラスを含める このセクションの一部のコードサンプルには、対応するテストクラスがあります。 本番組織にリリースする場合、コードにこのテストクラスを含めます。 テストクラスには、Apex クラスおよびトリガの動作を検証する単体テストが含まれ ます。単体テストは、コード内の特定の部分が正しく機能していることを確認する クラスメソッドです。単体テストのメソッドは引数を取らず、データベースへのデー タのコミットを行うこともなく、メソッド定義に testMethod キーワードのフラグが 立てられます。 正確性やコードカバー率を確認し、また回帰テストを行う意味も含めて、Apex コー ドが本番組織にリリースされるときには、毎回、組織内のすべてのテストメソッド が実行されます。本番組織にリリースするには、すべての Apex クラスで 75% 以上の コードカバー率が必要になります。また、すべてのトリガについてもある程度のコー ドカバー率が必要です。 @isTest クラスアノテーションは、このクラスにはテストメソッドのみが含まれて いることを示します。@isTest アノテーションで定義したクラスは、すべてのApex スクリプトの組織サイズの上限には含まれません。テストおよびコードカバー率に ついての詳細は、『Apex コード開発者ガイド』を参照してください。 このセクションでは、Visualforce を使用して検索ページを作成します。次の手順を実 行します。 1. Visualforce を使用して記事リストを作成する 2. ページネーションを Visualforce 記事リストに追加する 3. 検索項目を [Visualforce Article Search (Visualforce 記事検索)] ページに追加する 4. 検索条件を [Visualforce Article Search (Visualforce 記事検索)] ページに追加する 5. [Last Updated Promotions (最後に更新されたプロモーション)] ボックスを [Visualforce Article Search (Visualforce 記事検索ページ)] に追加する 13 Visualforce タグを使用した検索ページの作成 Visualforce を使用して記事リストを作成する Visualforce を使用して記事リストを作成する Visualforce 検索ページの最初のコンポーネントとなる記事リストを作成します。 1. ブラウザのアドレスバーで、salesforce.com/ より右側すべてを apex/ArticleList に置き換えます。 salesforce.com/ の左側は何も変更しないでください。 この結果、URL は、https://instance.salesforce.com/apex/ArticleList のようになります。 2. Enter キーを押します。 ページがまだ存在しないことを示す Visualforce エラーページが表示されます。 3. [ArticleList ページを作成] リンクをクリックします。 4. 新しい Visualforce ページの下部にあるフッターで、[ArticleList] をクリックして Visualforce 開発モードのページ エディタを表示します。 5. Visualforce 開発モードのページエディタでデフォルトのマークアップをすべて削除し、「Visualforce 記事リス トのコードサンプル」 (ページ 14)に表示されているマークアップに置き換えます。 6. [保存] ( ) をクリックします。 マークアップを保存すると、Force.comプラットフォームでマークアップが有効であるかどうかが確認されて、 エラーがあれば通知されます。マークアップが有効である場合、Visualforce ページの新しいバージョンが保存 され、ブラウザに表示されます。これで、記事のリストが表示された [Article List (記事リスト)] ページを確認で きます。 Visualforce 記事リストのコードサンプル 太字の行については、コードサンプルの後に説明があります。 <apex:page sidebar="false" title="Article List"> <style> td{ vertical-align : top; text-align: left; } </style> <apex:form > <apex:pageBlock title="Article List" > <apex:panelGrid width="100%"> <table width="99%"> <tr> <th width="33%">Title</th> <th width="33%">Article Type</th> <th width="33%">Summary</th> </tr> </table> <knowledge:articleList articleVar="article" hasMoreVar="false" pageSize="10"> <table width="99%"> <tr> <td width="33%"> <apex:outputLink target="_blank" value="{!URLFOR($Action.KnowledgeArticle.View, 14 Visualforce タグを使用した検索ページの作成 Visualforce を使用して記事リストを作成する article.id,['popup' = 'true'])}">{!article.title}</apex:outputLink> </td> <td width="33%"><apex:outputText >{!article.articleTypeLabel}</apex:outputText></td> <td width="33%"><apex:outputText >{!article.abstract}</apex:outputText></td> </tr> </table> </knowledge:articleList> </apex:panelGrid> </apex:pageBlock> </apex:form> </apex:page> 次のコードフラグメントでは、knowledge:articleList Visualforce コンポーネントによって最初の記事リス トが作成されます。pageSize 属性により、リスト内に 10 個までしか記事が表示されないようになります。 <knowledge:articleList articleVar="article" hasMoreVar="false" pageSize="10"> [Visualforce Article Search (Visualforce 記事検索)] タブの作成 次に、記事リストが表示される Visualforce ページの新しいカスタムタブを作成します。このページを [Visualforce Article Search (Visualforce 記事検索)] ページと呼ぶこととします。 1. [設定] で、[作成] > [タブ] をクリックします。 2. Visualforce タブ領域で、[新規] をクリックします。 3. [Visualforce ページ] ドロップダウンリストで、ArticleList を選択します。 4. [タブの表示ラベル] 項目に「Visualforce Article Search」(Visualforce 記事検索) と入力します。 5. [タブ名] 項目のデフォルト値はそのままにしておきます。 6. [タブスタイル] ルックアップアイコンをクリックして、新しいタブのスタイルを選択します。 7. [Salesforce Classic 準備完了] チェックボックスをオフ、[スプラッシュページのカスタムリンク] ド ロップダウンリストの設定を [--なし--] のままにします。 8. [説明] 項目に「A tab for the Visualforce Article Search page」(Visualforce 記事検索ページのタ ブ) と入力します。 9. [次へ] をクリックします。 10. [次へ] を再度クリックして、デフォルトのユーザプロファイル表示を受け入れます。 11. [カスタムアプリケーションに追加] ページで、自分のナレッジアプリケーション以外のすべての [タブを含 める] チェックボックスをオフにします。 12. [各ユーザのカスタマイズ設定にタブを追加する] チェックボックスをオンにします。 13. [保存] をクリックします。 ページが更新されると、[Visualforce Article Search (Visualforce 記事検索)] タブが自動的にページ上部のアプリケー ションタブに追加されます。 15 Visualforce タグを使用した検索ページの作成 ページネーションを Visualforce 記事リストに追加する これまでの作業を確認する [Visualforce Article Search (Visualforce 記事検索)] タブを選択して、記事リストを表示します。 リスト内の各項目には、記事のタイトル、記事タイプ、および記事の概要が表示されます。現時点では、 Visualforce リストのコードサンプルの knowledge:articleList タグで設定したように、リストにはページご とに 10 個の記事しか表示されません。 ページネーションを Visualforce 記事リストに追加する [Visualforce Article Search (Visualforce 記事検索)] タブに、ページ間を移動するための [次へ] および [前へ] リンクを追 加します。 1. [Visualforce Article Search (Visualforce 記事検索)] タブの下部にあるフッターで、[ArticleList] をクリックして Visualforce 開発モードのページエディタを表示します。 2. Visualforce 開発モードのページエディタで既存のマークアップをすべて削除し、「Visualforce 記事リストペー ジネーションのコードサンプル」 (ページ 17)に表示されているマークアップに置き換えます。 3. [保存] ( ) をクリックします。 新しい Visualforce コードは、Apex クラスおよびメソッドを参照しているため、後でエラーメッセージが表示 されて、想定されるクラスまたはメソッドを宣言するように求められます。これらの項目を 1 つずつ宣言 する代わりに、適切なコントローラを作成します。 4. [設定] から、[開発] > [Apex クラス] をクリックします。 16 Visualforce タグを使用した検索ページの作成 ページネーションを Visualforce 記事リストに追加する 5. [新規] をクリックします。 6. Visualforce ページネーションコントローラのコードサンプル (ページ 18)の内容をコピーして貼り付けます。 7. [保存] をクリックします。 8. ステップ 1 ~ 3 を繰り返します。 Visualforce 記事リストページネーションのコードサンプル このコードサンプルは、最初に保存した Visualforce ページに基づいていますが、ページネーションを有効にす る機能強化が含まれています。太字の行については、コードサンプルの後に説明があります。 <apex:page sidebar="false" title="Article List" controller="vfListPaginationController"> <style> td{ vertical-align : top; text-align: left; } </style> <apex:form > <apex:pageBlock title="Article List" > <apex:panelGroup id="theSearchResults" > <apex:panelGrid width="100%"> <table width="99%"> <tr> <th width="33%">Title</th> <th width="33%">Article Type</th> <th width="33%">Summary</th> </tr> </table> <knowledge:articleList articleVar="article" pageNumber="{!currentPageNumber}" hasMoreVar="false" pageSize="10"> <table width="99%"> <tr> <td width="33%"> <apex:outputLink target="_blank" value="{!URLFOR($Action.KnowledgeArticle.View, article.id,['popup' = 'true'])}">{!article.title}</apex:outputLink> </td> <td width="33%"><apex:outputText >{!article.articleTypeLabel}</apex:outputText></td> <td width="33%"><apex:outputText >{!article.abstract}</apex:outputText></td> </tr> </table> </knowledge:articleList> </apex:panelGrid> <apex:panelGrid columns="2"> <apex:commandLink action="{!previous}" value="Previous" style="{!IF(prevRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> <apex:commandLink action="{!next}" value="Next" style="{!IF(nextRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> </apex:panelGrid> </apex:panelGroup> </apex:pageBlock> 17 Visualforce タグを使用した検索ページの作成 ページネーションを Visualforce 記事リストに追加する </apex:form> </apex:page> コード controller="vfListPaginationController" は、Visualforce ページで使用されるコントローラを参 照し、pageNumber="{!currentPageNumber}" は、記事リストのページネーションを設定します。 currentPageNumber 変数は、ユーザが [次へ] または [前へ] リンクをクリックするたびに更新されます。 次のコードフラグメントでは、コントローラ内の previous メソッドをコールします。rerender 属性は、 ページ全体ではなく記事リストのみを更新します。 <apex:commandLink action="{!previous}" value="Previous" style="{!IF(prevRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> Visualforce ページネーションコントローラのコードサンプル 太字の行については、コードサンプルの後に説明があります。 public with sharing class vfListPaginationController { //Page Size private Static Final Integer PAGE_NUMBER = 10; public vfListPaginationController() { String qryString = 'SELECT Id, title, UrlName, LastPublishedDate,LastModifiedById FROM KnowledgeArticleVersion WHERE (PublishStatus = \'online\' and Language = \'en_US\')'; List<KnowledgeArticleVersion> articleList= Database.query(qryString); maxSize = articleList.size() ; } //Keeps track of current page & max size of article list Integer currentPage = 1; Integer maxSize = 1; // Returns whether we need to see previous button or not public boolean getPrevRequired() { return currentPage > 1; } // Returns whether we need to see next button or not public boolean getNextRequired() { return currentPage * PAGE_NUMBER < maxSize; } //Returns current page number public Decimal getCurrentPageNumber() { return this.currentPage; } //action for next click public PageReference next() { if(maxSize > this.currentPage * PAGE_NUMBER) { this.currentPage = this.currentPage + 1; } 18 Visualforce タグを使用した検索ページの作成 検索項目を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する return null; } //action for previous click public PageReference previous() { if(this.currentPage > 1) this.currentPage = this.currentPage - 1; return null; } } 次のコードフラグメントは、記事情報を取得してリストに表示する SOQL 句です。WHERE 句では、公開記事の みが記事リストに表示されるように指定しています。 SELECT Id, title, UrlName, LastPublishedDate,LastModifiedById FROM KnowledgeArticleVersion WHERE (PublishStatus = \'online\' and Language = \'en_US\') これまでの作業を確認する 作業内容を保存すると、[Visualforce Article Search (Visualforce 記事検索)] ページが更新されて、[次へ] リンクがリス トの下部に表示されます。[次へ] をクリックすると、ページに [前へ] リンクが表示されます。 検索項目を [Visualforce Article Search (Visualforce 記事検索)] ページ に追加する 記事リストの上にキーワード検索項目を作成します。この項目にテキストを入力すると、リストが更新され て、そのキーワードを含む記事のみが表示されます。 19 Visualforce タグを使用した検索ページの作成 検索項目を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する 検索項目を使用する場合、検索文字列を設定および取得する新しいメソッドが必要になります。そのため、 [Visualforce Article Search (Visualforce 記事検索)] ページのコードを変更する前に新しいコントローラを追加します。 1. [設定] で、[開発] > [Apex クラス] をクリックします。 2. [新規] をクリックします。 3. Visualforce キーワード検索コントローラのコードサンプル (ページ 21)の内容をコピーして貼り付けます。 4. [保存] をクリックします。 5. [Visualforce Article Search (Visualforce 記事検索)] タブのフッターで、[ArticleList] をクリックして Visualforce 開発モー ドのページエディタを表示します。 6. Visualforce 開発モードのページエディタで既存のマークアップをすべて削除し、「Visualforce キーワード検索 のコードサンプル」 (ページ 20)に表示されているマークアップに置き換えます。 Visualforce キーワード検索のコードサンプル 太字の行については、コードサンプルの後に説明があります。 <apex:page sidebar="false" title="Article List" controller="vfKeywordSearchController"> <style> td{ vertical-align : top; text-align: left; } </style> <apex:form > <apex:pageBlock title="Search" > <apex:inputText value="{!searchstring}" id="theSearchstring" maxlength="100" size="110"/> <apex:commandButton value="Go" id="submitButton" style="width:30" reRender="theSearchResults" /> </apex:pageBlock> <apex:messages /> <apex:pageBlock title="Article List" > <apex:panelGroup id="theSearchResults" > <apex:panelGrid width="100%"> <table width="99%"> <tr> <th width="33%">Title</th> <th width="33%">Article Type</th> <th width="33%">Summary</th> </tr> </table> <knowledge:articleList articleVar="article" pageNumber="{!currentPageNumber}" Keyword="{!searchstring}" hasMoreVar="false" pageSize="10"> <table width="99%"> <tr> <td width="33%"> <apex:outputLink target="_blank" value="{!URLFOR($Action.KnowledgeArticle.View, article.id,['popup' = 'true'])}">{!article.title}</apex:outputLink> </td> 20 Visualforce タグを使用した検索ページの作成 検索項目を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する <td width="33%"><apex:outputText >{!article.articleTypeLabel}</apex:outputText></td> <td width="33%"><apex:outputText >{!article.abstract}</apex:outputText></td> </tr> </table> </knowledge:articleList> </apex:panelGrid> <apex:panelGrid columns="2"> <apex:commandLink action="{!previous}" value="Previous" style="{!IF(prevRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> <apex:commandLink action="{!next}" value="Next" style="{!IF(nextRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> </apex:panelGrid> </apex:panelGroup> </apex:pageBlock> </apex:form> </apex:page> 次のコードフラグメントでは、Keyword 属性を使用します。この属性の値で、vfKeywordSearchController コントローラの searchstring メソッドを呼び出します。 <knowledge:articleList articleVar="article" pageNumber="{!currentPageNumber}" Keyword="{!searchstring}" hasMoreVar="false" pageSize="10"> Visualforce キーワード検索コントローラのコードサンプル 太字の行については、コードサンプルの後に説明があります。 public with sharing class vfKeywordSearchController { //Page Size private Static Final Integer PAGE_NUMBER = 10; //Search String used in ArticleList tag public String searchstring { get; set; } public vfKeywordSearchController() { String qryString = 'SELECT Id, title, UrlName, LastPublishedDate,LastModifiedById FROM KnowledgeArticleVersion WHERE (PublishStatus = \'online\' and Language = \'en_US\')'; List<KnowledgeArticleVersion> articleList= Database.query(qryString); maxSize = articleList.size() ; } //Keeps track of current page & max size of article list Integer currentPage = 1; Integer maxSize = 1; // Returns whether we need to see previous button or not public boolean getPrevRequired() { return currentPage > 1; } // Returns whether we need to see next button or not 21 Visualforce タグを使用した検索ページの作成 検索項目を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する public boolean getNextRequired() { return currentPage * PAGE_NUMBER < maxSize; } //Returns current page number public Decimal getCurrentPageNumber() { return this.currentPage; } //action for next click public PageReference next() { if(maxSize > this.currentPage * PAGE_NUMBER) { this.currentPage = this.currentPage + 1; } return null; } //action for previous click public PageReference previous() { if(this.currentPage > 1) this.currentPage = this.currentPage - 1; return null; } } 次のコードフラグメントで、検索キーワードが設定および取得されます。 public String searchstring { get; set; } これまでの作業を確認する [Visualforce Article Search (Visualforce 記事検索)] ページの記事リストの上に検索項目が表示されます。 22 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する 検索条件を [Visualforce Article Search (Visualforce 記事検索)] ページ に追加する 検索項目に加えて、ユーザが店舗、国、またはファッションで検索結果を絞り込むことができるように、記事 リストを絞り込むデータカテゴリを表示します。 検索条件を Visualforce ページに追加する場合、データカテゴリをリスト、取得、および挿入するメソッドを設 定する必要があります。また、適切なメソッドをコールしてページを処理する新しいコントローラを追加する 必要もあります。 1. [設定] で、[開発] > [Apex クラス] をクリックします。 2. 次のコードサンプルを追加します。 a. データカテゴリ情報のコードサンプル b. データカテゴリグループ情報のコードサンプル c. データカテゴリユーティリティのコードサンプル d. Visualforce 検索コントローラのコードサンプル 3. [Visualforce Article Search (Visualforce 記事検索)] タブの下部にあるフッターで、[ArticleList] をクリックして Visualforce 開発モードのページエディタを表示します。 4. Visualforce 開発モードのページエディタで既存のマークアップをすべて削除し、Visualforce 検索のコードサン プル (ページ 32)のマークアップに置き換えます。 5. [保存] ( ) をクリックします。 23 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する データカテゴリ情報のコードサンプル /** * This class holds the Data Category Info. from * the describe result */ public class DataCategoryInfo { private String name; private String label; private String displayName; public DataCategoryInfo(String name, String label, String displayName) { this.name = name; this.label = label; this.displayName = displayName; } public String getName() { return this.name; } public String getLabel() { return this.label; } public String getDisplayName() { return this.displayName; } } データカテゴリ情報のテスト 次に、データカテゴリ情報のコードサンプル (ページ 24)のテストクラスを示します。 @isTest private class DataCategoryInfoTestClass { static testMethod void validateDataCategoryInfoObject() { DataCategoryInfo dataCategoryInfo = new DataCategoryInfo('Products__c', 'Products__c', 'Products'); System.assertEquals('Products__c',dataCategoryInfo.getName()); System.assertEquals('Products__c',dataCategoryInfo.getLabel()); System.assertEquals('Products',dataCategoryInfo.getDisplayName()); } } データカテゴリグループ情報のコードサンプル /** * This class holds the Data Category Group Info. * from the describe result 24 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する */ public class DataCategoryGroupInfo { private private private private String name; String label; String description; DataCategoryInfo[] groupStructure; public DataCategoryGroupInfo (String name, String label, String description, DataCategoryInfo[] structure) { this.name = name; this.label = label; this.description = description; this.groupStructure = structure; } public String getName(){ return this.name; } public String getLabel(){ return this.label; } public String getDescription(){ return this.description; } public DataCategoryInfo[] getGroupStructure(){ return this.groupStructure; } } データカテゴリグループ情報のテスト 次に、データカテゴリグループ情報のコードサンプル (ページ 24)のテストクラスを示します。 @isTest private class DataCategoryGroupInfoTestClass { static testMethod void validateDataCategoryGroupInfoObject(){ DataCategoryInfo[] structure = new DataCategoryInfo[1]; structure[0] = new DataCategoryInfo('Product','Product__c','Product__c'); DataCategoryGroupInfo dataCategoryGroupInfo = new DataCategoryGroupInfo('Product','Product__c','Test DataCategoryInfoClass',structure); System.assertEquals('Product', dataCategoryGroupInfo.getName()); System.assertEquals('Product__c', dataCategoryGroupInfo.getLabel()); System.assertEquals('Test DataCategoryInfoClass', dataCategoryGroupInfo.getDescription()); System.assertEquals(structure.size(),dataCategoryGroupInfo.getGroupStructure().size()); 25 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する } } データカテゴリユーティリティのコードサンプル /** * This class contains utility functions used by * the controller */ public with sharing class DataCategoryUtil { private static final DataCategoryUtil INSTANCE = new DataCategoryUtil(); private static final String NON_BREAKING_SPACE = ' '; private final String ARTICLE_TYPE = 'KnowledgeArticleVersion'; private DataCategoryUtil() { } public static DataCategoryUtil getInstance() { return INSTANCE; } /** * Retrieves a List of DataCategoryGroupInfo of all the data category * groups associated with Knowledge Article Version */ public DataCategoryGroupInfo[] getAllCategoryGroups() { Describedatacategorygroupresult[] results = getDescribeDataCategoryGroupResults(); DataCategoryGroupInfo[] dataCategoryGroups = new DataCategoryGroupInfo[] { }; for (Describedatacategorygroupresult singleResult : results) { dataCategoryGroups.add( new DataCategoryGroupInfo(singleResult.getName(), singleResult.getLabel(), singleResult.getDescription(), getCategoryStructure(singleResult.getName()))); } return dataCategoryGroups; } private Describedatacategorygroupresult[] getDescribeDataCategoryGroupResults() { String[] objTypes = new String[] {ARTICLE_TYPE}; return Schema.describeDataCategoryGroups(objTypes); } /** * Retrieves an ordered list of all Categories for the specified category group */ private DataCategoryInfo[] getCategoryStructure(String categoryGroupName) { DataCategory root = getRootCategory(categoryGroupName); DataCategory[] yetToBeProcessed = root.getChildCategories(); DataCategoryInfo[] allCategories = new DataCategoryInfo[] { processCategory(root, '') }; getAllCategories(yetToBeProcessed, allCategories, NON_BREAKING_SPACE); return allCategories; } private void getAllCategories(DataCategory[] yetToBeProcessed, DataCategoryInfo[] processed, 26 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する String labelPrefix) { for (DataCategory category : yetToBeProcessed) { processed.add(processCategory(category, labelPrefix)); getAllCategories(category.getChildCategories(), processed, labelPrefix + NON_BREAKING_SPACE); } } private DataCategoryInfo processCategory(DataCategory category, String labelPrefix) { return new DataCategoryInfo(category.getName(), category.getLabel(), labelPrefix + category.getLabel()); } private DataCategory getRootCategory(String categoryGroupName) { Describedatacategorygroupstructureresult structureResult = getDescribeDataCategoryGroupStructureResults(categoryGroupName); return structureResult.getTopCategories()[0]; } private Describedatacategorygroupstructureresult getDescribeDataCategoryGroupStructureResults(String categoryGroupName) { Datacategorygroupsobjecttypepair pair = new Datacategorygroupsobjecttypepair(); pair.setSobject(ARTICLE_TYPE); pair.setDataCategoryGroupName(categoryGroupName); return Schema.describeDataCategoryGroupStructures(new Datacategorygroupsobjecttypepair[] { pair }, false)[0]; } } データカテゴリユーティリティのテスト 次に、データカテゴリユーティリティのコードサンプル (ページ 26)のテストクラスを示します。 @isTest private class DataCategoryUtilTestClass { static testMethod void validateCategoryGroups(){ String[] objTypes = new String[] { 'KnowledgeArticleVersion' }; Describedatacategorygroupresult[] datacategorygroupresult = Schema.describeDataCategoryGroups(objTypes); DataCategoryGroupInfo[] dataCategoryGroupInfo = DataCategoryUtil.getInstance().getAllCategoryGroups(); System.assertEquals(datacategorygroupresult.size(),dataCategoryGroupInfo.size()); } static testMethod void validateCategoryGroupsResults(){ DataCategoryGroupInfo[] dataCategoryGroupInfo = DataCategoryUtil.getInstance().getAllCategoryGroups(); String[] objTypes = new String[] { 'KnowledgeArticleVersion' }; Describedatacategorygroupresult[] datacategorygroupresult = Schema.describeDataCategoryGroups(objTypes); for(Integer i=0;i< dataCategoryGroupInfo.size(); i++) { 27 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する System.assertEquals(dataCategoryGroupInfo[i].getName(),datacategorygroupresult[i].getName()); System.assertEquals(dataCategoryGroupInfo[i].getLabel(),datacategorygroupresult[i].getLabel()); System.assertEquals(dataCategoryGroupInfo[i].getDescription(),datacategorygroupresult[i].getDescription()); } } } Visualforce 検索コントローラのコードサンプル 太字の行については、コードサンプルの後に説明があります。 /** * Controller for Visual force Page. * author SFDC */ public with sharing class VfSearchController{ //Page Size private Static Final Integer PAGE_NUMBER = 10; //Search String used in ArticleList tag public String searchstring { get; set; } //Is new List reqd private boolean isRefRequired = true; //Exclude filter criteria for UI only private static final String EXCLUDE_CRITERIA_FILTER = 'All'; //Keeps track of current page & max size of article list Integer currentPage = 1; Integer maxSize = 1; //Returns array of Category Groups public DataCategoryGroupInfo[] getDataCategoryGroupInfo() { return DataCategoryUtil.getInstance().getAllCategoryGroups(); } //Returns category keyword required to filter articleList. public String getCategoryKeyword() { DataCategoryGroupInfo[] categoryGroups = DataCategoryUtil.getInstance().getAllCategoryGroups(); String categoryCondition = ''; for (DataCategoryGroupInfo categoryGroup : categoryGroups) { String selectedCategoryName = System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); if(selectedCategoryName != null && !selectedCategoryName.equals('NoFilter')) { if(categoryCondition=='' && selectedCategoryName != null){ 28 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する categoryCondition=categoryCondition+categoryGroup.getName() + ':' + System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); }else { categoryCondition=categoryCondition + ',' +categoryGroup.getName() + ':' + System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); } } } String categoryFilter = ''; for (DataCategoryGroupInfo categoryGroup : categoryGroups) { String categoryType = System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); if(categoryType != null && !categoryType.equals('NoFilter')) { if(categoryFilter == ''){ categoryFilter = categoryGroup.getName() + '__c ABOVE_OR_BELOW ' + categoryType +'__c'; } else { categoryFilter = categoryFilter + ' AND ' + categoryGroup.getName() +'__c ABOVE_OR_BELOW ' + categoryType +'__c'; } } } try { if(categoryFilter.length()>0) { if(searchString != null && searchString.length() >0 ) { String searchquery = 'FIND \'' + searchString + '*\'IN ALL FIELDS RETURNING KnowledgeArticleVersion(Id, title, UrlName, LastPublishedDate,LastModifiedById where PublishStatus =\'online\' and Language = \'en_US\') WITH DATA CATEGORY '+categoryFilter ; List<List<SObject>>searchList = search.query(searchquery); List<KnowledgeArticleVersion> articleList = (List<KnowledgeArticleVersion>)searchList[0]; maxSize = articleList.size() ; // maxSize = maxSize.divide(PAGE_NUMBER,2,System.RoundingMode.UP); } else { String qryString = 'SELECT Id, title, UrlName, LastPublishedDate,LastModifiedById FROM KnowledgeArticleVersion WHERE (PublishStatus = \'online\' and Language = \'en_US\') WITH DATA CATEGORY '+categoryFilter; List<KnowledgeArticleVersion> articleList= Database.query(qryString); maxSize = articleList.size() ; // maxSize = maxSize.divide(PAGE_NUMBER,2,System.RoundingMode.UP); } } else { String qryString = 'SELECT Id, title, UrlName, LastPublishedDate,LastModifiedById FROM KnowledgeArticleVersion WHERE (PublishStatus = \'online\' and Language = \'en_US\')'; List<KnowledgeArticleVersion> articleList= Database.query(qryString); maxSize = articleList.size() ; // maxSize = maxSize.divide(PAGE_NUMBER,2,System.RoundingMode.UP); } } catch(Exception e) { Apexpages.addmessages( e ); 29 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する } if(categoryFilter =='') { // maxSize = 0; categoryCondition = 'Fashions:All,Stores:All,Products:All' ; } return categoryCondition; } // Action call when the new list needs to be fetched public PageReference refreshSearchResult() { maxSize = currentPage = 1; return null; } // Returns whether we need to see previous button or not public boolean getPrevRequired() { return currentPage > 1; } // Returns whether we need to see next button or not public boolean getNextRequired() { return currentPage * PAGE_NUMBER < maxSize; } //Returns current page number public Decimal getCurrentPageNumber() { return this.currentPage; } //action for next click public PageReference next() { if(maxSize > this.currentPage * PAGE_NUMBER) { this.currentPage = this.currentPage + 1; } return null; } //action for previous public PageReference if(this.currentPage this.currentPage = return null; } click previous() { > 1) this.currentPage - 1; } 次のコードフラグメントでは、検索条件で選択したカテゴリを取得します。 public String getCategoryKeyword() { DataCategoryGroupInfo[] categoryGroups = DataCategoryUtil.getInstance().getAllCategoryGroups(); String categoryCondition = ''; for (DataCategoryGroupInfo categoryGroup : categoryGroups) { String selectedCategoryName = System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); 30 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する if(selectedCategoryName != null && !selectedCategoryName.equals('NoFilter')) { if(categoryCondition=='' && selectedCategoryName != null){ categoryCondition=categoryCondition+categoryGroup.getName() + ':' + System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); }else { categoryCondition=categoryCondition + ',' +categoryGroup.getName() + ':' + System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); } } } Visualforce 検索コントローラのテスト 次に、Visualforce検索コントローラのコードサンプル (ページ 28)のテストクラスを示します。 @isTest private class VfSearchControllerTestClass { static testMethod void validateDataCategoryGroupInfo(){ DataCategoryGroupInfo[] dataCategoryGroupInfo = DataCategoryUtil.getInstance().getAllCategoryGroups(); VfSearchController vfSearchControllerObj = new VfSearchController(); System.assertEquals(vfSearchControllerObj.getDataCategoryGroupInfo().size(), dataCategoryGroupInfo.size()); } static testMethod void testClassVariables() { VfSearchController vfSearchControllerObj = new VfSearchController(); vfSearchControllerObj.refreshSearchResult(); System.assertEquals(vfSearchControllerObj.getCurrentPageNumber(),1.0); vfSearchControllerObj.next(); System.assertEquals(vfSearchControllerObj.getCurrentPageNumber(),1.0); vfSearchControllerObj.previous(); System.assertEquals(vfSearchControllerObj.getCurrentPageNumber(),1.0); System.assertEquals(vfSearchControllerObj.getPrevRequired(),false); System.assertEquals(vfSearchControllerObj.getNextRequired(),false); } static testMethod void validateCategoryKeyword() { VfSearchController vfSearchControllerObj = new VfSearchController(); DataCategoryGroupInfo[] categoryGroups = DataCategoryUtil.getInstance().getAllCategoryGroups(); String categoryCondition = ''; for (DataCategoryGroupInfo categoryGroup : categoryGroups) { ApexPages.currentPage().getParameters().put('categoryType_'+categoryGroup.getName(),'All'); if(categoryCondition==''){ categoryCondition=categoryCondition+categoryGroup.getName() + ':' + 31 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); }else { categoryCondition=categoryCondition + ',' +categoryGroup.getName() + ':' + System.currentPageReference().getParameters().Get('categoryType_'+categoryGroup.getName()); } } System.assertEquals(categoryCondition, vfSearchControllerObj.getCategoryKeyword()); } } Visualforce 検索のコードサンプル 太字の行については、コードサンプルの後に説明があります。 <apex:page controller="VfSearchController" sidebar="false" title="Knowledge Search"> <style> td{ vertical-align : top; text-align: left; } </style> <apex:form > <apex:panelGrid columns="2" > <apex:panelGroup > <apex:pageBlock > <apex:outputText value="Filter Your Results" /> <apex:pageBlockSection columns="1"> <apex:dataTable value="{!dataCategoryGroupInfo}" var="dataCategory" id="dataCategory"> <apex:column width="20%"> <apex:outputLabel for="categoryType_{!dataCategory.name}">{!dataCategory.name}</apex:outputLabel> <br /> <select id="categoryType_{!dataCategory.name}" name="categoryType_{!dataCategory.name}" onchange = "refreshSearchResult()" > <option value="NoFilter">No Filter</option> <option value="All">All</option> <knowledge:categoryList categoryVar="category" categoryGroup="{!dataCategory.name}" rootCategory="All" level="-1"> <option value="{!category.name}"> <apex:outputText escape="false" value="{!LPAD(' ',6*category.depth,' ')}" /> {!category.label} </option> </knowledge:categoryList> </select> </apex:column> </apex:dataTable> </apex:pageBlockSection> </apex:pageBlock> 32 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する </apex:panelGroup> <apex:panelGroup > <apex:pageBlock title="Search" > <apex:inputText value="{!searchstring}" id="theSearchstring" maxlength="100" size="110" onkeypress="if (event.keyCode == 13) {refreshSearchResult();return false;} "/> <apex:commandButton value="Go" id="submitButton" style="width:30" reRender="theSearchResults" /> </apex:pageBlock> <apex:messages /> <apex:panelGroup id="theSearchResults" > <apex:pageBlock title="Search Results" > <apex:panelGrid width="100%"> <table width="99%"> <tr> <th width="33%">Title</th> <th width="33%">Article Type</th> <th width="33%">Summary</th> </tr> </table> <knowledge:articleList articleVar="article" categories="{!categoryKeyword}" Keyword="{!searchstring}" pageNumber="{!currentPageNumber}" hasMoreVar="false" pageSize="10"> <table width="99%"> <tr> <td width="33%"> <apex:outputLink target="_blank" value="{!URLFOR($Action.KnowledgeArticle.View, article.id,['popup' = 'true'])}">{!article.title}</apex:outputLink> </td> <td width="33%"><apex:outputText >{!article.articleTypeLabel}</apex:outputText></td> <td width="33%"><apex:outputText >{!article.abstract}</apex:outputText></td> </tr> </table> </knowledge:articleList> </apex:panelGrid> </apex:pageBlock> <apex:panelGrid columns="2"> <apex:commandLink action="{!previous}" value="Previous" style="{!IF(prevRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> <apex:commandLink action="{!next}" value="Next" style="{!IF(nextRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> </apex:panelGrid> </apex:panelGroup> </apex:panelGroup> </apex:panelGrid> <apex:actionFunction action="{!refreshSearchResult}" name="refreshSearchResult" rerender="theSearchResults" > </apex:actionFunction> </apex:form> </apex:page> 33 Visualforce タグを使用した検索ページの作成 検索条件を [Visualforce Article Search (Visualforce 記事検 索)] ページに追加する 次のコードフラグメントでは、<apex:dataTable> タグで、(Visualforce検索コントローラのコードサンプルで 宣言した) getdataCategoryGroupInfo メソッドを使用して、各カテゴリグループを反復処理します。 <apex:dataTable value="{!dataCategoryGroupInfo}" var="dataCategory" id="dataCategory"> <apex:column width="20%"> <apex:outputLabel for="categoryType_{!dataCategory.name}">{!dataCategory.name}</apex:outputLabel> <br /> 次のコードフラグメントでは、<select> タグで、カテゴリ検索条件を作成します。onchange 属性とその refreshSearchResult 値で、ユーザが検索条件の選択内容を変更するたびに記事リストを更新します。 <select id="categoryType_{!dataCategory.name}" name="categoryType_{!dataCategory.name}" onchange = "refreshSearchResult()" > <option value="NoFilter">No Filter</option> <option value="All">All</option> 次のコードフラグメントでは、knowledge:categoryList タグで、カテゴリグループの [All (すべて)] の下に あるすべてのカテゴリのループを実行します。 <knowledge:categoryList categoryVar="category" categoryGroup="{!dataCategory.name}" rootCategory="All" level="-1"> <option value="{!category.name}"> <apex:outputText escape="false" value="{!LPAD(' ',6*category.depth,' ')}" /> {!category.label} </option> </knowledge:categoryList> </select> </apex:column> </apex:dataTable> 次のコードフラグメントでは、ページを更新する必要がある場合に (Visualforce 検索コントローラのコードサン プルの) refreshSearchResult メソッドをコールします。[Visualforce Article Search (Visualforce 記事検索)] ページ の [Search Results (検索結果)] セクションのみが更新されます。 <apex:actionFunction action="{!refreshSearchResult}" name="refreshSearchResult" rerender="theSearchResults" > これまでの作業を確認する [Visualforce Article Search (Visualforce 記事検索)] ページに、[結果を絞り込み] ボックスが表示されます。検索条件の 選択内容を変更すると、[Search Results (検索結果)] ボックスが更新されます。選択したカテゴリに一致する記事 のみが表示されます。 34 Visualforce タグを使用した検索ページの作成 [Last Updated Promotions (最後に更新されたプロモーショ ン)] ボックスを [Visualforce Article Search (Visualforce 記事 検索ページ)] に追加する [Last Updated Promotions (最後に更新されたプロモーション)] ボッ クスを [Visualforce Article Search (Visualforce 記事検索ページ)] に追 加する 最後に、[Last Updated Promotions (最後に更新されたプロモーション)] ボックスを追加します。 1. [Visualforce Article Search (Visualforce 記事検索)] タブの下部にあるフッターで、[ArticleList] をクリックして Visualforce 開発モードのページエディタを表示します。 2. Visualforce 開発モードのページエディタで既存のマークアップをすべて削除し、「Visualforce ボックスのコー ドサンプル」 (ページ 35)に表示されているマークアップに置き換えます。 3. [保存] ( ) をクリックします。 Visualforce ボックスのコードサンプル 太字の行については、コードサンプルの後に説明があります。 <apex:page controller="VfSearchController" sidebar="false" title="Knowledge Search"> <style> td{ vertical-align : top; 35 Visualforce タグを使用した検索ページの作成 [Last Updated Promotions (最後に更新されたプロモーショ ン)] ボックスを [Visualforce Article Search (Visualforce 記事 検索ページ)] に追加する text-align: left; } </style> <apex:form > <apex:panelGrid columns="2" > <apex:panelGroup > <apex:pageBlock > <apex:outputText value="Filter Your Results" /> <apex:pageBlockSection columns="1"> <apex:dataTable value="{!dataCategoryGroupInfo}" var="dataCategory" id="dataCategory"> <apex:column width="20%"> <apex:outputLabel for="categoryType_{!dataCategory.name}">{!dataCategory.name}</apex:outputLabel> <br /> <select id="categoryType_{!dataCategory.name}" name="categoryType_{!dataCategory.name}" onchange = "refreshSearchResult()" > <option value="NoFilter">No Filter</option> <option value="All">All</option> <knowledge:categoryList categoryVar="category" categoryGroup="{!dataCategory.name}" rootCategory="All" level="-1"> <option value="{!category.name}"> <apex:outputText escape="false" value="{!LPAD(' ',6*category.depth,' ')}" /> {!category.label} </option> </knowledge:categoryList> </select> </apex:column> </apex:dataTable> </apex:pageBlockSection> </apex:pageBlock> <apex:pageBlock > <apex:outputText value="Last Updated Promotions" /> <apex:pageBlockSection columns="1"> <knowledge:articleList articleVar="article" articleTypes="Promotion__kav" pageSize="10" > <li> <apex:outputLink target="_blank" value="{!URLFOR($Action.KnowledgeArticle.View, article.id, ['popup' = 'true'])}">{!article.title}</apex:outputLink> </li> </knowledge:articleList> </apex:pageBlockSection> </apex:pageBlock> </apex:panelGroup> <apex:panelGroup > <apex:pageBlock title="Search" > <apex:inputText value="{!searchstring}" id="theSearchstring" maxlength="100" size="110" onkeypress="if (event.keyCode == 13) {refreshSearchResult();return false;} "/> <apex:commandButton value="Go" id="submitButton" style="width:30" reRender="theSearchResults" /> </apex:pageBlock> <apex:messages /> <apex:panelGroup id="theSearchResults" > 36 Visualforce タグを使用した検索ページの作成 [Last Updated Promotions (最後に更新されたプロモーショ ン)] ボックスを [Visualforce Article Search (Visualforce 記事 検索ページ)] に追加する <apex:pageBlock title="Search Results" > <apex:panelGrid width="100%"> <table width="99%"> <tr> <th width="33%">Title</th> <th width="33%">Article Type</th> <th width="33%">Summary</th> </tr> </table> <knowledge:articleList articleVar="article" categories="{!categoryKeyword}" Keyword="{!searchstring}" pageNumber="{!currentPageNumber}" hasMoreVar="false" pageSize="10"> <table width="99%"> <tr> <td width="33%"> <apex:outputLink target="_blank" value="{!URLFOR($Action.KnowledgeArticle.View, article.id,['popup' = 'true'])}">{!article.title}</apex:outputLink> </td> <td width="33%"><apex:outputText >{!article.articleTypeLabel}</apex:outputText></td> <td width="33%"><apex:outputText >{!article.abstract}</apex:outputText></td> </tr> </table> </knowledge:articleList> </apex:panelGrid> </apex:pageBlock> <apex:panelGrid columns="2"> <apex:commandLink action="{!previous}" value="Previous" style="{!IF(prevRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> <apex:commandLink action="{!next}" value="Next" style="{!IF(nextRequired = true,'display:block','display:none')}" reRender="theSearchResults"/> </apex:panelGrid> </apex:panelGroup> </apex:panelGroup> </apex:panelGrid> <apex:actionFunction action="{!refreshSearchResult}" name="refreshSearchResult" rerender="theSearchResults" > </apex:actionFunction> </apex:form> </apex:page> 次のコードフラグメントでは、<knowledge:articleList> タグで、最後に公開された記事をデフォルトで 取得します。articleTypes 属性では、プロモーション記事のみを [Last Updated Promotions (最後に 更新されたプロモーション)] ボックスに表示するように指定します。 <apex:outputText value="Last Updated Promotions" /> <apex:pageBlockSection columns="1"> <knowledge:articleList articleVar="article" articleTypes="Promotion__kav" pageSize="10" > <li> <apex:outputLink target="_blank" value="{!URLFOR($Action.KnowledgeArticle.View, article.id, ['popup' = 'true'])}">{!article.title}</apex:outputLink> 37 Visualforce タグを使用した検索ページの作成 [Last Updated Promotions (最後に更新されたプロモーショ ン)] ボックスを [Visualforce Article Search (Visualforce 記事 検索ページ)] に追加する </li> </knowledge:articleList> これまでの作業を確認する [Visualforce Article Search (Visualforce 記事検索)] ページの左ペインに [Last Updated Promotions (最後に更新されたプロ モーション)] ボックスが表示されています。このボックスには、新しいプロモーションまたは最近更新された プロモーションが表示されます。 38 第4章 トピック: • • PublishingService ク ラス 記事のマスタバー ジョンをアーカイ ブする • 翻訳に関連するタ スクを割り当てる • マスタ記事に関連 するタスクを割り 当てる • 記事のマスタバー ジョンを削除する • 記事の翻訳バー ジョンを削除する • マスタ記事のオン ラインバージョン を編集する • 記事のマスタバー ジョンを公開する • 記事のアーカイブ バージョンを復元 する • 記事のメタデータ を取得する • 記事のバージョン を取得する • マスタバージョン のメタデータ要素 を検索する • 翻訳バージョンの メタデータ要素を 検索する • 翻訳記事のバー ジョンを完了に設 定する • 翻訳記事のバー ジョンを未完了に 設定する Apex および REST API を使用した記事の 管理 Apex または REST API を使用した記事の管理 このセクションでは、記事や記事翻訳で実行可能な多くの主要なアクション (下記参 照) にプログラムでアクセスできるようにする API について説明します。 • 公開 • 更新 • 取得 • 削除 • 翻訳の申請 • 翻訳を完了または未完了の状況に設定 この章の最初のトピックでは、Apex ナレッジ管理公開サービスクラスについて説明 します。その後のトピックでは、REST API を使用して実行できる公開アクションにつ いて説明します。 Apex を使用して記事を管理する方法についての詳細は、『Force.com Apex コード開発 者ガイド』を参照してください。REST を使用して記事を管理する方法についての詳 細は、『Force.com REST API 開発者ガイド』を参照してください。 39 Apex および REST API を使用した記事の管理 • 記事の翻訳を申請 する • 記事のマスタバー ジョンを非公開に する • 翻訳記事のオンラ インバージョンを 非公開にする • Salesforce Object Query Language を 使用して参照統計 を更新する • Salesforce Object Search Language を 使用して検索キー ワードを追跡する • Salesforce Object Search Language を 使用して記事の参 照統計を更新する 40 Apex および REST API を使用した記事の管理 PublishingService クラス PublishingService クラス KbManagement.PublishingService クラスのメソッドを使用して、記事とその翻訳のライフサイクルを管 理します。 名前空間 KbManagement 使用方法 記事とその翻訳のライフサイクルで次の部分を管理するには、KbManagement.PublishingService クラス のメソッドを使用します。 • 公開 • 更新 • 取得 • 削除 • 翻訳の申請 • 翻訳を完了または未完了の状況に設定 • アーカイブ • ドラフト記事または翻訳のレビュータスクの割り当て メモ: 日付値は、GMT に基づきます。 このクラスのメソッドを使用するには、Salesforce ナレッジを有効にする必要があります。Salesforce ナレッジの 設定についての詳細は、『Salesforce Knowledge Implementation Guide』を参照してください。 このセクションの内容: PublishingService メソッド PublishingService メソッド PublishingService のメソッドは次のとおりです。すべてのメソッドが静的です。 このセクションの内容: archiveOnlineArticle(String, Datetime) 記事のオンラインバージョンをアーカイブします。指定された scheduledDate が null の場合、記事は即時に アーカイブされます。それ以外の場合、記事は予定日にアーカイブされます。 assignDraftArticleTask(String, String, String, Datetime, Boolean) ドラフト記事に関連するレビュータスクを割り当てます。 41 Apex および REST API を使用した記事の管理 PublishingService メソッド assignDraftTranslationTask(String, String, String, Datetime, Boolean) ドラフト翻訳に関連するレビュータスクを割り当てます。 cancelScheduledArchivingOfArticle(String) スケジュールされたオンライン記事のアーカイブをキャンセルします。 cancelScheduledPublicationOfArticle(String) スケジュールされたドラフト記事の公開をキャンセルします。 completeTranslation(String) 翻訳を完了状態 (公開準備完了) にします。 deleteArchivedArticle(String) アーカイブされた記事を削除します。 deleteArchivedArticleVersion(String, Integer) アーカイブされた記事の特定のバージョンを削除します。 deleteDraftArticle(String) ドラフト記事を削除します。 deleteDraftTranslation(String) ドラフト翻訳を削除します。 editArchivedArticle(String) アーカイブされたマスタバージョンからドラフト記事を作成し、記事の新しいドラフトマスタバージョン ID を返します。 editOnlineArticle(String, Boolean) オンラインバージョンからドラフト記事を作成し、記事の新しいドラフトマスタバージョン ID を返しま す。さらに、unpublish が true に設定されている場合は、オンライン記事の公開を解除します。 editPublishedTranslation(String, String, Boolean) 特定の言語のオンライン翻訳のドラフトバージョンを作成し、記事の新しいドラフトマスタバージョン ID を返します。さらに、true に設定されている場合は、記事の公開を解除します。 publishArticle(String, Boolean) 記事を公開します。flagAsNew が true に設定されている場合は、記事をメジャーバージョンとして公開 します。 restoreOldVersion(String, Integer) 既存のオンライン記事の指定されたアーカイブバージョンに基づいて、その記事からドラフト記事を作成 し、記事のバージョン ID を返します。 scheduleForPublication(String, Datetime) メジャーバージョンとして記事の公開をスケジュールします。指定された日付が null の場合、記事は即時 に公開されます。 setTranslationToIncomplete(String) 公開準備完了のドラフト翻訳を「処理中」状況に戻します。 submitForTranslation(String, String, String, Datetime) 指定された言語への記事の翻訳を申請します。さらに、指定されたユーザと期日も申請に割り当て、ドラ フト翻訳の新しい ID を返します。 42 Apex および REST API を使用した記事の管理 PublishingService メソッド archiveOnlineArticle(String, Datetime) 記事のオンラインバージョンをアーカイブします。指定された scheduledDate が null の場合、記事は即時にアー カイブされます。それ以外の場合、記事は予定日にアーカイブされます。 署名 public static Void archiveOnlineArticle(String articleId, Datetime scheduledDate) パラメータ articleId 型: String scheduledDate 型: Datetime 戻り値 型: Void 例 String articleId = 'Insert article ID'; Datetime scheduledDate = Datetime.newInstanceGmt(2012, 12,1,13,30,0); KbManagement.PublishingService.archiveOnlineArticle(articleId, scheduledDate); assignDraftArticleTask(String, String, String, Datetime, Boolean) ドラフト記事に関連するレビュータスクを割り当てます。 署名 public static Void assignDraftArticleTask(String articleId, String assigneeID, String instructions, Datetime dueDate, Boolean sendEmailNotification) パラメータ articleId 型: String assigneeID 型: String instructions 型: String dueDate 型: Datetime 43 Apex および REST API を使用した記事の管理 PublishingService メソッド sendEmailNotification 型: Boolean 戻り値 型: Void 例 String articleId = 'Insert article ID'; String assigneeId = ''; String instructions = 'Please review this draft.'; Datetime dueDate = Datetime.newInstanceGmt(2012, 12,1); KbManagement.PublishingService.assignDraftArticleTask(articleId, assigneeId, instructions, dueDate, true); assignDraftTranslationTask(String, String, String, Datetime, Boolean) ドラフト翻訳に関連するレビュータスクを割り当てます。 署名 public static Void assignDraftTranslationTask(String articleVersionId, String assigneeID, String instructions, Datetime dueDate, Boolean sendEmailNotification) パラメータ articleVersionId 型: String assigneeID 型: String instructions 型: String dueDate 型: Datetime sendEmailNotification 型: Boolean 戻り値 型: Void 例 String articleId = 'Insert article ID'; String assigneeId = 'Insert assignee ID'; 44 Apex および REST API を使用した記事の管理 PublishingService メソッド String instructions = 'Please review this draft.'; Datetime dueDate = Datetime.newInstanceGmt(2012, 12,1); KbManagement.PublishingService.assignDraftTranslationTask(articleId, assigneeId, instructions, dueDate, true); cancelScheduledArchivingOfArticle(String) スケジュールされたオンライン記事のアーカイブをキャンセルします。 署名 public static Void cancelScheduledArchivingOfArticle(String articleId) パラメータ articleId 型: String 戻り値 型: Void 例 String articleId = 'Insert article ID'; KbManagement.PublishingService.cancelScheduledArchivingOfArticle (articleId); cancelScheduledPublicationOfArticle(String) スケジュールされたドラフト記事の公開をキャンセルします。 署名 public static Void cancelScheduledPublicationOfArticle(String articleId) パラメータ articleId 型: String 戻り値 型: Void 45 Apex および REST API を使用した記事の管理 PublishingService メソッド 例 String articleId = 'Insert article ID'; KbManagement.PublishingService.cancelScheduledPublicationOfArticle (articleId); completeTranslation(String) 翻訳を完了状態 (公開準備完了) にします。 署名 public static Void completeTranslation(String articleVersionId) パラメータ articleVersionId 型: String 戻り値 型: Void 例 String articleVersionId = 'Insert article ID'; KbManagement.PublishingService.completeTranslation(articleVersionId); deleteArchivedArticle(String) アーカイブされた記事を削除します。 署名 public static Void deleteArchivedArticle(String articleId) パラメータ articleId 型: String 戻り値 型: Void 46 Apex および REST API を使用した記事の管理 PublishingService メソッド 例 String articleId = 'Insert article ID'; KbManagement.PublishingService.deleteArchivedArticle(articleId); deleteArchivedArticleVersion(String, Integer) アーカイブされた記事の特定のバージョンを削除します。 署名 public static Void deleteArchivedArticleVersion(String articleId, Integer versionNumber) パラメータ articleId 型: String versionNumber 型: Integer 戻り値 型: Void 例 String articleId = 'Insert article ID'; Integer versionNumber = 1; KbManagement.PublishingService.deleteArchivedArticleVersion(articleId, versionNumber); deleteDraftArticle(String) ドラフト記事を削除します。 署名 public static Void deleteDraftArticle(String articleId) パラメータ articleId 型: String 戻り値 型: Void 47 Apex および REST API を使用した記事の管理 PublishingService メソッド 例 String articleId = 'Insert article ID'; KbManagement.PublishingService.deleteDraftArticle(articleId); deleteDraftTranslation(String) ドラフト翻訳を削除します。 署名 public static Void deleteDraftTranslation(String articleVersionId) パラメータ articleVersionId 型: String 戻り値 型: Void 例 String articleVersionId = 'Insert article ID'; KbManagement.PublishingService.deleteDraftTranslation (articleVersionId); editArchivedArticle(String) アーカイブされたマスタバージョンからドラフト記事を作成し、記事の新しいドラフトマスタバージョン ID を返します。 署名 public static String editArchivedArticle(String articleId) パラメータ articleId 型: String 戻り値 型: String 48 Apex および REST API を使用した記事の管理 PublishingService メソッド 例 String articleId = 'Insert article ID'; String id = KbManagement.PublishingService.editArchivedArticle(articleId); editOnlineArticle(String, Boolean) オンラインバージョンからドラフト記事を作成し、記事の新しいドラフトマスタバージョン ID を返します。 さらに、unpublish が true に設定されている場合は、オンライン記事の公開を解除します。 署名 public static String editOnlineArticle(String articleId, Boolean unpublish) パラメータ articleId 型: String unpublish 型: Boolean 戻り値 型: String 例 String articleId = 'Insert article ID'; String id = KbManagement.PublishingService.editOnlineArticle (articleId, true); editPublishedTranslation(String, String, Boolean) 特定の言語のオンライン翻訳のドラフトバージョンを作成し、記事の新しいドラフトマスタバージョン ID を 返します。さらに、true に設定されている場合は、記事の公開を解除します。 署名 public static String editPublishedTranslation(String articleId, String language, Boolean unpublish) パラメータ articleId 型: String language 型: String 49 Apex および REST API を使用した記事の管理 PublishingService メソッド unpublish 型: Boolean 戻り値 型: String 例 String articleId = 'Insert article ID'; String language = 'fr'; String id = KbManagement.PublishingService.editPublishedTranslation(articleId, language, true); publishArticle(String, Boolean) 記事を公開します。flagAsNew が true に設定されている場合は、記事をメジャーバージョンとして公開し ます。 署名 public static Void publishArticle(String articleId, Boolean flagAsNew) パラメータ articleId 型: String flagAsNew 型: Boolean 戻り値 型: Void 例 String articleId = 'Insert article ID'; KbManagement.PublishingService.publishArticle(articleId, true); restoreOldVersion(String, Integer) 既存のオンライン記事の指定されたアーカイブバージョンに基づいて、その記事からドラフト記事を作成し、 記事のバージョン ID を返します。 署名 public static String restoreOldVersion(String articleId, Integer versionNumber) 50 Apex および REST API を使用した記事の管理 PublishingService メソッド パラメータ articleId 型: String versionNumber 型: Integer 戻り値 型: String 例 String articleId = 'Insert article ID'; String id = KbManagement.PublishingService.restoreOldVersion (articleId, 1); scheduleForPublication(String, Datetime) メジャーバージョンとして記事の公開をスケジュールします。指定された日付が null の場合、記事は即時に公 開されます。 署名 public static Void scheduleForPublication(String articleId, Datetime scheduledDate) パラメータ articleId 型: String scheduledDate 型: Datetime 戻り値 型: Void 例 String articleId = 'Insert article ID'; Datetime scheduledDate = Datetime.newInstanceGmt(2012, 12,1,13,30,0); KbManagement.PublishingService.scheduleForPublication(articleId, scheduledDate); setTranslationToIncomplete(String) 公開準備完了のドラフト翻訳を「処理中」状況に戻します。 51 Apex および REST API を使用した記事の管理 PublishingService メソッド 署名 public static Void setTranslationToIncomplete(String articleVersionId) パラメータ articleVersionId 型: String 戻り値 型: Void 例 String articleVersionId = 'Insert article ID'; KbManagement.PublishingService.setTranslationToIncomplete(articleVersionId); submitForTranslation(String, String, String, Datetime) 指定された言語への記事の翻訳を申請します。さらに、指定されたユーザと期日も申請に割り当て、ドラフト 翻訳の新しい ID を返します。 署名 public static String submitForTranslation(String articleId, String language, String assigneeID, Datetime dueDate) パラメータ articleId 型: String language 型: String assigneeID 型: String dueDate 型: Datetime 戻り値 型: String 例 String articleId = 'Insert article ID'; String language = 'fr'; 52 Apex および REST API を使用した記事の管理 記事のマスタバージョンをアーカイブする String assigneeId = 'Insert assignee ID'; Datetime dueDate = Datetime.newInstanceGmt(2012, 12,1); String id = KbManagement.PublishingService.submitForTranslation(articleId, language, assigneeId, dueDate); 記事のマスタバージョンをアーカイブする 記事のマスタバージョンをアーカイブします。各アクションは、リソースで要求する項目変更によって定義さ れます。マスタバージョンをアーカイブするには、"publishStatus":"Archived" を使用します。アーカ イブの日付をスケジュールするには、"archiveScheduleDate" : <date> を使用します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions/<versionID> 形式 JSON、XML HTTP メソッド PATCH 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 publishStatus 記事の公開の状況。archived を使用します。 archiveScheduleDate 記事をアーカイブする日付。 リクエストボディの例 アーカイブ: { "publishStatus":"Archived" } アーカイブのスケジュール (GMT 日付形式を使用): { "archiveScheduleDate" : "2012-04-19T07:00:00.000+0000" } レスポンスボディの例 既存のレコードが更新される場合、HTTP 状況コード 204 が返されます。 53 Apex および REST API を使用した記事の管理 翻訳に関連するタスクを割り当てる 翻訳に関連するタスクを割り当てる 期日や説明を含む、翻訳記事のタスクをユーザに割り当てます。各アクションは、リソースで要求する項目変 更によって定義されます。 URI /services/data/v25.0/knowledgeManagement/articleVersions/translations/<translationVersionId> 形式 JSON、XML HTTP メソッド PATCH 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 assigneeId マスタ記事をユーザ ID に割り当てます。 dueDate タスクの期日。 instruction タスクに関する説明。 リクエストボディの例 { "assigneeId":"05Dxx0000dsads" "dueDate":"2012-04-19T07:00:00.000+0000" "instruction":"Please review." } レスポンスボディの例 既存のレコードが更新される場合、HTTP 状況コード 204 が返されます。 マスタ記事に関連するタスクを割り当てる 期日や説明を含む、マスタ記事のタスクをユーザに割り当てます。各アクションは、リソースで要求する項目 変更によって定義されます。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions/<versionID> 形式 JSON、XML HTTP メソッド PATCH 54 Apex および REST API を使用した記事の管理 記事のマスタバージョンを削除する 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 assigneeId マスタ記事をユーザ ID に割り当てます。 dueDate タスクの期日。 instruction タスクに関する説明。 リクエストボディの例 { "assigneeId":"05Dxx0000dsads" "dueDate":"2012-04-19T07:00:00.000+0000" "instruction":"Please review." } レスポンスボディの例 既存のレコードが更新される場合、HTTP 状況コード 204 が返されます。 記事のマスタバージョンを削除する 記事のマスタバージョンを削除します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions/<versionID> 形式 JSON、XML HTTP メソッド DELETE 認証 Authorization: OAuth accesstoken パラメータ なし リクエストボディの例 不要 レスポンスボディの例 既存のレコードが削除される場合、HTTP 状況コード 204 が返されます。 55 Apex および REST API を使用した記事の管理 記事の翻訳バージョンを削除する 記事の翻訳バージョンを削除する 記事の翻訳バージョンを削除します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/translations/<versionID> 形式 JSON、XML HTTP メソッド DELETE 認証 Authorization: OAuth accesstoken パラメータ なし リクエストボディの例 不要 レスポンスボディの例 既存のレコードが削除される場合、HTTP 状況コード 204 が返されます。 マスタ記事のオンラインバージョンを編集する マスタ記事のオンラインバージョンのドラフトコピーを作成します。この操作でオンラインバージョンが非公 開になることはありません。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions 形式 JSON、XML HTTP メソッド POST 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 articleId 記事の ID。 56 Apex および REST API を使用した記事の管理 記事のマスタバージョンを公開する リクエストボディの例 { "articleId":<articleID> } 記事のマスタバージョンを公開する 記事のマスタバージョンを公開します。公開の各アクションは、リソースで要求する項目変更によって定義さ れます。マイナーバージョンを公開するには、"publishStatus":"Online" を使用します。メジャーバー ジョンを公開するには、"publishStatus":"Online" および "versionNumber":"NextVersion" を使用 します。公開日をスケジュールするには、"publishScheduleDate" : <date> を使用します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions/<versionId> 形式 JSON、XML HTTP メソッド PATCH 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 publishStatus 記事の公開の状況。online を使用します。 versionNumber 記事のバージョン。 publishScheduleDate 記事を公開する日付。 リクエストボディの例 マイナーバージョンの公開: { "publishStatus":"Online" } メジャーバージョンの公開: { "publishStatus":"Online" "versionNumber":"NextVersion" } 57 Apex および REST API を使用した記事の管理 記事のアーカイブバージョンを復元する 公開のスケジュール (GMT 日付形式を使用): { "publishScheduleDate" : "2012-05-19T07:00:00.000+0000" } レスポンスボディの例 既存のレコードが更新される場合、HTTP 状況コード 204 が返されます。 記事のアーカイブバージョンを復元する 記事のアーカイブバージョンを復元します。versionNumber を指定しないと、アーカイブ済み記事の最新バー ジョンが復元されます。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions/ 形式 JSON、XML HTTP メソッド POST 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 articleId 記事の ID。 versionNumber 記事のバージョン。この項目を指定しないと、アーカイブ済み記事の 最新バージョンが復元されます。 リクエストボディの例 { "articleId":<articleID> ("versionNumber":<number>) } 記事のメタデータを取得する 記事のメタデータを取得します。 URI /services/data/v25.0/knowledgeManagement/articles/<articleId> 58 Apex および REST API を使用した記事の管理 記事のバージョンを取得する 形式 JSON、XML HTTP メソッド GET 認証 Authorization: OAuth accesstoken パラメータ なし リクエストボディの例 不要 記事のバージョンを取得する 記事のバージョン ID を取得します。 URI /services/data/v25.0/knowledgeManagement/articleversions/masterVersions/<articleVersionId> 形式 JSON、XML HTTP メソッド GET 認証 Authorization: OAuth accesstoken パラメータ なし リクエストボディの例 不要 マスタバージョンのメタデータ要素を検索する 記事のオンラインマスタバージョンのメタデータ要素を検索します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions? filterArticleId=value1&FilterPublishStatus=value2 形式 JSON、XML HTTP メソッド GET 59 Apex および REST API を使用した記事の管理 翻訳バージョンのメタデータ要素を検索する 認証 Authorization: OAuth accesstoken 例 次の例では、マスタ記事「kA0x50000000jsh」のオンラインバージョンを検索します。 /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions? filterArticleId=kA0x50000000jsh&filterPublishStatus=online" 翻訳バージョンのメタデータ要素を検索する 記事の翻訳バージョンのメタデータ要素を検索します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/translations?filterArticleId=value1& filterLanguage=value2&FilterPublishStatus=value3"; 形式 JSON、XML HTTP メソッド GET 認証 Authorization: OAuth accesstoken 例 次の例では、記事「kA0x50000000jsh」のドイツ語のオンライン翻訳を検索します。 /services/data/v25.0/knowledgeManagement/articleVersions/translations?filterArticleId=kA0x50000000jsh& filterLanguage=de&filterPublishStatus=online" 翻訳記事のバージョンを完了に設定する 翻訳記事のバージョンを完了に設定します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/translations/<translationVersionID> 形式 JSON、XML HTTP メソッド PATCH 認証 Authorization: OAuth accesstoken 60 Apex および REST API を使用した記事の管理 翻訳記事のバージョンを未完了に設定する パラメータ パラメータ 説明 complete 完了している翻訳に対して、この値を true に設定します。 リクエストボディの例 { "complete":"true" } レスポンスボディの例 既存のレコードが更新される場合、HTTP 状況コード 204 が返されます。 翻訳記事のバージョンを未完了に設定する 翻訳記事のバージョンを未完了に設定します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/translations/<translationVersionID> 形式 JSON、XML HTTP メソッド PATCH 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 complete 翻訳を未完了に設定するには、この値を false に設定します。 リクエストボディの例 { "complete":"false" } レスポンスボディの例 既存のレコードが更新される場合、HTTP 状況コード 204 が返されます。 61 Apex および REST API を使用した記事の管理 記事の翻訳を申請する 記事の翻訳を申請する 記事の翻訳を申請して、オンラインバージョンを保持します。指定した言語の翻訳がすでに存在する場合は、 コピーするか、新しいドラフト翻訳を作成します。公開の各アクションは、リソースで要求する項目変更に よって定義されます。 URI /services/data/v25.0/knowledgeManagement/articleVersions/translations 形式 JSON、XML HTTP メソッド POST 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 articleID 記事 ID。 language 言語の ISO コード。 リクエストボディの例 { "articleId":<articleID> "language":"fr" } 記事のマスタバージョンを非公開にする 既存のドラフト記事がない場合、記事のオンラインマスタバージョンを非公開にします。公開の各アクション は、リソースで要求する項目変更によって定義されます。マスタバージョンを非公開にするに は、"publishStatus":"draft" を使用します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/masterVersions/<versionId> 形式 JSON、XML HTTP メソッド PATCH 認証 Authorization: OAuth accesstoken 62 Apex および REST API を使用した記事の管理 翻訳記事のオンラインバージョンを非公開にする パラメータ パラメータ 説明 publishStatus 記事の公開の状況。draft を使用します。 リクエストボディの例 { "publishStatus":"draft" } レスポンスボディの例 既存のレコードが更新される場合、HTTP 状況コード 204 が返されます。 翻訳記事のオンラインバージョンを非公開にする 翻訳記事のオンラインバージョンを非公開にします。公開の各アクションは、リソースで要求する項目変更に よって定義されます。オンライン状態から翻訳を編集および削除するには、"publishStatus":"draft" を 使用します。 URI /services/data/v25.0/knowledgeManagement/articleVersions/translations/<translationVersionID> 形式 JSON、XML HTTP メソッド PATCH 認証 Authorization: OAuth accesstoken パラメータ パラメータ 説明 publishStatus 記事の公開の状況。draft を使用します。 リクエストボディの例 { "publishStatus":"draft" } 63 Apex および REST API を使用した記事の管理 Salesforce Object Query Language を使用して参照統計を 更新する Salesforce Object Query Language を使用して参照統計を更新する UPDATE VIEWSTAT 句は、Salesforce ナレッジの記事の検索および参照についてレポートするために SELECT ス テートメントで使用します。開発者は、記事の参照統計を更新できます。 次の構文を使用して、オンラインでアクセスできるすべての記事の参照カウントを増加できます。 SELECT Title FROM FAQ__kav WHERE PublishStatus='online' and Language = 'en_US' and KnowledgeArticleVersion = 'ka230000000PCiy' UPDATE VIEWSTAT Salesforce Object Search Language を使用して検索キーワードを追 跡する UPDATE TRACKING 句は、Salesforce ナレッジの記事の検索および参照についてレポートするために使用しま す。開発者は、Salesforce ナレッジの記事の検索で使用するキーワードを追跡できます。また、言語属性を使用 して、特定の言語 (ロケール) で検索することもできます。ただし、1 つのクエリで指定できるのは 1 つの言語 のみです。目的の言語ごとに、個別のクエリを行います。ロケールを指定するには、アンダースコアを使用す る Java 形式 (fr_FR、jp_JP など) を使用します。サポートされているロケールのリストを取得するには、Web で 「java ロケールコード」を検索してください。 次の構文を使用して、Salesforce ナレッジの記事の検索で使用するキーワードを追跡できます。 FIND {Keyword} RETURNING KnowledgeArticleVersion (Title WHERE PublishStatus="Online" and language="en_US") UPDATE TRACKING Salesforce Object Search Language を使用して記事の参照統計を更 新する UPDATE VIEWSTAT 句 (省略可能) は、Salesforce ナレッジの記事の検索および参照についてレポートするために 使用します。開発者は、記事の参照統計を更新できます。また、言語属性を使用して、特定の言語 (ロケール) で検索することもできます。ただし、1 つのクエリで指定できるのは 1 つの言語のみです。目的の言語ごとに、 個別のクエリを行います。ロケールを指定するには、アンダースコアを使用する Java 形式 (fr_FR、jp_JP など) を 使用します。サポートされているロケールのリストを取得するには、Web で「java ロケールコード」を検索し てください。 次の構文を使用して、オンラインで英語でアクセスできるすべての記事の参照カウントを増加できます。 FIND {Title} RETURNING FAQ__kav (Title WHERE PublishStatus="Online" and language="en_US" and KnowledgeArticleVersion = 'ka230000000PCiy') UPDATE VIEWSTAT 64
© Copyright 2024 ExpyDoc