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




コメント (2)
はじめまして。山崎愛です。トラックバック頂き、ありがとうございいました! 私のお粗末なコードがこんな素敵なスクリプトに生まれ変わらせてもらって。。。と、ちょっと感動です。
ブログがちょっとずつでも役に立っているようで、なんともうれしいです。今後ともよろしくお願いいたします。
投稿者: 山崎愛 | 2008年03月07日 19:35
日時: 2008年03月07日 19:35
山崎さん
いつもお世話になっております(書籍などで)
技術者といたしましては非常にありがたいエントリをたくさんポストしていただいて助かっております!
このブログではSharePointのウェブサービス関係のエントリを増やしていこうかと思います。
今後ともどうぞよろしくお願いいたします。
投稿者: ひげもじゃ | 2008年03月08日 01:26
日時: 2008年03月08日 01:26