Showing posts with label Application Development. Show all posts
Showing posts with label Application Development. Show all posts

Monday, 8 August 2011

Deploying Site Templates in the Solution Gallery

Case
I downloaded a couple of site templates from the Solution Gallary of my SharePoint Portal.

I want to put these site templates in a Solution Package so I can easily deploy them in my development enviroments.

I just want to deploy the solution, go to my site collection and greate the subpages I need.

Problem
After putting the file in the correct location (_catalogs/solutions) in my site collection, I noticed I couldn't activate the templates. Activating the templates is necessary to be able to select the template while creating a new site.

Solution
The following solution turned out to work for me:

- Create a new Module in VS2010.
- Add the site templates to your Module.


[Module Name="Templates" List="121" Url="_catalogs/solutions"]
[File Path="Templates\Template_Name.wsp" Url="Template_Name.wsp" Type="GhostableInLibrary"]
[Property Name="ContentType" Value="Solution Gallery" /]
[Property Name="SolutionTitle" Value="Template Name" /]
[Property Name="SolutionDescription" Value="Standard Template" /]
[/File]
[/Module]


* Replace [ and ] signs with less than (<) and greater than (>) signs.


- Add an eventreceiver to the feature and uncomment 'FeatureActivated'


SPSite currentSite = (SPSite)properties.Feature.Parent;

// Get all names of added solutions
List solutionName = new List();
SPUserSolutionCollection solutionsCollection = currentSite.Solutions;

foreach (SPUserSolution solution in currentSite.Solutions)
{
string name = solution.Name;
if (!solutionName.Contains(name))
{
solutionName.Add(name);
}
}

// Add new solutions to the collection of the gallery
SPDocumentLibrary solutionsGallery = (SPDocumentLibrary)currentSite.GetCatalog(SPListTemplateType.SolutionCatalog);
foreach (SPListItem item in solutionsGallery.Items)
{
if (!solutionName.Contains(item.Name))
{
solutionsCollection.Add(item.ID);
}
}

// Properly activate solutions
SPFeatureCollection featureCollection = currentSite.Features;
foreach (SPUserSolution solution in solutionsCollection)
{
Guid solutionId = solution.SolutionId;

SPFeatureDefinitionCollection siteFeatures = currentSite.FeatureDefinitions;

var features = from SPFeatureDefinition f in siteFeatures
where f.SolutionId.Equals(solutionId) && f.Scope == SPFeatureScope.Site
select f;

foreach (SPFeatureDefinition featureDefinition in features)
{
SPFeature foundFeature = featureCollection[featureDefinition.Id];

if (foundFeature == null)
currentSite.Features.Add(featureDefinition.Id, false, SPFeatureDefinitionScope.Site);
}
}

Friday, 8 July 2011

Redirecting userdisp.aspx to custom User Profile Page

Case
Because we are building a custom User Profile Page to display custom properties, we wanted to redirect the /_layouts/userdisp.aspx request to our custom LayoutsPage. This request is the default request of SharePoint to the built-in Profile Page.

Problem
The /_layouts/groups.aspx displays all groups in a collection. When you click on the groupname to display all members, it sends you to the /_layouts/userdisp.aspx which will redirect you to the correct /_layouts/people.aspx?MembershipGroupId.

Our /_layouts/userdisp.aspx should do the same, but how does SharePoint determine when it needs to show a group or user?

Solution
The solution could be found in the Microsoft.SharePoint.ApplicationPages.dll and original userdisp.aspx file.

In your SharePoint solution create a new application page. Make sure it's mapped to the /_layouts/ folder.

In your .aspx file
Add this control to the ContentPlaceHolder 'PlaceHolderMain':

[SharePoint:FormComponent id="UserListForm" TemplateName="UserListForm" ControlMode="Display" runat="server"/] (replace [ to make it a tag ;-)

In your .cs file
Add the following code to Page_Load:

int result = 0;
string url = "User/UserProfile.aspx?" + base.Request.QueryString.ToString();

if (base.Request.QueryString["ID"] != null)
{
if (!int.TryParse(base.Request.QueryString["ID"], out result) || (result <= 0))
{
throw new SPException(SPResource.GetString("InvalidQueryString", new object[] { "ID" }));
}
}
else
{
result = base.Web.CurrentUser.ID;

if (result <= 0)
{
throw new SPException(SPResource.GetString("InvalidQueryString", new object[] { "ID" }));
}

this.UserListForm.ItemId = result;
}

this.UserListForm.ListId = base.Web.SiteUserInfoList.ID;

SPListItem listItem = this.UserListForm.ListItem;
SPContentTypeId id = (SPContentTypeId)listItem["ContentTypeId"];

if (SPBuiltInContentTypeId.SharePointGroup.IsParentOf(id))
{
url = "people.aspx?MembershipGroupId=" + listItem.ID.ToString(CultureInfo.InvariantCulture);
string keyOrValueToEncode = base.Request.QueryString["Source"];

if (keyOrValueToEncode != null)
{
url = url + "&Source=" + SPHttpUtility.UrlKeyValueEncode(keyOrValueToEncode);
}
}

SPUtility.Redirect(url, SPRedirectFlags.RelativeToLayoutsPage, this.Context);

}

