Monday, October 27, 2014

SPListItem Extension Methods To Get And Set Field Values

Followings are the extension methods for SPListItem class.

Single line of text, Multiline lines of text and Choice(Single)


public static string GetStringValue(this SPListItem item, string columnName)
{
return item[columnName] as String;
}
public static void SetStringValue(this SPListItem item, string columnName, string value)
{
item[columnName] = value;
}

Choice (Multiple)


public static SPFieldMultiChoiceValue GetMultipleChoiceValueCollection(this SPListItem item, string columnName)
{
return (item[columnName] == null) ? null : new SPFieldMultiChoiceValue(item[columnName] as string);
}
public static void SetMultipleChoiceValueCollection(this SPListItem item, string columnName, string[] choices)
{
var value = new SPFieldMultiChoiceValue();
foreach (var choice in choices)
{
value.Add(choice);
}
item[columnName] = value;
}
public static void SetChoiceToMultipleChoiceValueCollection(this SPListItem item, string columnName, string choice)
{
SPFieldMultiChoiceValue choices = (item[columnName] == null)
? new SPFieldMultiChoiceValue()
: new SPFieldMultiChoiceValue(item[columnName] as string);
choices.Add(choice);
item[columnName] = choices;
}

Number, Currency


public static Double? GetNumberValue(this SPListItem item, string columnName)
{
return item[columnName] as Double?;
}
public static void SetNumberValue(this SPListItem item, string columnName, Double value)
{
item[columnName] = value;
}

DateTime


public static DateTime? GetDateTimeValue(this SPListItem item, string columnName)
{
return item[columnName] as DateTime?;
}
public static void SetDateTimeValue(this SPListItem item, string columnName, DateTime value)
{
item[columnName] = value;
}

Lookup (Single)


public static SPFieldLookupValue GetLookupValue(this SPListItem item, string columnName)
{
return (item[columnName] == null) ? null : new SPFieldLookupValue(item[columnName] as string);
}
public static void SetLookupValue(this SPListItem item, string columnName, int itemId)
{
item[columnName] = itemId;
}

Lookup (Multiple)


public static SPFieldLookupValueCollection GetLookupValueCollection(this SPListItem item, string columnName)
{
return (item[columnName] == null)
? null
: new SPFieldLookupValueCollection(item[columnName] as string);
}
public static void SetLookupValueCollection(this SPListItem item, string columnName, int[] itemIds)
{
SPWeb web = item.Web;
var value = new SPFieldLookupValueCollection();
value.AddRange(itemIds.Select(i => new SPFieldLookupValue(i.ToString())));
item[columnName] = value;
}
public static void SetLookupValueToLookupValueCollection(this SPListItem item, string columnName, int itemId)
{
SPFieldLookupValueCollection value = (item[columnName] != null)
? value = item[columnName] as SPFieldLookupValueCollection
: value = new SPFieldLookupValueCollection();
value.Add(new SPFieldLookupValue(itemId.ToString()));
item[columnName] = value;
}

Yes/No


public static Boolean? GetYesNoValue(this SPListItem item, string columnName)
{
return item[columnName] as Boolean?;
}
public static void SetYesNoValue(this SPListItem item, string columnName, Boolean value)
{
item[columnName] = value;
}

User


public static SPFieldUserValue GetUserValue(this SPListItem item, string columnName)
{
SPFieldUser field = item.Fields[columnName] as SPFieldUser;
if (field != null)
{
SPFieldUserValue fieldValue = field.GetFieldValue(item[columnName].ToString()) as SPFieldUserValue;
return (fieldValue == null) ? null : fieldValue;
}
else
{
return null;
}
}
public static void SetUserValue(this SPListItem item, string columnName, int userId)
{
SPWeb web = item.Web;
item[columnName] = new SPFieldUserValue(web, userId.ToString());
}

User Collection


public static SPFieldUserValueCollection GetUserValueCollection(this SPListItem item, string columnName)
{
return (item[columnName] == null) ? null : item[columnName] as SPFieldUserValueCollection;
}
public static void SetUserValueCollection(this SPListItem item, string columnName, int[] userIds)
{
SPWeb web = item.Web;
var value = new SPFieldUserValueCollection();
value.AddRange(userIds.Select(i => new SPFieldUserValue(web, i.ToString())));
item[columnName] = value;
}
public static void SetUserToValueCollection(this SPListItem item, string columnName, int userId)
{
SPWeb web = item.Web;
SPFieldUserValueCollection value = (item[columnName] != null)
? value = item[columnName] as SPFieldUserValueCollection
: value = new SPFieldUserValueCollection();
value.Add(new SPFieldUserValue(web, userId.ToString()));
item[columnName] = value;
}

