Posts Tagged ‘Snippet’
Posted on October 19, 2009 - by Rouslan Grabar
How to allow only Folder items to be created in the List root folder
Sometimes you need to prohibit creation of list items in the root folder of the list. For example, you invented some pretty looking, folder-based, issue cataloguing system, but end users create issues in list’s root folder no matter how hard you beg them not to.
Below you will find the code that looks into HttpContext for a “RootFolder” and “Type” parameters and makes use of SPItemEventProperties.Cancel property.
public class IssueItemEventReceiver : SPItemEventReceiver
{
private HttpContext _current;
public IssueItemEventReceiver()
{
_current = HttpContext.Current;
}
public override void ItemAdding(SPItemEventProperties properties)
{
using (SPSite site = new SPSite(properties.SiteId))
{
using (SPWeb web = site.OpenWeb(properties.RelativeWebUrl))
{
SPList list = web.Lists["Issues"];
string rootRelUrl = string.Format("{0}/{1}",
properties.RelativeWebUrl,
list.RootFolder);
bool isFolder = (_current.Request.Params["Type"] != null
&& _current.Request.Params["Type"] == "1");
bool isInRoot = (_current.Request.Params["RootFolder"] == rootRelUrl);
properties.Cancel = !(isFolder && isInRoot);
//// here you can redirect to your very own page in _layouts folder
//if (properties.Cancel)
//{
// SPUtility.Redirect("myFeatureFolderInLayoutsFolder/MyCustomErrorPage.aspx",
// SPRedirectFlags.RelativeToLayoutsPage | SPRedirectFlags.Trusted,
// _current);
//}
}
}
}
}
Posted on October 9, 2009 - by Rouslan Grabar
Move list item into a subfolder in the same list
Someone asked how to copy the list item into a subfolder on the same list. The code the guy provided that used SPListItem.CopyTo(url) did not work for him and was yelling the following:
Invalid URI: The format of the URI could not be determined.
The reason was the fact the guy used destination item property Url. This property is a relative Url, but the CopyTo method requires absolute URL.
Another caveat is that even if used properly, the method was throwing the following exception message:
Source item cannot be found. Verify that the item exist and that you have permission to read it.
Considering the fact that we are moving item the way to overcome this is to use this approach – please see the Powershell snippet below:
#this is p o w e r s h e l l code
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
#returns the SPSite at the specified URL
function getSPSite ([String]$webUrl=$(throw 'Parameter -webUrl is missing!'))
{
return New-Object Microsoft.SharePoint.SPSite("$webUrl");
}
$site = getSPSite($url) as [Microsoft.SharePoint.SPSite];
[Microsoft.SharePoint.SPWeb]$web = $site.OpenWeb("/website");
[Microsoft.SharePoint.SPList]$list = $web.Lists["listname"];
[Microsoft.SharePoint.SPListItem]$srcItem = $list.GetItemById(1);
[Microsoft.SharePoint.SPListItem]$destItem = $list.GetItemById(2);
[String]$srcUrl = $web.Url + "/" +$srcItem.Url;
#here we construct the destination URL for the item
[String]$destUrl = $web.Url + "/" +$destItem.Url + "/" + $srcItem.ID + "_.000";
[Microsoft.SharePoint.SPFile]$srcFile = $web.GetFile($srcUrl);
$srcFile.MoveTo($destUrl);

