4

ユーザーの現在のビュー/フィルターのアイテムだけを取得するにはどうすればよいですか?Sharepoint 2010クライアントオブジェクトモデル(つまり、Javascript / ECMAScript)を使用します。

ユーザーは、ライブラリまたはリストで使用可能なアイテムのサブセットを表示するビューを選択してから、1つ以上の列にフィルターを適用できます。そのすべてのフィルタリングの最終結果を取得したいと思います。すべてのページで、すべてのアイテムをユーザーに表示したいと思います。

クエリを構成するために現在のビューを知ることに依存するサンプルコードをたくさん見てきましたが、この場合は実際には役に立ちません。選択したアイテムだけを取得する方法をすでに知っています。

SP.ListOperation.Selection.getSelectedItems(SP.ClientContext.get_current());

ただし、それは現在のページのアイテムのみを選択します。

ありがとう!

4

2 に答える 2

2

Sibirmanによる推奨される回答は、ビューの生のクエリのみを返します。ユーザーがフィルターアクションを適用すると、ユーザー指定のフィルターが実際にURLに(InplviewHash文字列の一部として)追加されます。

例:#InplviewHashf16272c0-c177-42d7-9638-35fd75c90348 = WebPartID%3D%7BF16272C0--C177--42D7--9638--35FD75C90348%7D- FilterField1%3DProjectRef- FilterValue1%3DProject%25201- FilterField2%3DAddress- FilterValue2%3

INPLVIEW.jsおよび/_layoutsの他のSPJavaScriptファイルには、これをデコードしてビューを再初期化するための関数を含む関数がありますが、すべてを解読することはできませんでした。

DecodeHashAsQueryStringとInitGridFromViewは、開始するのに適した場所です。

ハッシュ文字列をチェックするために独自のコードを記述してから、キーと値のペアを削除しました。

var uri = window.location.href;
var hashIndex = uri.search("#");

var filter = false;
if (hashIndex == -1) {
  // Wasn't found
  alert('No filters applied!');
  // ...go with default query.
} else {
  // # found. Get hashstring
  var hashStr = uri.substring(hashIndex);
  newStr = DecodeHashAsQueryString(hashStr);

  var trStr = newStr.substring(newStr.indexOf("FilterField"));
  var retStr = trStr.replace(/%3D|&/g,",").replace(/%2520/g," ");
  retStr = retStr.replace(/FilterField[0-9]+,|FilterValue[0-9]+,/g,"")
  var filtArray = retStr.split(','); // "MyField1","MyValue1",...

そして、制限を含まない自分のクエリにそれらを適用すると、フィルター条件を満たすすべてのアイテムが返されます。

text opr choice以外のフィールドを処理する場合は、さらに一歩進んでフィールドタイプを取得し、必要に応じて各フィールドのクエリの値タイプを変更できるようにする必要があります。

于 2014-08-17T23:27:02.290 に答える
1

あなたは2つの要求によってそれを行うことができます:

function getItemsFromView(listTitle, viewTitle)
{

    var context = new SP.ClientContext.get_current();
    var list = context.get_web().get_lists().getByTitle(listTitle);
    var view = list.get_views().getByTitle(viewTitle);
    context.load(view);

    context.executeQueryAsync(
        function(sender, args) {getItemsFromList(listTitle, "<View><Query>" + view.get_viewQuery() + "</Query></View>")},
        function(sender, args) {alert("error: " + args.get_message());}
    );
}

function getItemsFromList(listTitle, queryText) 
{
    var context = new SP.ClientContext.get_current();
    var list = context.get_web().get_lists().getByTitle(listTitle);

    var query = new SP.CamlQuery();
    query.set_viewXml(queryText);

    var items = list.getItems(query);

    context.load(items);
    context.executeQueryAsync(
        function()
        {
            var listEnumerator = items.getEnumerator();
            var i = 0;
            while (listEnumerator.moveNext())
            {
                i++;
            }
            alert("items retrieved: " + i);
        },
        function(sender, args) {alert("error in inner request: " + args.get_message());}
   );

}
于 2013-01-16T05:09:51.127 に答える