2009/05/07

サイドリンクバーをフライアウト表示すると縦位置がずれてしまう

サイドリンクバーをフライアウト表示させるようなカスタマイズ方法として、下記サイトなどでAspMenu コントロールでの方法が紹介されています。

[方法] サイド リンク バーの表示をカスタマイズする

http://msdn.microsoft.com/ja-jp/library/ms466994.aspx

ただ、この手順だけですと、以下のような問題が発生します。
・ASPMenu をフライアウト表示するときに、カーソル位置のメニューとサブメニューの縦位置が大きくずれることがある。

この問題の修正方法をまとめておきます。

■問題の再現方法
・画面縦サイズより ASPMenu の縦幅が大きい状態でブラウザを表示する
・表示しきれていない ASPMenu を表示するために画面を下にスクロールする。
・そこでサブメニューを表示しようとすると、サブメニューの表示位置がカーソル位置から大きくずれてしまう。

■回避策
スクリプトを修正し、既定のスクリプト関数をコピーして現象発生の要因となる処理を修正した関数を定義し、既存の関数を置き換える処理を実装する。
置き換える関数の定義は規模が大きいですが、既存処理との変更点としては、以下の4 行をコメント アウトしているだけのため、この現象を回避する以外には基本的には影響はないはず。

-- コメント アウト箇所 開始 --

/*
else if (document.documentElement && (typeof(document.documentElement.scrollTop) != "undefined")) {
scrollTop = document.documentElement.scrollTop;
scrollLeft = document.documentElement.scrollLeft;
}
*/

-- コメント アウト箇所 終了 --

■サンプル スクリプト
なお、以下はサンプル スクリプトです。
実装にあたっては適宜十分な検証を実施してください。

【手順】
1. フライ アウト メニューを実装している default.master を開きます。
2. 以下のスクリプトを、コード終端の </BODY> タグの前に貼り付けて、保存します。

-- サンプル 開始 –