This should do the trick!

Wednesday, 2 February 2011

List Error when picking SiteTemplate - 0x81020012

Case
We were creating a new site definition for a customer build up with elements of the new SharePoint 2010 Features in Visual Studio 2010. At some point the solution started trowing errors when choosing the Site Template with the template picker:



A list, survey, discussion board, or document library with the specified title
already exists in this Web site. Please choose another title. 0x81020012


Problem
After analyzing the problem we discovered that VS2010 what deploying the Template Files to ‘14-hive \ Template \ Solution’ instead of ‘14-hive \ Template \ SiteTemplates \ Solution \ xml’. This way, since the webtemp_*.xml was deployed correctly, it was possible to choose the template in the template picker. When selected, SharePoint couldn’t find the onet.xml-file.

If this onet.xml-file is missing SharePoint throws this fuzzy ‘list, survey, discussion board, or document library with the specified title already exists’ message. You can test this by throwing away the file from your ‘14-hive \ Template \ SiteTemplates \ Solution \ xml’-directory.

What went wrong?
By default VS2010 knows the onet.xml-file should be located in the ‘14-hive \ Template \ SiteTemplates \ Solution \xml’-directory. Every file you add will be configured to be deployed in this path.

But when you include a new file, in this case my onet.xml, VS2010 sets the path to ‘{SharePointRoot} \ Template \ Solution \ SiteDefinition ’.

Solution
Go back to VS2010 and check the following settings in your site definition:

Onet.xml

  • Deployment Location:
    {SharePointRoot}\Template\SiteTemplates\Csolutions.SharePoint.SalesPortal.Site\Xml\
  • Deployment Type: TemplateFile

Webtemp_*.xml

  • Deployment Location:
    {SharePointRoot}\Template\SiteTemplates\Csolutions.SharePoint.SalesPortal.Site\Xml\
  • Deployment Type: TemplateFile

Re-deploy the solution and recreate the sitecollection with the correct template. This solved the problem for me.

Friday, 28 January 2011

Microsoft.SharePoint.ApplicationPages

So you want to create a silk-layed-out SharePoint Administration page? Then you need to reference the Microsoft.SharePoint.ApplicationPages.dll!

Problem
I was looking for the Microsoft.SharePoint.ApplicationPages assembly, but I couldn't reference it from the assembly cache. Apparently it isn't begin installed in the assembly bin, but in the _app_bin of your web application.

Solution
You can create a (web app undependent) reference to the dll from the following location:
SharePoint 2007: 12-hive\CONFIG\BIN
SharePoint 2010: 14-hive\CONFIG\BIN

Monday, 24 January 2011

Programmatically Set Master Page of Publishing Sites

Case
SharePoint Standard has a nice feature that allows configurating the Master Page on a Site Collection Level. This feature presents itself when you enabled the ‘SharePoint Server Publishing Infrastructure’-feature, found in the Site Collection Features.

Now you can use the ‘Site Master Page Settings’ (/_Layouts/ChangeSiteMasterPage.aspx) to set the Site Master Page and System Master Page.

Problem
But what does a Site and System Master Page mean? And how do you set these properties programmatically?


Solution

Site Master Page
This is the master page that is being used by publishing pages. This means that you use an other masterpage for views, etc.

System Master Page
This is the master page that is being used by system pages like settings.aspx, Forms and view pages like the view of document library pages.

The code
[Guid("00000000-0000-0000-0000-000000000000")] // Add Guid here
public class
StylingEventReceiver : SPFeatureReceiver
{
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
if (properties != null
&& properties.Feature != null
&& properties.Feature.Parent != null
&& properties.Feature.Parent.GetType() == typeof(SPSite))
{
SPSite site = (SPSite)properties.Feature.Parent;

using (SPWeb rootWeb = site.RootWeb)
{
rootWeb.AllowUnsafeUpdates = true;
rootWeb.MasterUrl = "/_catalogs/masterpage/v4.customer.master";
rootWeb.CustomMasterUrl = "/_catalogs/masterpage/V4.customer.master";
rootWeb.Update();
rootWeb.AllowUnsafeUpdates = false;
}
}
}

