Tuesday 24 August 2010

Rational Guide to implementing SharePoint Server 2010 User Profile Synchronization (Link)

Just thought i'd share an absolutely fantastic post on setting up User Profile Sync in SharePoint Server 2010

As the guy says, there are tones of "guides" and tuition on this available on the net but hopefully landing here, or following here (all 2 of you) will save you the hassle. -All credit to the author, of course.

life saving!

http://www.harbar.net/articles/sp2010ups.aspx

Just remember to do the damn IIS Reset at the end lol

Ryan ;)

Wednesday 26 May 2010

Track Any Download in SharePoint using Google Analytics

,,,,,,,,

Ryan Mathieson wrote:

SharePoint and Google Analytics: Track external downloads and who’s downloading them

Loads of posts available explaining how to track downloads from document libraries and lists but not external links or content links written into HTML Content fields in publishing pages. After some time fiddling around with different ideas this very basic little script can be adapted to most requirements.

My requirement was simply to track forms based authenticated users downloading PDFs using Google analytics and build a report on it. The challenge was that the downloads being tracked could be document libraries, lists, external links or files sitting in IIS (don’t ask..)

 

<%@ Import Namespace="Microsoft.SharePoint" %>

<script type="text/javascript">

    var loginName = "<%= SPContext.Current.Web.CurrentUser.LoginName %>";   

</script>

<a href="#" onClick="javascript: pageTracker._trackPageview('/downloads/PDF/' + loginName); ">

 

In my case i put the <script> into my page layout and in the html fields on the page, I would add the link with the onClick event. This worked perfectly.

 

 

 

Wednesday 24 February 2010

Define Site-Level Search scopes using master pages

Introduction

My client has a custom public facing Web Content Management SharePoint solution on the web. Their requirement is that within certain areas of this public site searches submitted by users only search the current area they are in.

To achieve this; a Search Scope was created specific to each site using Microsoft Office SharePoint Server, Shared Services provider. A search scope defines a subset of information in the search index. Normally used in the context of allowing a user to select a search scope when performing a search in order to restrict search results to within that search scope. Typically, search scopes encompass specific topics and content sources that are important and common to users in the organization and selection of the desired search scope is done using the standard SearchBox web part for MOSS providing a drop down to the user.

In our scenario; searches are taking place from one central input control on the Master Page of the site collection and our search scope selection is based definitively on the current area of the site in which the user performs the search.

Use Example: If a user navigates to: http://sharepointsite.com/subsite/contentsite/. Our user is in the current site “contentsite” which in this case is a site collection defaulting to the “/pages” with no document libraries, lists or additional content as it is a public facing SharePoint site. When a user submits a search from this site his returned results should be all pages and documents within the Trustees site and its subsites without returning unnecessary SharePoint content.

Defining Search Scopes for Public Facing SharePoint Site

our site is a public facing WCM (Web Content Management) version of SharePoint and configuring search on this site is more advanced than on an out-of-box Intranet or publishing solution. Standard SharePoints search results include all content of the site, its subsites and all of the resource content such ass CSS, JavaScript, XSL, Images, Administration list, User Profiles and more. For public facing site the search experience must only return relevant results based on the content and context of the web site.

Search Scope Configuration

Searches using these scopes will return anything that is in the content source “Site” AND (the content is a publishing page OR the content is a document). If you need to know more about defining content sites, click here

The logic of these rules are as follows:

  • Include = OR
  • Require = AND
  • Exclude = AND NOT

The ‘contentclass’ property specifies what type the indexed item is and will be automatically available for any content item in SharePoint. The two types that we are specifically targeting are:

  • STS_ListItem_850 (Publishing Pages)
  • STS_ListItem_DocumentLibrary (Documents)

SubsiteA

Title:

SubsiteA

Description:

Search scope specific to SubsiteA site & subsites

Rules

Behavior

Folder = http://SharePointSite.com/SubsiteA

Require

contentclass = STS_ListItem_850

Include

contentclass = STS_ListItem_DocumentLibrary

Include

ContentSource = Site

Require

Search Field Customisation

Determining which search scope is to be used is done programmatically. Search queries are inputted using a field on the master pages of the site rather than an independent control on the page or web part. This means that on the event where a user submits a search it will execute a search query against the Enterprise Search in Microsoft Office SharePoint Server 2007 service by encoding the query in a URL and posting it to the custom search page.

When doing this we are passing two parameters: http://SharepointSite.com/Utils/Pages/SearchSite.aspx?k=Keyword&s=SubsiteA

  • K=”Keywords” – The keywords submitted by our user
  • S=”Scope” – The scope which will be used to run our query against

Posting from master page

Before implementation of this solution, the search button event posted just the keyword to the search centre producing a site collection level search:

protected void ImageButtonSearch_Click(Object sender, ImageClickEventArgs e)

{
Page.Response.Redirect("/Utils/Pages/SearchSite.aspx?k=" + txt_Search.Text);
}

http://SharePointSite.com/Utils/Pages/SearchSite.aspx?k=Keyword

This has been extended to:

protected void ImageButtonSearch_Click(Object sender, ImageClickEventArgs e)

{

SPSite site = new SPSite(Page.Request.Url.AbsoluteUri);
SPWeb web = site.OpenWeb();
string strSiteTitle = web.Title;
string strParentSite = web.ParentWeb.Title;

if (strSiteTitle == "SubsiteA" || strParentSite == "SubsiteA")
{
Page.Response.Redirect("/Utils/Pages/SearchSite.aspx?k=" + txt_Search.Text + "&s=SubsiteA");
}

else

{

Page.Response.Redirect("/Utils/Pages/SearchSite.aspx?k=" + txt_Search.Text);

}

}

This code utilises the Microsoft SharePoint 2007 development API first of all opening a connection to the current site. Once the connection is open the Site Title and the Parent Site Title are stored.

The code then checks if the Site Title or Parent Site Title matches the conditions that it is one of our site level search enabled sites. At which point it passes the extended url string to the search centre including which scope to use. In our case any searches within the upper level subsite area and all of its subsites are included. A more specific rule can be created by removing the parentsite condition.

NOTE: The name of the scope being used must be identical to the Title of the search scope and case sensitive. An invalid scope title passed into the query will return zero search results with no error.

Deployment

Presently the above code is deployed by being produced on each master page used by selected pages in the scope of this implementation. For future implementations it may be more appropriate to develop and install a custom SharePoint Feature which processes all search queries across the entire site. This would be viable on a larger scale implementation where by each site (every site) had predefined processes and search scope requirements.

The scope of this implementation is focused on the above pages and does not justify the design, development, deployment and testing requirements of implementing a site wide custom search handler feature although that would probably be the best way to do it.