Hyperlink or Picture


public static SPFieldUrlValue GetUrlValue(this SPListItem item, string columnName)
{
return (item[columnName] == null) ? null : new SPFieldUrlValue(item[columnName] as string);
}
public static void SetUrlValue(this SPListItem item, string columnName, string url, string description)
{
var value = new SPFieldUrlValue { Url = url, Description = description };
item[columnName] = value;
}

Managed Metadata (Single)


public static TaxonomyFieldValue GetTaxonomyValue(this SPListItem item, string columnName)
{
return item[columnName] as TaxonomyFieldValue;
}
public static void SetTaxonomyValue(this SPListItem item, string columnName, Guid termId)
{
var field = item.Fields[columnName] as TaxonomyField;
var session = new TaxonomySession(item.Web.Site);
Term term = session.GetTerm(termId);
field.SetFieldValue(item, term);
}

Managed Metadata (Multiple)


public static TaxonomyFieldValueCollection GetTaxonomyValueCollection(this SPListItem item, string columnName)
{
return item[columnName] as TaxonomyFieldValueCollection;
}
public static void SetTaxonomyValueCollection(this SPListItem item, string columnName, Guid[] termIds)
{
var field = item.Fields[columnName] as TaxonomyField;
var session = new TaxonomySession(item.Web.Site);
TermCollection terms = session.GetTerms(termIds);
field.SetFieldValue(item, terms);
}
public static void SetTaxonomyToTaxonomyValueCollection(this SPListItem item, string columnName, Guid termId)
{
var field = item.Fields[columnName] as TaxonomyField;
var session = new TaxonomySession(item.Web.Site);
TaxonomyFieldValueCollection collection = (item[columnName] != null)
? collection = item[columnName] as TaxonomyFieldValueCollection
: collection = new TaxonomyFieldValueCollection(field);
Term term = session.GetTerm(termId);
TaxonomyFieldValue taxonomyFieldValue = new TaxonomyFieldValue(field)
{
TermGuid = term.Id.ToString(),
Label = term.Name
};
collection.Add(taxonomyFieldValue);
field.SetFieldValue(item, collection);
}


You can download SPListItemExtensions.cs file containing all above extension methods.

Monday, October 20, 2014

Relative Path Using SPUrlExpressionBuilder & URL Tokens

Many time you need to provide relative path when you are working with image, js or css files. Of course you can use hard coded (Absolute) path but it fails after changing domain name or environment. Absolute path is more useful when linking to another website. You can also build relative path using ../ but it fails when you add reference in master page.

Fortunately, SharePoint provides SPUrlExpressionBuilder and URL tokens to generate the relative url. You can use following url tokens:
  • ~Site - Resolve to current web
  • ~SiteCollection - Resolve to current site collection root
URL Tokens can be use only with server side control. Followings are snippets to generate the relative url:

JavaScript


<!-- ~Site/FILE_LOCATION -->
<SharePoint:ScriptLink Language="JavaScript" Name="~Site/SiteAssets/File.js" runat="server" OnDemand="false">
</SharePoint:ScriptLink>
<!-- OR -->
<script type="text/javascript" src='<asp:Literal runat="server" Text="<%$SPUrl:~Site/%>" />SiteAssets/File.js'>
</script>

CSS


<!-- ~Site\FILE_LOCATION -->
<link rel="stylesheet" type="text/css" href='<asp:Literal runat="server" Text="<% $SPUrl:~Site/%>" />SiteAssets/abc111.css' />
<!-- OR -->
<SharePoint:CssRegistration Name="<% $SPUrl:~Site/SiteAssets/File.css %>" runat="server"></SharePoint:CssRegistration>
<!-- OR -->
<Sharepoint:CssLink runat="server" DefaultUrl="<% $SPUrl:~Site/SiteAssets/File.css %>"/>

Favicon


<!-- ~Site\FILE_LOCATION -->
<link rel='shortcut icon' href='<asp:Literal runat="server" Text="<% $SPUrl:~Site/SiteAssets/favicon.ico%>"/>' type="image/vnd.microsoft.icon" />