public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
{
if (properties != null
&& properties.Feature != null
&& properties.Feature.Parent != null
&& properties.Feature.Parent.GetType() == typeof(SPSite))
{
SPSite site = (SPSite)properties.Feature.Parent;

using (SPWeb rootWeb = site.RootWeb)
{
rootWeb.AllowUnsafeUpdates = true;
rootWeb.MasterUrl = "/_catalogs/masterpage/v4.master";
rootWeb.CustomMasterUrl = "/_catalogs/masterpage/v4.master";
rootWeb.Update();
rootWeb.AllowUnsafeUpdates = false;
}
}
}
}

Thursday, 10 June 2010

Explorer and test Webservices

Case

I needed to explorer and test a corporate webservice. I needed to know which functionalities the webservice delivers, what kind of parameters the webservice expected and with what kind of responses the webservice replies.

Problem

The webservice wasn't documented and before a wanted to try to make a custom application I looked for a more dynamic solution. I didn't have the time to write a good testing program...

Solution

I learned that the awnser was pretty easy. Just use this handy tool: http://www.codeplex.com/WebserviceStudio

It allows you to explorer webservices easily!

Thursday, 14 January 2010

The resource object with key 'NamexxxField' was not found

Normaly a solution deployment would copy important dll's, resource files etc. to the Global_Resources map in your (inetpub) web applications bin directory. Somehow one of my build SharePoint solutions didn't copied those file during deployment.

I recieved the following message

Exception Type: System.Web.HttpException Exception Message: The resource object with key 'NamexxxField' was not found.
I needed to execute the following command to fix the problem:

"C:\Program Files\Common Files\Microsoft Shared\web server
extensions\12\BIN\STSADM.exe" -o copyappbincontent
After that SharePoint had copied the files and my solution worked correctly, but my wsp needed futher investigation.

Source: http://software.sharepointsolutions.com/Community/t/75.aspx

Friday, 8 January 2010

Remove lost/broken Webparts

Previously, I retracted a solution from my web application. The consequence of this action was that I was not able to load the pages anymore. I recieved:

Error

An error occurred during the processing of . Could not load file or assembly 'Solution.WebParts, Version=1.0.0.0, Culture=neutral, PublicKeyToken=a7985c93d0151889' or one of its dependencies. The system cannot find the file specified.

In this case, the only thing you have to do is to remove the webpart. Removing the webpart in the webpart gallery doesn't solve this.

Solution:
Append ?Contents=1 to the webpart page's URL to display the Webpart Maintenance Page. On that page you can delete the malefactor.

Example: http://moss/default.aspx?contents=1

Thursday, 29 October 2009

The directory is not a subdirectory of the root directory. (Exception from HRESULT: 0x80070090)

Issue
When developing a new Site Column in XML I received: “The directory is not a subdirectory of the root directory. (Exception from HRESULT: 0x80070090)”.


Problem
Somehow the Site couldn’t create the basic Site Columns, etc. When exploring I noticed that one of my Solutions was giving an error. I redeployed it using the '-force' parameter.

Solution
I actually didn't find a solution, somehow retracting and deploying the solution solved my problem. If you found or know any other explanation please leave a message!

Thursday, 27 August 2009

Request for the permission of type XXX failed

During the creation of a new Web Application I had a bit of a problem. I forgot to change the trust level. I got exceptions from every webpart that looked like this example:

Exception in UserControl:
System.Security.SecurityException: Request for the permission of type 'Microsoft.SharePoint.Security.SharePointPermission, Microsoft.SharePoint.Security, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' failed. at Microsoft.SharePoint.ApplicationRuntime.SPVirtualPathProvider.GetCacheKey(String virtualPath) at Microsoft.SharePoint.Publishing.Internal.CmsVirtualPathProvider.GetCacheKey(String virtualPath) at System.Web.Compilation.BuildManager.GetCacheKeyFromVirtualPath(VirtualPath virtualPath, Boolean& keyFromVPP) at System.Web.Compilation.BuildManager.GetVPathBuildResultFromCacheInternal(VirtualPath virtualPath) at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath
virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile) at System.Web.UI.TemplateControl.LoadControl(VirtualPath virtualPath) at xxx.customclass.method() The action that failed was: Demand The type of the first permission that failed was: Microsoft.SharePoint.Security.SharePointPermission The Zone of the assembly that failed was: MyComputer

If you encounter this exception then go to the web.config in the folder of your web application:

C:\Inetpub\wwwroot\wss\VirtualDirectories\<webappdir>

Then change the <trust level=" - tag as shown below.

Change:
<trust level="WSS_Custom" originurl="">

to:
<trust level="Full" originurl="">