Я хочу отображать все сайты в семействе сайтов с помощью JSOM, к которым пользователь имеет доступ. Другими словами, мне нужно найти коллекцию сайтов, к которым пользователь имеет доступ в семействе сайтов. Я могу получить все веб-страницы, но он не работает, если у пользователя нет разрешений на некоторые веб-сайты.Получить все сайты sharepoint в семействе сайтов, к которым пользователь имеет доступ, используя объектную модель клиента Javascript
ответ
Если вы можете использовать API вместо этого, я бы предложил вам сделать следующее, чтобы вернуть все под веб-страницы для текущего пользователя.
using(SPSite site = new SPSite("http://example/site/"))
{
using (SPWeb web = site.OpenWeb())
{
SPWebCollection webCollection = web.GetSubwebsForCurrentUser();
}
}
Примечание: Как отметил Helm Sterk в комментарии ниже, GetSubwebsForCurrentUser() не будет возвращать результат, который ищет пользователь. Таким образом, код выше не работал.
Привет, следующий фрагмент кода может вам помочь.
var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
ctx.load(web);
var webCollection = web.getSubwebsForCurrentUser(null);
ctx.load(webCollection);
ctx.executeQueryAsync(
Function.createDelegate(this,this.onSuccess),
Function.createDelegate(this,this.onError)
);
getSubwebsForCurrentUser - использует параметр типа SP.SubwebQuery, который вы можете оставить утратившим. Веб-коллекция, которую вы используете с помощью этого кода, всего на один уровень. Вы не получите подсайты подсайтов. Для этого вам нужно выполнить одни и те же утверждения на каждом объекте SP.Web, который вы получаете - рекурсивно - начиная с корневой сети.
SP.Web.getSubwebsForCurrentUser Method возвращает безопасность обрезанную (пользователь имеет доступ) коллекция суб-сайтов (только один уровень ниже)
Пример
var ctx = SP.ClientContext.get_current();
var webs = ctx.get_web().getSubwebsForCurrentUser(null);
ctx.load(webs);
ctx.executeQueryAsync(
function() {
for(var i=0;i< webs.get_count();i++) {
var web = webs.getItemAtIndex(i);
console.log(web.get_title());
}
},
function(sender,args){
console.log(args.get_message());
}
);
Если вы заинтересованы во всех суб перемычками внутри семейства сайтов, вы могли бы рассмотреть следующий подход.
function getAllSubwebsForCurrentUser(success,error)
{
var ctx = SP.ClientContext.get_current();
var web = ctx.get_site().get_rootWeb();
var result = [];
var level = 0;
var getAllSubwebsForCurrentUserInner = function(web,result,success,error)
{
level++;
var ctx = web.get_context();
var webs = web.getSubwebsForCurrentUser(null);
ctx.load(webs,'Include(Title,Webs)');
ctx.executeQueryAsync(
function(){
for(var i = 0; i < webs.get_count();i++){
var web = webs.getItemAtIndex(i);
result.push(web);
if(web.get_webs().get_count() > 0) {
getAllSubwebsForCurrentUserInner(web,result,success,error);
}
}
level--;
if (level == 0 && success)
success(result);
},
error);
};
getAllSubwebsForCurrentUserInner(web,result,success,error);
}
Использование
getAllSubwebsForCurrentUser(
function(allwebs){
for(var i = 0; i < allwebs.length;i++){
console.log(allwebs[i].get_title());
}
},
function(sendera,args){
console.log(args.get_message());
});
Он не работает для пользователей с доступом «Посетители» .. Он переходит к ошибке() метода «ошибка», .. когда я удаляю веб-страницы из Include: ctx.load (веб-страницы, «Include (Title, Webs)») ; , Он работает и переходит к функции Успеха. Любая помощь? –
getSubwebsForCurrentUser() возвращает только один уровень сайтов под текущим сайтом. Он не улавливает sub, subsites. –