« 第4回国際ニコニコ映画祭の受付が開始されているようです。 | メイン | 餃子の皮から水餃子作ったよ。 »



SharePointのNewForm.aspxやEditForm.aspxにスクリプトを差し込む方法

SharePointのNewForm.aspxやEditForm.aspxにスクリプトを差し込む方法をはてなブックマークに追加 SharePointのNewForm.aspxやEditForm.aspxにスクリプトを差し込む方法をdel.icio.usに追加  Yahoo!ブックマークに登録 SharePointのNewForm.aspxやEditForm.aspxにスクリプトを差し込む方法をGoogle Bookmarksに追加 SharePointのNewForm.aspxやEditForm.aspxにスクリプトを差し込む方法をtwitterにポスト
タイトルではあたかもワタシが編み出した風なことを言っていますが、SharePointの書籍も書いておられるSharePoint Technical Note : 山崎 愛さんのとこで、SharePointの入力フォーム初期値設定スクリプトがあったのでワタシも野良スクリプトを作ってみました。

ワタシの野良スクリプトはSharePointの「ようこそ ○○ さん」ていう div からアカウントを引いて、さらにSharePointで持っているPeople.asmxサービスを使って部署やメールアドレスなども初期設定しています。
SharePointのユーザ・グループフィールドはディレクトリサービス・プロファイルと連携しているため、ディレクトリサービス側で部署やメールアドレスが変更された場合、それらの過去の履歴を保持することが出来ません。これではいろいろとビジネスコンプライアンスの面でリストに登録した情報をトレースできないことがあったりなかったりするので、1行テキストのフィールドに正しいアカウントの情報を突っ込みたいことがあります。(ユーザ・グループフィールドでなければ、ディレクトリサービスに依存しませんので、どんなフィールドでもよいです。)
ただ、この入力をユーザに任せると、それはそれは自由に入力されるので、統一が取れませんが、SharePointが持ってるサービスから情報を抜いて、初期値として入れるこの方法だとそれなりに威力を発揮したりしなかったりします。もちろん1行テキストフィールドに入れる必要は無く、適宜、ユーザ・グループフィールドに突っ込んだりもできます(実装依存です)
これまでSharePointのフォームに手を入れたくて本当に困っていたのですが、やり方がわかってかなりスッキリしました。バリデーションチェックなんかもこの方法でできるようになるかもですね。詳細は山崎 愛さんのブログを参照していただきたいですが、ここでも軽くコメントしておきます。

NewForms.aspx のContentPlaceHolderId属性が"PlaceHolderMain"となっているところの直後に自前のスクリプトを差し込みます。
<asp:Content ContentPlaceHolderId="PlaceHolderMain" runat="server">
このあたりのようです。で、
_spBodyOnLoadFunctionNames.push( "<your_function_name>" );
ていうのが、フォームのオンロード時に自前のメソッドを呼ぶトリガになるんだと思います。読んだまんまだと、onLoad時のメソッド名をプッシュしておくと言うことでしょうか。
あとは、「ようこそ ○○ さん」のからアカウント名を引くところですが、環境によってそのタグの id が違うみたいで zz6_Menu だったり zz7_Menu だったりするらしいです。ご自身の環境のHTMLソースをfindしてみてください。
また、フォームに初期値として設定するフィールドもHTMLソースの id を調べて実装してみてください。
<script type="text/javascript">
// onLoadのトリガらしい。
_spBodyOnLoadFunctionNames.push( "getStaticUserInfo" );

// ノードの nullチェック
function getNodeValue( nodeInst, name )
{
    return ( nodeInst.selectSingleNode( name ) != null ) 
        ? nodeInst.selectSingleNode( name ).text : '';
}

function getStaticUserInfo()
{
    var httpInst = window.XMLHttpRequest ? new XMLHttpRequest() : ( function() {
        try        { return new ActiveXObject( "Msxml2.XMLHTTP" );    }
        catch( e ) { return new ActiveXObject( "Microsoft.XMLHTTP" ); }
    })();

    var accountNameFld = '';
    var displayNameFlg = '';
    var emailFld = '';
    var departmentFld = '';

    // ようこそ ○○ さんの div の id は zz*_Menu のようです。
    // 表示名を同姓同名で複数存在していたらアウト
    var loginDisplayName = document.getElementById( "<your_element_id>" ).innerText;
    var loginName = loginDisplayName.substring( 4, loginDisplayName.lastIndexOf( "さ", loginDisplayName.length ) );

    httpInst.open( "POST", "http://<your_site>/_vti_bin/People.asmx", false );
    httpInst.setRequestHeader( 'Content-Type','text/xml; charset=utf-8' );
    httpInst.setRequestHeader( 'SOAPAction','http://schemas.microsoft.com/sharepoint/soap/SearchPrincipals' );
    var postBody = '<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><SearchPrincipals xmlns="http://schemas.microsoft.com/sharepoint/soap/"><searchText>' + loginName + '</searchText><maxResults>1</maxResults><principalType>All</principalType></SearchPrincipals></soap:Body></soap:Envelope>';
    httpInst.onreadystatechange = function()
    {
        if ( httpInst.readyState == 4 ){
            xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
            xmlDoc.async = false;
            xmlDoc.loadXML( httpInst.responseText );
            rowsItem = xmlDoc.selectSingleNode( '/soap:Envelope/soap:Body/SearchPrincipalsResponse/SearchPrincipalsResult/PrincipalInfo' );
            accountNameFld = getNodeValue( rowsItem, 'AccountName' );
            displayNameFlg = getNodeValue( rowsItem, 'DisplayName' );
            emailFld       = getNodeValue( rowsItem, 'Email' );
            departmentFld  = getNodeValue( rowsItem, 'Department' );
        }
    }
    httpInst.send( postBody );
    
    // フィールドに格納。htmlソースに id があるようです。
    document.getElementById( "<your_account_name_field>" ).value = accountNameFld;
    document.getElementById( "<your_display_name_field>" ).value = displayNameFlg;
    document.getElementById( "<your_email_field>" ).value = emailFld;
    document.getElementById( "<your_department_field>" ).value = departmentFld;
};
</script>

★このコンテンツに目的の情報はありませんでしたか?


[ 最近のエントリーとその関連エントリー ]


[ スポンサードリンク ]

トラックバック

このエントリーのトラックバックURL:
http://mojalog.com/cgi/mt/mt-tb.cgi/247

コメント (2)

はじめまして。山崎愛です。トラックバック頂き、ありがとうございいました! 私のお粗末なコードがこんな素敵なスクリプトに生まれ変わらせてもらって。。。と、ちょっと感動です。
ブログがちょっとずつでも役に立っているようで、なんともうれしいです。今後ともよろしくお願いいたします。

ひげもじゃ:

山崎さん
いつもお世話になっております(書籍などで)
技術者といたしましては非常にありがたいエントリをたくさんポストしていただいて助かっております!
このブログではSharePointのウェブサービス関係のエントリを増やしていこうかと思います。
今後ともどうぞよろしくお願いいたします。

コメントを投稿

ツリータイプ・カテゴリー

open all | close all

リファラから検索


サイト内検索