Кнопка только для чтения для элемента списка в Sharepoint - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть следующая проблема Sharepoint: я создал кнопку ленты, которая говорит "Только для чтения".Когда я нахожусь в списке и проверяю некоторые элементы, я хочу установить эти элементы только для чтения.Кнопка ленты отлично работает, и когда я делаю предупреждение или что-то, я получаю ответ.Так что это не может быть проблемой.Я сделал следующее:

var listitem;
var roleAssgn;
var Assgn;
var selectedItems;

function readonly() {
    selectedItems = SP.ListOperation.Selection.getSelectedItems();
    var currentListGuid = SP.ListOperation.Selection.getSelectedList();

    var context = SP.ClientContext.get_current();
    var currentWeb = context.get_web();
    var currentList = currentWeb.get_lists().getById(currentListGuid);

     for (k in selectedItems) {
        listitem = currentList.getItemById(selectedItems[k].id);
        context.load(listitem, 'RoleAssignments');
        context.executeQueryAsync(Function.createDelegate(this, this.readonlyPerItem), Function.createDelegate(this, this.failed));
    }
}

function readonlyPerItem(sender, args) {
    var k;
    var Assgn;
    var r;
  context = SP.ClientContext.get_current();
  roleAssgn = listitem.get_roleAssignments();

  for(r in roleAssgn){
        Assgn = roleAssgn[r];
        alert("1");
        context.load(Assgn, 'RoleDefinitionBindings');
        alert("2");
        context.executeQueryAsync(Function.createDelegate(this, this.readonlyPerRoleA), Function.createDelegate(this, this.failed));
    }
}

function readonlyPerRoleA(sender, args) {
    var bindings = Assgn.get_roleDefinitionBindings();
    var member = Assgn.get_member();
}

function failed(sender, args) {
        alert("FAIL");
}

Это прекрасно работает, пока не дойдет до оповещений.Оповещение-1 работает, но не Оповещение-2.Отладчик говорит: объект не поддерживает свойство "get_ $ h".И это происходит в sp_runtime.js с:

SP.DataRetrievalWithExpressionString. $ 1Q_0 (a.get_ $ h (), d)

Я действительно не вижупроблема.Это ошибка или это просто невозможно?

1 Ответ

0 голосов
/ 10 февраля 2012

Хорошо, я использовал другой способ сделать это и хотел, чтобы вы знали, как это работает для меня. Я использовал JS в меню ленты, чтобы позвонить на другой сайт, который является просто пустым сайтом. Я добавил параметры (listguid, siteurl и разделенный запятыми пункт). Затем этот сайт просто печатает «True» или «False». Этот ответ будет перехвачен моим Ribbon JS и покажет какое-то сообщение, работает ли оно или нет Это моя лента JS:

<CustomAction
    Id="ReadOnlyButton"
    RegistrationId="101"
    RegistrationType="List"
    Location="CommandUI.Ribbon"
    Sequence="15"
    Rights="ManageLists"
    Title="Set Readonly">
    <CommandUIExtension>
      <CommandUIDefinitions>
        <CommandUIDefinition
          Location="Ribbon.Documents.Manage.Controls._children">
          <Button
            Id="Ribbon.Documents.ReadOnly"
            Command="ReadOnly"
            Sequence="15"
            Image16by16="/_layouts/1031/images/formatmap16x16.png"
            Image16by16Left="-80"
            Image16by16Top="-128"
            Image32by32="/_layouts/1031/images/formatmap32x32.png"
            Image32by32Left="-160"
            Image32by32Top="-256"
            Description="Read Only"
            LabelText="Read Only" 
            TemplateAlias="o1"/>
        </CommandUIDefinition>
      </CommandUIDefinitions>
      <CommandUIHandlers>
        <CommandUIHandler
         Command="ReadOnly"
         CommandAction="javascript:
           var nid;
           function getItemIds()
           {
             var itemIds = '';
             var items = SP.ListOperation.Selection.getSelectedItems();
             var item;
             for(var i in items)
             {
               item = items[i];
               if(itemIds != '')
               {
                 itemIds = itemIds + ',';
               }
               itemIds = itemIds + item.id;               
             }
             return itemIds;
           }
           function handleReadyStateChange()
           {
             if (client.readyState == 4)
             {
               if (client.status == 200) 
               {
                 SP.UI.Notify.removeNotification(nid);
                 if(client.responseText == 'True') {                  
                  nid = SP.UI.Status.addStatus('The Rights has been set successfully', '', true);
                  SP.UI.Status.setStatusPriColor(nid, 'green');
                 } else {
                  nid = SP.UI.Status.addStatus('Error while setting Rights', '', true);
                  SP.UI.Status.setStatusPriColor(nid, 'red');
                 }

                  window.setTimeout('SP.UI.Status.removeStatus(\'' + nid + '\')', 5000);
               }
             }
           }
           function invokeReadOnly()
           {
             var itemLength = 0;
             var params = 'itemids=' + getItemIds(); 
             for (var i=0;i&lt;params.length;i++) { if (',' == params.substr(i,1)) { itemLength++; } } 

             if(itemLength > 0) {
              nid = SP.UI.Notify.addNotification('Rights set for ' + (itemLength +1) + ' elements...', true);
             } else {
              nid = SP.UI.Notify.addNotification('Set Rights...', true);
             }

             var site='{SiteUrl}'; 
             var url = site + '/_layouts/ReadOnly.aspx?listId={ListId}';
             client = null;
             client = new XMLHttpRequest();
             client.onreadystatechange =  handleReadyStateChange;
             client.open('POST', url, true);         
             client.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
             client.setRequestHeader('Content-length', params.length);
             client.send(params);
           }      
           invokeReadOnly();"

      EnabledScript="javascript:
           function enableReadOnly()
           {
             var items = SP.ListOperation.Selection.getSelectedItems();
             return (items.length > 0);
           }
           enableReadOnly();"/>
      </CommandUIHandlers>
    </CommandUIExtension>
  </CustomAction>

И это мой сайт (ReadOnly.aspx):

protected void Page_Load(object sender, EventArgs e)
{
    string itemidsAll = Page.Request["itemids"];
    string listId = Page.Request["listId"];
    bool set = true;

    if (!String.IsNullOrEmpty(itemidsAll))
    {
        string[] itemIds = itemidsAll.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
        int item = 0;

        SPSite _site = null;
        SPListItem spitem = null;
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            _site = new SPSite(SPContext.Current.Site.ID);
        });
        using (SPWeb web = _site.OpenWeb())
        {
            web.AllowUnsafeUpdates = true;
            SPList doclib = SPContext.Current.Web.Lists.GetList(new Guid(listId), false);                

            foreach (string itemId in itemIds)
            {
                if (Int32.TryParse(itemId, out item))
                {
                    spitem = doclib.GetItemById(item);
                    set &= SetItem(spitem, SPContext.Current, ref _site);
                }
            }

            web.AllowUnsafeUpdates = false;
        }
        _site.Dispose();
    }

    Response.Clear();
    Response.Write(set.ToString());
    Response.End();  
}

SetItem-метод предназначен для установки прав. Вы можете использовать свои собственные вещи там:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...