views:

694

answers:

1

Hi,

I'm making issue tracking portal based on Sharepoint. Users should be able to add entries, but in the entry itself i want one column be only visible to specific group of users (Administrators). Is there a way to set column based access control?

Thanks in advance

+5  A: 

As far as I know that is not available in the standard platform. What you can do on the other hand is to handcraft your own fieldcontrol

So in custom fieldtypes.xml

<FieldTypes>

  <FieldType>
    <Field Name="TypeName">MyInteger</Field>
    <Field Name="ParentType">Integer</Field>
    ...
    <Field Name="FieldTypeClass">xxx</Field>
  </FieldType>

and in sitecolumns.xml

  <Field ID="xxx"
      Name="xxx"
      DisplayName="xxx
      Description="xxx"
      Group="xxx
      Type="MyInteger"    
      DisplaceOnUpgrade="TRUE"
  />

and in your fieldcontrol

public class MyInteger: SPFieldNumber
{
    public MyInteger(SPFieldCollection fields, string fieldName)
        : base(fields, fieldName)
    {
    }

    public MyInteger(SPFieldCollection fields, string typeName, string displayName)
        : base(fields, typeName, displayName)
    {
    }


    public override BaseFieldControl FieldRenderingControl
    {
        [SharePointPermission(SecurityAction.LinkDemand, ObjectModel = true)]
        get
        {
            Microsoft.SharePoint.WebControls.BaseFieldControl ctl = 
               new MyIntegerControl();
            ctl.FieldName = InternalName;
            return ctl;

        }
    }

    }

and in the MyIntegerControl you can do whatever you want (lots of overrides), but an example is:

protected override void CreateChildControls()
{
    base.CreateChildControls();
    if (this.ControlMode == SPControlMode.New || 
        this.ControlMode == SPControlMode.Display)
    {
      // check that use is admin and display value
    }
}
Johan Leino
I agree that a custom field is the way to go. Excellent example!
Kirk Liemohn
Me too, and very nicely laid out example!
Colin