Image


<!-- ~Site\FILE_LOCATION -->
<img src='<asp:Literal runat="server" Text="<%$SPUrl:~Site/%>" />SiteAssets/File.png' />
<!-- OR -->
<img runat="Server" src='<% $SPUrl:~site/SiteAssets/File.png %>' />
<!-- OR -->
<asp:Image ImageUrl="<% $SPUrl:~site/SiteAssets/File.png %>" runat="server" />

Hyperlink


<!-- ~Site\FILE_LOCATION -->
<a href='<asp:Literal runat="server" Text="<%$SPUrl:~Site/%>" />SiteAssets/PAGE.aspx' >Page URL</a>
<!-- OR -->
<a runat="Server" href="<% $SPUrl:~Site/SiteAssets/PAGE.aspx %>" >Page URL</a>
<!-- OR -->
<asp:HyperLink runat="Server" NavigateUrl="<% $SPUrl:~Site/SiteAssets/PAGE.aspx %>" Text="Page URL">
</asp:HyperLink>

Server side


// ~Site/FILE_LOCATION
string filePath = SPUrlExpressionBuilder.EvaluateUrlExpression("~Site/SiteAssets/File.png").ToString();

SharePoint 2013 search users/group autocomplete with presence 2.0

Recently I have updated my SharePoint 2013 search users/group auto complete with presence plugin on CodePlex. Now it will look for search suggestions along with users.

Features

  • Update SharePoint 2013 search input box to search people with the presence
  • Redirect to Profile page on selection [optional]
  • Show user picture with presence [optional]
  • Show search suggestions

Prerequisites

  • SharePoint 2013
  • jQuery 1.8.x +
  • jQuery UI JS 1.10.x
  • jQuery UI CSS 1.10.x

Solution Deployment

  • Deploy Arya.SearchUser.wsp using following PowerShell Command:
    add-spsolution -LiteralPath "SOLUTION_LOCATION\Arya.SearchUser.wsp"
                        
  • Activate "SearchUserFeature" for particular WebApplication from Central Admin

Manual Installation

  • Copy jquery.searchpeople.js, imgPreload.js, arya.searchpeople.css, loader.gif and spinner.gif to Site.
  • Add reference to the page/masterpage
    <script src="http://code.jquery.com/jquery-1.8.3.min.js" type="text/javascript"></script>
    <script src="http://code.jquery.com/ui/1.10.1/jquery-ui.min.js" type="text/javascript"></script>
    <script src="/SiteAssets/jquery.searchpeople.js" type="text/javascript"></script>
    <script src="/SiteAssets/imgPreload.js" type="text/javascript"></script>
    <link href="http://code.jquery.com/ui/1.10.1/themes/smoothness/jquery-ui.css" type="text/css"/>
    <link href="/SiteAssets/arya.searchpeople.css" type="text/css"/>
  • Add following javascript
    $(document).ready(function () {
    _spBodyOnLoadFunctionNames.push("addSearchBox");
    setTimeout(addSearchBox, 1500);
    });
    function addSearchBox() {
    var settings = {
    mySiteUrl: "http://PROFILE_URL",
    redirectToProfilePage: true,
    maxSuggetions: 10,
    showpicture: false,
    showInitials: true,
    principleType: 1,
    showSearchSuggetions: true
    }
    $.searchPeople(settings);
    }

Settings


mySiteUrl :

My site url. User will redirect to profile page url. default: ""
e.g. http://PROFILEURL/person.aspx?accountname=NETWORID

redirectToProfilePage :

If true then user will be redirected to profile page url on selection. default: false

maxSuggetions :

Maximum suggestions to display. default: 10

showpicture:

Show user picture. default: true

showInitials:

Show Gmail like text avatar in case user profile image in not available. default: false

showSearchSuggetions:

Show search suggestions. default: true

principalType:

Principal type to search. default: 1
options:
  • 0 - User, DL, SecGroup, SPGroup
  • 1 - User
  • 2 - DL
  • 4 - SecGroup
  • 8 - SPGroup

Enable search suggestions:

  • Go to Central Admin
  • Click on "Manage service applications" under "Application Management"
  • Click on Search Service Application
  • Click on "Query Suggestions" under "Queries and Results" in left navigation
  • Check "Show search suggestions" and click "Save Settings"

Search without picture


Search with picture


Contact card


You can download the latest source code from codeplex