SharePoint のリストでカスケード分類を実現!続

さて、前回から引き続き、SharePoint のリストでカスケードを実現する方法です。挙動は前回ご説明していますので、早速、実装方法をご紹介したと思います。

まず、分類マスタになるカスタムリストを作成して情報を入力しておきます。
エクセルから貼りつけると楽でいいと思います。
リストの位置は、どこにあっても構いませんが、ユーザが自身でメンテナンスできるように、権限と動線を用意しておくことをお勧めします。

ポイントとして、ビューは必ず「親の昇順→子の昇順」でソートしておきます。
このマスタリストのGUIDと、ビューのGUIDを取得しておいて下さい。

次に、本体になる(カスケードを利用したい)リストを作成します。
このリストに、列を2つ追加します。
ここでは「parent」「child」とします。

列形式は、どちらも「一行テキスト」です。
「選択肢」ではないことに注意して下さい。

新規作成すると、このようになります。
当然、parent にも child にも値は入っていません。

parent と child コントロール(input)の「name」「id」「title」属性を取得しておきます。
いずれも画面のソースから確認できます。

URL を /NewForm.aspx?toolpaneview=2 に書換え、強制的に編集モードにします。
コンテンツエディタWebパーツを追加し、[ソース]に以下のスクリプトを記入します。
SharePointMANIACS_cascadingDropDown.txt

冒頭の変数部分を、先程取得しておいた値に変更して下さい。

新規アイテムを作成すると、スクリプトが id 値から input を特定し、それを onchange イベントが設定された <select> に書換えます。
その上で、マスタリストを GetListItem で走査して選択肢を取得して option として追加します。
ただし、この時、同じ値が連続した場合、重複とみなして無視します。
親が選択されると、その onchange イベントで、親を条件として GetListItem を行い、同様に子 option を追加します。

この手法のミソはいくつかあります。

まずなにより ie の謎仕様。
スクリプトの setAttribute が上手く機能しません。
Javascript に明るい方には既知の問題だと思いますが、私はかなり此処でハマりました。
結局、onChange 属性を設定するために、一旦親ノードに移動→配下のHTMLタグを全て書換え、という無理矢理な方法を使っています。

ちなみに、Javascript は id でノードを特定するのが安定しますが、一方で、どうも SharePoint は保存時に name を内部利用しているようです。正しい name 属性が指定されていないと、値が保存されません。これも注意点。

また、「選択肢」列でなく「一行テキスト」列を利用する理由ですが、どうも「選択肢」列の場合、設定画面で予め用意された選択候補以外の値は保存出来ないようです(当然かもしれませんけど)
せっかく、外部にマスタを定義しているのに、同じ情報を列に設定しなくてはならないのでは、運用面であまり旨くありません。

あと、NewForm.aspx の場合は上記で問題ないのですが、EditForm.aspx の場合、ちょっと勝手が違います。
編集モードに強制変更して、コンテンツエディタを配置すると、きちんと配置はされるのですが、以後、EditForm.aspx の表示がなにやら不思議な感じにおかしくなります。
発行ページレイアウトのような感じでしょうか。ちょっと違いますが。

理由はよく判りませんが、バグだと思います(苦笑)
追加したWebパーツを削除するともとに戻ります。
このため、EditForm.aspx については、SharePoint Designer で編集して、直接ソースにスクリプトを埋め込む必要があります。

また、同じ列でも、NewForm.aspx 上と、EditForm.aspx では、id と name の値が異なりますので注意が必要です。

なお、この「カスケード」は汎用性が高いため、スクリプト本体は外部化して、リスト側からそれを呼びだすようにすれば、メンテナンス性も良くなると思います。
こちらに、そのサンプルを置いておきます。

SharePointMANIACS_cascadingDropDown.zip


これまでのコメント

  1. poteto より:

    AGENT: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDS; InfoPath.3; .NET4.0C; .NET4.0E)
    こんにちは、お疲れ様です。
    いつも参考にさせていただいております。

    社内のとあるリストにて、魚(さんま、アジ、マグロ・・・)・肉(和牛、国産、サーロイン・・・)・野菜(キャベツ、トマト、ピーマン・・・)などの素材をキーワードとして登録、選択できるようにという要求がありました。
    選択肢フィールドにすると膨大な量になってしまうので、本記事の内容を設定してみました。カンペキです!
    ほんと助かりました。ありがとうございました!!

  2. zucky より:

    NotesからMOSS2007への移行を行っており、Notesでは必須に近いカスケード分類の機能について参考にさせていただき、ありがとうございました。
    ただ当方イマイチスクリプトというかajax?に詳しくないため、親子孫の3層対応ができません。
    方法をご教授願えないでしょうか
    よろしくお願いします。

  3. 中村 和彦 より:

    中村です。「個別案件」になりますので、大変恐縮ですが弊社「アドバイザリサービス」でのご支援とさせて頂ければと思います。詳しくはメールにてお送りさせて頂きましたので、ご検討頂ければ幸いです。

login

Author

中村 和彦(シンプレッソ・コンサルティング株式会社 代表)が「ユーザ視点の SharePoint 情報」を発信します。元大手製造業 SharePoint 運用担当。現SharePoint コンサルタント。お仕事のお問い合わせはこちらまでお願いします。当ブログにおける発信内容は個人に帰属し所属組織の公式発信/見解ではありません。
FB : 中村 和彦
blog: Be・Better!
MS MVP SharePoint 2009/10-2011/9
MS MVP Office 365 2012/10-2014/9