<script type="text/javascript">
function PopOut_Position(panel, hideScrollers) {
if (window.opera) {
panel.parentNode.removeChild(panel);
document.forms[0].appendChild(panel);
}
var rel = WebForm_GetElementById(panel.rel);
var relTable = WebForm_GetElementByTagName(rel, "TABLE");
var relCoordinates = WebForm_GetElementPosition(relTable ? relTable : rel);
var panelCoordinates = WebForm_GetElementPosition(panel);
var panelHeight = ((typeof(panel.physicalHeight) != "undefined") && (panel.physicalHeight != null)) ?
panel.physicalHeight :
panelCoordinates.height;
panel.physicalHeight = panelHeight;
var panelParentCoordinates;
if (panel.offsetParent) {
panelParentCoordinates = WebForm_GetElementPosition(panel.offsetParent);
}
else {
panelParentCoordinates = new Object();
panelParentCoordinates.x = 0;
panelParentCoordinates.y = 0;
}
var overflowElement = WebForm_GetElementById("__overFlowElement");
if (!overflowElement) {
overflowElement = document.createElement("img");
overflowElement.id="__overFlowElement";
WebForm_SetElementWidth(overflowElement, 1);
document.body.appendChild(overflowElement);
}
WebForm_SetElementHeight(overflowElement, panelHeight + relCoordinates.y + parseInt(panel.y ? panel.y : 0));
overflowElement.style.visibility = "visible";
overflowElement.style.display = "inline";
var clientHeight = 0;
var clientWidth = 0;
if (window.innerHeight) {
clientHeight = window.innerHeight;
clientWidth = window.innerWidth;
}
else if (document.documentElement && document.documentElement.clientHeight) {
clientHeight = document.documentElement.clientHeight;
clientWidth = document.documentElement.clientWidth;
}
else if (document.body && document.body.clientHeight) {
clientHeight = document.body.clientHeight;
clientWidth = document.body.clientWidth;
}
var scrollTop = 0;
var scrollLeft = 0;
if (typeof(window.pageYOffset) != "undefined") {
scrollTop = window.pageYOffset;
scrollLeft = window.pageXOffset;
}
/*
else if (document.documentElement && (typeof(document.documentElement.scrollTop) != "undefined")) {
scrollTop = document.documentElement.scrollTop;
scrollLeft = document.documentElement.scrollLeft;
}
*/
else if (document.body && (typeof(document.body.scrollTop) != "undefined")) {
scrollTop = document.body.scrollTop;
scrollLeft = document.body.scrollLeft;
}
overflowElement.style.visibility = "hidden";
overflowElement.style.display = "none";
var bottomWindowBorder = clientHeight + scrollTop;
var rightWindowBorder = clientWidth + scrollLeft;
var position = panel.pos;
if ((typeof(position) == "undefined") || (position == null) || (position == "")) {
position = (WebForm_GetElementDir(rel) == "rtl" ? "middleleft" : "middleright");
}
position = position.toLowerCase();
var y = relCoordinates.y + parseInt(panel.y ? panel.y : 0) - panelParentCoordinates.y;
var borderParent = (rel && rel.parentNode && rel.parentNode.parentNode && rel.parentNode.parentNode.parentNode
&& rel.parentNode.parentNode.parentNode.tagName.toLowerCase() == "div") ?
rel.parentNode.parentNode.parentNode : null;
WebForm_SetElementY(panel, y);
PopOut_SetPanelHeight(panel, panelHeight, true);
var clip = false;
var overflow;
if (position.indexOf("top") != -1) {
y -= panelHeight;
WebForm_SetElementY(panel, y);
if (y < -panelParentCoordinates.y) {
y = -panelParentCoordinates.y;
WebForm_SetElementY(panel, y);
if (panelHeight > clientHeight - 2) {
clip = true;
PopOut_SetPanelHeight(panel, clientHeight - 2);
}
}
}
else {
if (position.indexOf("bottom") != -1) {
y += relCoordinates.height;
WebForm_SetElementY(panel, y);
}
overflow = y + panelParentCoordinates.y + panelHeight - bottomWindowBorder;
if (overflow > 0) {
y -= overflow;
WebForm_SetElementY(panel, y);
if (y < -panelParentCoordinates.y) {
y = 2 - panelParentCoordinates.y + scrollTop;
WebForm_SetElementY(panel, y);
clip = true;
PopOut_SetPanelHeight(panel, clientHeight - 2);
}
}
}
if (!clip) {
PopOut_SetPanelHeight(panel, panel.clippedHeight, true);
}
var panelParentOffsetY = 0;
if (panel.offsetParent) {
panelParentOffsetY = WebForm_GetElementPosition(panel.offsetParent).y;
}
var panelY = ((typeof(panel.originY) != "undefined") && (panel.originY != null)) ?
panel.originY :
y - panelParentOffsetY;
panel.originY = panelY;
if (!hideScrollers) {
PopOut_ShowScrollers(panel);
}
else {
PopOut_HideScrollers(panel);
}
var x = relCoordinates.x + parseInt(panel.x ? panel.x : 0) - panelParentCoordinates.x;
if (borderParent && borderParent.clientLeft) {
x += 2 * borderParent.clientLeft;
}
WebForm_SetElementX(panel, x);
if (position.indexOf("left") != -1) {
x -= panelCoordinates.width;
WebForm_SetElementX(panel, x);
if (x < -panelParentCoordinates.x) {
WebForm_SetElementX(panel, -panelParentCoordinates.x);
}
}
else {
if (position.indexOf("right") != -1) {
x += relCoordinates.width;
WebForm_SetElementX(panel, x);
}
overflow = x + panelParentCoordinates.x + panelCoordinates.width - rightWindowBorder;
if (overflow > 0) {
if (position.indexOf("bottom") == -1 && relCoordinates.x > panelCoordinates.width) {
x -= relCoordinates.width + panelCoordinates.width;
}
else {
x -= overflow;
}
WebForm_SetElementX(panel, x);
if (x < -panelParentCoordinates.x) {
WebForm_SetElementX(panel, -panelParentCoordinates.x);
}
}
}
}

if (typeof(overridePopOut_Position) == 'function' && typeof(PopOut_Position) == 'function') { PopOut_Position = overridePopOut_Position; }
</script>

-- サンプル 終了 --

2009/05/01

SharePoint Server 2007 サイトに多数のユーザーとグループが含まれている場合、期待する検索結果が得られない

表題のKB

http://support.microsoft.com/kb/944299/ja

では、回避策として

「この問題を防止するため、SharePoint サイトに対し、1,000 を超えるユーザー、グループ、メンバシップ、ロールにアクセス権を与えないことをお勧めします。」

とありますが、対象がサイト全体なのかアイテムなのか…、いまいちわかりませんでしたが、実際は以下のようです。

MOSS 2007、WSS 3.0の検索では、検索を実行したユーザーがアクセス可能なコンテンツのみを検索結果に表示します。 検索時にユーザーがアクセス可能なコンテンツを識別するため、サイトをクロールする際に、コンテンツにアクセス権のあるユーザー、グループなどを確認し、アクセス制御リスト (ACL) を作成します。 作成されるアクセス制御リストのサイズには、最大でアイテムあたり 、64 KB の制限があります。

この制限を超えた場合、クロールに失敗します。

64KBのサイズは、一般的に、ユーザー、グループ、メンバシップ、ロールの合計数が最大で 1800 程度であると想定。

