メインコンテンツへスキップ
見出し画像

左メニューもテーブルでできている(sys_app_module)


    ServiceNow にログインすると、まず目に入るのが画面左の アプリケーションナビゲーター(左メニュー、Next Experience では「All」から開くメニュー)です。「Incident」「Configuration」といった見出しがあり、その下に「Create Incident」「All Incidents」といった項目がぶら下がっています。この見慣れたメニューが、実はテーブルのデータから組み立てられていることはあまり知られていません。

    この記事は、ServiceNow を毎日触っているが、左メニューがどんなテーブルでどんな形で定義されているのかを確認したい管理者・開発者を想定しています。PDI(Zurich / OOTB)で実際にテーブルを開き、メニューが「見出し(sys_app_application)+項目(sys_app_module)」の親子で出来ていることを確認します。あわせて1項目の挙動を決める link_type、並び順の order、誰に見えるかを決める roles も見ます。

    この記事で分かること

    • 左メニューは見出し=sys_app_application(Application menu)と項目=sys_app_module(Module)の親子で出来ていること

    • 親子は sys_app_module の application(→ sys_app_application 参照)でつながること

    • 1項目の挙動は link_type で決まること(List of Records / New Record / Single Record / URL / Separator など)。PDI 実機では2705件中1637件(約61%)が List of Records だったこと

    • roles が空なら全員に見え、ロールを指定するとその保有者だけに見えること(見出し単位・項目単位の両方で効く)

    • 見出し「Incident」は roles=itil、「Self-Service」は roles 空、という実例

    この記事の内容は ServiceNow の PDI(Personal Developer Instance)Zurich(ズーリッヒ)リリースの OOTB(初期設定)で確認した個人メモです。本番環境やカスタマイズ済み環境では、フィールド・選択肢・件数が異なる場合があります。


    左メニューは「見出し」と「項目」の親子

    アプリケーションナビゲーターは、2つのテーブルの親子関係で出来ています。

    • 見出し … sys_app_application(label=Application menu)。Incident・Configuration といった太字の見出しにあたります。PDI 実機では203件ありました。

    • 項目 … sys_app_module(label=Module)。見出しの下にぶら下がる Create Incident・All Incidents などのクリックできる行です。PDI 実機では2705件ありました。

    この2つは、sys_app_module の application フィールド(Reference → sys_app_application)でつながっています。つまり「この項目はどの見出しに属するか」を application が指しています。


    画像

    下の実画面は、項目(sys_app_module)を1件開いたフォームです。Title(Incidents Assigned to Me)、Application menu(Incident)、Order(200)が並びます。Visibility タブには Roles(itil)が見えます。link_type は「Link Type」タブで設定します。「どの見出しの・どんな挙動の・誰に見える項目か」が1レコードで決まることが分かります。


    画像

    項目(sys_app_module)の主なフィールド

    項目1件の挙動を決めるのは、次のフィールドです。


    画像
    • application … 親の見出し。

    • link_type … クリックしたときの挙動(後述)。

    • name … 対象テーブル(例: incident)。

    • order … 見出し内の並び順。小さいほど上に出ます。

    • roles … この項目を見られるロール。

    • filter … 一覧(List of Records)の絞り込み条件。「Open Incidents」のような既定フィルタはここで定義します。

    なお、タスクでよく混同される query(Arguments) は、URL や Script など一部の link_type に渡す引数で、一覧の絞り込み(filter)とは別物です。


    link_type:クリックしたときの挙動が変わる

    同じ「項目」でも、link_type によって挙動はまったく変わります。


    画像
    • List of Records(LIST) … name のテーブルの一覧を開く。最も一般的。

    • New Record(NEW) … 新規作成フォームを開く。

    • Single Record(DETAIL) … 特定の1レコードを開く(例: My Profile)。

    • URL (from Arguments:)(DIRECT) … query に書いた URL へ遷移。

    • Separator(SEPARATOR) … クリックできない区切り線。

    PDI 実機で link_type を集計すると、分布は次の通りでした。


    画像


    画像

    2705件中1637件(約61%)が List of Records でした。左メニューの正体は「ほとんどが、どこかのテーブルの一覧を開くショートカット」だと言えます。区切り線(Separator)が354件もあるのは、メニューを見やすくグループ分けするためです。


    roles:誰にどの項目が見えるか

    ナビゲーターは「全員に同じメニューが見える」わけではありません。roles が表示を絞っています。


    画像

    ルールはシンプルです。roles が空なら制限なし(ログインユーザー全員に見える)、ロールを指定すると、そのいずれかを持つ人だけに見える。これは見出し(application)にも項目(module)にも効きます。

    PDI 実機で見比べると分かりやすい例がありました。

    • 見出し Self-Service は roles が空。だから全ユーザーに見えます。ただしその配下の My Approvals という項目だけは roles=approver_user。承認者ロールを持つ人にしか出ません。見出しは全員でも、項目単位でさらに絞れるわけです。

    • 見出し Incident は roles=itil。itil ロールがないユーザーには、この見出しごと左メニューに現れません。


    画像

    「ロールを付けたのにメニューが出ない/消えない」という場面では、見出しと項目の両方の roles を確認するのが近道です。ロールそのものの仕組みは ユーザー・グループ・ロール(sys_user_has_role) で詳しく確認できます。


    実例:Incident メニューの中身

    最後に、見出し「Incident」(roles=itil)配下のモジュールを実機で並べてみます。


    画像


    画像
    • Create Incident は URL (from Arguments:) で新規起票画面へ。

    • Incidents Assigned to Me / Open Incidents / All Incidents はすべて List of Records。同じ incident テーブルを filter 違いで見せている。

    • 6件すべて roles=itil。

    つまり「Incident」という1つの見出しは、同じ incident テーブルへの入口を、用途別に order で並べたものだと分かります。203件の見出しと2705件の項目すべてが、この同じ仕組みで出来ています。フォーム下部に出る関連リストの仕組みは 関連リストは一覧の列とは別テーブル(sys_ui_related_list) で確認できます。


    実機で確認するときに見るべきURL

    最後に、今回見た画面を自分のインスタンスで開くためのURLをまとめます(<YourInstance> は置き換えてください)。

    # 見出し(Application menu)の一覧
    https://<YourInstance>/sys_app_application_list.do?sysparm_query=ORDERBYorder
    
    # 項目(Module)を link_type でグループ化
    https://<YourInstance>/sys_app_module_list.do?sysparm_query=GROUPBYlink_type
    
    # sys_app_module のフィールド定義
    https://<YourInstance>/sys_dictionary_list.do?sysparm_query=name=sys_app_module^elementISNOTEMPTY

    公式の説明は ServiceNow ドキュメントの Application navigator(Zurich) にもあります。


    まとめ

    • 左メニューは 見出し(sys_app_application・203件)+項目(sys_app_module・2705件) の親子で出来ている。

    • 親子は sys_app_module の application 参照でつながり、項目の name が対象テーブルを指す。

    • 1項目の挙動は link_type で決まり、約61%が List of Records(一覧を開くショートカット)。

    • order で並び順、roles で表示権限が決まる。roles 空=全員、指定=該当ロールのみ。見出し・項目の両方で効く。

    • 「メニューが出ない」は、見出しと項目の roles を両方見れば原因にたどり着ける。

    左メニューの仕組みが分かると、アプリとスコープ(sys_app / sys_scope)・ユーザー・グループ・ロール・関連リストは一覧の列とは別テーブル(sys_ui_related_list)・権限を決める ACL という「アプリ・権限・画面」のつながりが、ひとつの地図として見えてきます。


    関連記事

     
     
    ServiceNowのPDI(Personal Developer Instance)を実機で観察して、Noteに記事を書いています 実装・運用・教育の現場視点で淡々と記録中です リクエストがあればその記事も書きます 個人の観察日記です

    あなたへのおすすめ