<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5710148126712656048</id><updated>2011-09-09T12:05:38.146+01:00</updated><category term='Migration'/><category term='Moss'/><category term='Problems'/><category term='Google Ajax API'/><category term='Migrating'/><category term='CWEP Tricks'/><category term='ASP.Net Controls'/><category term='Moss search scope'/><category term='WCM SharePoint Demonds'/><title type='text'>Getting under the Point</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gettingunderthepoint.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>19</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-1361682648686994154</id><published>2010-01-28T09:29:00.002Z</published><updated>2010-01-28T10:09:12.918Z</updated><category scheme='http://www.blogger.com/atom/ns#' term='ASP.Net Controls'/><title type='text'>Creating Custom Controls - Back to basics</title><content type='html'>Sometimes you just need to stop and go back to the basics.&lt;br /&gt;&lt;br /&gt;Yesterday I had some problems with nested controls in a custom control that was added to a Web part. The nested controls were losing their post back information, in the end it came down to a forgotten Interface, the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx"&gt;INamingContainer&lt;/a&gt;. The INamingContainer is that small piece of magic that gives your composite control a new ID Namespace which uniquely identifies your control and all of its sub controls.&lt;br /&gt;It is also worth noting that you need to add the child controls to the collection before setting their values for the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.control.trackviewstate.aspx"&gt;TrackViewState()&lt;/a&gt; to be called, though you can do this manually.&lt;br /&gt;&lt;br /&gt;Now I am going back to my old reference books to see what else I have let slip.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-1361682648686994154?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=1361682648686994154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/1361682648686994154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/1361682648686994154'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2010/01/creating-custom-controls-back-to-basics.html' title='Creating Custom Controls - Back to basics'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-2206211491713028282</id><published>2009-07-22T17:59:00.002+01:00</published><updated>2009-07-22T18:15:36.614+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WCM SharePoint Demonds'/><title type='text'>Anonymous Access SharePoint WCM Site prompting for login in IE only.</title><content type='html'>Watch out for those SharePoint anonymous access demons, while a new site that I have been working on was going through testing on its way to UAT we encountered an odd bug where only IE 6-8 would request a login box when loading some pages, we traced this down to one Custom control that was pulling an item from a SharePoint list and displaying some images with their description.&lt;br /&gt;&lt;br /&gt;As this was not an issue in other browsers we concluded that it was not the control or a case that the images were not published (though we checked to be sure), after a long night and a few tufts of hair lost to frustration I had a look at the html output, there plain as day was the culprit, an image tag with no alt or source, I have come across this before and could kick myself for it but what happened was the developer simply fetched the value of the image field and rendered the html supplied by SharePoint. When no image Url is supplied SharePoint outputs a blank image tag like this &amp;lt;img src=”” alt=””&amp;gt;&amp;lt;/img&amp;gt;, this tag causes IE to try and authenticate the user(don’t know why never botherd to look any deeper).&lt;br /&gt;&lt;br /&gt;So the lesson learnt Don’t trust SharePoint’s Html it can be a Demond in disguise.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-2206211491713028282?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=2206211491713028282' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2206211491713028282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2206211491713028282'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/07/anonymous-access-sharepoint-wcm-site.html' title='Anonymous Access SharePoint WCM Site prompting for login in IE only.'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-5640275455592307007</id><published>2009-07-21T14:23:00.002+01:00</published><updated>2009-07-21T14:37:13.493+01:00</updated><title type='text'>SharePoint 2010 and the NDA</title><content type='html'>I have been lucky enough to be working with the next release of SharePoint 2010 through the TAP program and have wondered what I can and can’t say about it, Joel Oleson has recreantly posted a helpful blog in regards to what we can and can’t say(&lt;a href="http://www.sharepointjoel.com/Lists/Posts/Post.aspx?List=0cd1a63d-183c-4fc2-8320-ba5369008acb&amp;ID=243"&gt;What’s Up? NDA or NOT? Office 2010 Technical Preview vs. SharePoint 2010 Technical Beta&lt;/a&gt;), Till the NDA is lifted I won’t be saying much other than so far I have found 2010 to be looking really good and I can’t wait for it to move on to RTM.&lt;br /&gt;&lt;br /&gt;For those that are interested.&lt;br /&gt;My SharePoint 2010 environment is all beta/rc at the moment&lt;br /&gt;Windows Server 2k8 R2 RC hyper-v Host with Windows Server 2k8 R2 RC VMs&lt;br /&gt;With SQL 2008 running as the backend database on one.&lt;br /&gt;&lt;br /&gt;So far so good, look forward to sharing what I have found in the future.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-5640275455592307007?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=5640275455592307007' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/5640275455592307007'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/5640275455592307007'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/07/sharepoint-2010-and-nda.html' title='SharePoint 2010 and the NDA'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-4884265456312040384</id><published>2009-05-08T16:52:00.003+01:00</published><updated>2009-05-08T17:12:58.570+01:00</updated><title type='text'>Finding the language packs installed on a SharePoint Server</title><content type='html'>I spent a hour or sow looking for a way to find all the installed languages on a server so I could update one of the XML files via a feature (I will post later about  Installing a Theme across multiple front end servers targeting multiple languages).&lt;br /&gt;&lt;br /&gt;The file I want to modify was SPTHEMES that is located at TEMPLATE\LAYOUTS\{LCID}\SPTHEMES.XML, There is a unique file for each language. &lt;br /&gt;I thought that there must be a class in the OM that would allow me to get the installed languages. After diving in to the SPFarm object, digging in the NewSitePage class and a number of web searches while still getting no where I stumbled on the most simple class. (YaY for Reflector)&lt;br /&gt;&lt;br /&gt;SPRegionalSettings and its GlobalInstalledLanguages property.&lt;br /&gt;&lt;br /&gt;SPRegionalSettings.GlobalInstalledLanguages is a collection of SPLanguage objects.&lt;br /&gt;each SPLanguage object is a simple data object that contains DisplayName and a LCID propriety. &lt;br /&gt;&lt;br /&gt;so with this simple for loop I managed to avoid messing around with searching through the File system.&lt;br /&gt;&lt;br /&gt;foreach (SPLanguage language in SPRegionalSettings.GlobalInstalledLanguages)&lt;br /&gt;{&lt;br /&gt;  DoSomthingWith(language);&lt;br /&gt;}   &lt;br /&gt;&lt;br /&gt;Sometimes the simple solution takes the longest to find.&lt;br /&gt;Hope this helps someone.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-4884265456312040384?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=4884265456312040384' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/4884265456312040384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/4884265456312040384'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/05/finding-language-packs-installed-on.html' title='Finding the language packs installed on a SharePoint Server'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-5086570584194071738</id><published>2009-05-05T15:47:00.003+01:00</published><updated>2009-05-05T15:53:33.931+01:00</updated><title type='text'>A New SharePoint blogger</title><content type='html'>One of my bosses has started blogging about his experiences skinning SharePoint sites and the work he has done to create a simple CSS frame work that can be used &lt;a href="http://www.sharepointux.com/MyBlog/"&gt;Making SharePoint Beautiful&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;More than worth a look at some of the secreats behind the magic he has created.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-5086570584194071738?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=5086570584194071738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/5086570584194071738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/5086570584194071738'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/05/new-sharepoint-blogger.html' title='A New SharePoint blogger'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-7522882325502062362</id><published>2009-03-18T14:01:00.002Z</published><updated>2009-03-18T14:08:22.729Z</updated><title type='text'>SharePoint Best practices conference - UK</title><content type='html'>Looking forward to the SharePoint Best Practices Conference in London comming up this April &lt;br /&gt;&lt;br /&gt;for more info see &lt;a href="http://www.sharepointbestpractices.co.uk/ "&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-7522882325502062362?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=7522882325502062362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/7522882325502062362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/7522882325502062362'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/03/sharepoint-best-practices-conference-uk.html' title='SharePoint Best practices conference - UK'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-7459806081041810812</id><published>2009-03-05T17:55:00.004Z</published><updated>2009-03-05T18:00:52.493Z</updated><title type='text'>Twitter And Me</title><content type='html'>Well i have made the jump in to the Twitter pond you can find me at http://twitter.com/jcvivian not that there will be mutch looking at my blogging history :P&lt;br /&gt;&lt;br /&gt;I am trying out the Blu Client though TweetDeck and the like seem to be better clients i just cant bring my self to install yet another platform, I dont have java installed for the same resion.  &lt;br /&gt;&lt;br /&gt;John&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-7459806081041810812?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=7459806081041810812' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/7459806081041810812'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/7459806081041810812'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/03/twitter-and-me.html' title='Twitter And Me'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-7752965394773908427</id><published>2009-03-05T17:22:00.002Z</published><updated>2009-03-05T17:52:59.698Z</updated><title type='text'>FBA Login Page - Images not showing when user is Anonymous</title><content type='html'>I have been doing a lot of work with FBA and custom membership providers and here is something that is so simple but nearly caught me out.&lt;br /&gt;The Client was happy with the way the login worked but complained that the styling was different from the rest of the site. So one of our designers put together a Simple.Master based on the main master pages styling and a custom CSS.&lt;br /&gt;So we added this to our solution and deployed it to our staging environment.&lt;br /&gt;The login page loaded fine but neither the CSS file nor the images were being pulled through leaving the login page looking worse than before. At first thought I was a little confused as the CSS and the images were stored in a Layouts/{Project Name}/CSS and Images folder and worked fine once a user was logged in. Then I realised exactly where I had gone wrong, The Layouts folder is only accessible to authenticated users, this is not only expected but wanted. So as WSS is based on ASP.Net we can open a path to our CSS and Images folders to allow Anonymous users to see the files and only these files.&lt;br /&gt;We added the following to the Web.Config&lt;br /&gt;&lt;br /&gt;&amp;lt;location path="_layouts/{Project}/images"&amp;gt;&lt;br /&gt;&amp;lt;system.web&amp;gt;&lt;br /&gt;&amp;lt;authorization&amp;gt;&lt;br /&gt;&amp;lt;allow users="*"&amp;gt;&lt;br /&gt;&amp;lt;/allow&amp;gt;&lt;br /&gt;&amp;lt;/authorization&amp;gt;&lt;br /&gt;&amp;lt;/system.web&amp;gt;&lt;br /&gt;&amp;lt;location path="_layouts/{Project}/CSS"&amp;gt;&lt;br /&gt;  &amp;lt;system.web&amp;gt;&lt;br /&gt;    &amp;lt;authorization&amp;gt;&lt;br /&gt;      &amp;lt;allow users="*"&amp;gt;&lt;br /&gt;    &amp;lt;/allow&amp;gt;&lt;br /&gt;  &amp;lt;/authorization&amp;gt;&lt;br /&gt;&amp;lt;/system.web&amp;gt;&lt;br /&gt;&lt;br /&gt;It would have been possible to place the Images in the Images folder but I prefer to keep all Custom files in the layouts/{Project Name} format as it makes it easier for admins to track the changes our solution has made to their servers.&lt;br /&gt;Also to note there is nothing in these folders that would be need to be protected however there are some files in the layouts/{Project Name} that should only be available to authenticated so we could not just open up the entire Folder.&lt;br /&gt;&lt;br /&gt;Any way just something small that helped.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-7752965394773908427?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=7752965394773908427' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/7752965394773908427'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/7752965394773908427'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/03/fba-login-page-images-not-showing-when.html' title='FBA Login Page - Images not showing when user is Anonymous'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-2312276644604130006</id><published>2009-01-25T17:49:00.003Z</published><updated>2009-01-25T18:14:11.797Z</updated><title type='text'>Moving On</title><content type='html'>It has been a while since my last post.&lt;br /&gt;&lt;br /&gt;Thing have been really busy for me as I changed jobs in October.&lt;br /&gt;&lt;br /&gt;I am now working for &lt;a href="http://www.brightstarr.com"&gt;Brightstarr&lt;/a&gt; leading their SharePoint development team.&lt;br /&gt;&lt;br /&gt;BrightStarr concentrates more on the usability and look and feel customisations as opposed to the backend integration and Business layer side. Their aim is the make the users want to use SharePoint because it is fun and looks good. &lt;br /&gt;So the last few months I have had to brush up on my UI layer, Web 2.0 and what makes a website usable. All in all it has been a great few months and some of the projects that I have been working on really need a second look to see that it is really running on SharePoint with all its out of the box goodness.&lt;br /&gt;&lt;br /&gt;Well I hope I will get some time to post some of the Web 2.0 SharePoint things I have been up to with My Sites and some of the interesting front end web parts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-2312276644604130006?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=2312276644604130006' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2312276644604130006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2312276644604130006'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2009/01/moving-on.html' title='Moving On'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-6130492709065507440</id><published>2008-09-05T17:02:00.002+01:00</published><updated>2008-09-05T17:35:44.268+01:00</updated><title type='text'>Creating Custom Meeting Workspaces Site Definitions</title><content type='html'>My college was working on a project that needed to create a custom Meeting Workspace site definition.&lt;br /&gt;&lt;br /&gt;The simple answer would be to create a copy of the site definition and work from there&lt;br /&gt;However as quite often SharePoint is not quite so simple.&lt;br /&gt;&lt;br /&gt;The problem comes in the form of 3 web parts embedded in the MasterPage. These web parts check to see that the webTemplateId of the current SPWeb object is equal to 2 (which is the ID of the MPS templates In the webtemp.xml). These web parts then fail to render breaking the site.&lt;br /&gt;&lt;br /&gt;He had located the problem but was unable to find a acceptable workaround.&lt;br /&gt;1) He could modify the OotB MPS Site Definition (This is NOT acceptable practice)&lt;br /&gt;2) He could use a feature stapler to modify the Site Definition on creation(This would apply to all new Meeting Workspace across the Farm and not really practical given the project)&lt;br /&gt;3) he could remove the Web Parts and replace them with custom ones (the classic developer answer but never a practical one)&lt;br /&gt;&lt;br /&gt;None of these option were really viable for his project.&lt;br /&gt;&lt;br /&gt;So I asked him if he had thought of using a SPWebProvisioningProvider class.&lt;br /&gt;With a little testing we found that the SPWebProvisioningProvider does not change the WebTemplateID as the Site Definition used during the provisioning of the site is still the OotB MPS Definition and the Provisioner runs code After the site had been created.&lt;br /&gt;&lt;br /&gt;He can now create a Customised Meeting Workspace site definition.&lt;br /&gt;the SPWebProvisioningProvider class he is using is quite small as all it does is activate and deactivate a few features, this allows for easy modification of the features rather than having to recompile the provisioner should the client wish to change anything.&lt;br /&gt;&lt;br /&gt;Just something that popped up today :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-6130492709065507440?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=6130492709065507440' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/6130492709065507440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/6130492709065507440'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2008/09/creating-custom-meeting-workspaces-site.html' title='Creating Custom Meeting Workspaces Site Definitions'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-6151109158537990846</id><published>2008-09-05T11:35:00.003+01:00</published><updated>2008-09-05T12:49:06.819+01:00</updated><title type='text'>Creating and attaching Information Management Policies</title><content type='html'>I haven't posted anything for a while and here is something I meant to post&lt;br /&gt;Sorry for the formatting issues with the code Hope this Overview helps. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Background information about information Policies&lt;/span&gt;&lt;br /&gt;Polices are defined in xml markup&lt;br /&gt;A skeleton Policy described in xml.&lt;br /&gt;&lt;samp&gt;&lt;br /&gt;&amp;lt;p:Policy xmlns:p="office.server.policy" id="" local="true"&amp;gt;&lt;br /&gt;&amp;lt;p:Name&amp;gt;&amp;lt;/p:Name&amp;gt;&lt;br /&gt;&amp;lt;p:Description&amp;gt;&amp;lt;/p:Description&amp;gt;&lt;br /&gt;&amp;lt;p:Statement&amp;gt;&amp;lt;/p:Statement&amp;gt;&lt;br /&gt;&amp;lt;p:PolicyItems&amp;gt;&lt;br /&gt;&amp;lt;p:PolicyItem featureId=""&amp;gt;&lt;br /&gt; &amp;lt;p:Name&amp;gt;&amp;lt;/p:Name&amp;gt;&lt;br /&gt; &amp;lt;p:Description&amp;gt;&amp;lt;/p:Description&amp;gt;&lt;br /&gt; &amp;lt;p:CustomData&amp;gt;&lt;br /&gt;   &amp;lt;data&amp;gt;&lt;br /&gt;   &amp;lt;/data&amp;gt;&lt;br /&gt; &amp;lt;/p:CustomData&amp;gt;&lt;br /&gt;&amp;lt;/p:PolicyItem&amp;gt;&lt;br /&gt;&amp;lt;/p:PolicyItems&amp;gt;&lt;br /&gt;&amp;lt;/p:Policy&amp;gt;&lt;br /&gt;&lt;/samp&gt;&lt;br /&gt;Note the Policy id attribute takes a string that uniquely identifies this policy&lt;br /&gt;Example “Microsoft.Office.RecordsManagement.Policy”&lt;br /&gt;&lt;br /&gt;Each policy contains a number of Policy Items&lt;br /&gt;A Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration Policy Item defined in xml.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;p:PolicyItem featureId="Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration"&amp;gt;&lt;br /&gt;&amp;lt;p:Name&amp;gt;Expiration&amp;lt;/p:Name&amp;gt;&lt;br /&gt;&amp;lt;p:Description&amp;gt;&lt;br /&gt;Automatic scheduling of content for processing, and expiry of content&lt;br /&gt;that has reached its due date.&lt;br /&gt;&amp;lt;/p:Description&amp;gt;&lt;br /&gt;&amp;lt;p:CustomData&amp;gt;&lt;br /&gt;&amp;lt;data&amp;gt;&lt;br /&gt;&amp;lt;formula id="Microsoft.Office.RecordsManagement.PolicyFeatures.Expiration.Formula.BuiltIn"&amp;gt;&lt;br /&gt;&amp;lt;number&amp;gt;0&amp;lt;/number&amp;gt;&lt;br /&gt;&amp;lt;property&amp;gt;Created&amp;lt;/property&amp;gt;&lt;br /&gt;&amp;lt;period&amp;gt;days&amp;lt;/period&amp;gt;&lt;br /&gt;&amp;lt;/formula&amp;gt;&lt;br /&gt;&amp;lt;action type="workflow" id="" /&amp;gt;&lt;br /&gt;&amp;lt;/data&amp;gt;&lt;br /&gt;&amp;lt;/p:CustomData&amp;gt;&lt;br /&gt;&amp;lt;/p:PolicyItem&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;These Policy items are used to configure the Policy Features for this Policy.&lt;br /&gt;See &lt;a href="http://www.tonstegeman.com/Blog/Lists/Posts/Post.aspx?List=70640fe5-28d9-464f-b1c9-91e07c8f7e47&amp;amp;ID=22"&gt;Stegeman Blog&lt;/a&gt; for more information on how to create your own custom Policy Features.&lt;br /&gt; &lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Managing Information Management Policies via Code&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Creating a Information Management Policy&lt;/span&gt;&lt;br /&gt;The Policy needs to be defined in xml markup. This definition can then be passed to the&lt;br /&gt;Policy.ValidateManifest () method that will validate the XML against the Policy Xml schema.&lt;br /&gt;Once the policy has been validated it can be added to the policy collection using the PolicyCollection.Add () method&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;code&gt;&lt;br /&gt;string xmlManifest = generatePolicyXML(policyId,&lt;br /&gt;                                                                       Name,&lt;br /&gt;                                 string.Empty,&lt;br /&gt;                                 string.Empty,&lt;br /&gt;                                 FieldName,&lt;br /&gt;                                 WorkflowAssociationId);&lt;br /&gt;&lt;br /&gt;Policy.ValidateManifest(xmlManifest);&lt;br /&gt;&lt;br /&gt;PolicyCollection.Add(site, xmlManifest);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In this example I am generating the XML Manifest using a method and passing it various parameters once we have the xmlManifest string populated I pass it for validation to the Policy.ValidateManifest (string) method (Note this will through an exception that explains why it is unable to validate the XML) and then I add it to the Site via the PolicyCollection.Add (SPSite, string)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Retrieving a Information management Policy for a Site&lt;/span&gt;&lt;br /&gt;To retrieve an Information Management Policy for a site we need to first get the Policy Catalog for that site and then retrieve the Policy from the catalog. We retrieve the Policy Catalog by creating a new PolicyCatalog object passing the SPSite object to the Constructor. We can then access the PolicyList collection of the new PolicyCatalog object to retrieve the Policy.&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;code&gt;&lt;br /&gt;using (SPSite site = new SPSite(siteId))&lt;br /&gt;{&lt;br /&gt;PolicyCatalog policyCatalog = new PolicyCatalog(site);&lt;br /&gt;Policy returnPolicy = policyCatalog.PolicyList[policyId];&lt;br /&gt; &lt;br /&gt;if (returnPolicy != null)&lt;br /&gt;{&lt;br /&gt;//Code to run aganst the new Policy Object …&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In this example I am creating the SPSite object from a Guid that is the Id for the site. Once I have the site object I pass it to the PolicyCatalog Constructor to create a new PolicyCatalog object that relates to the site. Once I have the PolicyCatalog for the site I can use its PolicyList Collection to retrieve a Policy using the Policy’s Id. Note that if a Policy does not exist with the supplied Policy ID then the Collection returns null so I check the returned Policy is not null before running code against it.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Attaching a Information Management Policy to a Content Type&lt;/span&gt;&lt;br /&gt;To attach a Site Information Management Policy to a Content Type, we first need to fetch the site policy and then attach it to the Content Type using the Policy.CreatePolicy () passing it the Policy and Content Type.&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;code&gt;&lt;br /&gt;using (SPWeb web = site.OpenWeb())&lt;br /&gt;{&lt;br /&gt;SPContentType contentType = web.ContentTypes[contentTypeId];&lt;br /&gt;if (contentType != null)&lt;br /&gt;{&lt;br /&gt;Policy.CreatePolicy(contentType, policy);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;In this example I fetch the SPWeb Object and use it to fetch the Content Type with the supplied Content Type ID. Once I have the Content Type I check that that the returned value is not null and then I pass it to the Policy.CreatePolicy (SPContentType, Policy). Note a content type can only have one policy attached at any time and it may be best to check that the content type does not have a policy attached by testing that the Policy.GetPolicy (SPContentType) method returns null and not a Policy object else the Policy.CreatePolicy () method will through an exception.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Configuring the Expiration PolicyFeature&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Creating an Expiration PolicyFeature Formula&lt;/span&gt;&lt;br /&gt;The Expiration PolicyFeature has a custom data node that defines the when the item will expire. This is stored in the formula node.&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;formula id="Microsoft.Office.RecordsManagement.PolicyFeatures.&lt;br /&gt;Expiration.Formula.BuiltIn"&amp;gt;&lt;br /&gt; &amp;lt;number&amp;gt;0&amp;lt;/number&amp;gt;&lt;br /&gt; &amp;lt;property&amp;gt;ERMExpiryDate&amp;lt;/property&amp;gt;&lt;br /&gt; &amp;lt;period&amp;gt;days&amp;lt;/period&amp;gt;&lt;br /&gt;&amp;lt;/formula&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;The Formula id Points the out of the box, built in formula&lt;br /&gt;Number refers to the number of units to append to the date&lt;br /&gt;Property refers to the Field in the item to retrieve the date from&lt;br /&gt;Period refers to the unit that the number represents.&lt;br /&gt;There are 3 period options: days, months, years.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-style: italic;"&gt;Creating an Expiration PolicyFeature Action that calls a Workflow&lt;/span&gt;&lt;br /&gt;The Expiration PolicyFeature has a custom data node that defines what action should be taken once the Item has expired. We want to start off a workflow so our XML looks like this&lt;br /&gt;&lt;br /&gt;Example&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;action type="workflow" id="feebb1e3-68f0-40ce-8dc0-e297814680ab" /&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;I define the type of action to be workflow and set the id to point the ParentAssociationId of the Content Types Workflow Association.&lt;br /&gt;Setting this ID is one of the resigns that have not been able to get around in CAML.&lt;br /&gt;This Guid is neither the Workflow Associations Id nor the Workflow Template ID but the Parent Association Id of the Workflow association.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Resources&lt;/b&gt;&lt;br /&gt;&lt;b style="font-style: italic;"&gt;MSDN&lt;/b&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms499244.aspx"&gt;Introduction to Information Management Policy&lt;/a&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms580309.aspx"&gt;Policy Schema Overview&lt;/a&gt;&lt;br /&gt;&lt;b style="font-style: italic;"&gt;Private Blogs&lt;/b&gt;&lt;br /&gt;&lt;a href="http://www.tonstegeman.com/Blog/Lists/Posts/Post.aspx?List=70640fe5-28d9-464f-b1c9-91e07c8f7e47&amp;amp;ID=22"&gt;MOSS Custom policies part 1 - Creating a custom information management policy&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-6151109158537990846?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=6151109158537990846' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/6151109158537990846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/6151109158537990846'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2008/09/creating-and-attaching-information.html' title='Creating and attaching Information Management Policies'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-1484020466152784854</id><published>2008-01-16T16:41:00.000Z</published><updated>2008-01-16T16:42:22.045Z</updated><title type='text'>SPFieldCollection indexer (Field[string]) Vs SPFieldCollection. GetField(string)</title><content type='html'>The Question can be asked don’t they do the same thing and reading the SDK doesn’t clear that up (see http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spfieldcollection.aspx )&lt;br /&gt;So a bit of work with Reflector and the difference becomes apparent &lt;br /&gt;&lt;br /&gt;The Indexer calls the internal method GetFieldByDisplayName(strDisplayName, true)&lt;br /&gt;Which in turn accesses the Display Name Hashtable using the parameter as the key value DisplayNameDict[strDisplayName];&lt;br /&gt;(Note the second Pramater of GetFieldByDisplayName is a bool which sets if the method will throw any exceptions)&lt;br /&gt;GetField(string) calls GetField(strName, true) which in turn will call GetFieldByInternalName(strName, false) which accesses the Internal Name Hashtable using the parameter as the key value InternalNameDict[strName] if this fails to return a value it accesses the InternalNameWithPrefixDict Hashtable. If GetFieldByInternalName fails to return a value GetField will make a call to GetFieldByDisplayName(strName, false)&lt;br /&gt;&lt;br /&gt;In practice how does this help&lt;br /&gt;The Indexer only works with Display Names while the GetField() will look for the internal name first but if it can’t find a field it will then try the parameter as the display name. This matches up nicely with the ContainsField(string) method as this method will return true if the string is found as ether a display name or a internal name. Using this we have a nice way of avoiding unnecessary exception handling when accessing List data &lt;br /&gt;&lt;br /&gt;Eg&lt;br /&gt;if (item.Fields.ContainsField(_fieldName))&lt;br /&gt;{&lt;br /&gt;  holderstring = item[_fieldName].ToString();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Not checking to see if the field exists can cause a System.NullReferenceException - Object reference not set to an instance of an object on the ToString() method&lt;br /&gt;&lt;br /&gt;Note there is also a GetFieldByInternalName(string) which will only call GetFieldByInternalName(strName, false)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-1484020466152784854?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=1484020466152784854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/1484020466152784854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/1484020466152784854'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2008/01/spfieldcollection-indexer-fieldstring.html' title='SPFieldCollection indexer (Field[string]) Vs SPFieldCollection. GetField(string)'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-2203725585331839487</id><published>2008-01-16T15:43:00.001Z</published><updated>2008-09-02T21:40:37.071+01:00</updated><title type='text'>Been a while</title><content type='html'>It has been a while (6 months) since my last post and in that time I have acquired ownership of some rather messy projects (Please I am begging people don’t modify out of the box files even if you think you know what you are doing because most likely YOU DONT …. ok maybe Application.master and the like but then again only if absolutely necessary and you and your client understand what Microsoft has to say &lt;a href="http://blogs.msdn.com/sharepoint/archive/2007/10/30/kb-944105-how-to-customize-application-pages-in-the-layouts-folder-in-wss-3-0-and-moss-2007.aspx"&gt;http://blogs.msdn.com/sharepoint/archive/2007/10/30/kb-944105-how-to-customize-application-pages-in-the-layouts-folder-in-wss-3-0-and-moss-2007.aspx&lt;/a&gt; ) and passed my MCTS - WSS 3.0 Application Development gotten engaged and learnt a lot about WSS and MOSS and to be honest ASP.NET&lt;br /&gt;&lt;br /&gt;I will try and Blog all of what I have discovered and where I went badly wrong over the next few months and return what I can to the SharePoint community. &lt;br /&gt;Hope to post more as time goes on :)&lt;br /&gt;&lt;br /&gt;PS I would like to see more internet facing WSS 3/Moss sites on the web they are easy to develop and even easier to maintain for the non technical minded.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-2203725585331839487?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=2203725585331839487' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2203725585331839487'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2203725585331839487'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2008/01/been-while.html' title='Been a while'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-6636898765168926483</id><published>2007-07-17T16:15:00.000+01:00</published><updated>2007-07-17T16:26:49.666+01:00</updated><title type='text'></title><content type='html'>Creating a New My Sites or adding My Sites to a Moss Portal&lt;br /&gt;The other day I had to add My Sites to a client Moss Site&lt;br /&gt;&lt;br /&gt;Firstly create a My Sites Web Application&lt;br /&gt;Central Administration &gt; Application Management &gt; SharePoint Web Application Management: &lt;br /&gt;Create or extend Web application&lt;br /&gt;&lt;br /&gt;Then create a My Site Host Site Collection&lt;br /&gt;Central Administration &gt; Application Management &gt; SharePoint Site Management: &lt;br /&gt;Create site collection&lt;br /&gt;Remember to set the site template as Enterprise&gt;My Site Host&lt;br /&gt;&lt;br /&gt;Now add a managed path if you don’t plan to use Sites as your location&lt;br /&gt;Central Administration &gt; Application Management &gt; SharePoint Web Application Management: &lt;br /&gt;Define managed paths&lt;br /&gt;Add your Location as a wildcard path.&lt;br /&gt;Next go in to your SSP&lt;br /&gt;User Profiles and My Sites: My Site settings&lt;br /&gt;Change the &lt;br /&gt;Personal Site Services: to your new Web Application&lt;br /&gt;And change&lt;br /&gt;Personal Site Location: to your new location you defined earlier&lt;br /&gt;&lt;br /&gt;And there you have it a new My Sites.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-6636898765168926483?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=6636898765168926483' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/6636898765168926483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/6636898765168926483'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2007/07/creating-new-my-sites-or-adding-my.html' title=''/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-858108651555963909</id><published>2007-07-09T14:52:00.000+01:00</published><updated>2007-07-09T15:40:55.905+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Moss search scope'/><category scheme='http://www.blogger.com/atom/ns#' term='Google Ajax API'/><category scheme='http://www.blogger.com/atom/ns#' term='CWEP Tricks'/><title type='text'>Adding Google as a search scope</title><content type='html'>Well the title is prehaps miss leading but you can trick MOSS in to using Google as a search scope.&lt;br /&gt;&lt;br /&gt;Firstly how do we get google working with in a Moss site&lt;br /&gt;As Google is droping thier Web service api (which was limated to 1000 quires a day) and are promoting thier Ajax API i will describe how to use the Ajax API.&lt;br /&gt;We will use a CWEP (Content Editor Web Part) and drop some custom code in to the Source section.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;P&gt;&amp;lt;link href="http://www.google.com/uds/css/gsearch.css" type="text/css" rel="stylesheet"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script src="http://www.google.com/uds/api?file=uds.js&amp;amp;amp;v=1.0&amp;amp;key=REPLACE_ME" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script language="Javascript" type="text/javascript"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&amp;lt;![CDATA[&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; function OnLoad() {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create a search control&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var searchControl = new GSearchControl();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add in a full set of searchers&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchControl.addSearcher(new GwebSearch());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchControl.addSearcher(new GvideoSearch());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchControl.addSearcher(new GblogSearch());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchControl.addSearcher(new GnewsSearch());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchControl.addSearcher(new GbookSearch());&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // draw in tabbed layout mode&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var drawOptions = new GdrawOptions();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; drawOptions.setDrawMode(GSearchControl.DRAW_MODE_TABBED);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchControl.draw(document.getElementById("search_control_tabbed"), drawOptions);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Execute an inital search&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; searchControl.execute(cleanup(getQval("k")));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; GSearch.setOnLoadCallback(OnLoad);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //]]&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function cleanup(str)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str = str.replace(/%22/ig, "\"");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str = str.replace(/\+/ig, " ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str = str.replace(/%20/ig, " ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; str = str.replace(/%2B/ig, "+");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return str;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;function getQval(name)&lt;BR&gt;{&lt;BR&gt;var m, Q = window.location.search.substring(1);&lt;BR&gt;if ('' != Q)&lt;BR&gt;{&lt;BR&gt;var re = new RegExp(escape(name) + '=([^&amp;amp;$]+)');&lt;BR&gt;if (m = Q.match(re))&lt;BR&gt;return m[1];&lt;BR&gt;else return '';&lt;BR&gt;}&lt;BR&gt;return '';&lt;BR&gt;}&lt;/P&gt;&lt;br /&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;BR&gt;&amp;lt;div class="search-control" id="search_control_tabbed"&amp;gt;Loading&amp;lt;/div&amp;gt;&lt;BR&gt;&amp;lt;div id="error"&amp;gt;&amp;lt;/div&amp;gt;&lt;/P&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Replace the REPLACE_ME with your google API key which you can get here&lt;br /&gt;http://code.google.com/apis/ajaxsearch/signup.html&lt;br /&gt;NOTE espaly for corprate clients they must read and approve of the tearms and conditions in relation to Google's API key&lt;br /&gt;&lt;br /&gt;The Google part of the code is in the OnLoad()&lt;br /&gt;and you should be able to easly modfy it to your own needs just explor the API&lt;br /&gt;&lt;br /&gt;the rest of the fuctions are there to tokenise the URL string so make the search work from a search scope&lt;br /&gt;the cleanup(str) fuction is used to reformat the URL token in to plain text.&lt;br /&gt;&lt;br /&gt;the getQval(name) Gets the url tokens for the search string. Since i am just lazy and not much of a javascript programer this is just a cut and past from this Forum all credit goes to RobB and Michael Winter.&lt;br /&gt;http://www.thescripts.com/forum/thread149745.html&lt;br /&gt;&lt;br /&gt;now you have a google search webpart&lt;br /&gt;go to the Search colection in your portal&lt;br /&gt;Add two pages one for Google Search and one for Google Search Results.&lt;br /&gt;Add these pages to the relative tabs.&lt;br /&gt;Drop a Cwep whith the above code.&lt;br /&gt;you now have a search page and a results page that contain a Google search web part&lt;br /&gt;&lt;br /&gt;now how to get Moss search scopes to point the results here&lt;br /&gt;&lt;br /&gt;go to search scopes ehter in the SSP or at the toplvl of the site colection(recomended for this method)&lt;br /&gt;Create a display groop and call it Google Search Group (or your own name)&lt;br /&gt;Creat a search scope called Google Search that is atached to Search Dropdown and Google Search Group that uses a custon search results page. Point to your newly created Google search results Page were you added the Cwep.&lt;br /&gt;&lt;br /&gt;add a rule that will not search anywere (point it to the google search page you created for a minimal search)&lt;br /&gt;&lt;br /&gt;now you will have a google search in your defauld search dropdown and any search placed in there will open your Google Search Results page which will display the search results in the Cwep.&lt;br /&gt;&lt;br /&gt;one last thing to fix&lt;br /&gt;&lt;br /&gt;go edit page on your Google search page and go Modfy sheard webpart on the Search box&lt;br /&gt;Hide the search dropdown and under Mics change the results page to your new Google Search Results and change the Scope (txt box just below) to Google Search Group.&lt;br /&gt;repeat these steps on your Google Search Resluts page&lt;br /&gt;&lt;br /&gt;sorry i was in a hurry with this post :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-858108651555963909?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=858108651555963909' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/858108651555963909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/858108651555963909'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2007/07/adding-google-as-search-scope.html' title='Adding Google as a search scope'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-3025778561697813272</id><published>2007-06-18T09:02:00.000+01:00</published><updated>2007-06-18T10:14:56.238+01:00</updated><title type='text'>Adding a document to a Document library</title><content type='html'>Here is one that stumped me for a while&lt;br /&gt;&lt;br /&gt;One of my fellow developers had a web part that needed to convert a xml file to a pdf and then add the pdf to a document library . Well the conversion worked and everything was fine except he couldn’t workout how to get the pdf in to a document library. &lt;br /&gt;There are no overrides on the .Add() method of the SPListItemCollection Class that take File in to account, the .File propriety is only a get and we didn’t know what Field to use. Evan the SPDocumentLibrary class was of no use.&lt;br /&gt;&lt;br /&gt; After a bit of head scratching we found that we needed to use the list.Rootfolder.Files.add &lt;br /&gt;&lt;br /&gt;This is in the SDK on one line in one of the related classes but I can’t find it again  &lt;br /&gt;&lt;br /&gt;Hopefully this post will help anyone else that gets snagged on this simple process &lt;br /&gt;&lt;br /&gt;A useful tip&lt;br /&gt;&lt;br /&gt;The Add method of the SPFilecolection returned a SPFile object&lt;br /&gt;So you can use this code to add your relevant meta data&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;SPFile newFile =  list.Rootfolder.Files.add( fileURL, fileStream);&lt;br /&gt;SPListItem fileItem = newFile.Item;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Hope that help&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-3025778561697813272?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=3025778561697813272' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/3025778561697813272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/3025778561697813272'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2007/06/adding-document-to-document-library.html' title='Adding a document to a Document library'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-2548966207164362336</id><published>2007-06-12T15:53:00.000+01:00</published><updated>2007-06-12T16:01:06.961+01:00</updated><title type='text'>Noooo SharePoint Blogs is down</title><content type='html'>SharePoint Blogs is down...&lt;br /&gt;One of the best resorces bor a bumbling MOSS newbee developers like my self&lt;br /&gt;But there is light at the end of the tunnel as it is all is not lost&lt;br /&gt;Thanks to Andrew Connell posting info on the problem&lt;br /&gt;&lt;a href="http://andrewconnell.com/blog/archive/2007/06/08/6059.aspx"&gt;SharePointBlogs.com public service announcement&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Heres to hoping you will be back up and running soon&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-2548966207164362336?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=2548966207164362336' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2548966207164362336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/2548966207164362336'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2007/06/noooo-sharepoint-blogs-is-down.html' title='Noooo SharePoint Blogs is down'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-936827795701148367</id><published>2007-06-11T11:40:00.000+01:00</published><updated>2007-06-11T15:07:50.774+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Moss'/><category scheme='http://www.blogger.com/atom/ns#' term='Migrating'/><category scheme='http://www.blogger.com/atom/ns#' term='Problems'/><category scheme='http://www.blogger.com/atom/ns#' term='Migration'/><title type='text'>Stsadm export / import comand Errors to catch us</title><content type='html'>Migrating a sub site from one location to another within a single Site Collection.&lt;br /&gt;&lt;br /&gt;After a short search you will find that most places point you towards Stsadm.exe -export / import and most of these tuts and How to’s are complete so no need to Blog it again (besides I could not do half as good a job)  But what I want to highlight is errors that I have come across when using the commands that I can’t find answers to&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Firstly the size of the sub site&lt;/u&gt;&lt;br /&gt;When using stsadm.exe export the exported data is not written to destination disk till after the export is complete so if the sub site is larger than the free space on the system disk the export will fail.&lt;br /&gt;Not much can be done around this one you can try reduce the amount of information exported by using the –versions command or create your own migration tool using the API’s&lt;br /&gt;If you know any good way around this please add a comment.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Next Lists with e-mail address &lt;/u&gt;&lt;br /&gt;If a list has an attached incoming email address and the Portal incoming email settings Directory Management Service is set to yes. The import fails as it can’t create the email address as it all ready exists short of removing all e-mail support from these lists and redoing the export and import then add email association to the newly imported lists&lt;br /&gt;Best way I have found is to drop all list email association and then do the export and import then add the associations to the new lists.&lt;br /&gt;If you know any good way around this please add a comment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-936827795701148367?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=936827795701148367' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/936827795701148367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/936827795701148367'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2007/06/stsadm-export-import-comand-errors-to.html' title='Stsadm export / import comand Errors to catch us'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5710148126712656048.post-5519938020051160030</id><published>2007-06-11T10:40:00.000+01:00</published><updated>2007-06-11T11:39:06.677+01:00</updated><title type='text'>Lets start exposing my lack of anything</title><content type='html'>Well i read somewere that app developers should have a blog (evan if they have nothing usefull to say) so here are my ramblings.&lt;br /&gt;This blog is about MOSS 2007. I have only started on MOSS and have a measly 1 month of it behind me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5710148126712656048-5519938020051160030?l=gettingunderthepoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5710148126712656048&amp;postID=5519938020051160030' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/5519938020051160030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5710148126712656048/posts/default/5519938020051160030'/><link rel='alternate' type='text/html' href='http://gettingunderthepoint.blogspot.com/2007/06/lets-start-exposing-my-lack-of-anything.html' title='Lets start exposing my lack of anything'/><author><name>John Vivian</name><uri>http://www.blogger.com/profile/11722138329637670027</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