エクスプローラ ビューが表示できない

  • 現象
    • Windows Vista でドキュメント ライブラリの エクスプローラ ビューを表示できない
  • 原因
    • ルート (http://<ServerName>/) にサイトが存在しない
    • WebDAV ルートフォルダ がない場合、Vista の WebClient サービスでは、子フォルダにアクセスできない動作に起因
  • 回避策
    • ルートにサイトを作成
  • 対処方法
  • 注意点
    • ルートにサイトが存在しない場合、その他いくつかの現象が発生するため、ルートにはサイトを作成する

MOSSの「システム アカウント」

MOSSのシステム アカウント】

お客様の環境ではあまり起きないかと思いますが、ちょっとした検証環境なんかで動作確認しているときに、

MOSS画面右上に表示される「ようこそ~さん」の表示が、アカウント/表示名になっていたり、システムアカウントと

なっているケースがあります。

システムアカウントと判断されてしまうケースは以下の通りのようです。

ログオン ユーザーが、以下のいずれかの Web アプリケーションに対するアプリケーション プールのセキュリティ アカウントに

指定されている場合、そのユーザーはシステム アカウントとなります。

  • SharePoint Central Administration v3
  • 表示するサイトの Web アプリケーション (例. SharePoint - 80)

ワークフローが自動起動しない

  • 現象
    • SharePoint Designer で自動的に起動する設定をしたWorkflow を作成したが、システム アカウントで操作を行った場合、Workflow が開始しない
  • 詳細
    • Workflow の開始オプションで、いずれかのオプションを指定
      • [新しいアイテムが作成されたら、この Workflow を開始する]
      • [アイテムが変更されたら、この Workflow を開始する]
  • 環境

    Windows SharePoint Services 3.0 Service Pack 1

    Office SharePoint Server 2007 Service Pack 1

  • 原因
    • セキュリティを考慮し、Windows SharePoint Services 3.0 Service Pack 1 から、システム アカウントでは、自動的に Workflow が開始しないよう動作変更
    • サポート技術情報 947284 A declarative workflow does not start automatically after you install Windows SharePoint Services 3.0 Service Pack 1 http://support.microsoft.com/kb/947284/

2007/11/30

IRM ライブラリ関連の参考情報

■MOSSの権限とRMS権限のマッピング

アクセス許可レベルをカスタマイズするときに、役に立つかと。 http://technet2.microsoft.com/Office/f/?ja-JP/library/073bfc71-7b01-4b77-bdc3-ac018889d54b1041.mspx これだけだと、すべて必須なのか組み合わせ次第なのかまだ分かりづらいとは思いますが。

Office SharePoint Server 2007 の権限

IRM 権限

権限の管理、Web の管理

クライアントで定義されているように、フル コントロールです。この場合、ユーザーは通常、権限が管理されているコンテンツの読み取り、編集、コピー、保存、およびその権限の変更を行うことができます。

リスト アイテムの編集、リストの管理、ページの追加とカスタマイズ

編集、コピー、および保存の権限。必要に応じて、これらの権限を持つユーザーが、ドキュメント ライブラリからのドキュメントを印刷できるように設定することもできます。

リスト アイテムの表示

読み取り権限。ユーザーはドキュメントを表示できますが、そのコンテンツをコピーまたは更新することはできません。必要に応じて、リスト アイテムの表示権限を持つユーザーが、ドキュメント ライブラリからのドキュメントを印刷できるように設定することもできます。

その他

IRM 権限に対応する他の権限はありません。

■IRM ライブラリ関連のエラー&トラブルシューティング

まだ英語しかないようですが、IRMライブラリがらみのエラーのイベント ID一覧、対応方法等々です。

http://technet2.microsoft.com/windowsserver/WSS/en/library/287fcedc-309c-4c32-ad1e-9e4030d524df1033.mspx

2007/10/30

ADで削除されたアカウントのプロファイルDBでの動作(2)

ADで削除されたアカウントのプロファイルDBでの動作 で書いていたんですが。 MOSSでADからプロファイルのインポートをおこなった場合、AD上で削除されたアカウントは、プロファイルDBから削除されるようになっていた、と。 どうも、完全ではないっぽい。 確かに、この前検証したときは、2つの異なる環境でやって、どっちでも削除されてました。 なんですが。 別件で気になることがあって、試していたら、ちっとも削除されません。SPS 2003と同じように非アクティブとしてマーク(インポートに含まれていないプロファイル)はされています。 前回検証したときは、動作確認だけではなくて、ちゃんとドキュメントもしらべて(というよりは、逆ですね。削除されると記述されているドキュメントを見つけて、これおかしくない?、と思って試したので)、正しい動きだと判断したので、掲載したんですが。 どっちが正しいのだ~??? どっちも一長一短なので、どっちでもいいんですが。。どっちなんだかは決めて欲しい。