<?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-11919785</id><updated>2012-01-28T07:24:30.814-08:00</updated><title type='text'>The SharingPoint</title><subtitle type='html'>Tips, Tricks and General Musings on Microsoft Sharepoint Portal Server and Windows Sharepoint Services.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default?start-index=101&amp;max-results=100'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>135</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-11919785.post-5858106211709134219</id><published>2007-06-09T15:56:00.000-07:00</published><updated>2007-06-09T15:58:36.034-07:00</updated><title type='text'>Pinned: New URL for The SharingPoint Blog</title><content type='html'>It seems as if many people are still not aware that this blog has moved. So, for all of you that still use this address and wonder why I haven't posted in, like, forever, head on over to &lt;a href="http://www.binarywave.com/blogs/eshupps"&gt;http://www.binarywave.com/blogs/eshupps&lt;/a&gt; for the latest SharingPoint goodness. For those that use the FeedBurner subscription, no worries - it has already been updated.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-5858106211709134219?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/5858106211709134219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=5858106211709134219' title='289 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5858106211709134219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5858106211709134219'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/06/pinned-new-url-for-sharingpoint-blog.html' title='Pinned: New URL for The SharingPoint Blog'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>289</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-5825125519797746004</id><published>2007-05-04T09:14:00.000-07:00</published><updated>2007-05-04T09:15:39.990-07:00</updated><title type='text'>Securing Application Pages in SharePoint 2007</title><content type='html'>Anonymous security in SharePoint 2007 is more of an art than an exact science, it seems.  Although drastically improved from 2003, there are still some gaps in the security model which need to be plugged (and some that need to be opened) for public-facing SharePoint sites.  One of the most glaring examples is the List View application page (12\TEMPLATE\LAYOUTS\viewlsts.aspx) which is accessible by every user with read permissions.  While not technically a security risk - there isn't much a user can do from this page without sufficient access rights - it may expose more information to anonymous users than is acceptable.&lt;br /&gt;&lt;br /&gt;To work around this issue, add code to the individual application page(s) to check if the user is authenticated and, if not, redirect the user to the Access Denied page.  Insert the following script at the top of the page (before or after the page declarations and registrations):&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt; runat="server"&gt;    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;protected void Page_PreInit(object sender, EventArgs e)    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;{        &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   try        &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   {            string sUserName = SPContext.Current.Web.CurrentUser.LoginName;        }&lt;/em&gt;&lt;br /&gt;&lt;em&gt;   catch        &lt;/em&gt;&lt;br /&gt;&lt;em&gt;   {            this.Response.Redirect("/_layouts/accessdenied.aspx");        }    &lt;/em&gt;&lt;br /&gt;&lt;em&gt;}&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt; / script &gt;&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;The above code attempts to assign the user login name to a string variable.  If the operation fails, which it will if the user is not authenticated, the catch statement redirects the user to the default access denied page.  Once the code is placed on a page in the /_layouts directory, it will effectively be hidden from anonymous users.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-5825125519797746004?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/5825125519797746004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=5825125519797746004' title='262 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5825125519797746004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5825125519797746004'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/05/securing-application-pages-in.html' title='Securing Application Pages in SharePoint 2007'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>262</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-284785125094652922</id><published>2007-05-04T09:13:00.000-07:00</published><updated>2007-05-04T09:14:03.151-07:00</updated><title type='text'>Anonymous Search Results in WSS v3</title><content type='html'>When configuring WSS v3 (2007) for a public facing web site there are a number of steps to take to insure anonymous users don't have access to areas they shouldn't - removing default lists, modifying application pages to hide pulic views, locking down mysites, etc. - but there is one page that is absolutely necessary for everyone to access: osssearchresults.aspx.  This page presents the list of search results and is the de facto target location for WSS search controls.&lt;br /&gt;&lt;br /&gt;By default, viewing this page requires a user to be authenticated to the server.  This can create a problem when your site definition includes the basic search control as it will attempt to render all search results on this page.  To remedy this situation, locate the following text at the top of the file (inside the &lt; % @ Page ... /&gt; declaration) and remove it:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Inherits="Microsoft.SharePoint.WebControls.LayoutsPageBase"&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;This setting determines the inheritance of the page from the generic application page base class; however, it is not required for the page to function.  Anonymous uers will be able to view the page without having to login and search results will continue to be security trimmed so users without proper permissions will be unable to view restricted items.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-284785125094652922?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/284785125094652922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=284785125094652922' title='430 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/284785125094652922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/284785125094652922'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/05/anonymous-search-results-in-wss-v3.html' title='Anonymous Search Results in WSS v3'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>430</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-6806776338275525354</id><published>2007-05-03T08:43:00.000-07:00</published><updated>2007-05-03T08:45:01.537-07:00</updated><title type='text'>SharePoint 2007 RSS Aggregator Web Part</title><content type='html'>One of the most common requirements we have these days is to display RSS feeds on WSS/MOSS sites inside of a web part.  Most users want the ability to see just a list of article links, sorted by date, from multiple feed sources - a collection of technology blogs or all the official SharePoint blogs, for example.&lt;br /&gt;&lt;br /&gt;There are several free utilities for performing RSS aggregation in SharePoint - inlcuding those that come out of the box with 2007 - but none of them work the way that I needed them to (in fact, I couldn't get the included web parts to work at all in WSS).  So I put together a basic RSS Aggregation web part that fits the bill.&lt;br /&gt;&lt;br /&gt;The functionality is really quite simple - supply the web part with a semi-colon delimited list of feed URL's, set a few parameters (like number of listings per feed, total number of listings, alternate stylesheet, etc.) and drop it onto a page.  The web part will display a list of links from each feed source sorted by publish date in descending order.  The formatting is controlled by a set of base and alternate styles that can be included in custom stylesheet or integrated with your base site definition styles.&lt;br /&gt;&lt;br /&gt;You can download the RssAggregator web part here: &lt;a href="http://www.binarywave.com/products/downloads/Free%20Utilities/BinaryWave.RssAggregator.zip"&gt;http://www.binarywave.com/products/downloads/Free%20Utilities/BinaryWave.RssAggregator.zip&lt;/a&gt;.  The zip file contains the Visual Studio 2005 solution with full source code (written in C#) and a readme file with setup and configuration instructions.  Post any issues or questions as comments to &lt;a href="http://www.binarywave.com/blogs/eshupps/Lists/Posts/Post.aspx?ID=3"&gt;http://www.binarywave.com/blogs/eshupps/Lists/Posts/Post.aspx?ID=3&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Note: I discovered while putting this together that there are quite a few differing feed formats depending on which source you are trying to access.  Most RSS 2.0 and ATOM feeds should work but you may need to tweak the XML parsing methods in the source code if you are referencing a feed that uses non-standard or custom formatting in the source XML.  If you do make modifications, please post them so everyone can benefit from your changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-6806776338275525354?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/6806776338275525354/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=6806776338275525354' title='302 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/6806776338275525354'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/6806776338275525354'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/05/sharepoint-2007-rss-aggregator-web-part.html' title='SharePoint 2007 RSS Aggregator Web Part'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>302</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-2858543812702787086</id><published>2007-05-03T08:40:00.000-07:00</published><updated>2007-05-03T08:43:52.368-07:00</updated><title type='text'>The SharingPoint Has A New Home!</title><content type='html'>Now that we've completed the changeover from The eGroup to BinaryWave, this blog will be moving onto our new SharePoint 2007 servers.  The new url will be &lt;a href="http://www.binarywave.com/blogs/eshupps"&gt;http://www.binarywave.com/blogs/eshupps&lt;/a&gt;.  For the near future, I will continue to cross-post as I move old content over and get the archives up to snuff (is there anyone out there who has written a utility to move Blogger content to SharePoint?  I REALLY don't want to write that myself...).&lt;br /&gt;&lt;br /&gt;For those of you that use the FeedBurner RSS link that will be redirected to the new blog address.  Any troubles, post a comment and we'll figure it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-2858543812702787086?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/2858543812702787086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=2858543812702787086' title='197 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/2858543812702787086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/2858543812702787086'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/05/sharingpoint-has-new-home.html' title='The SharingPoint Has A New Home!'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>197</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-1544353507227859906</id><published>2007-04-11T05:36:00.000-07:00</published><updated>2007-04-11T18:42:05.513-07:00</updated><title type='text'>Colligo Contributor v2.0 Review</title><content type='html'>Part of our practice methodology at The eGroup/BinaryWave is to use SharePoint Team Sites to manage all of our projects - time tracking, project milestones, tasks, issues, bug tracking, project documents, deliverables, etc. - are all contained in SharePoint lists. This has several advantages, primarily complete project visibility for our customers, and secondarily, the capability for our staff to work remotely from any location. Beyond that, it also does an excellent job of demonstrating the capabilities of the platform to new customers and provides their project team with some informal on-the-job training.&lt;br /&gt;&lt;p&gt;This arrangement does, however, provide some challenges for frequent travelers such as myself. As I am often in transit from one location to another (usually across the Atlantic) it is commonplace to be without Internet connectivity for long periods of time. This makes it quite difficult to update project-related information, as I am unable to gain access to our SharePoint servers, a major roadblock in my role as project manager. To compensate, I had been relying upon a cobbled-together mish-mash of local files, Outlook folders, and a bit of slapdash code to keep things in synch which, to be honest, wasn't working very well at all.&lt;/p&gt;&lt;p&gt;Enter Contributor from Colligo. A month or so ago the folks from Colligo invited me to test drive version 2.0 of their Contributor product. Billed as an offline client for SharePoint, I had assumed that it's primary purpose would be to keep files in sync between my local folders and SharePoint document libraries. A fine utility, to be sure, but my experience with similar products was that they did a decent job of moving files back and forth but completely lacked any support for SharePoint lists, which is where I do the majority of my work.&lt;/p&gt;&lt;p&gt;I admit that I was pleasantly surprised by the product's capabilities in this regard. To set up Colligo to work with SharePoint, you first supply the URL of the site and your login credentials. The product then downloads the site contents and I was encouraged to see that list information was being collected along with document libraries. Once the content has been collected, the application presents the site information using the same basic layout as a WSS v3 Team Site - lists and libraries organized on the left, list contents on the right, with the same WSS list icon, headings, and breadcrumb at the top.&lt;/p&gt;&lt;a href="http://farm1.static.flickr.com/167/455270389_8b7241db84.jpg"&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;a href="http://farm1.static.flickr.com/167/455270389_8b7241db84.jpg"&gt;&lt;img style="WIDTH: 400px; CURSOR: hand" alt="" src="http://farm1.static.flickr.com/167/455270389_8b7241db84.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;Choosing to duplicate the SharePoint interface was an excellent decision - the experience of interacting with the list contents is nearly identical to that of SharePoint's web GUI. Say what you will of Microsoft's design, at least the consistency between the two products means there is no learning curve to overcome - anyone who has worked with a SharePoint list will be immediately productive within Contributor. Switching views, uploading documents, sorting columns, and creating new list items is natural and intuitive. Entering a new item in a list brings up a dialog that contains all the list columns (including choice, lookup, and calculated columns) and which looks almost identical to the built-in SharePoint forms.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;/div&gt;&lt;a href="http://farm1.static.flickr.com/183/455270403_77e1abad9c.jpg"&gt;&lt;img style="WIDTH: 400px; CURSOR: hand" alt="" src="http://farm1.static.flickr.com/183/455270403_77e1abad9c.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;After modifying or updating the list contents, you can manually synchronize one or more sites to commit your changes. Alternatively, you can leave Contributor running the background and it will synchronize automatically (you can enable/disable this functionality by right-clicking on the synchronization message in the status bar but I was unable to find any way to modify the automatic synchronization interval). &lt;/p&gt;&lt;div&gt;Naturally, being an offline client, there are a few limitations. You cannot create new views from within Contributor; likewise, it is not possible to alter the list structure (add or remove columns, change column types, etc.) while offline. I also noticed that the list views, which do a good job of display grouping, filtering and summary selections, do not display column totals; that is, if you have applied a total parameter to a list (i.e. SUM the Hours column) the values for this calculation are not displayed. &lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;The pricing for Contributor affordable for both individual and corporate users. At $125 per seat, it's hard to argue with the price/performance equation for this product. The time saved in lost productivity on one cross-country flight pays for the license several times over. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;Overall, I think the Colligo team has done an excellent job with version 2.0 of Contributor. I use it exclusively to update list content while on the road, letting it synchronize all of my changes the next time I'm connected to the Internet. This has allowed me to be more productive - especially when flying - and I often use when I am connected as I prefer the WinForms experience over the browser-based approach. If you travel often, or have limited connectivity (i.e. dial-up or second-generation WWAN) and need to interact with SharePoint lists, Contributor may be the answer you've been looking for.&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Visit Colligo's web site for more information. A free trial of Contributor 2.0 can be downloaded here.&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;CORRECTION: &lt;/strong&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;The automatic synchronization setting can be adjustd by modifying the followig registry value: HKEY_LOCAL_MACHINE\Software\ColligoOfflineClient\Synchronization\ PeriodicSyncInterval.  This key determines the number of minutes between sync attempts - the minimum value is 15 and the default is 30.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-1544353507227859906?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/1544353507227859906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=1544353507227859906' title='166 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/1544353507227859906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/1544353507227859906'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/04/colligo-contributor-v20-review.html' title='Colligo Contributor v2.0 Review'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/167/455270389_8b7241db84_t.jpg' height='72' width='72'/><thr:total>166</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-3817844453175637976</id><published>2007-04-06T08:10:00.000-07:00</published><updated>2007-04-06T08:11:46.408-07:00</updated><title type='text'>The Trials and Tribulations of Being Your Own Boss</title><content type='html'>&lt;p&gt;Sometimes you've just got to stop and post something because it makes you smile.  Fellow SharePointer Extraordinaire &lt;a href="http://www.heathersolomon.com/blog"&gt;Heather Solomon&lt;/a&gt; recently decided to take the plunge and strike out on her own as an independent consultant.  Earlier this week she &lt;a href="http://www.heathersolomon.com/blog/archive/2007/04/03/Wherefore-Art-Thou-Heather.aspx"&gt;put up a post&lt;/a&gt; about how little time she's had since taking The Big Step.  It brought a smile to my face as people are always asking me why I don't post more and work less, why it takes so long to return emails, why don't I do more speaking engagements, etc.  Welcome to the &lt;em&gt;gotta-get-the-project-done-no-time-to-chat-why-doesn't-my-phone-stop-ringing-my-God-is-it-midnight-already-where-are-my-slides-for-tomorrow-did-I-get-that-invoice-out-when-do-I-get-paid?&lt;/em&gt; club, Heather!&lt;/p&gt;&lt;p&gt;Now, if I can just find a way to sabotage her email for a day so I can get her to work on some projects for MY clients... :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-3817844453175637976?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/3817844453175637976/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=3817844453175637976' title='48 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/3817844453175637976'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/3817844453175637976'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/04/trials-and-tribulations-of-being-your.html' title='The Trials and Tribulations of Being Your Own Boss'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>48</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-362542883720089312</id><published>2007-04-02T06:42:00.000-07:00</published><updated>2007-04-02T06:50:21.082-07:00</updated><title type='text'>UK SharePoint User Group Meeting in Manchester April 11th</title><content type='html'>The first UK user group meeting in Manchester will be held on April 11th at TSG.  Nick Swan, whose travels for community meetings might actually come close my own air miles, will open the session with an intro on WSS v3, followed by some in-depth info on branding and customization.  As this is the first meeting in Manchester, show Nick some SharePoint love by showing up en masse (you should be recovered from the big Manchester United match by then, right?).   &lt;br /&gt;&lt;br /&gt;&lt;a href="http://suguk.org/forums/thread/2772.aspx"&gt;Click here&lt;/a&gt; for info and directions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-362542883720089312?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/362542883720089312/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=362542883720089312' title='48 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/362542883720089312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/362542883720089312'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/04/uk-sharepoint-user-group-meeting-in.html' title='UK SharePoint User Group Meeting in Manchester April 11th'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>48</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-5061736802853513984</id><published>2007-04-02T06:24:00.000-07:00</published><updated>2007-04-02T06:38:11.318-07:00</updated><title type='text'>Source Code for Hosting User Controls in Web Parts</title><content type='html'>Every .NET developer who has come anywhere near &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;SharePoint&lt;/span&gt; development has, at one time or another, seen, heard of, or used &lt;a href="http://www.smartpart.info/default.aspx"&gt;Jan &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Tielens&lt;/span&gt;' &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;SmartPart&lt;/span&gt;&lt;/a&gt;.  It's a great control and very effective for rapid application development within &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SharePoint&lt;/span&gt; - no need to learn web part coding, just whip up a quick user control and off you go.&lt;br /&gt;&lt;br /&gt;We do a great deal of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SharePoint&lt;/span&gt; user control development in our shop, for several reasons: 1) when you work on billable time, clients want the fastest, most effective solution to a problem not some esoteric argument on what is 'pure' &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;SharePoint&lt;/span&gt; development and what is not, 2) It's easier to hire and get new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;SharePoint&lt;/span&gt; developers up to speed using .NET controls they are already familiar with, 3) it's far easier to turn over user controls to our clients for future code maintenance than try to give them a crash course in web part development, and 4) I don't know about you but I have absolutely no interest in hand-coding &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;UI&lt;/span&gt; elements that I could otherwise drag-and-drop in the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;IDE&lt;/span&gt; (but then, I'm known to be a lazy programmer, so take that for what it's worth).&lt;br /&gt;&lt;br /&gt;Because of this, we have developed our own web part wrapper for hosting user controls.  Similar to the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;SmartPart&lt;/span&gt;, it's designed to be a low overhead control that can be deployed for rapid development scenarios but we needed a bit more flexibility than the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;SmartPart&lt;/span&gt; offers.  We've been using it for quite a while and have had great success with it.  We're releasing the source code to the community so everyone can do the same and also to see what kind of improvements and enhancements all you smart coders out there can come up with.&lt;br /&gt;&lt;br /&gt;If you're looking for a way to host user controls in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;SharePoint&lt;/span&gt; and you would rather write and own the code yourself than use a third-party control, give it a try.  Sean Skinner has &lt;a href="http://fusioncs.blogspot.com/2007/03/binarywave-webpart-wrapper.html"&gt;posted the code&lt;/a&gt; over on &lt;a href="http://fusioncs.blogspot.com/"&gt;his blog &lt;/a&gt;for you to download.  Take it, make it your own, and let us know what kind of cool stuff you do with it.&lt;br /&gt;&lt;br /&gt;Direct any questions to either Sean or myself via comments on these posts so everyone can participate in the discussion.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-5061736802853513984?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/5061736802853513984/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=5061736802853513984' title='72 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5061736802853513984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5061736802853513984'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/04/source-code-for-hosting-user-controls.html' title='Source Code for Hosting User Controls in Web Parts'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>72</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-5186126126675967360</id><published>2007-03-24T14:52:00.000-07:00</published><updated>2007-03-24T15:04:13.635-07:00</updated><title type='text'>UK User Group Meeting in Glasgow, Scotland March 28th</title><content type='html'>&lt;a href="http://suguk.org/blogs/combined_knowledge/default.aspx"&gt;Steve Smith&lt;/a&gt; of &lt;a href="http://www.combined-knowledge.com/"&gt;Combined Knowledge &lt;/a&gt;is organizing an informal &lt;a href="http://www.suguk.org"&gt;UK User Group &lt;/a&gt;meeting in Glasgow, Scotland on March 28th.  If you are in the area, make plans to attend and support the growing UK SharePoint community.  After all, there's beer and food involved - can't miss out on that!  &lt;a href="http://suguk.org/blogs/combined_knowledge/archive/2007/03/15/2625.aspx"&gt;Go here&lt;/a&gt; for more information.&lt;br /&gt;&lt;br /&gt;BTW, the User Group meeting in London on the 22nd was an excellent affair.  Tip o' the hat to Riaz Ahmed for doing a bang-up job presenting a Search deep-dive and accessibility overview (Riaz, if you're out there, post a comment with your blog URL so I can link you up).  More than 75 people showed up (although how many were actually there for the free beer and pizza is impossible to determine).  C'mon Dallas, we've some catching up to do - the UK gang is making us look bad!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-5186126126675967360?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/5186126126675967360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=5186126126675967360' title='67 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5186126126675967360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/5186126126675967360'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/03/uk-user-group-meeting-in-glasgow.html' title='UK User Group Meeting in Glasgow, Scotland March 28th'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>67</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-1207758075262214392</id><published>2007-03-21T00:45:00.000-07:00</published><updated>2007-03-21T00:54:12.827-07:00</updated><title type='text'>SharePoint User Group Meeting in London March 22nd</title><content type='html'>Just a quick reminder to all UK SharePointers that the user group meeting is this Thursday, March 22nd, at LBi in London.  Go &lt;a href="http://suguk.org/forums/thread/2311.aspx"&gt;here&lt;/a&gt; for more information. &lt;br /&gt;&lt;br /&gt;In case you've never attended, the UK meetings are some of the best user group gatherings I've ever been to (and I've been to many in my time).  &lt;a href="http://sharepointnick.com/blog/default.aspx"&gt;Nick Swan &lt;/a&gt;does a great job organizing the event, the participation is high (200+ attendees at the last meeting in February), and the content is excellent.  If you live or work in the UK and SharePoint is our thing (why else would you be reading this blog???), I highly recommend attending.  And be sure to say "Hullo!" when you arrive - I'm easy to spot, just look above the crowd for the 6'5" Texan wandering about ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-1207758075262214392?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/1207758075262214392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=1207758075262214392' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/1207758075262214392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/1207758075262214392'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/03/sharepoint-user-group-meeting-in-london.html' title='SharePoint User Group Meeting in London March 22nd'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-8659333468973368307</id><published>2007-02-26T20:01:00.001-08:00</published><updated>2007-02-26T20:02:43.158-08:00</updated><title type='text'>WSS v3 Drop-Down Menus in Team Sites</title><content type='html'>&lt;p&gt;While working with some custom site definitions based on the built-in STS (Team Site) definition I came across an annoying navigation issue that derailed me for a couple of hours.  It turns out the the drop-down functionality in the top navigation bar, which works perfectly well in the Publishing and Collaboration Portal definitions,  is disabled in the Team Site definition.  After digging around in the object model for a while and trying a few different combinations, I found the solution in the menu settings contained within the default master page.&lt;/p&gt;&lt;p&gt;To enable drop-down menu functionality, locate the following block of code in the Default.Master page (/_catalog/masterpage/default.master in the site collection or \12\Template\Global\default.master on the file system):&lt;/p&gt;&lt;p&gt;     &lt;em&gt;&amp;lt; asp:SiteMapDataSource&lt;br /&gt;          ShowStartingNode="False"&lt;br /&gt;          SiteMapProvider="SPNavigationProvider"&lt;br /&gt;          id="topSiteMap"&lt;br /&gt;          runat="server"&lt;br /&gt;          StartingNodeUrl="sid:1002" / &amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This sets the data source for the menu control and its associated parameters.  Each Site Map Provider is defined in the &amp;lt; Providers &amp;gt; section of web.config.  The SPNavigationProvider entry looks like this:&lt;/p&gt;&lt;p&gt;&lt;em&gt;     &amp;lt; add name="SPNavigationProvider" type="Microsoft.SharePoint.Navigation.SPNavigationProvider, Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" / &amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;If you locate this entry in web.config you will notice another entry for "SPSiteMapProvider" immediately below it.  After much trial and error I discovered that this is the data source that is required for the drop-down menus.  To enable it, change the SiteMapDataSource settings in default.master (or your custom master page) to the following:&lt;/p&gt;&lt;p&gt;&lt;em&gt;     &amp;lt;asp:SiteMapDataSource&lt;br /&gt;          ShowStartingNode="True"&lt;br /&gt;          SiteMapProvider="SPSiteMapProvider"&lt;br /&gt;          id="topSiteMap"&lt;br /&gt;          runat="server" /&amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;The navigation menu will now use the SPSiteMapProvider data source which contains all the nodes in the current site collection.  Depending upon your requirements, you may also wish to modify the settings for the default number of static and dynamic levels (flyouts) the navigation control displays.  To do that, adjust the following settings within the &amp;lt; SharePoint.AspMenu / &amp;gt; control:&lt;/p&gt;&lt;p&gt;&lt;em&gt;     StaticDisplayLevels="2"&lt;br /&gt;     MaximumDynamicDisplayLevels="1"&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Adjusting these values up or down will increase or decrease the number of levels.  Be advised that setting the levels to a higher value may impact performance, as the control will need to fetch the relevant information from the database and build the complete menu structure before the page can finish loading. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-8659333468973368307?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/8659333468973368307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=8659333468973368307' title='306 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/8659333468973368307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/8659333468973368307'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/02/wss-v3-drop-down-menus-in-team-sites.html' title='WSS v3 Drop-Down Menus in Team Sites'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>306</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-8510620340685675964</id><published>2007-02-17T14:22:00.001-08:00</published><updated>2007-02-17T14:23:53.211-08:00</updated><title type='text'>Multilingual Scenarios</title><content type='html'>&lt;p&gt;During the European SharePoint Conference this week I spent some time in a workgroup focused on multilingual scenarios in SharePoint and talked a great deal about these issues with other attendees.  As you may  already be aware, Microsoft's solution for portals supporting multiple languages is Site Variations, a process that allows for content duplication between source and target sites and automatic redirection based on browser localization settings.&lt;/p&gt;&lt;p&gt;Essentially, Variations act as an advanced form of replication.  A publishing site is created and assigned as the source (the base language is irrelevant).  Whenever a subsite is created, the administrator selects the site language pack and localization (such as US or UK English) and the site is then provisioned as a target.  Whenever content in publishing controls on the source site is modified, the content is replicated to the target sites and, once approved, published for viewing.  &lt;/p&gt;&lt;p&gt;While this is a good first step, there are a number of shortcomings to the Variations model.  For one, it only applies to content in publishing controls - no lists, web parts, or other content is replicated.  In addition, there is no translation performed during the replication process - it is incumbent upon a human being to at some point perform content translation into the target language.  Finally, it does not provide a single portal - by which I mean a single, unified URL - to be presented in multiple languages; visitors are simply redirected to a target site (for example, from &lt;a href="http://www.example.com"&gt;www.example.com&lt;/a&gt; to &lt;a href="http://www.example.com/en"&gt;www.example.com/en&lt;/a&gt;) if one exists that matches their localization settings; if not, no redirection takes place.&lt;/p&gt;&lt;p&gt;In the multilingual working group we identified these as the top three items of concern out of a list of maybe ten or eleven issues (including search optimization, metadata translation, post-provisioning language reassignment, and more).  From this, the group formulated some ideas on how to introduce features in the next version, or provide add-on solutions in the interim, to address these problems.  As this is an important area of concern for our customers, we are giving serious consideration to developing our own suite of tools and utilities for multilingual portals.  Before we go down this path, though, we need more information from the SharePoint community.  We'd like to know how you are dealing with multilingual issues, what your top pain points are, and what form you'd like to see potential solutions take (web parts, custom site definitions, a packaged set of features, etc.).  So talk to me - post some feedback (in the language of your choice, of course) and let me know what we can do to make your (multilingual) life easier.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-8510620340685675964?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/8510620340685675964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=8510620340685675964' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/8510620340685675964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/8510620340685675964'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/02/multilingual-scenarios.html' title='Multilingual Scenarios'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>41</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-7649787986985106693</id><published>2007-02-15T03:17:00.001-08:00</published><updated>2007-02-15T03:17:58.153-08:00</updated><title type='text'>European SharePoint Conference Final Thoughts</title><content type='html'>&lt;p&gt;The European SharePoint Conference in Berlin concluded with another full day of presentations.  Previous commitments had me traveling back to the UK on Wednesday so I can't give a recap of day three (see &lt;a href="http://sharingpoint.blogspot.com/2007/02/european-sharepoint-conference-day-1.html"&gt;here&lt;/a&gt; and &lt;a href="http://sharingpoint.blogspot.com/2007/02/european-sharepoint-conference-day-2.html"&gt;here&lt;/a&gt; for a rundown on days one and two), which is really a shame as &lt;a href="http://www.sharepointblogs.com/benrobb/"&gt;Ben Robb&lt;/a&gt; was scheduled to give a couple of good presentations on Internet-facing web sites and profiling/personalization that I would have liked to have attended.  So instead here are my final thoughts on the conference as a whole.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Organization&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The overall event organization was quite good.  Check-in was a breeze, there were big signs in each area detailing the day's events, and if you got a bit lost all you had to do was grab hold of one of the ubiquitous orange-shirted emissaries to point you in the right direction.  The sessions were a bit spread out due to the configuration of the facilities but you had plenty of time between sessions to wander to and fro and numerous opportunities to grab some refreshments on the way.  There were some glitches with invoicing and payment that had a few people (including myself) scrambling a bit but I understand that was due to some EMEA regulations regarding credit-card bookings that were out of the organizer's control.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Content&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I was quite pleased by the content presented in the break-out sessions.  There was a distinct division between developer, IT and partner sessions, and quite a bit to choose from in each track.  Naturally, the developers wanted to see more code and the IT people wanted more numbers, but that's always how it is.  Aside from a few last-minute speaker substitutions most of it went off without a hitch.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Venue&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The Hotel Estrel is a nice facility with lots of space but it wasn't laid out that well, especially for the vendor booths, forcing participants to walk back and forth across the hotel quite a bit.  Guest rooms booked up quickly so a lot of people stayed at hotels scattered around Berlin (I chose the &lt;a href="http://www.tripadvisor.com/Hotel_Review-g187323-d199365-Reviews-Upstalsboom_Hotel_Friedrichshain-Berlin.html"&gt;Upstalsboom Friedrichshain&lt;/a&gt; which was quite nice but, like everywhere else, had no WiFi to speak of).  The staff were very good, exhibiting the renowned German efficiency - you could barely set an empty plate down before someone came and whisked it away.  The food was mostly standard conference fair but I must say that the sweets were top notch - I had way more of them than I should have.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Speakers&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There was quite a good mix of speakers for this event, even though some, like &lt;a href="http://blog.u2u.info/dottextweb/patrick/"&gt;Patrick Tisseghem&lt;/a&gt; and Ben Robb, presented multiple sessions (which is fine by me because I like listening to them both).  Speakers seemed to be matched well to their topics and generally provided good domain knowledge.  The slide decks were fairly uniform (excepting Patrick, who seems to be as addicted to PowerPoint SmartArt as he is to Belgian beer) but there were lots of demos and code samples to keep things interesting.  In fact, it will be a bit of a letdown when we get the final slide decks as most of the good content was in the demos.  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Vendors&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There was in impressive number of vendors at the event from all over Europe as well as the UK and America.  Some were promoting general offerings - like HP and AMD - but there were a large number of SharePoint-specific solution providers in attendance.  I didn't hang around the booths much so I don't know how good their conversion ratios were but there were a lot of people carrying literature and chatting up the vendors.  The best venue for them was probably the vendor breakout sessions, of which there were quite a few, and which seemed to have pretty good attendance. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Participation&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Quite frankly, I was amazed at the turnout for this event.  Official figures were somewhere north of 2,300 participants.  Considering all the other products that Microsoft has launched in the last year and the fact that SharePoint is marketed as part of the overall Office product line, this is really and astounding level of interest.  If there were any doubts that SharePoint should be taken seriously this should dispel them entirely.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Like any event of this type, it wasn't perfect, but I think overall I'd give it a B+.  The location was a bit difficult to reach for a lot of attendees (Paris, London or Rome would have been easier) but it wasn't too bad.  The organization and content were good and the participation was excellent.  I hope that next year will see an even greater number of attendees and more focused breakout sessions (and, of course, more in-depth developer content).    &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-7649787986985106693?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/7649787986985106693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=7649787986985106693' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/7649787986985106693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/7649787986985106693'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/02/european-sharepoint-conference-final.html' title='European SharePoint Conference Final Thoughts'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-2225741805349107031</id><published>2007-02-14T14:55:00.001-08:00</published><updated>2007-02-14T15:01:27.180-08:00</updated><title type='text'>European SharePoint Conference, Day 2</title><content type='html'>&lt;p&gt;After the previous night's entertainment we were all a bit bleary eyed come Tuesday morning (I probably looked the worst as I stayed up late blogging and then fought with the worst pillows ever created in the history of mankind in a losing battle for even a few hours of sleep).  But with a healthy dose of coffee and a can-do attitude (or, more accurately, an I'm-awake-so-I-may-as-well-make-the-best-of-it attitude) I dived back into the conference.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Designing, Deploying and Managing Workflow in SharePoint Sites&lt;/strong&gt; (Christian Stark) &lt;/p&gt;&lt;p&gt;The toughest part of a conference like this is choosing which sessions to attend.  There were a large number of presentations from partners and ISV's that I would have liked to have taken in but I concentrated on the Development track as best I could since that is our core business.  Unfortunately, this presentation was just a click-n-show overview with no code and I think I dozed off somewhere in the middle.  From the parts I do remember, I recall Christian pointing out that while you can author workflows for WSS sites you have to buy MOSS to get any built-in workflows or workflow templates (I wasn't aware of that).  He also said that there will be a workflow SDK coming out soon that will have a bunch of workflow templates included with it.  Hallelujah!&lt;/p&gt;&lt;p&gt;I realized later, after talking with Dr. Ulrich Knechtel of AMD, that I should have gone to his presentation about their search optimization project with Microsoft.  The two companies are teaming up to create hardware/software configurations optimized for large-scale search optimization.  If you've ever worked with search in a big deployment you know how resource-intensive this process can be so this new initiative looks very promising (post a comment if you want more information - they're looking for customer projects that might serve as good POC's).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Developing Visual Studio Workflows and Activities for SharePoint Sites&lt;/strong&gt; (Steve Heaney)&lt;/p&gt;&lt;p&gt;Now this is what I came for.  Steve got down and dirty and showed us how to code up workflows from scratch in Visual Studio.  It was one of the most amazing demos I've ever seen - Steve hand-coded a five step WF, including two custom InfoPath forms, in a half-hour, without making a single mistake.  In fact, he never even used Intellisense - just whipped out some classes, slapped in some methods, banged the code in and pressed F5.  Build succeeded the first time!  Unbelievable.  Obviously, Steve had done this presentation many times before but it was still bloody impressive.  &lt;/p&gt;&lt;p&gt;If you haven't played with it yet, the workflow designer in VS 2005 is really quite good.  There are a bunch of built-in workflow objects that you can drop in from the toolbox and creating your own is almost as simple as whipping up a Visio diagram.  What Steve didn't cover (due only to time restrictions, I think) was coding custom actions and activities, which is the real meat of VS and WF.  In most cases, designers will create the workflows in SharePoint Designer with custom activities supplied by developers, as the VS method is much too complex for your average front-end person.  That said, you can do a lot with it and it's very flexible and extensible.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Capacity and Performance Planning&lt;/strong&gt; (Steve Smith)&lt;/p&gt;&lt;p&gt;The Combined Knowledge booth was the unofficial UK gathering point at the conference.  We joked about hanging a Union Jack from one of the columns and I think we would have done it had anyone thought to bring one.  Steve Smith, MVP with Combined Knowledge, gave several presentations but this was the first I one I could fit into my agenda.  Steve derived a great deal of his content from &lt;a href="http://blogs.msdn.com/joelo/archive/2006/06/09/2003-2007-performance-and-scalability-capacity-planning.aspx"&gt;Joel Oleson's blog&lt;/a&gt; and put up some useful figures from &lt;a href="http://blogs.msdn.com/joelo/archive/2006/06/09/2003-2007-performance-and-scalability-capacity-planning.aspx"&gt;this post&lt;/a&gt;.  Although I dispute some of his assumptions (he uses a 10% utilization baseline for concurrency which I believe is way too low - but it really depends on how each portal is used) and conclusions (40% of latency issues are at the client?  I really don't think so - better check those capture stats one more time, mate), Steve did quite a good job painting a realistic picture of scalability issues and areas to look for performance issues.&lt;/p&gt;&lt;p&gt;At one point, Steve illustrated the issues regarding list rendering as it relates to item count by showing a line graph (shaped like a hockey-stick) of the per-transaction completion time of a document add operation in a library.  The more documents you add (I think the tipping point was around 2,000) the worse the performance gets - way worse, in fact.  I couldn't have asked for a better visual describing the limitations of using the object model for repetitive operations (he didn't say but I'll bet my hat they used the OM to do it).  I can't wait to get my hands on that slide so I can demonstrate the stark difference in performance when executing the exact same operation using web services or FrontPage RPC's.  &lt;/p&gt;&lt;p&gt;Speaking of slides, Steve hit us with so many statistics that I can't possibly hope to reproduce them all here (and I was scribbling like a madman so I probably got most of them wrong anyway).  As soon as Steve uploads the presentation I'll post them all here - they really are important data points to consider when planning your farm deployment and/or expansion.  For example, one thing that never occurred to me when troubleshooting performance is the relationship between your MOSS server farm and Active Directory.  If you have several thousand users on a portal the new security-trimming features require a lot of authentication procedures; enough to overload that poor old AD box sitting all by itself in a forgotten corner of the data center.  One more place to look when your users suddenly start complaining about how long it takes to login to SharePoint in the morning...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Building and Branding SharePoint Sites Using New Web Content&lt;/strong&gt; (Arpan Shah)&lt;/p&gt;&lt;p&gt;Ok, so this one really didn't include much development content (unless you consider SharePoint Designer to be a development tool) but it was good nonetheless.  Unfortunately for Arpan, he had just returned from vacation and it seemed like parts of his demo were still on holiday - Designer didn't want to cooperate and his MOSS site was a bit flaky but Arpan's an excellent presenter and what he couldn't show he explained rather well.    He did a fair job introducing site variations to the audience but it wa really only a warmup for the next Dev session.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Multilingual Portal and Public-Facing Web Applications&lt;/strong&gt; (Aku Heikkerö)&lt;/p&gt;&lt;p&gt;It was fitting (and somewhat amusing) that the presenter for Multilingual solutions had a Finnish accent so heavy I could barely understand him.  Where's that universal translator from the Tardis when I need one?  In any event, you should know by now that this is an important area of interest for me, and Aku did a good job of digging into the ins and outs of site variations.  He was also very explicit on what variations can and can't do (and even though they can do some good things they are just a small step towards solving this problem).  One thing I didn't know (just because I haven't had time to play with the new MySites much) is that users can now pick the language they want to see their MySite in.  That's very cool.  After the presentation I mapped out some ideas on how to improve site variations to make them more usable in real-world scenarios (more on this in a future post) with my new friend Razvan-Petru Radu from Luxembourg.  And no, in case you're still wondering from yesterday, no word yet on that Redneck language pack for MOSS.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shared Emotions&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I don't think I was the only one who thought this was an odd name for the after-conference party.  Even more odd was being shipped by bus halfway across Berlin to a big warehouse on some island for a dinner party when we had a huge hall at our disposal right there at the Estrel (we all fit in there the night before, didn't we?).  Thankfully, there were no celebrity impersonators, just a really lukewarm jazz band.  Personally, I would have liked to see the guy who did the Louis Armstrong bit on Monday night do another set just to liven things up (I poke fun at the lookalike entertainers but they really were very talented).  Rob Gray from Microsoft UK managed to secure the upstairs lounge for our lot so we enjoyed feeling superior to everyone else from on high.  The food was spectacular, especially if you are a fan of creme brulee, and the beer and wine were free.  Can't beat that!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Internet Access&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Let's tell the truth here - trying to get to the Internet in Berlin was like trying to find a place to stand in the conference common areas where someone wasn't smoking.  First of all, there was no free WiFi at the convention center.  Only hotel guests could access the WiFi and they had to pay for it - not even the conference speakers had access to the Internet.  Think about that for a second - a Microsoft conference about a purely browser-based product and no WiFi?  Uh, pardon me for pointing out the elephant in the middle of the room, that's just plain ridiculous.  My hotel and the airport were no better, with either weak signals that were all but useless or pay-as-you-go services that wanted upwards of 10 euros for 30 minutes of blissful connectivity.  I know the Germans pride themselves on their efficiency but they've got a lot to learn from us Yanks on this score.       &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Notes on Berlin&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;It's a shame really that I didn't get to see much of Berlin at all on this trip.  Being a history buff I could probably spend days wandering around the museums and such.  I did learn that the airport that I flew into (&lt;a href="http://en.wikipedia.org/wiki/Tempelhof_International_Airport"&gt;Flughafen Tempelhof&lt;/a&gt;) was central to the Berlin Airlift operation and used to be a US Air Force base (it was the Americans, in fact, who built the current concrete runways).  There's a statue out front dedicated to the US and British pilots who died during that operation - very cool.  East Berlin is still a bit grim but there is a fair amount of new construction intermixed with some really old structures.  There's a strange statue on the river of three figures fighting or wrestling - I'm not sure which - that I never did figure out and none of the cab driver spoke enough English to explain it to me.  The real travesty of this visit was that I had precious little time to sample any German beer.  That's almost a crime, I think, to visit Berlin and never set foot in a Biergarten.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-2225741805349107031?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/2225741805349107031/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=2225741805349107031' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/2225741805349107031'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/2225741805349107031'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/02/european-sharepoint-conference-day-2.html' title='European SharePoint Conference, Day 2'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-2676886272094502173</id><published>2007-02-12T16:52:00.001-08:00</published><updated>2007-02-12T16:52:17.223-08:00</updated><title type='text'>European SharePoint Conference, Day 1</title><content type='html'>&lt;p&gt;Today was the first day of the European (EMEA) SharePoint Conference in Berlin, Germany.  As we have recently expanded into the UK, we are now officially a 'global' company (there's a scary thought for you) so we took this opportunity to join our mates from jolly ol' England on a jaunt across the Old Country.  I have to say that I am quite impressed by the overall experience - if there were any doubts that SharePoint is a serious application around the world, let them be dispelled here and now.  With  more than 2,300 attendees (that's nearly twice as many as we managed to cobble together in the States last year) from 40 countries and 90 partners and vendors, it was quite a show.  Read on for a summary of the day's events.&lt;/p&gt;&lt;p&gt;BTW, Southwest could learn a few things from SN Brussels Airlines.  Like, how about some free chocolates on each trip instead of crappy peanuts, eh Mr. Kelleher?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Opening/Keynote&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The Microsoft team kicked off the conference with a five-minute introduction in German (to the delight of the local audience, I might add) which left most of us scratching our heads and saying 'Was is das?'.  The 'Wow is Now' video has long since jumped the shark, but the first speakers were energetic enough to make up for it.   The catchphrase of the day was 'Ich bin ein SharePointer'.  Say that a few times after a couple of Hefeweizen!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Derek Burney&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There were quite a few Redmondites around - especially on stage and in the ubiquitous orange speaker shirts - and Derek Burney was first up (with an able assist from &lt;a href="http://blogs.msdn.com/mikefitz/"&gt;Mike Fitzmaurice&lt;/a&gt;).   He laid some good numbers on us, like license count now exceeding 80 million worldwide and the official size of the internal Microsoft SharePoint deployment: 325,000 portals, sites and subsites comprising more than 12TB of data (who gets to back that up, I wonder?).  It was interesting to note that on his slide promoting 'major' companies who had adopted SharePoint, three of the ten are based in Dallas :-)&lt;/p&gt;&lt;p&gt;Mike revealed publicly what had heretofore been confidential, so I can now tell you that sometime next month MS will unveil the official &lt;a href="http://sharepoint.microsoft.com/sharepoint"&gt;SharePoint Community Portal&lt;/a&gt;.  &lt;a href="http://blogs.msdn.com/sharepoint/"&gt;Lawrence Liu&lt;/a&gt; gave us a rundown of this last week at the UK SharePoint User Group meeting (what, you weren't there?) and it's plenty slick.  Just a beta right now but it will be live soon.&lt;/p&gt;&lt;p&gt;They closed with the most ridiculous commercial I've ever seen - a takeoff on those Total cereal ads where they claim that everything and the kitchen sink is in 'just one bowl'.  It came complete with a corny jingle and sleazy used-car-salesman actor.  Ok, I get the message, but was this really a good use of marketing dollars?  Really?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Patrick Tisseghem, Part Eins&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I always enjoying listening to Patrick as 1) he knows his stuff, and 2) he's a good presenter.  And you just gotta like a guy whose every demo has something to do with beer.  Patrick gave the standard rundown on using the object model, talked about garbage collection and good coding practices, and highlighted a bit about working with web services.  He covered impersonation pretty well, which I think was lost on most everyone present, and even talked a bit about CAML and SPSiteDataQuery.  Although he gave an explicit warning about using the DataQuery object to collect list data instead of looping through the SPListCollection, he did not voice similar concerns about using the object model to loop through SPWeb objects.  In fact, he showed us how to do it (albeit briefly) and moved quickly past it. &lt;/p&gt;&lt;p&gt;I suppose I'm destined to be the lone voice in the wilderness on this issue, so let me state it once again in case anyone missed it the first thousand times - DON'T DO THIS!  EVER!  Unless you know for a fact that you'll never have more than a hundred or so sites in a site collection, this is bad, bad, bad.  The overhead of GetSubwebsForCurrentUser and its equivalent(s) is tremendous and should be avoided like the plague.   I know that's how it's shown in the SDK but you don't believe everything you read, do you?  &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Multilingual Working Group&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Aside from the bizarre evening entertainment (see below) this was the highlight of the day.  We don't think much about it in the States but this is a real pain point for many customers, especially throughout Europe where they often have to support three, four, five or a half-dozen languages at once.  Hats off to Microsoft for realizing the severity of the issue and soliciting feedback and advice from partners and users.  A couple of partners and myself gave 'em an earful for an hour (I also harped on Lawrence about this last week, so if you're reading this Al, that one's for you!).  We came out with some good ideas and even a few suggestions for the workgroup sponsors to take back to Microsoft.  We also agreed that since C# seems to be a universal language we are all now adding it to our resumes (CV's) immediately.  And no, in case you're wondering, there is no Redneck Language Pack forthcoming in this or any future release, so y'all will have to just go on scratchin' yer heads at my vocabillary.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Content Types and Metadata&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Good topic, wrong audience.  This was supposed to be on the developer track and although Dustin Friesenhahn gave a good presentation it was all foam and no beer.  There were only a couple of slides that even showed a smattering of code - the rest was all point and click.  Nice for the IT guys but not what we hardcore OM types were looking for.  General disappointment was expressed by all.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Patrick Tisseghem, Part Zwei&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;After that letdown, we needed some real code to perk us up, and Patrick didn't let us down.  Some genius assigned him the topic of Templates, Definitions and Solution Deployment and only gave him an hour - now that's just plain wrong.  I could talk for an entire day on any one of those subjects and I don't have all of Patrick's demos and &lt;a href="http://www.maniactive.com/states/2006/12/top-6-powerpoint-fashion-trends-for.html"&gt;SmartArt&lt;/a&gt;.  He did an admirable job walking the group through custom site definitions and deployment - not an easy topic even for intermediate coders.  Lots of great code samples and the ever-present Beer Team site.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dinner and Entertainment&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The Hotel Estrel Convention Center is reminiscent of Vegas-style auditoriums - lots of multimedia and light shows.  After Patrick's final presentation a swarm of worker bees descended upon the room and cleared more chairs in five minutes than were on the entire deck of the Titanic.  There's something to be said for German efficiency.  While we all wandered off for a beer or two (konnte ich Schofferhofer bitte?) they turned out the 'rounds and we piled back in for some free victuals.  I can't say much for the food - it was typical bland conference style fare meant not to offend anyone - but when the lights went down after the meal things go interesting.&lt;/p&gt;&lt;p&gt;Turns out the Estrel is the home of a popular Vegas-style musical review called Stars on Stage.  Before we knew what was happening, a pre-Bobby Brown Whitney Houston was belting 'em out on stage, complete with scenes form her music videos and the requisite clips from Bodyguard during 'I Will Always Love You' on the big screens.  Without a chance to catch our breath (or keep from falling over with laughter) were were hit in succession with Madonna, Boy George, Louis Armstrong, Tina Turner (who looked awfully like Whitney in a different wig) and finally, as you would expect, Elvis himself.  I'll give 'em this - they were pretty damn good, especially considering they didn't have the best acoustics to work with and a stage with no Vegas flair (but some might fine-looking backup dancers).  Louis Armstrong was simply amazing - right down to his facial expressions and the gap in his front teeth, this guy has it down, you dig?  And all of this with a gigantic Office SharePoint Server 2007 sign in the background.  Now don't that beat all?&lt;/p&gt;&lt;p&gt;So that's a wrap for day one.  I'll post pictures as soon as I can get a reliable WiFi connection (don't even get me started on Internet access over here).  And before I collapse for the night, a hearty "Salut!" to my new friends from Romania, Reka and Marius, and "Moien" to David and Razvan from Luxembourg.&lt;/p&gt;&lt;p&gt;Gute Nacht!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-2676886272094502173?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/2676886272094502173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=2676886272094502173' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/2676886272094502173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/2676886272094502173'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/02/european-sharepoint-conference-day-1.html' title='European SharePoint Conference, Day 1'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-117046159694696661</id><published>2007-02-02T16:13:00.001-08:00</published><updated>2007-02-06T09:10:48.765-08:00</updated><title type='text'>Creating a Basic Site Definition in SharePoint 2007</title><content type='html'>&lt;p&gt;Creating a site definition from scratch in SharePoint 2007 is no easy task; easier, certainly, than it was in 2003, but in some ways even more complex. Perhaps the most confusing new element to creating site definitions is the use of FEATURES. There are some great articles on what FEATURES are and how to use them (see &lt;a href="http://dotnetaddict.dotnetdevelopersjournal.com/sharepoint_features2ndglance.htm"&gt;here&lt;/a&gt;, &lt;a href="http://www.heathersolomon.com/blog/articles/servermstpageforsitecollect_feature.aspx"&gt;here&lt;/a&gt;, and &lt;a href="http://msdn2.microsoft.com/en-us/library/aa830818.aspx"&gt;here&lt;/a&gt;) so do a little homework before you get started.&lt;/p&gt;&lt;p&gt;Unfortunately, the built-in WSS templates don't use the time-saving and oh-so-handy Publishing features of the portal definitions, so you'll have to create your own definition if you want to apply any customizations beyond basic style overrides. To get you going in the right direction, here's a handy little guide on creating a very basic site definition from scratch. Let's first assume that you want a custom Team Site - nothing fancy, just something you can style and modify without impacting the default definitions. &lt;/p&gt;&lt;p&gt;Begin by performing the same steps you would have done in 2003. Navigate to the \12\Template\SiteTemplates directory (the 60 hive is dead; long live the 12 hive). Copy the 'Sts' folder and rename it - say 'CUSTOMSITE' for this example. Next, find the WEBTEMP.XML folder in \12\Template\1033\Xml. Open it in Notepad and add a new Template node to the end, like so:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;lt; Template Name="CUSTOMSITE" ID="1001" &amp;gt;&lt;br /&gt;&amp;lt; Configuration ID="0" Title="Custom Web Site" Hidden="FALSE" ImageUrl="/_layouts/images/stsprev.png" Description="Customized site definition for My Team Site" DisplayCategory="Collaboration" &amp;gt; &amp;lt; /Configuration &amp;gt;&lt;br /&gt;&amp;lt; /Template &amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;* Note: The same numbering conventions apply in 2007 as in 2003 - set your Template ID to something greater than 1000 and the first Configuration node should always start with '0'.&lt;/p&gt;&lt;p&gt;Save the file and do an IISRESET at the command prompt. This is all you really need for a basic site definition but, as you will discover if you create a new Site Collection using this new definition and open it in SharePoint Designer, there are some things missing. Some very important things, actually, like the DefaultLayout.aspx page (look in /_catalogs/masterpage and you'll notice that only the default.master page is present). Without DefaultLayout.aspx you'll be able to modify the master page but not the central content area of your site. Oops. What happened?&lt;/p&gt;&lt;p&gt;As I said at the beginning, it's all about the Features. In this case, not only does the ONET.XML file determine what Features are provisioned as part of the site, there are also Features which determine what goes into a site that have nothing to do with the site itself - they are system Features that SharePoint uses when provisioning all sites.&lt;/p&gt;&lt;p&gt;To make sure that your new Site Definition has all the right pieces and parts, navigate to the \12\Template\Features\BaseSiteStapling folder and open BaseSiteStapling.xml in Notepad. It should look something like this:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;lt; Elements xmlns="&lt;/em&gt;&lt;a href="http://schemas.microsoft.com/sharepoint/%22"&gt;&lt;em&gt;http://schemas.microsoft.com/sharepoint/"&lt;/em&gt;&lt;/a&gt;&lt;em&gt;&amp;gt; &lt;/em&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="STS#0" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="STS#2" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="MPS#0" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="MPS#1" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="MPS#2" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="MPS#3" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="MPS#4" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="WIKI#0" / &amp;gt;&lt;br /&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="BLOG#0" / &amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;...&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Take note of the first child node - it defines a Feature (in this case, the BaseSiteFeatureTitle) to be included with the site identified by the TemplateName setting. Does this setting look familiar? It should, as it's the same as the STS (WSS Team Site) &amp;lt; Template &amp;gt; node in WEBTEMP.XML. The #0 after it refers to a specific &amp;lt; Configuration &amp;gt; child node. Since your new Site Definition needs to behave exactly as the STS definition does, you must create a &amp;lt; FeatureSiteTemplateAssociation &amp;gt; for each Feature that STS is associated with, like so:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;lt; FeatureSiteTemplateAssociation Id="B21B090C-C796-4b0f-AC0F-7EF1659C20AE" TemplateName="CUSTOMSITE#0" / &amp;gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Simply go through BaseSiteStapling.xml and each time you see an ID associated with STS#0 add an entry for CUSTOMSITE. But wait, you're not done. You now have to do the same thing in the PremiumSiteStapling.xml file located in \12\Template\Features\PremiumSiteStapling folder and, if you want the included workflows, do the same in FeatureStapling.xml in \12\Template\Features\StapledWorkflows folder.&lt;/p&gt;&lt;p&gt;Perform another IISRESET and create a new Site Collection based on your custom Site Definition. Now, when you edit the site in SharePoint Designer, you will see all the right files in /_catalogs/masterpage, such as DefaultLayout.aspx, AdvancedSearchLayout.aspx, SearchMain.aspx, etc.&lt;/p&gt;&lt;p&gt;As an aside, you can mimic some of the Publishing functionality of the Portal Site Definitions by create your own Style and Images libraries, uploading your files, and referring to them from your customized master and layout pages by relative URL (such as ../../images/myhomepageimage.gif or ../../styles/custom.css). &lt;a href="http://sharingpoint.blogspot.com/2007/02/overriding-default-stylesheets-in.html"&gt;See this post&lt;/a&gt; for information on how to override CORE.CSS using this method.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.sharepointkicks.com/kick/?url=http://sharingpoint.blogspot.com/2007/02/creating-basic-site-definition-in.html"&gt;&lt;img alt="kick it on SharePointKicks.com" src="http://www.sharepointkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://sharingpoint.blogspot.com/2007/02/creating-basic-site-definition-in.html" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-117046159694696661?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/117046159694696661/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=117046159694696661' title='31 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/117046159694696661'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/117046159694696661'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/02/creating-basic-site-definition-in.html' title='Creating a Basic Site Definition in SharePoint 2007'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>31</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-117036525766558495</id><published>2007-02-01T13:27:00.000-08:00</published><updated>2007-02-02T07:33:52.626-08:00</updated><title type='text'>Overriding Default Stylesheets in SharePoint 2007</title><content type='html'>&lt;p&gt;&lt;a href="http://www.heathersolomon.com/"&gt;Heather Solomon&lt;/a&gt; posted a &lt;a href="http://heathersolomon.com/blog/archive/2006/10/27/sp07cssoptions.aspx"&gt;detailed explanation&lt;/a&gt; on her site regarding the inheritance of styles in MOSS; specifically, the various methods for overriding CORE.CSS in master pages and site definitions. After defining the various options, Heather recommends the following for applying custom styles:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;My recommendation is to store styles in the master page itself in a set of STYLE tags. If your master page design has variations for assorted subsites, store the CSS differences in a file and reference it via the Master Page settings, or if you need CSS changes for a single page, store it in an HTML file and reference it in a hidden Content Editor Web Part.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;I wasn't at all comfortable with this approach, not so much because there is anything wrong with it (there isn't and Heather should get an award for incurring the brain damage required to sort through it all), but mostly because I don't like the idea of SharePoint forcing a default style onto my customized pages, thereby making me jump through hoops to correct a deficiency that never should have been there in the first place. I thought we'd been through this enough with 2003 and the design team would have learned their lesson but apparently not. &lt;/p&gt;&lt;p&gt;So after playing around with a few alternatives, I went old school and found the solution. Instead of using one of the new &lt;strong&gt;&amp;lt; SharePoint:CssRegistration / &amp;gt;&lt;/strong&gt; tags to register your override style in the header, simply place it in a classic ASP &amp;lt; link &amp;gt; tag in the same location, like so:&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&amp;lt; link rel="stylesheet" type="text/css" href="../../Style Library/en-us/Core Styles/core_override.css" / &amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This procedure will circumvent whatever the parser is doing in the background to throw CORE.CSS into the mix at all the wrong places. The beauty of it is that CORE.CSS is called before your override stylesheet so you can inherit all the default styles and only override the styles you need. Be sure that the relative path is correct for the site definition you are working with. An alternative would be to place your override into the same folder as CORE.CSS and use a fixed path, which would make working with different site definitions much easier, as each master page can point to its own override file (this can also be done programmatically).&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;/span&gt; As &lt;a href="http://www.graphicalwonder.com/"&gt;Shane&lt;/a&gt; points out in his comments on this post, using the alternate style setting in the site collection settings IS a reliable method for overriding CORE.CSS; however, there are some things you should consider if you are using this approach:&lt;br /&gt;&lt;br /&gt;1) The alternate CSS setting is GLOBAl for the site collection.  This means that all pages, including _layout pages, will inherit this style.  That may work for one implementation and not another; you might want different styles for the Admin pages (my term for all the pages found in _layouts), content pages, or subsites.  &lt;/p&gt;&lt;p&gt;2) The Alternate CSS setting applies to all subsites in the collection, making it more difficult to assign those styles programatically.  If you want to mix and match styles in your subsites you will have to find a method to override both CORE.CSS AND the alternate style.&lt;/p&gt;&lt;p&gt;3) The alternate setting must be done AFTER the site is provisioned.  This obviously won't work for custom site definitions.  A better approach would be to put the style in the master page settings, the PlaceHolderAdditionalPageHead, or, as I have suggested, use a &lt;&gt; tag.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-117036525766558495?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/117036525766558495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=117036525766558495' title='57 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/117036525766558495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/117036525766558495'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/02/overriding-default-stylesheets-in.html' title='Overriding Default Stylesheets in SharePoint 2007'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>57</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-116934793488826252</id><published>2007-01-20T18:43:00.000-08:00</published><updated>2007-01-20T18:52:21.663-08:00</updated><title type='text'>SharePoint 2007 and the .NET 2.0 Object Data Source</title><content type='html'>One of the smartest SharePoint gurus I know is &lt;a href="http://fusioncs.blogspot.com/"&gt;Sean Skinner&lt;/a&gt;.  Lucky for me, he was guillable enough to be fooled into coming to work for my company, so now I get to take advantage of all his know-how on a daily basis.  Like, for example, when one of our SmartForms apps blew up all over the place, and we couldnt' figure out what in the world was going on, Sean kept at it until he had the answer.  From his blog:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;em&gt;You cannot have an Object Data Source running on MOSS and it have a parameter (insert, update or otherwise) with a type of 'object'. This appears to be the type assigned for GUIDs (database fields of type 'unique identifier'). When you do, as soon as I would bind the formview I would get a generic MOSS error page. You know the one, 'A web part is causing a problem....'By changing the type on the parameter to 'string' everything started working... &lt;/em&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;(BTW, when he refers to ASP:Table elements junking up otherwise working code inside of SharePoint, what he really means to say is "Eric screwed up my perfectly functional code by filling it up with server-side elements that we didn't need".  Now you know the rest of the story...)&lt;br /&gt;&lt;br /&gt;There'll be a whole lot more where that came from when we get all of our blogs moved over to the new MOSS site so stay tuned - and if you don't read &lt;a href="http://fusioncs.blogspot.com/"&gt;Sean's blog &lt;/a&gt;already, you're missing out.  Add it to the 'ol blogroll, pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-116934793488826252?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/116934793488826252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=116934793488826252' title='21 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116934793488826252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116934793488826252'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/01/sharepoint-2007-and-net-20-object-data.html' title='SharePoint 2007 and the .NET 2.0 Object Data Source'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>21</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-116897833999318018</id><published>2007-01-16T12:12:00.000-08:00</published><updated>2007-01-17T08:16:21.236-08:00</updated><title type='text'>Tag, I'm It!</title><content type='html'>&lt;p&gt;I was harboring secretive dreams that the recent spate of tagging would leave me unscathed but my hopes have been shattered. Friend and fellow powerblogger &lt;a href="http://www.heathersolomon.com/blog/"&gt;Heather Solomon&lt;/a&gt; got me at last. So what are five things that people don't know about me that aren't either a) embarrassing or b) still subject to a statute of limitations? How about these:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;My primary intellectual hobby is ancient Egyptian history&lt;/strong&gt;. I've read dozens of books on the subject, seen every documentary ever created, visited nearly every major museum with an Egyptian exhibit, and can even read and write some hieroglyphs. As an offshoot, I've also studied a tremendous amount of early Judaic and Christian history as well. If you value your sanity, don't ever get caught near the British Museum with me around or you'll end up losing an entire day of your life to my endless chattering about the proper pronunciation of Tutuanhkamun and why I think Zahi Hawass is an idiot. Unfortunately, I've never had an opportunity to visit Egypt in person but it's on my list of first things to do when I eventually take a vacation (yeah, right).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;My favorite activity is training and hunting with my Labrador Retriever&lt;/strong&gt;. If you're not an animal person, you just won't get this, but there is nothing more rewarding than the bond between human and dog when engaged in a singular activity. Cheyenne, my 100-pound black Lab, is an amazing creature - watching her do what she was bred to do is a wonder to my eyes. I spent two years learning about training hunting retrievers before I got her and I trained her myself from the time she was five weeks old. I took a chance and didn't buy her from a breeder (no reason to invest that kind of money if you're not sure of your own skills) but boy did I get lucky - she can hold her own against any of those pedigreed wondermutts you see on TV. One thing I've learned from her that has served me well is that a good dog doesn't need to be trained to work with a person - the person needs to be trained to work with the dog. The dog was born knowing what to do, it's us humans that get things all screwed up. Take that for what it's worth.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;I'm part Scottish and part Native American (Mescalero Apache)&lt;/strong&gt;. My mother's family is Scottish down to their kilts. My uncle used to be one of the premier bagpipe instructors in the country and my cousin has played the pipes live for Rod Stewart on several occasions. Our line goes back to one of the oldest highland clans, the Atholl Murray's, and one of our ancestors came over on the Mayflower. My paternal grandmother is full-blooded Apache Indian. Unfortunately, all her birth records were lost in a fire years ago so we can't trace back our heritage on that side. And yes, I can drink me some whisky, in case you were wondering :-) &lt;/li&gt;&lt;li&gt;&lt;strong&gt;I play the harmonica&lt;/strong&gt;. Or, rather, I did, then I gave it up, then I picked it up again, and now I can barely play the thing anymore. I keep threatening to take it up again but the rolled eyes around my house indicate that I may need some serious refresher courses before I'm allowed to blow any riffs around the 'ol campfire.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;I used to sell floorcovering&lt;/strong&gt;. At one point when I was living in California I got burned out on the technology business and went to work selling carpets, wood floors and tile. I did pretty well and actually had a good niche doing custom wood floors and high-end commercial projects. I even learned how to tear it up, install it, do finish work, everything. About as far from high-tech as you can get but at the time that was the whole point. It was fun but I don't think I was cut out for it - I kept finding excuses to play with company's computers and not rearrange my samples on the sales floor. Ah well, once a geek, always a geek!&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So there you have it - more than you ever wanted to know about this humble SharePointer. Everyone on my list has already been tagged, so I guess I'm a 'dead end', so to speak. Hey, the chain had to end somewhere, didn't it???&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt;  Turns out there are a couple of people who have been flying under the tag radar and need a good one slapped on 'em:&lt;/p&gt;&lt;p&gt;&lt;a href="http://fusioncs.blogspot.com/"&gt;Sean Skinner&lt;/a&gt;&lt;br /&gt;&lt;a href="http://suguk.org/blogs/sharepoint_blog_1/default.aspx"&gt;Nick Swan&lt;/a&gt;&lt;/p&gt;&lt;p&gt;You're it!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-116897833999318018?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/116897833999318018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=116897833999318018' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116897833999318018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116897833999318018'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/01/tag-im-it.html' title='Tag, I&apos;m It!'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-116774771181417820</id><published>2007-01-02T06:21:00.000-08:00</published><updated>2007-01-02T06:22:33.103-08:00</updated><title type='text'>Happy New Year!</title><content type='html'>&lt;p&gt;To all my readers around the world, I want to wish you a safe and prosperous New Year.  &lt;/p&gt;&lt;p&gt;First, I'd like to thank everyone who reads and contributes to this blog.  I started blogging in 2005 to share my thoughts with other SharePointers and I never dreamed that I'd be collaborating with people all over the world would.  Last year more than 23,000 visitors read this blog and more than 60,000 pageviews were generated for readers in more than 20 countries.  Sure, &lt;a href="http://weblogs.asp.net/bsimser/"&gt;Bil&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/jan/"&gt;Jan&lt;/a&gt; and &lt;a href="http://www.andrewconnell.com/blog/"&gt;AC&lt;/a&gt; get more traffic but it's not bad for a country boy from Texas.    &lt;/p&gt;&lt;p&gt;Second, my apologies to those very same readers for not posting more often in 2006.  Business exploded this last year, leaving me with little time to sleep or eat, much less post regularly.  I plan to correct that this year by setting (and sticking to) a regular blogging schedule.&lt;/p&gt;&lt;p&gt;Finally, the new year brings new changes.  The eGroup started as a one-man SharePoint consultancy but has now grown by leaps and bounds, with some great new team members coming on board, new offices opening in the UK, and lots of other positive developments.  To reflect these changes, we'll be changing our name and launching a new site soon (built on MOSS, of course).  With more exposure comes more responsibility, so we'll be releasing more products, tools and utilities throughout the year and participating in events and conferencese throughout the US and Europe (I'll finally get a chance to meet many of you face to face for the first time - hoorah!).  &lt;/p&gt;&lt;p&gt;As part of these changes, this blog will be moving to our MOSS web farm and off of Blogger.  Not that Blogger hasn't done its job but with the new blog templates in MOSS there's just no reason not to switch.  The good news is that all of our consultants and developers will be blogging on the new site so there will be lots of fresh new ideas and solutions.  Links to all the new blogs and sites will be posted soon.&lt;/p&gt;&lt;p&gt;I look forward to a very exciting 2007.    &lt;/p&gt;&lt;p&gt;Happy SharePointing!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-116774771181417820?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/116774771181417820/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=116774771181417820' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116774771181417820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116774771181417820'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2007/01/happy-new-year.html' title='Happy New Year!'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-116468189933024065</id><published>2006-11-27T18:30:00.000-08:00</published><updated>2006-11-27T18:55:13.056-08:00</updated><title type='text'>Looking For A Few Good SharePointers</title><content type='html'>It's that time of year again - no, I'm not talking about jolly 'ol Saint Nick, annoying crowds at the mall or an XBox in your stocking (hint, hint), this is even better - The eGroup is hiring! If you've got SharePoint development experience and you're itching to work with a dynamic team of fellow SharePoint-crazy codeslingers, mosey on over to our &lt;a href="http://www.theegroup.net/News/Document%20Library/SPSRDEV%20122006.pdf"&gt;job postings&lt;/a&gt; and see if you fit the bill. No, you won't a free &lt;a href="http://www.slate.com/id/2154425/"&gt;Tesla Roadster&lt;/a&gt; and you'll have to bring your own &lt;a href="http://www.ultimatebackstore.com/product-exec/product_id/168?ovchn=FRO&amp;ovcpn=Froogle+UBS&amp;amp;amp;amp;ovcrn=Froogle&amp;ovtac=CMP&amp;amp;hs373=FRO%5EFloor+Model+Sale+Aeron+Chair%5EUBS"&gt;Aeron&lt;/a&gt;, but you will get to work on exciting client projects using the latest and greatest Microsoft technologies. Give yourself a Christmas present and tell the boss man you're movin' on up!&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt; UK readers take note - we'll be hiring on your side of the pond in the first quarter of '07. We'll be looking for both experienced and junior SharePoint developers so send in your CV if you'll be in the market for a new gig after the first of the year. In fact, if you're in and about London, drop by the &lt;a href="http://suguk.org/blogs/sharepoint_blog_1/archive/2006/11/23/1736.aspx"&gt;SharePoint UK User Group Meet Up&lt;/a&gt; on December 14th (you are a memeber, aren't you?) and introduce yourself (I'll be the only 6'5" Texan in the pub - pretty easy bloke to pick out of a crowd).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-116468189933024065?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/116468189933024065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=116468189933024065' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116468189933024065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116468189933024065'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/11/looking-for-few-good-sharepointers.html' title='Looking For A Few Good SharePointers'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-116164400856523160</id><published>2006-10-23T15:53:00.000-07:00</published><updated>2006-10-23T19:14:46.086-07:00</updated><title type='text'>SPSiteDataQuery vs. GetListItems</title><content type='html'>&lt;p&gt;&lt;a href="http://blogs.tamtam.nl/mart/"&gt;Mart Muller&lt;/a&gt; over at TamTam &lt;a href="http://blogs.tamtam.nl/mart/QueryingDocumentLibrariesInWSS3.aspx"&gt;posted his thoughts&lt;/a&gt; about using the new &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spsitedataquery.aspx"&gt;SPSiteDataQuery&lt;/a&gt; object in MOSS 2007 to retrieve items in a document library without tripping over the annoying folder limitations of the much-maligned &lt;a href="http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spquery.aspx"&gt;SPQuery&lt;/a&gt; class. This is handy method for getting list data via the object model but it also has some limitations and 'gotchas' to be aware of. &lt;/p&gt;&lt;p&gt;First, when retrieving list data, anecdotal tests have shown (and our experience has proven this to be absolutely true) that the object model is best suited for working with smaller data sets within web parts or controls in small to medium traffic environments (~10,000 users). Why is this? Nobody seems to know for sure but I suspect that it has to do with the overhead related to repeatedly calling the core DLL's that are also performing a number of other concurrent tasks (but I could very well be wrong; the cause may be up for debate but the results speak for themselves).&lt;/p&gt;&lt;p&gt;Second, as Maurice Prather and Bil Simser have pointed out &lt;a href="http://www.bluedoglimited.com/SharePointThoughts/ViewPost.aspx?ID=73"&gt;here&lt;/a&gt;, &lt;a href="http://www.bluedoglimited.com/SharePointThoughts/ViewPost.aspx?ID=175"&gt;here&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/bsimser/archive/2006/02/16/438350.aspx"&gt;here&lt;/a&gt;, all those SPSite and SPWeb objects you're throwing around in your code don't dispose of themselves - you have to handle that yourself (you are disposing of your garbage, aren't you?). Those little guys riding round on the back of the Garbage Collector truck never see those objects so they don't throw 'em on the rubbish pile - leave a few thousand of those things open and your application pool will come to a screeching halt.&lt;/p&gt;&lt;p&gt;Third, you have to keep a careful eye on that ViewFields element (and don't forget to &lt;a href="http://sharingpoint.blogspot.com/2006/10/to-that-is-caml-question.html"&gt;write your query correctly&lt;/a&gt;). A blank value will return all the fields &lt;em&gt;that the records have in common&lt;/em&gt; but not any fields that have blank or null values - these are omitted from the results. This is important when you're looking for a particular field only to discover it's not there at all - crash goes your code. Pass in a null value and you get the default view (such as AllItems.aspx) which may not contain any of the fields you're looking for. You have to specify ALL of the fields that you want to appear in the results. And, just to keep you on your toes, make sure to use the DisplayName value of the column in each &amp;lt; FieldRef &amp;gt; node and not the Name value (they are often quite different, especially in custom lists). &lt;/p&gt;&lt;p&gt;Finally, remember that object model methods of this type are always subject to the annoying but ever-present &lt;a href="http://sharingpoint.blogspot.com/2006/03/who-am-i-demystifying-sharepoint.html"&gt;impersonation issue&lt;/a&gt;. Call SPSiteDataQuery in the wrong user context and you won't get very far. RevertToSelf, anyone?&lt;/p&gt;&lt;p&gt;Personally, I prefer to use the web services GetListItems() method to get items from a list because a) it's faster (I know, you don't believe me, but it's true - someone somewhere did a performance comparison once but I can't seem to find it again. &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt;&lt;/strong&gt; &lt;a href="http://www.ekegren.dk/blog/AddBlogComment.aspx?id=35"&gt;Found it here&lt;/a&gt; but there aren't any hard metrics in the post. &lt;strong&gt;&lt;span style="color:#ff0000;"&gt;UPDATE II&lt;/span&gt;&lt;/strong&gt;: Scroll to the bottom of &lt;a href="http://www.ekegren.dk/blog/AddBlogComment.aspx?id=17376"&gt;this post&lt;/a&gt; for some very basic metrics), b) I have more granular control over user credentials (I can use an admin account to get the items then check the user perms to verify the access level - no impersonation required), c) the data is returned as an XMLNode object, and d) there's no garbage to worry about - once the TCP connection is closed the memory is released. Most importantly, the web services scale well, especially in shared services environments where you may have one portal context accessing list data from another portal context. That being said, I will probably use the SPSiteDataQuery object in one-off web parts where scalability and performance are not an issue because the code is short and sweet - which is an advantage unto itself, now isn't it? &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-116164400856523160?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/116164400856523160/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=116164400856523160' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116164400856523160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116164400856523160'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/10/spsitedataquery-vs-getlistitems.html' title='SPSiteDataQuery vs. GetListItems'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-116126936301167404</id><published>2006-10-19T07:44:00.000-07:00</published><updated>2006-10-19T07:49:23.873-07:00</updated><title type='text'>New Article on Custom Master Pages</title><content type='html'>I get a lot of questions from readers and clients regarding deployment of custom master pages in MOSS 2007.  There are several ways to tackle this problem and here's a very good place to start - Heather Solomon's new article on &lt;a href="http://heathersolomon.com/blog/articles/servermstpageforsitecollect.aspx"&gt;How to Create and Store Master Pages on the Server for Use with Site Collections&lt;/a&gt;.  Heather is one of my all-time favorite MVP's (I swear someday I'm not going to be neck-deep in projects during a SharePoint conference and we'll actually meet in person) and if you're not reading her blog on a regular basis then you're missing out.  Go check it out and get those custom master pages going.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-116126936301167404?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/116126936301167404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=116126936301167404' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116126936301167404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116126936301167404'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/10/new-article-on-custom-master-pages.html' title='New Article on Custom Master Pages'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-116058587164752659</id><published>2006-10-11T09:39:00.000-07:00</published><updated>2008-01-25T16:03:20.049-08:00</updated><title type='text'>To &lt; Query &gt; Or Not To &lt; Query &gt;, That Is The CAML Question</title><content type='html'>If you do any development using SharePoint's web services you've undoubtedly run across the evil CAML beast rearing it's ugly head to devour your nicely structured markup. For instance, if you invoke GetListItems() to retrieve the column values of each item in a list, you have the option of passing in a CAML query to return specific records or a blank value to get the whole enchilada. The SDK is quite helpful, as it documents how this specific query should look. If, for example, you want a particular record with the title "Yellow", provide the following CAML:&lt;br /&gt;&lt;br /&gt;&amp;lt;Query&amp;gt;&amp;lt;Where&amp;gt;&amp;lt;Eq&amp;gt;&amp;lt;FieldRef name="Title"&amp;gt;&amp;lt;Value Type="Text"&amp;gt;Yellow&amp;lt;/Value&amp;gt;&amp;lt;/Eq&amp;gt;&amp;lt;/Where&amp;gt;&amp;lt;/Query&amp;gt;&lt;br /&gt;&lt;br /&gt;Simple, no? Well, not quite so simple. Try as you might, this query will never return just those items whose Title column is equal to "Yellow". Instead, the web service will happily ignore your fancy little CAML fragment and give you all the records in the list. Alas, no amount of cursing, head beating, keyboard throwing or foot stomping will make it otherwise. I assure you, I have tried all of those methods, and many more, to no avail. What DOES work is simply removing the &amp;lt;Query&amp;gt; and &amp;lt;/Query&amp;gt; tags, like so:&lt;br /&gt;&lt;br /&gt;&amp;lt;Where&amp;gt;&amp;lt;Eq&amp;gt;&amp;lt;FieldRef name="Title"&amp;gt;&amp;lt;Value Type="Text"&amp;gt;Yellow&amp;lt;/Value&amp;gt;&amp;lt;/Eq&amp;gt;&amp;lt;/Where&gt;&lt;br /&gt;&lt;br /&gt;What's that you say? That's not how the SDK says it should be done? You spent hours searching the newsgroups and nobody once mentioned this little bit of CAML trickery? I feel your pain, my friend, believe me, I do. Were it not for my innate stubbornness and determination to beat SharePoint at it's own game, I would have given up on this vexing problem many moons ago. What can I tell you - CAML is a mysterious creature and we know not it's wild and wily ways. Now go ye forth and slay that noxious Query fiend - or at least stab at it until the next time it bites you on the rear!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-116058587164752659?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/116058587164752659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=116058587164752659' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116058587164752659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/116058587164752659'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/10/to-that-is-caml-question.html' title='To &lt; Query &gt; Or Not To &lt; Query &gt;, That Is The CAML Question'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-115948439195602557</id><published>2006-09-28T15:59:00.001-07:00</published><updated>2006-09-28T16:02:35.823-07:00</updated><title type='text'>MOSS2007 Beta2TR Trials and Tribulations</title><content type='html'>&lt;p&gt;Today was my lucky day to install a new MOSS2007 Beta2TR virtual machine from scratch. Oh, joy. Has anyone anywhere at any time so far managed to do this without uttering a single curse of frustration? I seriously doubt it. So here are the lessons I learned on today's adventure to MOSS-land:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;If you plan on using a unique admin account (other than 'Administrator') for database access and application pools (such as 'SPSAdministrator') be sure that you are logged in as that account throughout the entire installation, upgrade and configuration process. Otherwise, you'll get all kinds of strange errors during installation and configuration. Oh, and don't forget to add that account to SQL before starting the process with full admin rights (or at least 'dbcreator' and 'securityadmin').&lt;/li&gt;&lt;li&gt;The slipstream process ain't all it's cracked up to be. I tried three times to slipstream the install, which worked through the installation process (assuming you sorted out the somewhat misleading upgrade instructions), but it failed to create the central admin application upon configuration all three times. What is not quite so obvious is that you need both MOSS and WSS TR's to do the update - just MOSS won't work. This is confusing as you don't need have to install WSS before MOSS the first time around. Just remember to a) copy all the files from the Beta 2 cd image into a local directory, then b) extract the update files for MOSS B2TR and WSS B2TR into that directory's \Update folder.&lt;/li&gt;&lt;li&gt;Central Administration will not work from a clean slipstream install (at least not for me it wouldn't and I was working from a fresh Win2k3 install). The configuration wizard runs and the central admin app is created but you can't access it - just an annoying 404 error every time. You must first install Beta 2, then run the configuration wizard (which creates the central admin app correctly) THEN run the WSS B2TR followed by the MOSS B2TR. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Finally, after much gnashing of teeth and flailing of limbs, I have a clean MOSS2007 image to work from. Now it's on to custom site definitions which, based on the install experience, promise to be a all-out man vs. machine war. Stay tuned for reports from the battlefield.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-115948439195602557?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/115948439195602557/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=115948439195602557' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115948439195602557'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115948439195602557'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/09/moss2007-beta2tr-trials-and_28.html' title='MOSS2007 Beta2TR Trials and Tribulations'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-115815192174902988</id><published>2006-09-13T05:52:00.000-07:00</published><updated>2006-09-13T05:53:06.420-07:00</updated><title type='text'>Business Portals  vs. Line of Business Applications</title><content type='html'>&lt;p&gt;A primary focus of our business is building custom SharePoint-based applications for our clients.&amp;nbsp; Naturally, being SharePoint gearheads, we believe that everything under the sun can somehow be made to work in SharePoint (and we're not often wrong) but we run into a great deal of confusion when presenting clients with various customization options.&amp;nbsp; One of the most difficult ideas to grasp is the separation between a business portal (BP) and a line of business application (LOB).&amp;nbsp; Which is which and where/how do you use each one?&lt;/p&gt; &lt;p&gt;To begin with, a business portal is defined as any application or set of applications (and the default SharePoint experience is really a set of integrated applications) that share a common brand or visual presentation and is usually delivered as a packaged installation (as opposed to a fixed location extranet or intranet) to customers, partners, or other constituents.&amp;nbsp; An LOB, on the other hand, is a distinct application that is deployed within an existing inter/intra/extranet implementation.&amp;nbsp; &lt;/p&gt; &lt;p&gt;On a more technical level, a customized set of WSS site definitions, web parts, and templates that together combine to form a branded collaboration application for, say, the real estate market, would be a business portal.&amp;nbsp; On the other hand, a set of web parts, lists, roll-ups, controls, or other programmatic elements, delivered individually or packaged together, and installed within an existing company intranet for tracking sales and orders, would be an line of business application.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Just to muddy up the waters a bit, it should be pointed out that the two are not mutually exclusive - an LOB can be deployed within a business portal and a business portal can be created to serve internal as opposed to external customers (an IT help desk solution for a company with multiple, independent locations comes to mind).&amp;nbsp; Many organizations start creating LOB's soon after they deploy a new portal solution without realizing that's what they are doing, as they roll out custom web parts that roll-up, consolidate, or provide access to various sources of company data.&lt;/p&gt; &lt;p&gt;Business portals can be a very powerful tool for organizations that need to&amp;nbsp;deliver&amp;nbsp;rich web-enabled applications on a limited budget.&amp;nbsp;&amp;nbsp;WSS provides a comprehensive, flexible, and customizable (and let's not forget FREE!)&amp;nbsp;platform for&amp;nbsp;creating dynamic web applications.&amp;nbsp; The best thing about BP's is that the&amp;nbsp;framework is already in place - navigation, data storage (via lists), security,&amp;nbsp;browser-based site management - so developers&amp;nbsp;can focus on customizing and extending the framework without reinventing the wheel at every turn.&amp;nbsp; With the introduction of SharePoint 2007 and the improved customization options, along with built-in workflow and item-level security, forms-based&amp;nbsp;authentication, and the business data catalog, expect a dramatic upsurge in the number of&amp;nbsp;business portals&amp;nbsp;being created, many of which will be offered as stand-alone applications (hint: expect to see several from us before the end of the year).&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-115815192174902988?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/115815192174902988/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=115815192174902988' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115815192174902988'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115815192174902988'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/09/business-portals-vs-line-of-business.html' title='Business Portals  vs. Line of Business Applications'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-115703697430528665</id><published>2006-08-31T08:09:00.000-07:00</published><updated>2006-08-31T09:45:58.220-07:00</updated><title type='text'>eGroup List Viewer Web Part</title><content type='html'>&lt;p&gt;Whenever I begin a new portal design engagement, one of the most difficult concepts to communicate to the client's design/architecture group is 'Content-Driven Design'. The theory is simple - create an architecture and taxonomy around the information that is most important within your organization. What makes it difficult is the almost Pavlovian instinct to organize content based on company structure - breaking away from the org chart sometimes requires superhuman effort. &lt;/p&gt;&lt;p&gt;Fortunately, once the initial shock wears off, the light goes on and heads start nodding around the conference table. It doesn't take long for people who couldn't pronounce 'taxonomy' the week before to suddenly become content design experts. This only makes sense, as they already have a picture in their minds of how their company's information should be organized, they just need a push in the right direction to translate those thoughts into a good architectural design. &lt;/p&gt;&lt;p&gt;One of the most critical elements to a good content-driven architecture is the concept of "Author Once, Publish Everywhere". In this model, information is created and managed in the most granular context applicable to it's function but published in the context where it is most often consumed. For example, an HR policy would most likely be created and stored in an HR team site, somewhere within the overall departmental hierarchy. This allows team members to collaborate effectively on documents that pertain to their job function while permitting the greatest degree of security and oversight. Users, on the other hand, shouldn't be poking around in the HR team site, they should be browsing a portal area that is generally classified to contain that type of information (such as 'Employee Resources' or 'New Hire Information'). &lt;/p&gt;&lt;p&gt;Unfortunately, this design methodology reveals an inherent weakness in SharePoint - the inability to distribute list content throughout the portal. In the SharePoint structure, lists can only be viewed in the context in which they were created (in our example, the HR documents could only be viewed within the HR team site). SharePoint does not ship with out-of-the-box capabilities to create list items in one area/site and view them in another.&lt;/p&gt;&lt;p&gt;To meet this requirement, we created a web part which allows list content in any area or site to be viewed in another area or site by users with sufficient permissions to view items in the source list (they must at least be a 'Reader'). We've used it in numerous client engagements and it is a critical component in our Content-Driven Design methodology. Just add the web part to a page, give it the portal/site url, list name, and view, set the display options (toolbars and column titles), and voila - list content for everyone, everywhere!&lt;/p&gt;&lt;p&gt;The web part can be downloaded &lt;a href="http://www.theegroup.net/Document%20Library/eGroup%20List%20Viewer%20Web%20Part.zip"&gt;here&lt;/a&gt;. The zip file contains a ReadMe document with instructions on installing the CAB file (in case you haven't done it before) along with information on deploying it to a portal/site page and configuring the various options. &lt;/p&gt;&lt;p&gt;As always, post any questions, comments, or suggestions to this post.&lt;/p&gt;&lt;p&gt;Enjoy!&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.sharepointkicks.com/kick/?url=http://sharingpoint.blogspot.com/2006/08/egroup-list-viewer-web-part.html"&gt;&lt;img src="http://www.sharepointkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://sharingpoint.blogspot.com/2006/08/egroup-list-viewer-web-part.html" border="0" alt="kick it on SharePointKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-115703697430528665?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/115703697430528665/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=115703697430528665' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115703697430528665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115703697430528665'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/08/egroup-list-viewer-web-part.html' title='eGroup List Viewer Web Part'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-115593813602844327</id><published>2006-08-18T14:55:00.000-07:00</published><updated>2006-08-18T15:03:31.396-07:00</updated><title type='text'>eGroup SharePoint Utilities</title><content type='html'>&lt;p&gt;I am a big proponent of leveraging SharePoint to deliver enterprise line-of-business applications (LOB's). Much of the custom development we do at The eGroup involves the use of SharePoint lists as data repositories for dashboards, workflows, roll-ups and, of course, LOB's. Working extensively with SharePoint lists brings introduces its own set of challenges - coding against the web services, creating and maintaining a large number of custom views, managing security and migration of list structure/content from development to staging and production.&lt;/p&gt;&lt;p&gt;In the course of developing these applications we have created a set of tools to aid us in our efforts. To save our fellow SharePoint developers some of the headaches we've encountered, and to encourage other developers to contribute their time-saving apps, we'll be releasing various applications and utilities from our toolkit in the coming weeks and months. The first utility, the &lt;a href="http://sharingpoint.blogspot.com/2006/08/sharepoint-list-xml-viewer-utility.html"&gt;SharePoint List XML Viewer&lt;/a&gt;, received an enthusiastic response and generated a fair number of downloads. I hope it is serving everyone well and we will continue to improve it as we receive feedback from the SharePoint community.&lt;/p&gt;&lt;p&gt;The second tool to be released, the SharePoint List Creator, is a companion utility to the List XML Viewer. Using the XML output gathered from the XML Viewer, it provides developers with the ability to define custom lists in XML and easily deploy them to multiple sites/areas. This can be quite a time saver when you have a large number of heavily customized lists that must be moved to different environments, especially when each portal or site collection exists in disparate server farms and/or separate domains.&lt;/p&gt;&lt;p&gt;To use the SharePoint List Creator you'll need good working knowledge of XML and some CAML experience. Creating a new list requires a source XML file that contains the properties, fields, and views that will comprise the list. A sample file, DocumentLibrary.xml, has been provided in the \XML directory to give you a basic template to work from (remember to store all your custom list templates in this same directory). If you haven't done much CAML or manual list creation, a good first step would be to create a custom list in the SharePoint GUI then view the list structure with the List XML Viewer. Compare the output to the sample xml template and it won't take long to figure out how to create just about any list type from scratch. We'll release more samples in the future to aid new developers and in response to comments/requests. &lt;/p&gt;&lt;p&gt;To use the SharePoint List Creator, first &lt;a href="http://www.theegroup.net/Document%20Library/eGroup%20SharePoint%20Utilities.zip"&gt;download the eGroup SharePoint Utilities&lt;/a&gt; Windows Installer package from our web site. This package contains both the SharePoint List Creator and the SharePoint List XML Viewer. Next, install the MSI on your development machine and launch it from the program menu shortcut. Provide the site/area URL, list name, type, source XML document, and authentication credentials, and submit the changes. The tabs in the utility will display the source XML, new list XML being submitted, the results from the list updates, and the results from the view modifications. You'll also find any errors encountered under the appropriate tab (i.e. if view creation fails, check the "View Results" tab).&lt;/p&gt;&lt;p&gt;We'll update the Utilities suite with new apps as we convert or create them (many are ASP.NET applications that require migration to Windows Forms prior to deployment). As always, please post your questions, suggestions, feature requests, gripes and complaints as comments to the post. Feedback is the only method we have to gauge the community reaction to our efforts. I hope you find the tools useful. Enjoy! &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.sharepointkicks.com/kick/?url=http://sharingpoint.blogspot.com/2006/08/egroup-sharepoint-utilities.html"&gt;&lt;img src="http://www.sharepointkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://sharingpoint.blogspot.com/2006/08/egroup-sharepoint-utilities.html" border="0" alt="kick it on SharePointKicks.com" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-115593813602844327?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/115593813602844327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=115593813602844327' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115593813602844327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115593813602844327'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/08/egroup-sharepoint-utilities.html' title='eGroup SharePoint Utilities'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-115487886227302484</id><published>2006-08-06T08:34:00.000-07:00</published><updated>2006-08-06T12:09:48.380-07:00</updated><title type='text'>New Version of SharePoint XML List Viewer</title><content type='html'>I received some good feedback on the XML List Viewer utility and have posted a new version with the following modifications:&lt;br /&gt;&lt;br /&gt;* Clear text entries hidden in password field&lt;br /&gt;* XML displayed in structured view (similar to IE functionality)&lt;br /&gt;* XML can be saved to local file (Right-click within XML field, choose 'Save')&lt;br /&gt;* XML can be printed (Right-click within XML field, choose 'Print')&lt;br /&gt;* XML can be searched for a specified string (right-click, 'Search')&lt;br /&gt;&lt;br /&gt;Download the new version (1.1) &lt;a href="http://www.theegroup.net/Document%20Library/eGroup.ListXmlViewer_v1_1.zip"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Please post any additional feature suggestions as comments to this post.&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt;&lt;/span&gt; Downloads from the earlier post had problems with the .NET 1.0 version of the tree view DLL.  I have posted an updated version (use the same link above) that includes a recompiled .NET 1.1 version XmlTreeView source code within the executable (thanks to &lt;a href="http://www.codeproject.com/cs/miscctrl/Siepe_XmlTreeView.asp"&gt;Thomas Siepe&lt;/a&gt; for making the source available on &lt;a href="http://www.codeproject.com/"&gt;The Code Project&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-115487886227302484?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/115487886227302484/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=115487886227302484' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115487886227302484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115487886227302484'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/08/new-version-of-sharepoint-xml-list.html' title='New Version of SharePoint XML List Viewer'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-115466419694089421</id><published>2006-08-03T20:38:00.000-07:00</published><updated>2006-08-03T21:05:57.663-07:00</updated><title type='text'>SharePoint List XML Viewer Utility</title><content type='html'>Many of us are rejoicing over the new web publishing features in MOSS2007 and the ability to create corporate web sites using SharePoint. Unfortunately, many enterprises are not planning to upgrade to 2007 for quite some time, and those that use SharePoint extensively are looking for ways to derive additional value from their portal investment. One of the best ways to do this is to use SharePoint 2003 as a basic content management system for a public web site (at least until a full 2007 migration can be completed).&lt;br /&gt;&lt;br /&gt;I just finished a project where an existing - and very expensive - CMS application (I won't name names but it's not MCMS) is being phased out in favor of using SharePoint lists as the primary method for managing content on a standard ASP/ASP.NET public web site. When you think about, this makes perfect sense - SharePoint provides a form-based web interface for handling content submissions, security is built into the platform, content approvals and basic workflow are easy to implement, and every list in a portal/site is accessible via web services (for more information on using SharePoint as part of a basic CMS application, &lt;a href="mailto:info@theegroup.net"&gt;email me directly&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;While working on this project I discovered that working with the SharePoint web services is no picnic; not only do you have to know all their little quirks (like the viewName argument requiring a GUID instead of the display name of the view) but you also have to make allowances in your code for all the funky things SharePoint does behind the scenes with the list XML. For example, when you name a field 'Field1', the list details show the field as just that - Field1 - but when you try to retrieve the list data using the Lists web service, you must refer to the field as 'ows_Field1'. And then there's the ever-popular trick of replacing all spaces in field names with '_x0020_'. Naturally, there are no tools in SharePoint that allow you to retrieve this information, invaluable though it might be. It's enough to drive you mad.&lt;br /&gt;&lt;br /&gt;To maintain my sanity and bring some order to web service programming, I created a small utility to retrieve the XML for any list via the SharePoint web services. The SharePoint List XML Viewer is a small Windows app that programmers can use to retrieve the XML output for any list or list items (including any default or custom views) to aid them in building web service applications. You can &lt;a href="http://www.theegroup.net/Document%20Library/eGroup.ListXmlViewer.zip"&gt;download it here&lt;/a&gt;. Just unzip the file and run the executable. Give it the site/area url, list name, and view name, supply the necessary login credentials, pick which type of XML you want (list data or list items) and - voila - instant XML that can be cut-and-pasted into your favorite text editor.&lt;br /&gt;&lt;br /&gt;The SharePoint List XML Viewer Utility isn't anything fancy - it's just a basic utility for developers - but it saved me countless hours programming against SharePoint's web services and I hope it helps you, too. Enjoy!&lt;br /&gt;&lt;br /&gt;(Post comments to this post if you have any issues installing and using the tool)&lt;br /&gt;&lt;br /&gt;BTW, I recommend using the application along with the &lt;a href="http://blog.u2u.info/DottextWeb/patrick/archive/2005/03/28/1617.aspx"&gt;CAML Query Builder and Execution Tool&lt;/a&gt; from the good folks at U2U. Sooner or later you'll need to execute a query in a web service call and the CAML Builder is the best thing going.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.sharepointkicks.com/kick/?url=http://sharingpoint.blogspot.com/2006/08/sharepoint-list-xml-viewer-utility.html"&gt;&lt;img src="http://www.sharepointkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://sharingpoint.blogspot.com/2006/08/sharepoint-list-xml-viewer-utility.html" border="0" alt="kick it on SharePointKicks.com" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-115466419694089421?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/115466419694089421/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=115466419694089421' title='286 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115466419694089421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115466419694089421'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/08/sharepoint-list-xml-viewer-utility.html' title='SharePoint List XML Viewer Utility'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>286</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-115108192207171602</id><published>2006-06-23T09:54:00.000-07:00</published><updated>2006-08-06T12:17:37.036-07:00</updated><title type='text'>Extreme SharePoint Design 2007: Introduction to Customizing Default Pages</title><content type='html'>&lt;span xmlns=""&gt;&lt;p&gt;This is the first post in a new series covering advanced design in Microsoft Office SharePoint Server 2007 (MOSS2007). As with previous Extreme SharePoint Design posts, much of the material will be undocumented, some posts will walk the line on supportability, and some will downright obliterate the line just to show what can be done; therefore, all techniques should be tried first in a test environment and a good backup is always a necessity. Now on to the good stuff! &lt;/p&gt;&lt;p&gt;MOSS2007 takes a radically different approach to rendering pages, due mostly to the integration of Content Management Server features into the product and an ongoing effort on Microsoft’s part to migrate towards a more structured, data-bound architecture (i.e. CAML and XML). Much of what we learned customizing SPS2003 will still be applicable but a great deal of the behind the scenes machinery has changed. A good place to begin learning how to modify MOSS2007 to meet your needs is with default page customizations; changing the structure, appearance, and layout of the default site welcome pages.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Since MOSS2007 is built on ASP.NET 2.0, a solid understanding of master pages is required in order to grasp how site pages are constructed and rendered. A master page (any ASPX page with a .master extension) is nothing more than a template with placeholders for content, much like a regular ASP.NET page that invokes user controls to render content. In .NET 2.0 syntax, these placeholders are implemented using the &amp;amp;lt;ASP:ContentPlaceHolder&amp;amp;gt; tag. Placeholders can be nested, so that a top-level placeholder may have multiple levels of child placeholders, much like a parent DIV can have many nested child DIV’s.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The master page by itself usually contains very little actual content other than headers and navigation – it’s just a framework for one or more layout pages that comprise the body of the page. In MOSS2007, the master page DEFAULT.MASTER, located in WEB SERVER EXTENSIONS\12\TEMPLATE\GLOBAL, defines the standard top header and left navigation layout found throughout the basic site definitions. Unlike SPS2003, where the default page in each site definition contained all the code necessary to render the page, the new site definitions, located in 12\TEMPLATE\SITETEMPLATES, have a DEFAULT.ASPX page that references the master page but contains no actual content. Instead, the default page is built at runtime when the site is created by combining MASTER.DEFAULT with the layout page referenced in the PublishingPageLayout property of the Default.aspx File node of the Modules configuration in ONET.XML (~SiteCollection/_catalogs/masterpage/defaultlayout.aspx for the SPS site definition, which corresponds to 12\TEMPLATE\FEATURES\PORTALLAYOUTS\DEFAULTLAYOUT.ASPX in the server file structure). The combined file is then stored in the Pages list on the top-level site.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DEFAULT.ASPX = MASTER.DEFAULT + DEFAULTLAYOUT.ASPX&lt;br /&gt;&lt;/p&gt;&lt;p&gt;When you edit the default page using SharePoint Designer you are actually editing the combined code from two pages – the master page and the layout page. Fortunately, because the default page is stored in a list, the whole ghosting/unghosting issue no longer applies (hooray for that!); however, there is one major drawback – since the page doesn’t actually exist until the site is created, editing it only applies to the current site instance – new sites or subsites based on the same definition will have to edited manually each time they are created. To automate this process, the site definition must be modified in a similar manner to the methods used in SPS2003 but using the new master page methodology. Doing so requires making changes not just to a single default page but both the master and layout pages (we’ll cover creating new site definitions from scratch in a subsequent post).&lt;br /&gt;&lt;/p&gt;&lt;p&gt;The layout page works with the default page by specifying what content is to be placed in the placeholder zones using the &amp;amp;lt;ASP:Content&amp;amp;gt; tag and referencing the placeholder id. The page handler process then assigns the content in the layout page, which consists of the HTML markup we are used to seeing in SharePoint pages (server controls, web part zones, etc.), to the proper zone in the default page. The following illustration is a wireframe model of a combined DEFAULT.ASPX page with all the major placeholders, server controls, custom tags, content areas and publishing/web part zones placed in their proper context (click on the image to view it full size):&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://static.flickr.com/57/173281773_b6bd7cc38a_o.png"&gt;&lt;img src="http://static.flickr.com/53/173281774_7bbb0b1bd6_o.png" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;Blue areas in the model indicate placeholders, red is for server/user controls, purple represents new ASP-specific controls (in this case the breadcrumb navigation menu), green indicates the new PublishingWebControls objects, and grey is the standard web part zones. The yellow headers indicate the relationship between the default and layout pages. The final rendered page looks like this:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://static.flickr.com/72/173322874_6c197cb8aa.jpg" width="400"/&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;As you can see from the wireframe model, the page layout is not all that different from SPS2003, except that content is now separated from navigation by using two different file types. The beauty of this model is that changes to DEFAULT.MASTER are global; no more cutting and pasting code modifications into multiple site definitions. Likewise, the DEFAULTLAYOUT.ASPX page is also universal, making changes much easier to implement. If, for example, we wished to change the basic layout of the web part zones in the body of the page, we can modify the markup in DEFAULTLAYOUT.ASPX without touching the headers and navigation contained in the master page. We can also add content to the master page by using &amp;amp;lt;ASP:Content&amp;amp;gt; tags and specifying the placeholder with the ContentPlaceHolderId setting without actually modifying the master page itself.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;In SPS2003 the customization process was cumbersome and inefficient; with the new master page model, Microsoft has given us far greater flexibility in customizing SharePoint sites to meet each organization’s unique requirements. In subsequent posts we will explore in greater depth the new MOSS2007 architecture, including the new list file structure, the long-overdue changes to the administration pages, and how to create new site definitions from scratch.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Happy SharePointing!&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://www.sharepointkicks.com/kick/?url=http://sharingpoint.blogspot.com/2006/06/extreme-sharepoint-design-_115108192207171602.html"&gt;&lt;img alt="kick it on SharePointKicks.com" src="http://www.sharepointkicks.com/Services/Images/KickItImageGenerator.ashx?url=http://sharingpoint.blogspot.com/2006/06/extreme-sharepoint-design-_115108192207171602.html" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-115108192207171602?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/115108192207171602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=115108192207171602' title='265 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115108192207171602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/115108192207171602'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/06/extreme-sharepoint-design-_115108192207171602.html' title='Extreme SharePoint Design 2007: Introduction to Customizing Default Pages'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>265</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114973484297843882</id><published>2006-06-07T19:45:00.000-07:00</published><updated>2006-06-08T06:27:50.266-07:00</updated><title type='text'>Extreme SharePoint Design: Using the AlternateHeader Property in WSS</title><content type='html'>I’ve done a number of customizations to administration pages (.aspx files located in the \LAYOUTS\1033 directory) by directly modifying the pages themselves. This is a cumbersome process, involving a lot of HTML search-and-replace operations. I felt it was time to use a more flexible approach so I attempted to create a more robust solution that works in both SPS and WSS. The first challenge to overcome was the fact that pages in a WSS context don’t inherit the AlternateHeader property from the Site Definition ONET.XML file. In the portal definitions, the following setting points the administration pages to a file called ‘PortalHeader.aspx’ and, if the file is not empty, renders the header contained therein:&lt;br /&gt;&lt;br /&gt;&amp;lt; title="Team Web Site" listdir="Lists" ows="Microsoft SharePoint" alternateheader="PortalHeader.aspx" disablewebdesignfeatures="wdfbackup; wdfrestore; wdfpackageimport; wdfpackageexport; wdfthemeweb; wdfthemepage; wdfnavigationbars; wdfnavigationview; wdfpublishview; wdfpublishselectedfile; wdfNewSubSite"&amp;gt;&lt;br /&gt;&lt;br /&gt;This setting does not exist in the STS definition so it must be added (note that this will have no effect on existing WSS sites, only new ones created after the ONET.XML file has been modified). Unfortunately, the default PortalHeader.aspx file contains a number of &amp;lt; SPSWC: &amp;gt; control references which are portal-specific and will not render in a WSS context; simply adding this setting will not solve the problem. So the first step is to edit the ONET.XML file in TEMPLATE\1033\STS\XML to include the AlternateHeader setting and point it to a new header file, as follows:&lt;br /&gt;&lt;br /&gt;Original code:&lt;br /&gt;&lt;br /&gt;&amp;lt; title="Team Web Site" listdir="Lists" ows="Microsoft SharePoint"&amp;gt;&lt;br /&gt;&lt;br /&gt;Replacement code:&lt;br /&gt;&lt;br /&gt;&amp;lt; title="Team Web Site" listdir="Lists" ows="Microsoft SharePoint" alternateheader="STSHeader.aspx"&amp;gt;&lt;br /&gt;&lt;br /&gt;Next, the new header file must be created (STSHeader.aspx in this example). This file must contain the proper WSS-context registrations to enable code execution (if necessary) and the content must be devoid of any portal-specific control references. Here is a sample STSHeader.aspx file:&lt;br /&gt;&lt;br /&gt;&amp;lt; % @ Page language="C#" % &amp;gt;&lt;br /&gt;&amp;lt; % @ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" % &amp;gt;&lt;br /&gt;&amp;lt; % @ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" % &amp;gt;&lt;br /&gt;&amp;lt; % @ Import Namespace="Microsoft.SharePoint" % &amp;gt;&lt;br /&gt;&amp;lt; % @ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" % &amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt; link rel="'stylesheet'" type="'text/css'" href="'/_layouts/1033/styles/custom.css'"&amp;gt;&lt;br /&gt;&amp;lt; table width="100%" cellpadding="0" cellspacing="0" border="0"&amp;gt;&lt;br /&gt;&amp;lt; tr &amp;gt;&lt;br /&gt;&amp;lt; td width="100%"&amp;gt;&lt;br /&gt;&amp;lt; div class="spsHeader" &amp;gt;&lt;br /&gt;&amp;lt; !-- Insert Header HTML Here -- &amp;gt;&lt;br /&gt;&amp;lt; % Execute Some ASP.NET Code Here % &amp;gt;&lt;br /&gt;&amp;lt; /div &amp;gt;&lt;br /&gt;&amp;lt; /td &amp;gt;&lt;br /&gt;&amp;lt; /tr &amp;gt;&lt;br /&gt;&amp;lt; /table &amp;gt;&lt;br /&gt;&lt;br /&gt;After modifying the ONET.XML file and creating the new header file, copy ONET.XML to its original location and place the new header file in the \LAYOUTS\1033 directory. Perform and IISRESET on the server and create a new WSS site. Next select ‘Documents and Lists’ or ‘Create’ from the menu to see your new header code in action. If you plan to utilize custom server controls within the header file be sure to add the necessary registrations to the top of the page prior to deployment.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114973484297843882?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114973484297843882/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114973484297843882' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114973484297843882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114973484297843882'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/06/extreme-sharepoint-design-using.html' title='Extreme SharePoint Design: Using the AlternateHeader Property in WSS'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114963126337007497</id><published>2006-06-06T14:58:00.000-07:00</published><updated>2006-06-06T15:01:03.656-07:00</updated><title type='text'>Ajax/Atlas in SharePoint?</title><content type='html'>A colleague of mine is trying to get Ajax/Atlas assemblies working in SharePoint. All is good if he hard-codes the functionality but the SharePoint safe mode parser is kicking the code out anytime he tries to use the precompiled assemblies. Anyone have experience with this? Post a comment and throw a fellow code monkey a banana or two!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114963126337007497?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114963126337007497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114963126337007497' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114963126337007497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114963126337007497'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/06/ajaxatlas-in-sharepoint.html' title='Ajax/Atlas in SharePoint?'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114856714510175258</id><published>2006-05-25T07:24:00.000-07:00</published><updated>2006-05-25T07:25:45.596-07:00</updated><title type='text'>Enabling the 'Edit in Microsoft Word' Functionality for Office 2000/XP Users</title><content type='html'>Ever since SharePoint v2 was released organizations have struggled with the Office 2003-dependent features of the product.  The primary source of frustration are those functions that should work for all users but don’t – like the ‘Edit in [Application]’ link in document libraries.  Users with Office 2000/XP get the dreaded “” error when trying to access files using this option, while Office 2003 users can continue working without interruption.  While there are several workarounds for this missing functionality, all of them require Office 2000/XP users to perform different steps to access a document than those users who have Office 2003 installed on their system.&lt;br /&gt;&lt;br /&gt;Fortunately, there is a way to overcome this problem.  The ‘Edit in …’ option is exposed in the core JavaScript file OWS.JS located in the 60\TEMPLATE\LAYOUTS\1033 folder on each front-end web server.  On or about line 1440 is the following function:&lt;br /&gt;&lt;br /&gt;function editDocumentWithProgID2(strDocument, varProgID, varEditor)&lt;br /&gt;{&lt;br /&gt;    var objEditor;&lt;br /&gt;    if (strDocument.charAt(0) == "/"  strDocument.substr(0,3).toLowerCase() == "%2f")&lt;br /&gt;        strDocument = document.location.protocol + "//" + document.location.host + strDocument;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        objEditor = new ActiveXObject(varEditor + ".2");&lt;br /&gt;        if (!objEditor.EditDocument2(window, strDocument, varProgID))&lt;br /&gt;            alert(L_EditDocumentRuntimeError_Text);&lt;br /&gt;        window.onfocus = RefreshOnNextFocus;&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    catch (e)&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        objEditor = new ActiveXObject(varEditor + ".1");&lt;br /&gt;        window.onfocus = null;&lt;br /&gt;        if (SzExtension(strDocument) == "ppt" &amp;&amp;amp; varProgID == "")&lt;br /&gt;            varProgID = "PowerPoint.Slide";&lt;br /&gt;        if (!objEditor.EditDocument(strDocument, varProgID))&lt;br /&gt;            alert(L_EditDocumentRuntimeError_Text);&lt;br /&gt;        SetWindowRefreshOnFocus();&lt;br /&gt;        return;&lt;br /&gt;    }&lt;br /&gt;    catch (e)&lt;br /&gt;    {&lt;br /&gt;        alert(L_EditDocumentProgIDError_Text);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;This function takes three parameters that define the document’s location, program ID, and the application which created it.  The critical code in this function is found within the two Try…Catch blocks starting on line 1445.  The first block applies to Office 2003 users (the “.2” designation appended to the variable varEditor indicates O2K3 clients), while the second is applicable to Office 2000/XP clients.  This is the portion of the function that must be altered to enable the ‘Edit in …’ option for these users.&lt;br /&gt;&lt;br /&gt;The original code identifies the application type and determines the correct application to launch based on settings in the DOCICON.XML file.  For Office 2000/XP clients, the script must instead contain an explicit mapping between file extension and application (UPDATE: There is a way to parse the DOCICON.XML file dynamically to achieve these results but the code is lengthy and cumbersome – the performance trade-offs are probably not worth the effort).  To achieve this, simply add a series of if…else if statements to the beginning of the second block for each file type:&lt;br /&gt;&lt;br /&gt;         if (SzExtension(strDocument) == "doc")&lt;br /&gt;        {&lt;br /&gt;            objEditor = new ActiveXObject("Word.Application");&lt;br /&gt;            objEditor.Visible = true;&lt;br /&gt;            objEditor.Documents.Open(strDocument);&lt;br /&gt;        }&lt;br /&gt;        else if (SzExtension(strDocument) == "xls")&lt;br /&gt;        {&lt;br /&gt;            objEditor = new ActiveXObject("Excel.Application");&lt;br /&gt;                        objEditor.Visible = true;&lt;br /&gt;            objEditor.Workbooks.Open(strDocument);&lt;br /&gt;        }&lt;br /&gt;        else if (SzExtension(strDocument) == "ppt")&lt;br /&gt;            {&lt;br /&gt;                        objEditor = new ActiveXObject("PowerPoint.Application");&lt;br /&gt;                        objEditor.Visible = true;&lt;br /&gt;                        objEditor.Presentations.Open(strDocument);&lt;br /&gt;        }&lt;br /&gt;        else if (SzExtension(strDocument) == "vsd")&lt;br /&gt;            {&lt;br /&gt;                        objEditor = new ActiveXObject("Visio.Application");&lt;br /&gt;                        objEditor.Visible = true;&lt;br /&gt;                        objEditor.Presentations.Open(strDocument);&lt;br /&gt;        }&lt;br /&gt;        else&lt;br /&gt;        {&lt;br /&gt;                        objEditor = new ActiveXObject(varEditor + ".1");&lt;br /&gt;                        window.onfocus = null;&lt;br /&gt;                        if (SzExtension(strDocument) == "ppt" &amp;&amp;amp; varProgID == "")&lt;br /&gt;                            varProgID = "PowerPoint.Slide";&lt;br /&gt;                        if (!objEditor.EditDocument(strDocument, varProgID))&lt;br /&gt;                            alert(L_EditDocumentRuntimeError_Text);&lt;br /&gt;            }&lt;br /&gt;        SetWindowRefreshOnFocus();&lt;br /&gt;        return;&lt;br /&gt;    &lt;br /&gt;The script will now check the file extension when the ‘Edit in …’ option is clicked and, if it matches one of the ‘if’ or ‘else if’ statements, open the associated application and load the file.  For compatibility, the original code is retained in the final ‘else’ statement.  Also, the SetWindowRefreshOnFocus() and return lines have been moved to the end of the function so they remain applicable to the entire function (if not relocated, the window will remain in a wait state after the ActiveX object has been invoked).&lt;br /&gt;&lt;br /&gt;There are a couple of caveats to this solution:&lt;br /&gt;&lt;br /&gt;1.  Each file type must be explicitly declared in the ‘if…else if’ statements.  This can be overcome by instead parsing the DOCICON.XML file; however, as noted above this method is a bit cumbersome and the XML settings are not comprehensive (many of the mappings call SharePoint.OpenDocuments instead of the original application, so a clunky series of substitutions must still be made to be effective; overall, this solution is less efficient than simply making the declarations in the code itself).&lt;br /&gt;&lt;br /&gt;2. If the SPS Area/WSS site is not in the user’s Intranet zone in IE and the ‘Initialize and script ActiveX controls not marked as safe’ option is not set to ‘Enable’, the user will get a warning dialog each time they select the ‘Edit in …’ option.  For organizations that make use of policy files and/or login scripts, these settings can be enabled globally via a policy file on login.&lt;br /&gt;&lt;br /&gt;While this is not a substitute for upgrading all Office 2000/XP clients to Office 2003 (users on the older platforms still won’t have the Explorer View functionality or be able to upload multiple files), it will serve as an effective interim measure until the upgrade process can be completed.  Afterwards, the script can be reverted back to its original state and the workaround code removed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114856714510175258?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114856714510175258/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114856714510175258' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114856714510175258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114856714510175258'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/05/enabling-edit-in-microsoft-word.html' title='Enabling the &apos;Edit in Microsoft Word&apos; Functionality for Office 2000/XP Users'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114840076360087247</id><published>2006-05-23T09:11:00.000-07:00</published><updated>2006-05-23T09:12:44.230-07:00</updated><title type='text'>Extreme SharePoint Design: Hiding List Types in Existing Sites/Areas</title><content type='html'>It can sometimes be necessary to disable a certain list type within a WSS site or SPS portal area.  If, for example, the customer doesn’t wish to provide portal users with the capability to create discussions, that list type should be removed from the list creation page.  If you have not already deployed the portal or team site, removing the list is as simple as editing the ONET.XML file for the site definition.  But what if you have already deployed a number of sites or areas?  Modifying ONET will have no impact on sites or areas that have already been created – only new ones created after the change takes place.  To remove a list type from an existing site/area you’ll need to directly modify the list display and creation pages to remove the list type from view.&lt;br /&gt;&lt;br /&gt;In this example we’ll hide the Dicussion Board list type.  Begin by removing the display of the list type from the Documents and Lists page (spsviewlsts.aspx in SPS and viewlsts.aspx in WSS – BE SURE TO BACK UP ALL FILES BEFORE MODIFYING THEM IN ANY WAY).  Both files can be found in the /60/TEMPLATE/LAYOUTS/1033 folder on the front-end web server(s).  On or about Lines 166 - 172 (viewlsts.aspx) or Line 175 - 181 (spsviewlsts.aspx) you will find the following block of code:&lt;br /&gt;&lt;br /&gt;ArrayList rgDiscussions = new ArrayList();&lt;br /&gt;rgRgs.Add(SPBaseType.DiscussionBoard);&lt;br /&gt;rgRgs.Add(SPListTemplateType.InvalidType);&lt;br /&gt;rgRgs.Add(L_szDisc_Text);&lt;br /&gt;if (!bBaseTypeInited) { rgRgs.Add(L_szNoDisc_Text); } else { rgRgs.Add(L_szNoDisc1_Text); };&lt;br /&gt;rgRgs.Add("?BaseType="+Convert.ToInt32(SPBaseType.DiscussionBoard));&lt;br /&gt;rgRgs.Add(rgDiscussions);&lt;br /&gt;&lt;br /&gt;Remove all but the first line of this code by closing the code block then commenting out the remainder of the text:&lt;br /&gt;&lt;br /&gt;ArrayList rgDiscussions = new ArrayList();&lt;br /&gt;%&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;rgRgs.Add(SPBaseType.DiscussionBoard);&lt;br /&gt;rgRgs.Add(SPListTemplateType.InvalidType);&lt;br /&gt;rgRgs.Add(L_szDisc_Text);&lt;br /&gt;if (!bBaseTypeInited) { rgRgs.Add(L_szNoDisc_Text); } else { rgRgs.Add(L_szNoDisc1_Text); };&lt;br /&gt;rgRgs.Add("?BaseType="+Convert.ToInt32(SPBaseType.DiscussionBoard));&lt;br /&gt;rgRgs.Add(rgDiscussions);&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt%&lt;br /&gt;&lt;br /&gt;This will prevent any existing Discussions from being displayed on the Documents and Lists page.  It is important to leave the first line intact so the dependent code that relies upon the rgDiscussions array does not throw an error.&lt;br /&gt;&lt;br /&gt;Next, perform the same edits on the WSS (create.aspx, lines 194 - 200) and SPS (spscreate.aspx, lines 199 - 205) list creation pages.  Save all four pages to their original location (no reset required) and view them in your browser (/_layouts/1033/{filename}.aspx for each site/area).  The Discussion Board group is now hidden from view.&lt;br /&gt;&lt;br /&gt;There is one caveat: users with sufficient knowledge of SharePoint can still create and view the list type you have hidden by using the URL protocol.  For example, the URL to create a new Discussion Board is http://{portal name}/_layouts/1033/new.aspx?ListTemplate= 108&amp;ListBaseType=3 and the list can still be viewed at /Lists/{ListName}/AllItems.aspx; however, for the vast majority of users this method will be sufficient to prevent them from utilizing the hidden list type.  It would also be a good idea to delete any existing lists of that type (if possible); or, at least remove any web parts or links that refer to them.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114840076360087247?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114840076360087247/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114840076360087247' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114840076360087247'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114840076360087247'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/05/extreme-sharepoint-design-hiding-list.html' title='Extreme SharePoint Design: Hiding List Types in Existing Sites/Areas'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114778647341230056</id><published>2006-05-16T06:32:00.000-07:00</published><updated>2006-05-16T06:34:33.986-07:00</updated><title type='text'>SharePoint Forums Released</title><content type='html'>Sometimes, you just gotta put down your coffee, get up from your computer and dance a little jig.  Today is one of those days.  Bil Simser has officially released his &lt;a href="http://weblogs.asp.net/bsimser/archive/2006/05/15/446555.aspx"&gt;new SharePoint Forums web parts&lt;/a&gt;.  And there was much rejoicing and dancing in the streets (there was at my desk, anyway).&lt;br /&gt;&lt;br /&gt;Seriously, everyone who has worked with SharePoint for even a day knows what a pain the built-in discussion boards can be.  We all owe Bil a debt of gratitude for solving this problem AND making it freely available to the community.&lt;br /&gt;&lt;br /&gt;So what are you waiting for?  &lt;a href="http://download.bilsimser.com/SharePointForums-1.0.0.0.zip"&gt;Go get ‘em&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114778647341230056?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114778647341230056/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114778647341230056' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114778647341230056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114778647341230056'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/05/sharepoint-forums-released.html' title='SharePoint Forums Released'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-114726797065021404</id><published>2006-05-10T06:32:00.001-07:00</published><updated>2006-05-10T06:32:52.213-07:00</updated><title type='text'>SharePoint Resources</title><content type='html'>Joris Poelmans (JOPX) has an updated &lt;a href="http://jopx.blogspot.com/2006/05/office-2007-sharepoint-server-2007-and.html"&gt;list of SharePoint resources&lt;/a&gt;, including some great stuff for MOSS 2007.  Check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114726797065021404?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114726797065021404/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114726797065021404' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114726797065021404'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114726797065021404'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/05/sharepoint-resources_10.html' title='SharePoint Resources'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-114657448342041922</id><published>2006-05-02T05:48:00.000-07:00</published><updated>2006-05-02T05:54:43.516-07:00</updated><title type='text'>MOSS 2007 Upgrade Article</title><content type='html'>I get a lot of questions regarding upgrading from SPS 2003 to MOSS 2007.  So far, there has been very little information on this topic, but Joel Oleson just posted a &lt;a href="http://spaces.msn.com/joeloleson/Blog/cns!B05AD15E2DE730DD!364.entry"&gt;good article&lt;/a&gt; on some of the upgrade options.  I am intrigued by the scan option to identify customized sites/pages in a portal but I have a feeling that heavily customized sites (which most of my clients demand) are still going to be a painful process to upgrade.&lt;br /&gt;&lt;br /&gt;On that note, if you are doing heavy customizations to site definitions and templates, it's always a good idea to warn the client up front that they will have to re-invest heavily in the upgrade when 2007 ships so they can budget accordingly.  As a personal rule of of thumb I try to always present the 'doomsday' scenario as part of the upgrade discussion, meaning for every dollar the client invests today in customizations they should plan on at least a 100% matching investment to upgrade.  That might be a bit over the top but personally I'd rather give them the bad news up front so they can make better decisions down the stretch.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114657448342041922?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114657448342041922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114657448342041922' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114657448342041922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114657448342041922'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/05/moss-2007-upgrade-article.html' title='MOSS 2007 Upgrade Article'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114657318528019241</id><published>2006-05-02T05:32:00.000-07:00</published><updated>2006-05-02T05:33:05.630-07:00</updated><title type='text'>SharePoint Developer Guidelines</title><content type='html'>One of the most common mistakes I see new SharePoint developers make is that they jump right into Visual Studio and start writing code without any real knowledge of the environment their applications will be deployed in.  They throw together some code, deploy it within a limited context (usually in WSS) on a local machine, do all their testing with an admin account, and then declare themselves to be SharePoint developers.  While this sort of slap-dash approach may be fine if you’re just trying to figure the object model out, it creates bad coding habits that will cause all sorts of headaches the first time your web parts are deployed in an enterprise portal environment.&lt;br /&gt;&lt;br /&gt;Here are a few guidelines for producing better code, in less time, with more positive long-term results:&lt;br /&gt;&lt;br /&gt;1. Learn the Product&lt;br /&gt;&lt;br /&gt;To begin with, developers should understand SharePoint before trying to create the next great web part that changes the world as we know it.  Investing the time to learn how portal areas are different from team sites, how the data model works, what the differences are between SPSite and SPWeb objects, how, when and why to do impersonation, how data is stored in and retrieved from lists, and getting a handle on the ins and outs of code access security will be time well spent.   Furthermore, one needs to work with SharePoint for a while to have an idea of how users are going to interact with the custom web parts being created.  How can a person effectively design a portal application if they’ve never struggled with the default navigation controls, created site collections and subsites, managed portal area security, configured search, created custom views, added calculated fields, configured cross-site groups, or put together a basic data view web part?  I’m not saying that developers should be admins – that’s not their job – but they sure need to know what they’re working with before jumping in with both feet.&lt;br /&gt;&lt;br /&gt;2. Plan for success&lt;br /&gt;&lt;br /&gt;It’s a funny thing, but SharePoint development tends to promote a kind of “code before planning” mentality that rarely exists elsewhere in the enterprise.  Developers who wouldn’t normally write a line of ASP.NET code without a dozen use cases jump right into web parts without any kind of plan whatsoever.  SharePoint’s inherent advantages – unified navigation, managed presentation layer, built-in security model, user-managed hierarchy – aren’t a substitute for a well-designed application framework; in fact, they often work against the developer to emphasize weak design elements and exacerbate poor application design.&lt;br /&gt;&lt;br /&gt;Before writing a single line of code, stop and T-H-I-N-K.  What’s the right type of project - web part, server control, event handler, or web service?  How will the users deploy the application?  Will it be used in both WSS and SPS?  Does the code require external files, such as XML and XSL, and, if so, where will they be stored and how will they be accessed?  What kind of permissions are necessary to execute the various functions in the code?  How will configuration parameters be stored and modified?  Does the output require a user control or will the HtmlTextWriter class of RenderWebPart be sufficient?  Are success/fail messages required in the GUI or Event Viewer?  How will you debug and test the application?&lt;br /&gt;&lt;br /&gt;Finally, plan your code just like you would any other enterprise application.  Identify your input elements, output parameters, presentation objects, class definitions, and so forth.  Map out the structure and navigation hierarchy.  Determine data storage requirements.  Create a specification for all the supporting elements – lists, libraries, areas, sites, etc.   In other words, treat it like a normal development project and avoid the common mistakes that cause web parts to fail under any conditions other than those used in the proof of concept.&lt;br /&gt;&lt;br /&gt;3. Know the Object Model&lt;br /&gt;&lt;br /&gt;Nothing is more frustrating than seeing an application that works flawlessly in development get kicked back from QA because the code is dependent upon some quirky object model function.  Those handy little methods that look like lifesavers in development – IsRootWeb, DoesUserHavePermissions, GetSubwebsForCurrentUser, ParentWeb – can wreak havoc in a production environment (try using IsRootWeb on a top-level portal area and watch your code get blown to smithereens).  Even worse, permission-dependent functions, like GetPermissionCollectionFromWeb, don’t work at all for non-admin users, requiring tricky account impersonation techniques. &lt;br /&gt;&lt;br /&gt;The best way to avoid these common pitfalls is to test, test, test in the best simulation of a real-world environment possible.  Make sure that the development SharePoint server has accounts for at lest each level of built-in security (and any custom security groups required by the application).  Deploy code in the Home area, top-level portal areas, subareas, site collections (parent sites) and subsites.  Above all, consider how the user *might* implement the code not how you originally intended it to be used.&lt;br /&gt;&lt;br /&gt;4. Log Application Events&lt;br /&gt;&lt;br /&gt;Debugging code is no easy task in SharePoint; it’s not always possible to run code on the local development server or virtual machine, the standard error messages are cryptic at best and nearly useless in many instances, and asynchronous code execution (event handlers, for instance) will give even the most seasoned .NET developer nightmares.  One simple yet effective method for debugging in SharePoint is to write success and fail messages to the event log during development and testing.  Using the WriteEntry method of the System.Diagnostics.EventLog class, developers can bypass the SharePoint safemode parser and STSFLTR ISAPI filter and write messages directly to the event log.  This is a handy method for isolating code errors during development; just be sure to remove the event log code before moving into production (although it might be a good idea to leave some level of error logging in the application, especially if it is an event handler or other async process).&lt;br /&gt;&lt;br /&gt;5. Code Only as a Last Resort&lt;br /&gt;&lt;br /&gt;It sounds strange but writing custom code should be the last resort in any SharePoint deployment, large or small.  Think about it – code is expensive to write, deploy, and maintain.  In most instances, the original developer isn’t going to be around when the code breaks or fails to run after the latest batch of service packs and updates.  No matter how good they are, nobody can fully comment a batch of code so that those who come behind them can just pick it up where they left off.  But worst of all, custom code cannot be learned, deployed, managed or improved upon by the average portal user.&lt;br /&gt;&lt;br /&gt;Out of the box, SharePoint provides a rich application framework that enables users to create dynamic collaboration spaces without any programming.  It never ceases to amaze me how many creative solutions users come up with just using the stock web parts and lists.  As developers, our first instinct when presented with a problem is to write code to solve it but users don’t think that way; give them a chance to create a solution on their own and you may be surprised what they come up with, especially once they learn how to use Data View Web Parts.  Concentrate on writing code only where it’s really needed so developers can spend their valuable time solving really hard problems without getting bogged down writing throw-away web parts and duplicating built-in functions. &lt;br /&gt;&lt;br /&gt;6. Lists Rule&lt;br /&gt;&lt;br /&gt;The secret to SharePoint’s power and flexibility is the list object.  The reason the product has been so successful where others have floundered (think Lotus Notes and PeachTree) is that it empowers users to create their own data-driven applications without even knowing how to spell ‘database’.  But lists are more than Databases for Dummies – they can be a developer’s best friend.  Need a datatable to store input parameters?  Use a list.  Need a sortable, filterable grid to display query results?  Lists do it automatically.  Need to store/retrieve file objects like XML configuration files?  Document libraries have it covered.  Need an automated method for launching processes in response to user-driven events?  Attach an event handler to a document library. &lt;br /&gt;&lt;br /&gt;In SharePoint it’s all about using what you have and not recreating the wheel.  If the design includes any sort of data input/output requirements, stop and think how a list can serve this purpose before writing to any XML files in the /bin directory or attaching to an external database.  Lists can be a tremendous time saver and, even better, can involve the user in the data management process, requiring less code and generating more interactivity. &lt;br /&gt;&lt;br /&gt;7. Don’t Fear the Database&lt;br /&gt;&lt;br /&gt;I know this is going to be controversial but I’ve never agreed with the misguided mantra promulgated by SharePoint product managers and evangelists of “Don’t touch the database”.  What rubbish.  Are we in the business of providing value to the customer or giving sermons on “supportability”?  Show me one instance of how reading from the database will blow up a portal and I’ll be glad to reconsider – but I have yet to see one (please note that I am talking ONLY about reading from the database – writing to it directly is a really bad idea and should be strenuously avoided).  And before you flame me with a zillion emails on the subject, stop and ask yourself why it’s wrong to read from the SharePoint database but OK to read from the MCMS data store?  Is there some evil genie guarding _SITE that’s going to awaken and eat all our lists for breakfast if we query the Webs table?  And here’s the real kicker – BizTalk can flood the SQL server with SELECT statements while executing a workflow process but my little navigation control is going to bring SharePoint to a screeching halt???   I think not.&lt;br /&gt;&lt;br /&gt;The truth of the matter is that the object model only goes so far.  Sometimes the right way to get information to the user is to fetch it from the database; sometimes it’s the ONLY way (think full-blown, drop-down, security-trimmed portal navigation, for instance, or rolling up list data across multiple portals/site collections).  Of course, a good developer will follow good data access practices, minimizing redundant calls across the network, closing connections in a timely manner, doing advanced sorting and filtering in dataviews, and so forth.  The database is to be respected but never feared; in fact, learning how the data model works in SharePoint can help one to develop richer, more efficient and flexible web parts.&lt;br /&gt; &lt;br /&gt;Naturally, these techniques are not a comprehensive guide to developing in SharePoint but they are a good starting point for beginners (and a timely refresher for those with a few web parts under their belts).  Learn to be a better SharePoint developer and everyone wins – fellow programmers, project managers, administrators, and, most importantly, the users who have to live with our applications on a daily basis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114657318528019241?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114657318528019241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114657318528019241' title='26 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114657318528019241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114657318528019241'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/05/sharepoint-developer-guide_114657318528019241.html' title='SharePoint Developer Guidelines'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114381969483480371</id><published>2006-03-31T07:41:00.000-08:00</published><updated>2006-03-31T07:41:34.886-08:00</updated><title type='text'>TechEd 2006 SharePoint Sessions</title><content type='html'>If you are planning to attend TechEd 2006 in Boston then you should drop by the &lt;a href="https://www.msteched.com/cfp/bofvoting.aspx"&gt;web site and vote&lt;/a&gt; for the SharePoint Birds of a Feather sessions.&amp;nbsp;&amp;nbsp;&lt;a href="http://heathersolomon.com/blog/archive/2006/03/30/4371.aspx"&gt;Heather Solomon&lt;/a&gt; and &lt;a href="http://www.andrewconnell.com/blog/"&gt;Andrew Connell&lt;/a&gt; each have one and and &lt;a href="http://weblogs.asp.net/bsimser/"&gt;Bil Simser&lt;/a&gt; has several (and if you don’t already read their blogs then get over there now and add them to your newsreader pronto).&amp;nbsp;&amp;nbsp;Don’t let the SQLers get all the exposure – show ‘em we want us some SharePoint!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114381969483480371?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114381969483480371/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114381969483480371' title='37 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114381969483480371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114381969483480371'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/03/teched-2006-sharepoint-sessions.html' title='TechEd 2006 SharePoint Sessions'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>37</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114357973793290286</id><published>2006-03-28T13:02:00.000-08:00</published><updated>2006-03-28T13:06:27.153-08:00</updated><title type='text'>Who Am I?  Demystifying SharePoint Impersonation.</title><content type='html'>The SharePoint security model makes it easy to programmatically execute code within the current user context. Just write and deploy your web part and it runs in the security context of the logged in user. There are even built-in functions that take advantage of the user’s security context – such as GetSubwebsForCurrentUser() – without requiring any extra coding on our part. Simple yet effective.&lt;br /&gt;&lt;br /&gt;But what about those times when you need to execute code with permissions greater than that of the current user (like instantiating a site collection or enumerating list permissions)? Well, that’s not quite so easy, but it’s not that hard, either – &lt;a href="http://www.lcbridge.nl/vision/impersonation.htm"&gt;Lois and Clark have an excellent post&lt;/a&gt; on various methods for altering security context. There’s also &lt;a href="http://mindsharpblogs.com/todd/archive/2005/05/03/467.aspx"&gt;Todd Bleeker’s method&lt;/a&gt; and &lt;a href="http://www.bluedoglimited.com/SharePointThoughts/ViewPost.aspx?ID=7"&gt;Maurice Prather’s approach&lt;/a&gt;. And just to cook your noodle a bit more, what about those times when you not only need to run in an administrative context but you also need to check permissions for the current user? So much for simple.&lt;br /&gt;&lt;br /&gt;Thankfully, there is a relatively straightforward way to achieve both objectives. By combining a bit of RevertToSelf() with AppDomains and SPRoleCollections, we can run securely in an administrative context without hard-coding account details, force SharePoint to use the credentials we give it, and verify that users have access to the content being displayed. In fact, this is the only way I’ve found to enforce impersonation in all instances.&lt;br /&gt;&lt;br /&gt;I must admit to not being the world’s greatest programmer, so I spent quite a bit of time flipping between each code snippet trying to piece together a solution (code wizards like &lt;a href="http://weblogs.asp.net/bsimser"&gt;Simser&lt;/a&gt; and &lt;a href="http://weblogs.asp.net/jan/"&gt;Tielens&lt;/a&gt; can do this stuff in their sleep but I seem to be lacking an equivalent concentration of grey matter). To save you from the same headaches, here’s the code in full with a complete description afterwards.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Data;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Text;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Drawing;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Collections;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Configuration;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Web;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Web.UI;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Web.UI.WebControls;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security.Policy;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security.Principal;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security.Permissions;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Runtime.InteropServices;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint.Utilities;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint.WebPartPages;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint.WebControls;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;namespace MyNameSpace&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;public class MyClass : System.Web.UI.Page&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;[DllImport("advapi32.dll")]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;static extern bool RevertToSelf();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;private void Page_Load(object sender, System.EventArgs e)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;WindowsIdentity objOriginalUser = WindowsIdentity.GetCurrent();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;RevertToSelf();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;WindowsIdentity.GetCurrent().Impersonate();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;AppDomainSetup objAppDomainSetup = AppDomain.CurrentDomain.SetupInformation; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;Evidence objEvidence = AppDomain.CurrentDomain.Evidence;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;AppDomain objMyAppDomain = AppDomain.CreateDomain("MyAppDomain", objEvidence, objAppDomainSetup);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPSite site = new SPSite(&amp;lt;portal URL&amp;gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;site.CatchAccessDeniedException = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPWeb web = site.AllWebs[&amp;lt;site URL&amp;gt;];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPPermissionCollection perms = web.Permissions;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPUserCollection users = web.Users;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;foreach (SPUser user in users)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;if (objOriginalUser.Name.ToLower() == user.LoginName.ToLower())&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPRoleCollection roles = user.Roles;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPListCollection lists = web.Lists;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;foreach (SPRole role in roles)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;foreach (SPPermission perm in perms)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;if (role.ID == perm.Member.ID)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;if &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;(role.PermissionMask.ToString().IndexOf("ViewPages") != -1 role.PermissionMask.ToString().IndexOf("FullMask") != -1)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;// TODO: Insert your code here.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;catch(System.UnauthorizedAccessException ex)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;Response.Write(ex.Message.ToString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;AppDomain.Unload(objMyAppDomain);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Before we go any further, allow me to point out that the code sample is probably causing real .NET developers to pull their hair out – for one, I don’t know all their code optimization techniques, and for another, I’m trying to keep it simple so this post doesn’t run off the end of the page, spill over the keyboard, and end up in the reader’s lap. So have some mercy and don’t flame me too badly but do post any tips that will help make the code better. Also, note that throughout this post I’ve tried to use the same variable names and syntax as the original articles to avoid confusion.&lt;br /&gt;&lt;br /&gt;Now on to business. In the above example, we are instantiating a new SPWeb object in the Administrator context and checking the permissions for the actual logged-in user for the target site. The first step is to make sure we have the proper references so be sure to add the proper DLL’s to your project and add all the required ‘using’ statements (you may need more or less depending upon what your application does).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Data;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Text;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Drawing;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Collections;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Configuration;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Web;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Web.UI;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Web.UI.WebControls;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security.Policy;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security.Principal;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Security.Permissions;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using System.Runtime.InteropServices;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint.Utilities;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint.WebPartPages;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;using Microsoft.SharePoint.WebControls;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Next, we need to import the ‘advapi32.dll’ in order to facilitate impersonation of user accounts.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;[DllImport("advapi32.dll")]&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;static extern bool RevertToSelf();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once we have the proper resources, we can impersonate the administrative user account. The RevertToSelf() function returns the user credentials of the account under which the SharePoint application pool runs in IIS (MSSharePointPortalAppPool in a default installation). If you are running your portal under a different context, now would be a good time to change it to a local admin account that is also a SharePoint administrator. The biggest advantage of this method is that it does not required any sensitive information (such as passwords) to be stored in clear text; the credentials are specified in the IIS settings for the virtual server.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;WindowsIdentity objOriginalUser = WindowsIdentity.GetCurrent();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;RevertToSelf();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;WindowsIdentity.GetCurrent().Impersonate();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The first line gets the current user account for later use. The second calls the Application Pool credentials and the third sets the impersonation context to that account (omitting it will generate an Access Denied error).&lt;br /&gt;&lt;br /&gt;Once we have the proper credentials in place, it’s necessary to create a unique application domain to run our code in. SharePoint has a nasty quirk wherein it insists on using the currently logged in user credentials no matter how many times you tell it otherwise. The fix for this is to create an application domain wrapper for the subsequent code, in effect fooling the SharePoint object model into thinking your web application is actually a console application (see &lt;a href="http://www.bluedoglimited.com/SharePointThoughts/ViewPost.aspx?ID=7"&gt;Maurice’s post&lt;/a&gt; for a full explanation).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;AppDomainSetup objAppDomainSetup = AppDomain.CurrentDomain.SetupInformation; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;Evidence objEvidence = AppDomain.CurrentDomain.Evidence;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;AppDomain objMyAppDomain = AppDomain.CreateDomain("MyAppDomain", objEvidence, objAppDomainSetup);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now that we have the proper credentials and domain in place we can move on to the actual SharePoint code. For this very basic example, we first instantiate a new site based on the root portal, then create an SPWeb object for a site so we can get its user and permission collections. Note the ‘CatchAccessDeniedException() method – this prevents authentication dialog boxes from appearing if the login somehow fails.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPSite site = new SPSite(&amp;lt;portal URL&amp;gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;site.CatchAccessDeniedException = false;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPWeb web = site.AllWebs[&amp;lt;site URL&amp;gt;];&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPPermissionCollection perms = web.Permissions;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPUserCollection users = web.Users;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Earlier we captured the original user credentials before impersonating the admin account. We can now use that information to compare against the list of site users to see if the currently logged-in user has permissions to access the site. First, we’ll check to see that the user names match:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;if (objOriginalUser.Name.ToLower() == user.LoginName.ToLower())&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then we’ll get the security role collection for the site:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;SPRoleCollection roles = user.Roles;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then we loop through the security roles and permission collections to see if the role ID for the current user matches the Member ID in the permissions table for the site. If it does, then we check to see if the user has either the ViewPages right or, if the user is an administrator, the FullMask right (rights are cumulative for Web Designers, Contributors, Readers and all other roles except Administrators, who simply have the ‘FullMask’ permission).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;foreach (SPRole role in roles)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;foreach (SPPermission perm in perms)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;if (role.ID == perm.Member.ID)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;if &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;(role.PermissionMask.ToString().IndexOf("ViewPages") != -1 role.PermissionMask.ToString().IndexOf("FullMask") != -1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Assuming the user credentials are accepted, you may now execute whatever code you desire with confidence that the user has sufficient permissions to view the specified content. Once the code has finished executing it’s a good idea to destroy the application domain you created and, if you wish, revert back to the original user context.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;AppDomain.Unload(objMyAppDomain);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;objOriginalUser.Impersonate();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Of all the methods that are available for running code under an administrative context in SharePoint, this combination of impersonation and application domains is the only one that I’ve found works in every situation I’ve tried.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114357973793290286?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114357973793290286/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114357973793290286' title='80 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114357973793290286'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114357973793290286'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/03/who-am-i-demystifying-sharepoint.html' title='Who Am I?  Demystifying SharePoint Impersonation.'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>80</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114272102378539620</id><published>2006-03-18T14:30:00.000-08:00</published><updated>2006-03-18T14:34:17.136-08:00</updated><title type='text'>SharingPoint Update</title><content type='html'>&lt;span style="font-family:Tahoma;"&gt;You may have noticed that I haven’t been blogging much lately.  I’ve been swamped with projects, starting with a complete, top-to-bottom site customization at the beginning of the year that I completed in just two weeks, followed by a month in Indianapolis in February, a few days in Baltimore, then right on to a project in Dallas.  In between I redesigned a company web site for a friend, did my corporate taxes, and emptied a storage bin full of old stuff.  Whew!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:Tahoma;"&gt;During this time I’ve been doing A LOT of custom development in .NET – web parts, object model code, server controls, custom lists, the whole nine yards.  As most people know I’m not the greatest programmer in the world and only know enough C# to be really dangerous so it’s been quite the learning experience.  Here’s a sample of what I’ve been up to:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:Tahoma;"&gt;Dynamic drop-down portal area navigation server control&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Tahoma;"&gt;Custom list query/XML rendering administration pages&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Tahoma;"&gt;Visio design template for SPS/WSS deployments&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Tahoma;"&gt;Custom site navigation control/web part with security trimming&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Tahoma;"&gt;Advanced customization best practices document&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Tahoma;"&gt;Document library event handlers (not started yet)&lt;/span&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;span style="font-family:Tahoma;"&gt;List search pages&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-family:Tahoma;"&gt;As is my custom, I’ll be posting detailed coding techniques, tips, tricks and sample code over the next few weeks.  Stay tuned for some good stuff!&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114272102378539620?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114272102378539620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114272102378539620' title='35 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114272102378539620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114272102378539620'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/03/sharingpoint-update.html' title='SharingPoint Update'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-114123228413659482</id><published>2006-03-01T08:58:00.000-08:00</published><updated>2006-03-01T09:04:19.246-08:00</updated><title type='text'>Extreme SharePoint Design: Modifying 'Grouped By' Headers, Part 2</title><content type='html'>&lt;p&gt;Creating a grouped list in SharePoint is easy – just Modify Settings and Columns, Create View, and select the column(s) to group on; however, getting the grouping to sort and display the way you want isn’t quite so simple.  By default, SharePoint sorts alphabetically and there aren’t any options to hide group headers, style them individually, or change the layout.&lt;/p&gt;&lt;p&gt;One of the most common requirements for grouped listings is to create a manual sort mechanism to circumvent the built-in alphabetical sort.  This is easily done by adding a new field with a numerical value and assigning each list entry to the appropriate identifier.  When a new view is created, the list is first grouped by the sort field and next by whatever content field is appropriate.  The problem is that the user sees the sort field in the first group header and there’s no way to turn it off in the list settings.&lt;/p&gt;&lt;p&gt;There are two ways to solve this problem.  You can modify the SCHEMA.XML file for the list type and change the CAML to render the groupings the way you want them (&lt;/span&gt;&lt;a href="http://sharingpoint.blogspot.com/2005/09/extreme-sharepoint-design-modifying.html"&gt;read this post to learn how&lt;/a&gt;&lt;span style="font-family:Tahoma;"&gt;).  The issue with this method is that it is a global change; all lists of the same type in the site definition will be changed.  Alternatively, you can override the default styles using a web part which hides or alters the appearance of the stock group header on a page by page basis.&lt;/p&gt;&lt;p&gt;Each header level is contained within a table row that inherits the ‘ms-gb’ (first group header) or ‘ms-gb2’ (second group header) style from OWS.CSS.  To override these styles, add a Content Editor Web Part (CEWP) to the page, open the Source Editor in the tool pane, and add your own stylesheet entry.  For example, to hide the first group header row entirely (dark gray bar in default theme), enter the following:&lt;/p&gt;&lt;p&gt;  &amp;lt;style&amp;gt;&lt;br&gt;   .ms-gb{display:none}&lt;br&gt;  &amp;lt;/style&amp;gt;&lt;/p&gt;&lt;p&gt;Disable the CEWP’s ‘Display on page’ setting (under ‘Layout’ in the tool pane) to hide the web part, save it and the group header disappears.  Because the CEWP is rendered after the default stylesheet references in the site definition page, it overrides the settings in OWS.CSS following the cascading rules of CSS (last reference takes precedence).  Technically, the header still exists, users just can’t see it.  Use the same method to apply font colors, background images, margins, and any other CSS style properties.&lt;/p&gt;&lt;p&gt;Unfortunately, this method doesn’t work as well for altering the actual text of the header entry (i.e. removing the ‘[Group Name] :’ prefix).  You can use JavaScript to achieve this effect by altering the innerHTML property of each header and using the getElementById method, but you’ll have to apply it individually to each header ID and they’re not always the same from page to page.  Plus, JavaScript in CEWP’s often causes unpredictable results (such as preventing web parts from being saved or disabling tool bar functions).  If you do plan to use JavaScript on a web part page, it’s always best to store the script in a document library as a .js file or as part of an HTML page then call that page using a Page Viewer Web Part.  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-114123228413659482?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/114123228413659482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=114123228413659482' title='55 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114123228413659482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/114123228413659482'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/03/extreme-sharepoint-design-modifying.html' title='Extreme SharePoint Design: Modifying &apos;Grouped By&apos; Headers, Part 2'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>55</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113983773695015740</id><published>2006-02-13T05:25:00.000-08:00</published><updated>2006-02-13T05:43:41.546-08:00</updated><title type='text'>Extreme SharePoint Design: Dynamic Style Sheets</title><content type='html'>&lt;p&gt;Both WSS and SPS provide mechanisms for altering the presentation of pages using custom style sheets. While WSS provides a relatively simple template structure for improving the stock look and feel on a site-by-site basis, SPS customizations must be applied on a portal-wide basis (using the custom style sheet field in Site Settings) or for each individual site definition. If you employ user controls in your site definitions to create custom headers, navigation elements, etc. this means that each site definition must reference it's own separate control. This makes code maintenance difficult and time consuming.&lt;/p&gt;&lt;p&gt;But perhaps the most glaring deficiency in employing custom styles is the lack of style continuity in administration pages. No matter how eye-catching your design is, as soon as the user attempts to manage portal content, change settings, create a list, or do one of a hundred other administrative tasks, the styles revert back to the boring out-of-the-box template (this holds true for both WSS sites and SPS portal areas).&lt;/p&gt;&lt;p&gt;In order to overcome this limitation, a method of dynamically switching styles for sites, areas, and administration pages is needed Fortunately, the SharePoint object model provides several functions that can be leveraged to create a style switcher based on site definition, site template, user id, group, or any number of other parameters depending upon your requirements.&lt;/p&gt;&lt;p&gt;To begin with, if you are not already employing user controls in your custom site definitions, you should consider doing so as soon as possible. They are flexible, reusable, and easy to maintain. Perhaps most importantly, they also provide access to server-side scripting which is disabled on standard ASPX pages within SharePoint. Creating a user control is simple - modify a base portal page (such as the default page for a cloned site definition) until you have the desired look and feel, then extract that code into a blank HTML page with all &amp;lt;HTML&amp;gt;, &amp;lt;HEAD&amp;gt; and &amp;lt;BODY&amp;gt; tags removed. Add the proper registrations to the top of the page (see example below) and save it into a centrally-accessible directory (such as /bin or /_layouts/1033) with an .ASCX extension. In the default page, add a page registration for the file and a code reference in the body of the page and you're done. You can now reference the user control from any portal page - changes made within the control will be viewable on all pages which reference it. Now you only one page to maintain instead of dozens.&lt;/p&gt;&lt;p&gt;Here's an example of a user control (header.ascx) that creates a custom portal header:&lt;/p&gt;&lt;div style="MARGIN-LEFT: 10px; COLOR: red"&gt;&lt;br /&gt;&amp;lt;%@ Control Language="c#" AutoEventWireup="false" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="SPSWC" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt;&lt;br /&gt;&amp;lt;table width="100%" border="0" cellpadding="0" cellspacing="0" ID="Table2"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td width="100%" coldiv="4" height="14" class="spsHeader_Banner"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td width="40" height="80" align="center" valign="middle" class="spsHeader_Logo"&amp;gt;&amp;lt;img src="/_layouts/images/Header_Left.gif"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td width="100" valign="middle" class="spsHeader_Name"&amp;gt;&amp;lt;SPSWC:WebProperty Property="SiteTitle" runat="server" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td width="99%" valign="bottom" class="spsHeader_Title"&amp;gt;Home&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td width="350" valign="bottom" class="spsHeader_Actions"&amp;gt;&lt;br /&gt;&amp;lt;table height="100%" width="100%" border="0" cellpadding="0" cellspacing="0" ID="Table3"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td coldiv="2" height="99%" valign="top" align="right" class="spsHeader_MySite" nowrap &amp;gt;&amp;lt;SPSWC:PageHeader id="PageHeaderID" runat="server" PageContext="SitePage" ShowTitle="false" Mode="LinksOnly" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td width="75" valign="middle" align="right" class="spsHeader_Search"&amp;gt;Search&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td valign="middle" width="99%" align="right" class="spsHeader_SearchBox"&amp;gt;&amp;lt;SPSWC:RightBodySectionSearchBox id="RightBodySectionSearchBoxID" runat="server" SearchResultPageURL="SEARCH_HOME" FrameType="None" /&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td coldiv="4" width="100%"&amp;gt;&lt;br /&gt;&amp;lt;div id="spsHeader_NavMenu"&amp;gt;&lt;br /&gt;&amp;lt;SPSWC:CategoryNavigationWebPart runat="server" id="HorizontalNavBar" /&amp;gt;&lt;br /&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td height="1" coldiv="4" width="100%" class="spsHeader_Separator"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/div&gt;&lt;p&gt;Note the page registrations at the top of the file - these provide access to SharePoint's built-in functions and the object model. On the default page, add a reference to the control like this: &lt;/p&gt;&lt;br /&gt;&lt;div style="MARGIN-LEFT: 10px; COLOR: red"&gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="CUSTOMUC" Tagname="Header" src="/bin/Header.ascx" %&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Then insert the control reference in the body of the page, like so:&lt;/p&gt;&lt;div style="MARGIN-LEFT: 10px; COLOR: red"&gt;&lt;br /&gt;&amp;lt;CUSTOMUC:Header id="Header" runat="server"&amp;gt;&amp;lt;/CUSTOMUC:Header&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;Once you have the control in place, you can add code to dynamically change style sheets. For example, let's assume that you have a style sheet for each standard portal definition - custom_sps.css, custom_msite.css, custom_topic.css, custom_news.css, and so on. In order for the header to have a different look for each area, the style sheet reference in the file must change based on which site definition the page being viewed is derived from. To make this happen, add the following code to the top of the control, just after the page registrations:&lt;/p&gt;&lt;br /&gt;&lt;div style="MARGIN-LEFT: 10px; COLOR: red"&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;if (SPControl.GetContextWeb(Context).WebTemplate == "SPS")&lt;br /&gt;{&lt;br /&gt;Response.Write("&amp;lt;link rel='stylesheet' type='text/css' href='/_layouts/" +&lt;br /&gt;System.Threading.Thread.CurrentThread.CurrentUICulture.LCID + "/styles/custom_SPS.css'&amp;gt;");&lt;br /&gt;}&lt;br /&gt;else if (SPControl.GetContextWeb(Context).WebTemplate == "SPSMSITE")&lt;br /&gt;{&lt;br /&gt;Response.Write("&amp;lt;link rel='stylesheet' type='text/css' href='/_layouts/" +&lt;br /&gt;System.Threading.Thread.CurrentThread.CurrentUICulture.LCID + "/styles/custom_msite.css'&amp;gt;");&lt;br /&gt;}&lt;br /&gt;else if (SPControl.GetContextWeb(Context).WebTemplate == "SPSTOPIC")&lt;br /&gt;{&lt;br /&gt;Response.Write("&amp;lt;link rel='stylesheet' type='text/css' href='/_layouts/" +&lt;br /&gt;System.Threading.Thread.CurrentThread.CurrentUICulture.LCID + "/styles/custom_spstopic.css'&amp;gt;");&lt;br /&gt;}&lt;br /&gt;else if (SPControl.GetContextWeb(Context).WebTemplate == "SPSNEWS")&lt;br /&gt;{&lt;br /&gt;Response.Write("&amp;lt;link rel='stylesheet' type='text/css' href='/_layouts/" +&lt;br /&gt;System.Threading.Thread.CurrentThread.CurrentUICulture.LCID + "/styles/custom_news.css'&amp;gt;");&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Response.Write("");&lt;br /&gt;}&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;To add additional site definitions, insert an extra "else if" statement for each definition name (WSS sites use the STS definition). The key to this script is the value of &lt;span style="color:red;"&gt;GetContextweb(Context).WebTemplate&lt;/span&gt; method. This method returns the site definition name for the page being viewed. For individual WSS site collections, you can also use &lt;span style="color:red;"&gt;GetContextWeb(Context).Site.RootWeb&lt;/span&gt; method. What makes this method even more useful is that the site definition/root web value persists on administration pages (see &lt;a href="http://sharingpoint.blogspot.com/2006/01/extreme-sharepoint-design-customizing.html"&gt;Extreme SharePoint Design: Customizing SharePoint Administration Pages&lt;/a&gt; for detailed instructions on how to employ user controls on administration pages).&lt;/p&gt;&lt;p&gt;Pages which call the new header will inherit the base styles, the custom styles applied at the portal level, and the definition-specific file referenced in the dynamic style sheet script. Due to the cascading principle of CSS, the last-referenced file takes precedence, insuring that the proper style is displayed. By utlizing dynamic style sheet switching you will create a more consistent user experience and reduce the amount of maintenance required for custom site definitions.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113983773695015740?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113983773695015740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113983773695015740' title='90 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113983773695015740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113983773695015740'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/02/extreme-sharepoint-design-dynamic.html' title='Extreme SharePoint Design: Dynamic Style Sheets'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>90</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113829549802811278</id><published>2006-01-26T11:18:00.000-08:00</published><updated>2006-01-26T13:45:09.320-08:00</updated><title type='text'>Extreme SharePoint Design: Customizing SharePoint Administration Pages</title><content type='html'>&lt;p&gt;Administration pages in SharePoint are often the Achilles heel of a customized portal design – they exist outside of the site definition framework, they don’t inherit templates, and they implement a confusing array of shared code structures. This can create usability issues as users switch from a cohesive design on default and list pages to the default GUI and navigation when trying to create a new list or add an alert.&lt;/p&gt;&lt;p&gt;Depending on your design, customizing administration pages can quickly become a nightmare – if just modifying the header is not enough then you’re in for a bumpy road ahead. Here are a few tips that can help you get from stock to custom without the need for a morphine I.V. drip:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Primary Page Structures&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;There are 215 .ASPX files in the /layouts/1033 directory. Seventy-eight percent of these fall into one of two primary code structures. For simplicity, we’ll call them the ‘SPS’ style and ‘WSS’ style. The SPS style relies upon a server-control structure to render page content; the WSS style uses more traditional HTML code to display content. &lt;/p&gt;&lt;p&gt;The following code renders the page header in the SPS style:&lt;/p&gt;&lt;p&gt;&lt;img style="WIDTH: 494px; HEIGHT: 57px" height="55" alt="" src="http://www.theegroup.net/Image%20Library/spsstyle.gif" width="567" border="0" /&gt;&lt;/p&gt;&lt;p&gt;This is how the same header is retrieved in the WSS style:&lt;/p&gt;&lt;p&gt;&lt;img height="332" alt="" src="http://www.theegroup.net/Image%20Library/wssstyle.gif" width="489" border="0" /&gt;&lt;/p&gt;&lt;p&gt;The most important difference between the two files is the WSS style’s utilization of the AlternateHeader property. The code first checks to see if an alternate header exists – either PORTALHEADER.ASPX or ALTERNATEHEADER.ASPX – and, if so, retrieves the code from the file and renders it; if not, it renders the code between the if…else blocks. This is a useful mechanism because the alternate header files function the same way as a user control – a central file that can be modified to match the new portal design scheme and is accessed from many pages – but it’s only applicable to the WSS style. How do we apply this same concept to the SPS style?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;User Controls&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Directly modifying the SPS style pages to replace the header is pretty straightforward – just replace the contents between the SPSWC:PageHeader tags (if you aren’t going to use the SPSWC:CategoryNavigationWebPart control in your code, be sure to leave it in place and comment it out). The problem is that there are 67 of these files so maintaining the customized code can become an issue. The solution is to implement a user control to replace the default code and duplicate the alternate header functionality. But there is a catch (naturally).&lt;/p&gt;&lt;p&gt;Pages in the /layouts/1033 directory can utilize external code files but only if they reside in the same directory. So, unlike site defintion files, for which user controls are normally stored in the virtual server /bin directory, any controls created for administration pages must be stored in /layouts/1033; otherwise, the process is the same. Create the replacement code, save it in an .ASCX file in the /layouts/1033 directory, and reference it from each administration page. &lt;/p&gt;&lt;p&gt;First, remember that when creating a user control you need the correct page registrations for any code contained within the file. The standard registrations are:&lt;/p&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;%@ Control Language="c#" AutoEventWireup="false" TargetSchema="&lt;/span&gt;&lt;a href="http://schemas.microsoft.com/intellisense/ie5"&gt;http://schemas.microsoft.com/intellisense/ie5&lt;span style="color:#ff0000;"&gt;&lt;span style="color:#0000ff;"&gt;"%&gt;&lt;/a&gt;;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="SPSWC" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="Utilities" Namespace="Microsoft.SharePoint.Utilities" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"%&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;You’ll also need to register the new user control at the top of each administration page, like this:&lt;/p&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;%@ Register Tagprefix="CUSTOMUC" Tagname="spsPortalHeader" src="spsPortalHeader.ascx"%&amp;gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;You can then call the code from within the page by placing the user control reference between the SPSWC:TopPageSection tags. For example:&lt;/p&gt;&lt;p&gt;&lt;span style="color:#0000ff;"&gt;&amp;lt;CUSTOMUC:spsPortalHeader id="spsPortalHeader" runat="server"&amp;gt;&amp;lt;/CUSTOMUC:spsPortalHeader&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Of course, you still have to modify all 67 SPS style pages but by implementing user controls you only have to do this once; after that, you make changes only to the .ASCX file and they will be propagated automatically.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Beyond Headers&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Sadly, replacing headers is the easiest part of administration file customization. Beyond that you enter into the realm of painful line-by-line replacement. WSS style pages are a bit easier as you have direct access to the page body code, which can be edited easily enough (user controls can also save you some headaches here), but watch out – the structures change slightly from page to page and there are often hard-coded elements (such as page titles) so be careful how much editing you do. The same can’t be said for SPS style pages – they use nothing but server controls to render code. &lt;/p&gt;&lt;p&gt;The good news on both fronts is that creative manipulation of style sheets can overcome most design challenges, as long as you’re willing to live with the boxy and boring standard white content area. The primary styles in play here are ms-nav, ms-navframe, ms-titlearea, ms-titleareaframe, ms-titlearealine, ms-verticaldots, ms-colspace, ms-pageidi, ms-pageidpt, and ms-pageidta. You’ll also have to deal with the stock images at the top of the left column by moving them around or making them disappear altogether. Assuming you’ve already modified the styles for the navigation frame on the left and the associated menus, you should be well on your way to improving the bland look of those finicky administration pages.&lt;/p&gt;&lt;p&gt;Happy SharePointing! &lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt; Need to get rid of that pesky image at the top of the left column in the SPS style?  Try &lt;a href="http://phark.typepad.com/phark/2003/08/accessible_imag.html"&gt;Mike Rundle's text-hiding method&lt;/a&gt;.  Add this to your style sheet:&lt;/p&gt;&lt;p&gt;.ms-pageidi&lt;br /&gt;{ text-align: -100px }&lt;/p&gt;&lt;p&gt;Image be gone!  (Note: it's still there, the text-align setting just moves it off the page where it can't be seen)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113829549802811278?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113829549802811278/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113829549802811278' title='51 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113829549802811278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113829549802811278'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/extreme-sharepoint-design-customizing.html' title='Extreme SharePoint Design: Customizing SharePoint Administration Pages'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>51</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113812298751485719</id><published>2006-01-24T09:16:00.000-08:00</published><updated>2006-01-24T09:16:27.580-08:00</updated><title type='text'>SharePoint UK User Group First Meeting</title><content type='html'>&lt;p&gt;Nick Swan has done a tremendous job putting together the SharePoint UK User Group.&amp;nbsp; They&amp;rsquo;ve got a &lt;a href="http://suguk.org/"&gt;great site&lt;/a&gt; with some really good info for UK SharePointers.&amp;nbsp; Their first meeting is being held Monday, February 13th.&amp;nbsp; I know how much work goes into organizing these events so hats off to Nick and his team.&amp;nbsp; If you live anywhere close to &lt;a href="http://www.microsoft.com/uk/about/map-reading.mspx"&gt;Thames Valley Park in Reading&lt;/a&gt; you should make every effort to attend (there are also some great pubs nearby&amp;nbsp;so it&amp;rsquo;s definitely worth the trip).&amp;nbsp; &amp;nbsp; &lt;/p&gt;&lt;p&gt;Go &lt;a href="http://suguk.org/forums/72/ShowThread.aspx"&gt;here&lt;/a&gt; for all the information.&amp;nbsp; &lt;/p&gt;&lt;p&gt;I do a fair amount of business in the UK and they really have a thriving SharePoint community.&amp;nbsp; It&amp;rsquo;s great to see them getting support from Microsoft.&amp;nbsp; Unfortunately I&amp;rsquo;m on a project Stateside all through February or I would be there to support the group.&amp;nbsp; Have a pint of &lt;a href="http://www.abbotale.co.uk/"&gt;Abbott Ale&lt;/a&gt; for me,&amp;nbsp;mates!&amp;nbsp; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113812298751485719?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113812298751485719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113812298751485719' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113812298751485719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113812298751485719'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/sharepoint-uk-user-group-first-meeting.html' title='SharePoint UK User Group First Meeting'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113760377815108380</id><published>2006-01-18T09:02:00.000-08:00</published><updated>2006-01-18T09:02:58.196-08:00</updated><title type='text'>SharePoint Communities</title><content type='html'>&lt;p&gt;Lately, there&amp;rsquo;s been a &lt;a href="http://www.sharepointblogs.com/dustin/archive/2006/01/12/4569.aspx"&gt;great deal of debate&lt;/a&gt; about forming communities to centralize/aggregate/organize SharePoint-related content.&amp;nbsp; I think every one of us who pontificates on SharePoint has lamented the lack of a distinct community structure at some point.&amp;nbsp; There is no doubt that it&amp;rsquo;s frustrating, especially for new users, to find SharePoint content, tips, tricks, advice, code, best practices, and the like.&amp;nbsp; There are &lt;a href="http://www.theegroup.net/Blogs/default.aspx"&gt;blogs&lt;/a&gt;, &lt;a href="http://www.sharepointreporter.com/"&gt;aggregators&lt;/a&gt;, &lt;a href="http://james.wss.bcentral.com/sharepoint/default.aspx"&gt;community sites&lt;/a&gt;, &lt;a href="http://www.msd2d.com/default_section.aspx?section=sharepoint"&gt;MSD2D&lt;/a&gt;, &lt;a href="http://www.microsoft.com/technet/community/newsgroups/server/sharepoint.mspx"&gt;newsgroups&lt;/a&gt;&amp;nbsp;&amp;ndash; the list goes on and on.&amp;nbsp; Now that&amp;rsquo;s the definition of confusion.&lt;/p&gt;&lt;p&gt;No one can really agree on how best to approach this problem &amp;ndash; although we&amp;rsquo;re all aware that there is, indeed, a problem &amp;ndash; but there seem to be three main approaches:&lt;/p&gt;&lt;p&gt;1. Centralization&lt;/p&gt;&lt;p&gt;Proponents of this approach believe that the only way to tame the beast is to bring all of the various resources together under one roof (which usually means&amp;nbsp;THEIR roof) to provide a one-stop-shopping approach.&amp;nbsp; While this initially sounds like an attractive proposition, there are all kinds of issues, like: Who controls the&amp;nbsp;platform?&amp;nbsp; Who&amp;nbsp;determines format? Who maintains the directory?&amp;nbsp; Who&amp;nbsp;has final say on contributions and content?&amp;nbsp;Is somebody&amp;nbsp;profiting&amp;nbsp;disproportionately from it?&amp;nbsp; How&amp;nbsp;are contributors engaged?&amp;nbsp;&amp;nbsp;Who gets&amp;nbsp;the AdSense revenue?&lt;/p&gt;&lt;p&gt;One very important&amp;nbsp;shortcoming of&amp;nbsp;a centralized resource is that&amp;nbsp;a structured framework by its very nature is anathema to creativity.&amp;nbsp; Most community contributors see their sites/blogs as labors of love and means of expression &amp;ndash; they&amp;nbsp;don&amp;rsquo;t want to use somebody else&amp;rsquo;s template or format or rules.&amp;nbsp; Centralization is their kryptonite &amp;ndash; they work under too many restrictions from day to day and free expression of their ideas is a constructive outlet.&amp;nbsp; The overall community&amp;nbsp;may not need yet another WSS site with a fancy template and a bit of original content but the person who built it needs it for their own personal satisfaction and edification.&amp;nbsp; This is a powerful factor that cannot be overlooked (and too often is).&lt;/p&gt;&lt;p&gt;And let&amp;rsquo;s not be so blind as to think that there is not a&amp;nbsp;profit motive behind many of these efforts; often times somebody, somewhere, wants to get paid (which is neither good nor bad, it&amp;rsquo;s just reality).&amp;nbsp; There&amp;rsquo;s a natural level of distrust between&amp;nbsp;the community and the people who run commercial enterprises; they assume, whether right or wrong, that the business owner wants their content for the sole purpose of enriching themselves.&amp;nbsp; In truth, that&amp;rsquo;s probably a rare&amp;nbsp;occurrence (I can&amp;rsquo;t&amp;nbsp;think of one example in the SharePoint community where this is absolutely the case), but the perception still exists.&amp;nbsp;&amp;nbsp;This is the true Achilles heel of centralization.&lt;/p&gt;&lt;p&gt;Then, of course, there&amp;nbsp;is Microsoft&amp;rsquo;s centralization effort, which you would think lends itself most to the profit motive argument but in reality is probably the least&amp;nbsp;likely to support that hypothesis (Microsoft is going to sell lots of&amp;nbsp;CAL&amp;rsquo;s regardless of what all of us post on the web).&amp;nbsp; There&amp;rsquo;s lots of distrust here too but for a different reason &amp;ndash;&amp;nbsp;people are worried that Microsoft will police their contributions,&amp;nbsp;stifling dissent and revoking&amp;nbsp;it&amp;rsquo;s favor (like MVP status) for those that don&amp;rsquo;t toe the line.&amp;nbsp; I don&amp;rsquo;t know if this will really happen or not but I&amp;nbsp;will admit that it concerns&amp;nbsp;me &amp;ndash;&amp;nbsp;how long do you think my Extreme SharePoint Design series of posts would last on an MS sponsored site?&amp;nbsp;&amp;nbsp;They&amp;rsquo;d never make it past the editors, I would imagine, because they show&amp;nbsp;users how to solve problems or overcome inbuilt limitations that don&amp;rsquo;t necessarily jive&amp;nbsp;with&amp;nbsp;what MS defines as a &amp;lsquo;supported&amp;rsquo; solution.&amp;nbsp; &amp;nbsp;&lt;/p&gt;&lt;p&gt;Having said all that, what are the advantages of centralization?&amp;nbsp; Ease of use, for one, especially for new users.&amp;nbsp;&amp;nbsp;Efficiency as well,&amp;nbsp;in that we would all spend less time&amp;nbsp;searching for what we need to know.&amp;nbsp; I suppose a certain level of consistency would also be achieved&amp;nbsp;along with&amp;nbsp;elimination of duplication if&amp;nbsp;everyone is&amp;nbsp;aware of what other contributors are saying.&amp;nbsp; There&amp;rsquo;s probably a bit of&amp;nbsp;esprit de corps that would go along with&amp;nbsp;being on the same team and enthusiasm, as we all know, is infectious.&amp;nbsp; And let&amp;rsquo;s not forget that together we could probably achieve more in one form or fashion than we could each working on our own.&lt;/p&gt;&lt;p&gt;So are the benefits enough to outweigh the disadvantages?&amp;nbsp; I suppose the community at large will decide, or they may choose&amp;hellip;&lt;/p&gt;&lt;p&gt;2. Decentralization&lt;/p&gt;&lt;p&gt;This model leaves things just as they are.&amp;nbsp;&amp;nbsp;Lots of different content islands floating around the SharePoint ocean with no direct&amp;nbsp;links between them.&amp;nbsp; Users leverage existing tools like Google, MSN, Yahoo!, Technorati, Feedster, and RSS&amp;nbsp;feed readers/aggregators to find what they&amp;rsquo;re looking for.&amp;nbsp; Convenient?&amp;nbsp; No.&amp;nbsp; Efficient?&amp;nbsp; Not even close.&amp;nbsp; Effective?&amp;nbsp; Hardly.&amp;nbsp; But it is easy, as no one has to build or maintain a centralized resource, and it doesn&amp;rsquo;t require users to do anything different than what they already do when looking for other types of information.&amp;nbsp; &lt;/p&gt;&lt;p&gt;This model is already in place and, if it were working well, I imagine that fewer people would be decrying the current state of affairs, so something&amp;nbsp;is rotten in Denmark (my express apologies to our Danish friends for that turn of phrase).&amp;nbsp; I know how confusing it is for new SharePointers &amp;ndash; I hear from my clients all the time about how hard it is to find good information.&amp;nbsp; Frankly, there&amp;rsquo;s just too much out there for them to catalog and synthesize.&amp;nbsp; It&amp;rsquo;s second nature to us because we live and breathe this stuff every day but they have real jobs with other responsibilities.&amp;nbsp; And I know lots of people want access to more resources because the most popular feature on my web site is my blogroll (I wish it were&amp;nbsp;the description of my&amp;nbsp;service offerings or my&amp;nbsp;contact page but sadly it is not to be).&amp;nbsp; &lt;/p&gt;&lt;p&gt;It&amp;rsquo;s also very hard to discover new content in a decentralized model.&amp;nbsp; When all the information is pulled instead of pushed you have to know exactly what you&amp;rsquo;re looking for.&amp;nbsp;&amp;nbsp;Free association is no strong point here &amp;ndash;&amp;nbsp;if you&amp;rsquo;re looking for needles, that&amp;rsquo;s what you&amp;rsquo;re going to get, even if a match stick might work better.&amp;nbsp;&amp;nbsp;It&amp;rsquo;s no secret that you always find what you were looking for yesterday&amp;nbsp;when you&amp;rsquo;re looking for something else today.&amp;nbsp;&amp;nbsp;By way of example, Heather has one of the &lt;a href="http://heathersolomon.com/blog/articles/148.aspx"&gt;best resources on the web&lt;/a&gt; for&amp;nbsp;SharePoint customization but&amp;nbsp;people still post&amp;nbsp;questions to the newsgroups that she has long since answered in-depth.&amp;nbsp;&amp;nbsp;I wish&amp;nbsp;more people&amp;nbsp;would use &lt;a href="http://www.theegroup.net/txtlstvw.aspx?LstID=0c510949-16ba-486f-a03a-369f7102b97f"&gt;SharePoint BlogSearch&lt;/a&gt; but they don&amp;rsquo;t &amp;ndash; it&amp;rsquo;s mostly a handy tool for me to find postings from other bloggers without wading through Technorati&amp;rsquo;s endless parade of irrelevant results.&amp;nbsp; And just a few months ago I had a user point me to one of Bil Simser&amp;rsquo;s posts on &lt;a href="http://weblogs.asp.net/bsimser/archive/2004/11/22/267846.aspx"&gt;automating list metadata from Word documents&lt;/a&gt; that I was unaware of &amp;ndash; and I read Bil&amp;rsquo;s blog religiously!&amp;nbsp; Talk about an embarrassing moment; if I don&amp;rsquo;t know these things off the top of my head, how on earth is Joe SharePoint Administrator supposed to cope?&amp;nbsp; There&amp;rsquo;s just too much out there for anyone to get a good handle on.&lt;/p&gt;&lt;p&gt;Which leads us to&amp;hellip;&lt;/p&gt;&lt;p&gt;3. Affiliation&lt;/p&gt;&lt;p&gt;This is a middle-of-the-road approach that places more importance on the connections between contributors than it does on command and control.&amp;nbsp; A Federalist solution, this model encompasses as many content islands as everyone can build so long as there are good links between the islands, perhaps with a DNS-root-server type of directory listing hosted somewhere.&amp;nbsp; This is in line with the organic growth model of most online communities and eschews any sort of governance other than mutual accountability.&amp;nbsp; &lt;/p&gt;&lt;p&gt;As with any group of city-states, the overall economy of the region is only as good as the trade routes between destinations.&amp;nbsp; In other words, if we can&amp;rsquo;t all agree on some uniform method of linking to each other and cross-publishing then the whole&amp;nbsp;garment will unravel.&amp;nbsp; We know the &amp;lsquo;web ring&amp;rsquo; concept doesn&amp;rsquo;t really work, so we&amp;rsquo;ll have to come up with a better method of maintaining the roadways between our islands.&amp;nbsp; And there still has to be a&amp;nbsp;unified directory somewhere, which opens up the same control issues as complete centralization.&amp;nbsp; &lt;/p&gt;&lt;p&gt;This method does seem, at least on the face of it, to&amp;nbsp;blend the best of&amp;nbsp;both the centralized and decentralized approaches.&amp;nbsp; Yes, we all have to agree on some way to keep traffic flowing between us, but it would sure make the task of finding information easier.&amp;nbsp; And contributors would be free to&amp;nbsp;exercise their creative talents.&amp;nbsp; The directory&amp;nbsp;is a problem, if for no&amp;nbsp;other&amp;nbsp;reason than someone is going to have&amp;nbsp;the task of maintaining it, and it will have to contain real&amp;nbsp;or near real-time information.&amp;nbsp; No easy task, to be sure.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;So what&amp;rsquo;s the final solution?&amp;nbsp; I don&amp;rsquo;t know any more than you do.&amp;nbsp; Personally, I think the Affiliation model works the best but I could be wrong &amp;ndash;&amp;nbsp;I know&amp;nbsp;several of my clients would much prefer&amp;nbsp;Centralization because it makes their work lives easier but&amp;nbsp;many community&amp;nbsp;members are&amp;nbsp;staunch adherents to the Decentralization metaphor.&amp;nbsp; The two constituencies seem to be at opposite ends of the spectrum.&amp;nbsp;&amp;nbsp;Judging by the community reaction to any proposition&amp;nbsp;for centralization,&amp;nbsp;I doubt we will see this happen any time soon so it may become the de facto loser, with decentralization&amp;nbsp;winning by default since it requires no additional effort on our part (I sure hope that&amp;rsquo;s not the&amp;nbsp;reason but we can&amp;rsquo;t rule out general sloth as a factor).&amp;nbsp; One thing&amp;rsquo;s for sure &amp;ndash;&amp;nbsp;spirited debate on the subject isn&amp;rsquo;t about to die any time soon!&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113760377815108380?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113760377815108380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113760377815108380' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113760377815108380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113760377815108380'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/sharepoint-communities.html' title='SharePoint Communities'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113753082951189289</id><published>2006-01-17T12:45:00.000-08:00</published><updated>2006-01-17T12:48:57.606-08:00</updated><title type='text'>SharePoint BlogSearch Update</title><content type='html'>I have updated &lt;a href="http://www.theegroup.net/txtlstvw.aspx?LstID=0c510949-16ba-486f-a03a-369f7102b97f"&gt;SharePoint BlogSearch&lt;/a&gt; with a bunch of new blogs (see a complete list of included blogs &lt;a href="http://www.theegroup.net/Blogs/default.aspx"&gt;here&lt;/a&gt;).  I've also modified some of the search parameters to return more relevant results and better default groupings.  Incremental updates are now being done weekly to conserve bandwidth; hopefully, this won't cause adversely affect any search results.  Should you notice something missing that needs to be there just &lt;a mailto:info@theegroup.net&gt;email me&lt;/a&gt; and I'll check it out. &lt;br /&gt;&lt;br /&gt;I've also added a BlogSearch form to the main page; just go to &lt;a href="http://www.theegroup.net/default.aspx"&gt;The eGroup Web Site&lt;/a&gt; and you'll see it on the right side of the page.  If you'd like to use this form on your web or blog site, copy and paste the following code into your HTML (style references are included so you can add them to your default CSS and change them accordingly):&lt;br /&gt;&lt;br /&gt;&amp;lt;form method="get" action="http://www.theegroup.net/search.aspx" target="_top"&amp;gt;&lt;br /&gt; &amp;lt;table width="250" border="0" cellspacing="0" cellpadding="0"&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td align="left" valign="bottom" style="padding-right: 3px"&amp;gt;&amp;lt;img src="http://www.theegroup.net/_layouts/images/SPSSearch2.gif"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td align="left" valign="bottom" style="font-weight: bold; font-family: verdana, arial, helvetica, sans-serif; color: #1B6E89; padding-bottom: 3px; font-size: 8pt;"&amp;gt;SharePoint BlogSearch&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt;  &amp;lt;tr&amp;gt;&lt;br /&gt;   &amp;lt;td&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td align="left" valign="bottom" style="font-family: verdana, arial, helvetica, sans-serif; font-size: 8pt"&amp;gt;&amp;lt;input type="text" name="k" size="35"/&amp;gt;&amp;lt;input type="hidden" name="s" value="SharePoint%20Blogs"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;   &amp;lt;td align="left" valign="middle" style="padding-left: 3px"&amp;gt;&amp;lt;input type="image" name="Submit" src="http://www.theegroup.net/_layouts/images/icongo02.gif"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;  &amp;lt;/tr&amp;gt;&lt;br /&gt; &amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;br /&gt;As always, let me know if a blog is missing that should be on the list or if you would like your blog excluded from the index.&lt;br /&gt;&lt;br /&gt;Happy blogsearching!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113753082951189289?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113753082951189289/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113753082951189289' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113753082951189289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113753082951189289'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/sharepoint-blogsearch-update.html' title='SharePoint BlogSearch Update'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113707850869838267</id><published>2006-01-12T06:45:00.000-08:00</published><updated>2006-01-12T09:23:56.563-08:00</updated><title type='text'>SharePoint Forge Opens Its Doors</title><content type='html'>&lt;p&gt;Many of us have &lt;a href="http://sharingpoint.blogspot.com/2005/07/sharepoint-vision.html"&gt;complained in the past&lt;/a&gt; that there is no central repository for SharePoint knowledge, code, web parts, techniques, etc. Well, those days are over. Bil Simser's &lt;a href="http://www.sharepointforge.com/"&gt;SharePointForge&lt;/a&gt; is now open for business.&lt;/p&gt;&lt;p&gt;Go check it out and let Bil know how much you appreciate his hard work.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113707850869838267?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113707850869838267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113707850869838267' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113707850869838267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113707850869838267'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/sharepoint-forge-opens-its-doors.html' title='SharePoint Forge Opens Its Doors'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-113699567208910989</id><published>2006-01-11T08:07:00.000-08:00</published><updated>2006-01-11T08:13:31.200-08:00</updated><title type='text'>An Open Letter to SharePoint Recruiters</title><content type='html'>&lt;p&gt;I get a lot of emails from recruiters looking for SharePoint resources. I welcome every message and try my best to connect the people I know with each opportunity that comes my way. One thing that I see over and over again is a job requirement that demands top-notch coding skills alongside advanced design/customization/deployment/project management knowledge. This is like asking the guy at GM who designed your SUV to also be the mechanic - they are two completely separate disciplines and anyone who claims to be good at both is going to be horrible at each one.&lt;/p&gt;&lt;p&gt;When was the last time you saw an architect framing a house and doing the brickwork? Or a graphic designer building a server farm? Or a nurse doing brain surgery? &lt;/p&gt;&lt;p&gt;Software architects and software developers have completely different skill sets. Yes, some skills overlap to a small degree, and knowledge of one discipline can make you better at the other, but to be really good at something you have to focus on that skill to the detriment of all others. I don’t write code not because I can’t but because there are people out there who can program circles around me with their eyes closed - but ask those same superstar developers to manage an end-to-end portal implementation or do all the design and customization work to take a project from mock-up to production and you’ll get that deer-in-the-headlights look. They’ll tell you straight up that’s not what they do, that’s what architects and designers do. And if they don’t then they are a) lying and b) bad developers. Don’t hire them. Period.&lt;/p&gt;&lt;p&gt;So please, to every recruiter out there, stop trying to shoe-horn two bodies into a single position - it won’t work and your client will definitely not be happy with the result. If you get a requisition with this type of ridiculous stipulation it’s your job to tell the hiring manager that he/she needs two experts, not one, and you’ll be happy to go find them both. Let people do what they do best - good personnel placement is about fitting round pegs into round holes not drilling out bigger holes to make room for triangles, squares and octagons.&lt;/p&gt;&amp;lt;/rant&amp;gt;&lt;br /&gt;&lt;p&gt;&lt;/rant&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113699567208910989?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113699567208910989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113699567208910989' title='58 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113699567208910989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113699567208910989'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/open-letter-to-sharepoint-recruiters.html' title='An Open Letter to SharePoint Recruiters'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>58</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113699449977809735</id><published>2006-01-11T07:48:00.000-08:00</published><updated>2006-01-11T08:20:28.946-08:00</updated><title type='text'>SharePoint User Interface Customization</title><content type='html'>&lt;p&gt;Heather has a &lt;a href="http://heathersolomon.com/blog/articles/3500.aspx"&gt;great new article&lt;/a&gt; on customizing the SharePoint user interface. Like her, I wish I could give you a step-by-step guide on how to do it but there's just no simple solution (&lt;a href="http://sharingpoint.blogspot.com/2005/10/extreme-sharepoint-design-custom.html"&gt;here are a few tips to get you started&lt;/a&gt; ). In Heather's words:&lt;/p&gt;&lt;blockquote cite="http://heathersolomon.com/blog/articles/3500.aspx"&gt;&lt;i&gt;Customizing SharePoint is like riding a bike, it is very hard to tell someone how to do it, and that person really just has to try, fall down, try again, and they will figure it out.&lt;/i&gt;&lt;/blockquote&gt;&lt;p&gt;I couldn't agree more. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113699449977809735?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113699449977809735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113699449977809735' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113699449977809735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113699449977809735'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/sharepoint-user-interface.html' title='SharePoint User Interface Customization'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113692187631462779</id><published>2006-01-10T11:32:00.000-08:00</published><updated>2006-01-10T11:37:56.506-08:00</updated><title type='text'>Extreme SharePoint Design: Custom MySite Titles, Part 2</title><content type='html'>&lt;p&gt;In a &lt;a href="http://sharingpoint.blogspot.com/2005/10/extreme-sharepoint-design-custom.html"&gt;previous post&lt;/a&gt; I demonstrated how to create custom titles on MySite pages that display the site owner's name and link back to the public view if the viewer is just a reader and the private view if the viewer is the site owner. The example used the Title property of the SPControl.GetContextWeb(Context) method to retrieve the site owner's name from AD. This works fine if the correct fields in AD have the right information in the right format (i.e First Name, Middle Initial, Last Name) but not so well if they don't. In many cases, the system returns the user name in the Windows default format of [Domain]\[Username].&lt;/p&gt;&lt;p&gt;Fortunately, SharePoint user profiles contain the user's full name, which is rendered in the &amp;lt;SPSWC:PersonalSpaceMainHeading&amp;gt; control; unfortunately, this information is not directly accessible via the object model and, like the Title property, the name is displayed in the 'Last Name, First Name' format. To further complicate matters, the PersonalSpaceMainHeading control insists on displaying an icon that indicates whether or not the user is logged into the system, even if the RenderPawn option is set to 'False'.&lt;/p&gt;&lt;p&gt;To circumvent these issues and insure that the user name is rendered as 'First Name, Last Name' in all instances, we'll first hide the &amp;lt;SPSWC:PersonalSpaceMainHeading&amp;gt; control on the page, then access it's innerText property to get the user name. Then we'll parse the user name into the correct format and apply logic to determine whether the user is a reader or site owner and then write out the proper link.&lt;/p&gt;&lt;p&gt;First, create a blank user control (server and client-side code are blocked from execution in a standard portal page) with the following registrations:&lt;/p&gt;&lt;p&gt;&amp;lt;%@ Control Language="c#" AutoEventWireup="false" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="SPSWC" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt; &lt;/p&gt;&lt;p&gt;Store the control in the /bin directory of your SharePoint virtual server. For this example, the control is named 'spsTitle_MySite.ascx'.&lt;/p&gt;&lt;p&gt;Next, create the container code for the display of the user name. For this application, we are simply enclosing the user name in a table with two cells: one that reads 'Personal Site' and one that displays the user name. Place the &amp;lt;SPSWC:PersonalSpaceMainHeading&amp;gt; control into a hidden DIV so it can be accessed later in the code:&lt;/p&gt;&lt;p&gt;&amp;lt;table align="left" cellpadding="0" cellspacing="0" border="0"&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td width="5"&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td valign="middle" class="Mysite"&amp;gt;Personal Site&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td valign="middle" class="Mysite_Title"&amp;gt;&amp;lt;div id="PersonalSpaceMainHeading" style="display:none"&amp;gt;&amp;lt;SPSWC:PersonalSpaceMainHeading RenderPawn="false" runat="server" /&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;&lt;p&gt;Next, combine a server-side 'If...Then' statement with client-side Javascript which extracts the innerText of the PersonalSpaceMainHeading control and renders the user name and correct link:&lt;/p&gt;&lt;p&gt;&amp;lt;% if (SPControl.GetContextWeb(Context).CurrentUser.LoginName == SPControl.GetContextWeb(Context).Author.LoginName) { %&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var strFullName = document.getElementById("PersonalSpaceMainHeading").innerText;&lt;br /&gt;var intLength = strFullName.length;&lt;br /&gt;var intLocation = strFullName.indexOf(", ");&lt;br /&gt;if (intLocation == -1)&lt;br /&gt;{&lt;br /&gt;strTitle = strFullName;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;strTitle = strFullName.substring(intLocation + 1) + " " + strFullName.substring(0, intLocation);&lt;br /&gt;}&lt;br /&gt;document.write("&amp;lt;a href='/mysite/default.aspx'&amp;gt;" + strTitle + "&amp;lt;/a&amp;gt;");&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;% } else { %&amp;gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;var strFullName = document.getElementById("PersonalSpaceMainHeading").innerText;&lt;br /&gt;var strUrl = window.location.href;&lt;br /&gt;var intLength = strFullName.length;&lt;br /&gt;var intLocation = strFullName.indexOf(", ");&lt;br /&gt;if (intLocation == -1)&lt;br /&gt;{&lt;br /&gt;strTitle = strFullName;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;strTitle = strFullName.substring(intLocation + 1) + " " + strFullName.substring(0, intLocation); &lt;/p&gt;&lt;p&gt;}&lt;br /&gt;document.write("&amp;lt;a href='" + strUrl + "'&amp;gt;" + strTitle + "&amp;lt;/a&amp;gt;");&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;% } %&amp;gt;&lt;/p&gt;&lt;p&gt;The first part of the 'If...' statement checks to see if the current user name matches the login name of the site author. Since personal sites are created by the user, the Author will always be the site owner. If the name matches, the subsequent javascript extracts the user name, parses out the comma and reverses the last name and first name (the full name is displayed in the 'Last Name, First Name' format by default). It then creates a hyperlink to the default (private view) of the personal site.&lt;/p&gt;&lt;p&gt;If the current user is not the author, the second javascript performs the same string manipulation then writes out the hyperlink using the public view URL (i.e. "/mysite/public.aspx?accountname=[UserID]"). This method will also work on shared and private libraries, personal pages, and lists, sending the user to the proper home page depending upon their role.&lt;/p&gt;&lt;p&gt;Now we'll need to call the user control from DEFAULT.ASPX and PUBLIC.ASPX. First, add a registration for your new control to the top of each page:&lt;/p&gt;&lt;p&gt;&amp;lt;%@ Register Tagprefix="UC" Tagname="spsTitle_MySite" src="/bin/spsTitle_MySite.ascx" %&amp;gt;&lt;/p&gt;&lt;p&gt;Next, call the control from the body of the page:&lt;/p&gt;&lt;p&gt;&amp;lt;td align="left" valign="middle"&amp;gt;&lt;br /&gt;&amp;lt;UC:spsTitle_MySite id="spsTitle_MySite" runat="server"&amp;gt;&amp;lt;/UC:spsTitle_MySite&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;/p&gt;&lt;p&gt;The final output looks something like this (you can modify the styles to render the link however you wish):&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;img src="http://www.theegroup.net/Image%20Library/MySite_Title.gif" /&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113692187631462779?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113692187631462779/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113692187631462779' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113692187631462779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113692187631462779'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/extreme-sharepoint-design-custom.html' title='Extreme SharePoint Design: Custom MySite Titles, Part 2'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113682059604799576</id><published>2006-01-09T07:29:00.000-08:00</published><updated>2006-01-09T09:48:23.196-08:00</updated><title type='text'>New SharePoint Discussion Forum Web Part</title><content type='html'>&lt;p&gt;Bil Simser has a &lt;a href="http://weblogs.asp.net/bsimser/archive/2006/01/09/434857.aspx"&gt;new post&lt;/a&gt; describing a Discussion Forum web part he's working on. I can't tell you how many times I get asked about a replacement for the built-in discussion functionality. This is great news. I can't wait to get my 'grubby little hands' on it when it's finished.&lt;/p&gt;&lt;p&gt;Way to go, Bil!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113682059604799576?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113682059604799576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113682059604799576' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113682059604799576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113682059604799576'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/new-sharepoint-discussion-forum-web.html' title='New SharePoint Discussion Forum Web Part'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113655876532546650</id><published>2006-01-06T06:46:00.000-08:00</published><updated>2006-01-06T13:19:09.053-08:00</updated><title type='text'>Customizing the Built-In SharePoint Menus</title><content type='html'>&lt;p&gt;In previous posts (&lt;a href="http://sharingpoint.blogspot.com/2005/09/extreme-sharepoint-design-creating.html"&gt;here&lt;/a&gt; and &lt;a href="http://sharingpoint.blogspot.com/2005/11/extreme-sharepoint-design-custom-user.html"&gt;here&lt;/a&gt;) I’ve shown you how to build your own custom menus to relocate the standad Actions and Views menus. Great if you’ve got the time and the need to do so but what if all you want is a quick menu solution that looks and works just like the Modify Shared Page menu? Well, &lt;a href="http://xgvb.blogspot.com/"&gt;Gert van Bael&lt;/a&gt; has the answer. &lt;a href="http://xgvb.blogspot.com/2006/01/how-to-reuse-modify-shared-page.html"&gt;In this post&lt;/a&gt; he shows you how to duplicate the existing menu code to create a custom drop-down that supports nested menus.&lt;/p&gt;&lt;p&gt;Great tip, Gert!&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;Update:&lt;/span&gt; Dustin has a previous post on the same topic &lt;a href="http://www.sharepointblogs.com/dustin/archive/2004/04/27/339.aspx"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113655876532546650?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113655876532546650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113655876532546650' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113655876532546650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113655876532546650'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/customizing-built-in-sharepoint-menus.html' title='Customizing the Built-In SharePoint Menus'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-113639379593334010</id><published>2006-01-06T05:56:00.000-08:00</published><updated>2006-01-06T06:46:51.026-08:00</updated><title type='text'>Don't Fire the Messenger</title><content type='html'>&lt;p&gt;Recently I had a conversation with a prospective client in which it became apparent that a sales engineer had given them bad advice. It fell to me to explain the shortcomings of the SE’s recommendations, as gently as possible, to an IT manager who had only a very short time frame to impelement a large, customized &lt;a href="http://www.technorati.com/tag/SharePoint"&gt;SharePoint&lt;/a&gt; solution. He didn’t take it very well, so needless to say, I don’t think I’ll be getting the engagement.&lt;/p&gt;&lt;p&gt;I see this happen quite frequently and it always ends up with the consultant being the bad guy. I hate to break this to the world at large but SE’s aren’t always right; in fact, I used to be an SE and I’ll admit to being wrong on several occasions. The problem with the Account Manager/SE arrangement is that the two primary contacts the end user is engaged with have little, if any, real-world field experience. Their job is to sell licenses and be generalists; they have neither the time nor the motivation to be specialists with in-depth product knowledge gained by sweating it out in the trenches. I can tell you first hand that most SE’s work with the products they promote only in lab environments and have very little time for problem solving or immersive knowledge. I humbly admit to getting much of my knowledge during my SE days from product documentation and lab trials; I know for a fact that this is how it’s usually done. &lt;/p&gt;&lt;p&gt;Before all my SE friends flame me to death, understand that I’m not pointing fingers; it’s not your job to know this stuff, it’s my job - that’s why you sell the product and I make it sing and dance. Unfortunately, the client takes the SE’s words as gospel. On those rare occassions where the SE gets it wrong, I’m in a no-win situation - I have to tell the client that the solution is not going to work. There is no way to overcome the client’s response of “Well, that’s how Microsoft/Oracle/Cisco/IBM/Whomever said to do it” unless you have a long-standing relationship with that client. I can’t afford to nod my head and go along with it just to get the gig  not only will it destroy my credibility with the client and eliminate any chance to do business with them again, it also means that I won’t be able to use that project as a reference (and we consultants live and die by our references). &lt;/p&gt;&lt;p&gt;So if you’re a consultant caught in a similar situation, what do you do? In my mind, there’s no question. You politely and respectfully tell the client why, based on your experience and knowledge, you think what they’ve been told is wrong. You also preface it by saying that you yourself may be wrong and there’s only one way to find out for sure - test the recommendations to see if they work. But you can’t dance around the subject or equivocate; doing so will eventually end your consulting career. You probably won’t get the assignment, but you will have a clear conscience and, when the client does try to implement the misguided suggestions and fails, your stock will go way, way up (no, they won’t call you in to fix it, but they might call you for the next project - just be sure to avoid the irresistable urge to say “I told you so”). &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113639379593334010?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113639379593334010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113639379593334010' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113639379593334010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113639379593334010'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/dont-fire-messenger.html' title='Don&apos;t Fire the Messenger'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113640479681061630</id><published>2006-01-05T11:11:00.000-08:00</published><updated>2006-01-05T09:12:27.830-08:00</updated><title type='text'>The Great Metadata Debate</title><content type='html'>&lt;p&gt;Dustin Miller kicked over the anthill when he &lt;a title="The Dean's Office" href="http://www.sharepointblogs.com/dustin/archive/2006/01/03/4480.aspx"&gt;ranted against subfolders&lt;/a&gt; in document libraries. Bil Simser concurs and stirred up some more dust with &lt;a title="Folder's Bad, Metadata Good!" href="http://weblogs.asp.net/bsimser/archive/2006/01/03/434454.aspx"&gt;his post&lt;/a&gt; on the subject. Of course, some folks take exception to all this, preferring to do things the old-fashioned way, but the real question is: what good are subfolders, anyway? Do they help us categorize information? No, they do not. Do they help users find documents easier? Absolutely not. Are they intuitive? Not really. Do users know what to do with them? Ah, and there's the rub - users are comfortable with folders and they know how to use them. Now ain't that a bummer??? &lt;/p&gt;&lt;p&gt;While Dustin and Bil are most certainly correct - metadata is by far the best way to categorize and display information in &lt;a href="http://www.technorati.com/tag/SharePoint"&gt;SharePoint &lt;/a&gt;- it turns out that there's a lot to be said for giving users something they're used to amidst a sea of change. Think about it for a minute: we toss around terms like 'metadata', 'lists', 'views', 'libraries', 'categories', 'content', 'areas', etc. like they're second nature to everyone but the truth is they only mean something to US. Your average user doesn't understand any of this and, what's worse, they don't even care. Here's a neat little trick - want to immediately turn a room full of professionals into a group of slack-jawed zombies? Use the word 'metadata' three times in one minute and see what happens. They instantly tune you out. I've seen it happen many times. &lt;/p&gt;&lt;p&gt;It may just be that we're asking people to digest more than they have an appetite for. Not only do they have to get used to all this &lt;a href="http://www.technorati.com/tag/SharePoint"&gt;SharePoint&lt;/a&gt; mumbo-jumbo but now they have to give up their folders too? For Pete's sake, it took them five years to learn what a network share is and now everything goes back into one directory? I swear I can hear the gears in their brains grinding to a halt when I get to this portion of the training. &lt;/p&gt;&lt;p&gt;Rarely do we have time to fully train (and re-train) every user before the new portal goes live. And even if we did, it's just too much for them to absorb. So we make a judgement call and weigh the options - do we have all these nice little categories that please our analytical minds or do we have immediately productive users? Every client I've ever had opts for the latter and rightly so - no organization can afford that much disruption. &lt;/p&gt;&lt;p&gt;Here's the other problem with metadata that nobody's talking about: it takes a lot of time to make it work right. Not only do we have to decide upon our categories but then we have to create lookups, add list definitions, modify views, group, sort, filter and generally yank, pull, twist, poke and wiggle until it all looks right. Then we need another library to do the same thing - but just a little bit different, of course - and we're at it again, like an army of &lt;a href="http://www.technorati.com/tag/SharePoint"&gt;SharePoint&lt;/a&gt; worker bees, buzzing around our little libraries being busy, busy, busy. Meanwhile the users are putting documents back into folders on the network 'cause that's what they know and all this SharePoint stuff is just too hard. &lt;/p&gt;&lt;p&gt;So what do we do? WE know metadata is good but user's don't. WE know it streamlines indexing and retrieval but they could care less. WE know folder structures are the worst way to organize information since, well, folder structures but nobody's listening. A bit of the ol' rock-and-a-hard-place, isn't it? &lt;/p&gt;&lt;p&gt;Well, here's an idea. Give 'em both. Give your users metadata AND folders. Let 'em store stuff the way they always have (at least for now) but also enforce metadata rules. Create standard list definitions and views for each document library that contain all the basic metadata fields that map directly to Word/Excel/etc. so they can fill out the fields in Office and don't have to fiddle with web forms (if you haven't done that yet, you're missing the boat. &lt;a href="http://weblogs.asp.net/bsimser/archive/2004/11/22/267846.aspx"&gt;Read this immediately&lt;/a&gt;). Customize the base defs/views only when you have to. Let users upload docs into whatever folder structure they desire until it comes time to ween them off; say six months, or even a year, when they can hear 'metadata' without their eyes glazing over. You can always move the docs out of folders and into the base library later on (I know, I know, some links will be broken but your views will still be intact). &lt;/p&gt;&lt;p&gt;In other words, feed them the elephant one bite at a time so they get used to the taste then invite them to the banquet. Users will be much happier and they'll actually stick with it since the new has now become the old. You'll still have a contingent of naysayers who'll put up a fight when it's time to yank their beloved folders out but by that time they'll be a distinct minority instead of a vocal majority. It'll save you a lot of headaches and them a lot of frustration. That's a win-win if I ever heard one.&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt; For more on metadata and how to use it, see Ian Morrish's post on &lt;a href="http://www.wssdemo.com/blog/Log/DisplayLog.aspx?ID=153"&gt;Sharepoint and metadata&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="color:#ff0000;"&gt;UPDATE 2:&lt;/span&gt; &lt;a href="http://blogs.msdn.com/danielmcpherson/"&gt;Daniel McPherson&lt;/a&gt; links back to an &lt;a href="http://blogs.msdn.com/danielmcpherson/archive/2004/04/02/106554.aspx"&gt;older post on the same subject&lt;/a&gt;.  His real-life example is dead on.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113640479681061630?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113640479681061630/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113640479681061630' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113640479681061630'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113640479681061630'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/great-metadata-debate.html' title='The Great Metadata Debate'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113631830205923599</id><published>2006-01-05T08:07:00.000-08:00</published><updated>2006-01-05T07:09:03.776-08:00</updated><title type='text'>Extreme Sharepoint Design: Modifying User-Defined Web Part Pages</title><content type='html'>User-defined web part pages allow web designers and portal members to create isolated pages with the same basic functionality as a standard area or site page. Because they are stored in document libraries instead of the area or site collection hierarchy, they can be created, deleted, and modified without affecting portal navigation, taxonomy or search results. They serve as an effective, low-impact method for enabling user creativity.&lt;br /&gt;&lt;br /&gt;Customizing user-defined web part pages is not quite as tricky as overhauling a complete site definition but they do present the designer with a few unique challenges. For one thing, there are several types in every definition and each one is slightly different. For another, they have a few built-in limitations that will cause problems if you don't know what to watch out for. Coordinating the look and feel of these pages with the overall portal design will improve consistency and encourage users to create their own pages without impacting the portal architecture.&lt;br /&gt;&lt;br /&gt;User-defined web part pages are stored in the DOCTEMP\SMARTPGS directory of each site definition, named in ascending numerical order (SPSTD1.ASPX, SPSTD2.ASPX, and so on). Each numbered file is directly related to an option in the Web Part Page Creation Wizard (SPCF.ASPX) section titled "Layout". The 'Choose a Layout Template' select box contains eight options for page layout, from a simple, single-column design to a complete, multi-zone web part page. Should you choose to edit Web Part Page Creation wizard page to add or remove items to/from this list, you will notice that the options are out of order in the select box code (line 251 of SPCF.ASPX):&lt;br /&gt;&lt;br /&gt;&amp;lt;SELECT id="onetidWebPartPageTemplate" name="WebPartPageTemplate" size="8" onchange="DoTemplateOptionChange()"&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="1"&amp;gt;Full Page, Vertical&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="3"&amp;gt;Header, Left Column, Body&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="4"&amp;gt;Header, Right Column, Body&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="2" selected="true"&amp;gt;Header, Footer, 3 Columns&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="5"&amp;gt;Header, Footer, 2 Columns, 4 Rows&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="6"&amp;gt;Header, Footer, 4 Columns, Top Row&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="7"&amp;gt;Left Column, Header, Footer, Top Row, 3 Columns&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;OPTION value="8"&amp;gt;Right Column, Header, Footer, Top Row, 3 Columns&amp;lt;/OPTION&amp;gt;&lt;br /&gt;&amp;lt;/SELECT&amp;gt;&lt;br /&gt;&lt;br /&gt;The options relate to each page in the site definition as follows:&lt;br /&gt;&lt;br /&gt;Option 1 -&amp;gt; spstd1.aspx -&amp;gt; Full Page, Vertical&lt;br /&gt;Option 2 -&amp;gt; spstd3.aspx -&amp;gt; Header, Left Column, Body&lt;br /&gt;Option 3 -&amp;gt; spstd4.aspx -&amp;gt; Header, Right Column, Body&lt;br /&gt;Option 4 -&amp;gt; spstd2.aspx -&amp;gt; Header, Footer, 3 Columns&lt;br /&gt;Option 5 -&amp;gt; spstd5.aspx -&amp;gt; Header, Footer, 2 Columns, 4 Rows&lt;br /&gt;Option 6 -&amp;gt; spstd6.aspx -&amp;gt; Header, Footer, 4 Columns, Top Row&lt;br /&gt;Option 7 -&amp;gt; spstd7.aspx -&amp;gt; Left Column, Header, Footer, Top Row, 3 Columns&lt;br /&gt;Option 8 -&amp;gt; spstd8.aspx -&amp;gt; Right Column, Header, Footer, Top Row, 3 Columns&lt;br /&gt;&lt;br /&gt;In addition, each option has an animated GIF of the same name associated with it that provides a thumbnail view of the page design. These images are located in the 60\TEMPLATES\LAYOUTS\1033 directory. Display of the thumbnails is controlled by the following script at the top of SPCF.ASPX:&lt;br /&gt;&lt;br /&gt;function DoTemplateOptionChange()&lt;br /&gt;{&lt;br /&gt;var index = document.frmWebPage.WebPartPageTemplate.selectedIndex;&lt;br /&gt;document.frmWebPage.PreviewImage.src = strImagePath + "spstd" + document.frmWebPage.WebPartPageTemplate.options[index].value + ".gif";&lt;br /&gt;document.frmWebPage.PreviewImage.alt = document.frmWebPage.WebPartPageTemplate.options[index].text;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;These images may be replaced with a custom animated gif that reflects the new page design or directed to another file name by editing the DoTemplateOptionChange() function.&lt;br /&gt;&lt;br /&gt;Modifying the pages themselves is done in much the same manner as any other definition file - start with the default code and add or remove tags and HTML code as necessary - but there are a few issues to bear in mind when working with web part pages:&lt;br /&gt;&lt;br /&gt;1. Web part zones in the page body (excluding the TitleBar zone; see below) are contained within a specific set of table cells which are referenced by a script that determines whether or not to display the cell based on it's contents (or, more accurately, the lack thereof). To recreate this functionality, be sure to place your web part zones inside the following cell:&lt;br /&gt;&lt;br /&gt;&amp;lt;td id="_invisibleIfEmpty" name="_invisibleIfEmpty" valign="top" width="100%"&amp;gt;&lt;br /&gt;&lt;br /&gt;It is also necessary to include the following script somewhere on the page (the default location is just after the closing row tag in the parent table for the web part zones):&lt;br /&gt;&lt;br /&gt;&amp;lt;script language="javascript"&amp;gt;if(typeof(MSOLayout_MakeInvisibleIfEmpty) == "function") {MSOLayout_MakeInvisibleIfEmpty();}&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;2. By default, the TitleBarWebPart is added to each web part page when it is rendered. This web part displays the page title and 'Modify Shared Page' menu link. This web part is NOT specified in any SCHEMA.XML file and cannot be disabled. Furthermore, it's target is the TitleBar zone and this zone must exist on the page or an error will occur after page creation. The zone can be located anywhere on the page (it does not have to exist in the "_invisibleIfEmpty" table cell). To hide it from view, it can be placed within a container DIV whose 'display' style is set to 'none', but doing so will require the addition of the Settings Link control (&amp;lt;WebPartPages:SettingsLink runat="server" /&amp;gt;) in the title area.&lt;br /&gt;&lt;br /&gt;3. If the portal design incorporates custom menus, those menus changes will cascade down to the web part pages. Incorporate any definition-specific menu options into the corresponding web part pages and remove any elements with localized dependencies (such as &amp;lt;SharePoint:RelatedTasks&amp;gt;, which depends upon the &amp;lt;Toolbar Type="RelatedTasks"&amp;gt; section in SCHEMA.XML) or context-sensitive options.&lt;br /&gt;&lt;br /&gt;4. Web part pages in each definition are similar but not exactly the same. Take note of the different controls used in portal definition pages and STS definition pages; for example, pages in SPSPERS use &amp;lt;SPWC:PersonalSpaceNavigation&amp;gt; while pages in STS use &amp;lt;Sharepoint:Navigation&amp;gt;. Similarly, the HTML layout code may change from page to page, with DIV's, Tables, and other elements in unusual locations. As with any site definition modifications, when copying and pasting code be aware of the differing page registrations for each definition type and any tags which that definition relies upon for proper page rendering (like &amp;lt;SPSWC:PersonalSpaceNavigation runat="server" /&amp;gt; on personal site pages).&lt;br /&gt;&lt;br /&gt;To implement web part page modifications, simply copy the modified files to the target server(s). Since there are no XML files associated with this page type, changes will be seen immediately without having to reset IIS.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt; Dennis has a great post on &lt;a href="http://expiscornovus.blog.com/479256/"&gt;adding your own custom templates&lt;/a&gt; to the 'Create' page in SPS/WSS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113631830205923599?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113631830205923599/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113631830205923599' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113631830205923599'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113631830205923599'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/extreme-sharepoint-design-modifying.html' title='Extreme Sharepoint Design: Modifying User-Defined Web Part Pages'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113648026788337946</id><published>2006-01-05T06:57:00.000-08:00</published><updated>2006-01-05T09:08:25.826-08:00</updated><title type='text'>The Blog Editor Blues</title><content type='html'>&lt;p&gt;Riddle me this: Why is it so hard to find a blog editor that does everything most bloggers want in a single package? After fiddling for weeks with every editor out there I’m ready to pull my hair out by the roots. Some give you decent editing options but weak post management. Others are good at managing previous posts but don’t have nearly enough formatting options for new posts. Some are good at text, others at HTML. Do the people that develop these apps actually spend any time managing a blog? I’m thinking not.&lt;/p&gt;&lt;p&gt;Maybe I’m asking for too much. Here’s my list of requirements:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Consistent formatting - A paragraph tag should be a paragraph tag no matter what. For some reason every editor handles tags differently; what looks right in one rich text designer looks terrible in Blogger and then gets even further garbled by Feedburner. Why can’t HTML just be HTML? &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Automatic Text Replacement - Is it really so hard to catch a less than/greather than symbol and replace it with properly encoded chracters while I’m typing or as soon as I cut and paste? We can figure out how to turn a computer into a virtual Bobby Fischer but we can’t get on-the-fly replacement to work? What the heck am I missing here?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Post Status Handling - If I mark something draft that means I want it to be a draft when it’s uploaded not a regular post. When I switch it from draft to publish status it should post immediately without further action on my part. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Outlook-Style View - I should be able to see previous posts in a pane on the left and the body of the post on the right. That way I can switch back and forth between posts without having a bunch of windows open. &lt;/li&gt;&lt;br /&gt;&lt;li&gt;Search - I’m forever linking back to previous posts and looking for information. I should be able to search those posts to find what I want and link to it with a single click. Speaking of...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Link URLs - Linking to posts should be easy; a single click and I’m done. The editor should insert the proper permalink from the blog address. This must be part of the same rocket science as text replacement because it doesn’t work right in any editor. I always seem to end up with some goofy address that has no bearing on reality. What gives?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Tags and Keywords - I want to set up a list of keywords and have the editor automatically catch those words in my post and insert the proper Technorati tags. No further effort on my part required. When I tag a word manually, the editor should find subsequent instances of that word and insert the same tag on it’s own. &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;This post is being written in Anconia &lt;a href="http://www.anconia.com/rocketpost/"&gt;RocketPost&lt;/a&gt;, which does a fair job but won’t replace my text on the fly (even though it says it will), doesn’t have a split-pane view, doesn’t handle post status properly (even though the options are there) and still garbles up my HTML between editing and posting. I’ve also tried &lt;a href="http://www.blogjet.com/"&gt;BlogJet&lt;/a&gt;, &lt;a href="http://wbloggar.com/"&gt;w.Bloggar&lt;/a&gt;, &lt;a href="http://www.qumana.com/download.htm"&gt;Quamana&lt;/a&gt; and &lt;a href="http://ecto.kung-foo.tv/"&gt;Ecto&lt;/a&gt;, which all fall short in various areas.&lt;/p&gt;&lt;p&gt;So I’m putting out a plea to the community at large. What do you use? Have you found anything that meets all these requirements? Am I just in outer space or what? Leave a comment and steer me in the right direction...&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113648026788337946?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113648026788337946/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113648026788337946' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113648026788337946'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113648026788337946'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/blog-editor-blues.html' title='The Blog Editor Blues'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-113640520932040089</id><published>2006-01-04T12:06:00.000-08:00</published><updated>2006-01-04T12:06:49.320-08:00</updated><title type='text'>SharePoint RPC Methods</title><content type='html'>I was browsing through &lt;a href="http://heathersolomon.com/blog/articles/148.aspx"&gt;Heather's list of SharePoint resources&lt;/a&gt; when I found &lt;a href="http://digitalmelon.com/posts/214.aspx"&gt;this link&lt;/a&gt; to an RPC method that I was unaware of.  That led to &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/SPPTWSSRPC_SV01072919.asp"&gt;this article&lt;/a&gt; that documents the various RPC methods and provides even more links to other information.&lt;br /&gt;&lt;br /&gt;If I'm not mistaken, isn't this just the sort of "associative trail" that &lt;a href="http://en.wikipedia.org/wiki/Vannevar_Bush"&gt;Vannevar Bush&lt;/a&gt; had in mind all along???&lt;br /&gt;&lt;br /&gt;&lt;font color="#FF0000"&gt;UPDATE:&lt;/font&gt; Bil Simser has a &lt;a href="http://weblogs.asp.net/bsimser/archive/2006/01/04/434463.aspx"&gt;great post&lt;/a&gt; on this topic that is a must read.  Go check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113640520932040089?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113640520932040089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113640520932040089' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113640520932040089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113640520932040089'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/sharepoint-rpc-methods.html' title='SharePoint RPC Methods'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113633210134959505</id><published>2006-01-04T06:30:00.000-08:00</published><updated>2006-01-04T09:21:10.976-08:00</updated><title type='text'>Top Ten Tricks for Customizing SharePoint</title><content type='html'>&lt;p&gt;In the spirit of helping new SharePointers along (see &lt;a href="http://weblogs.asp.net/bsimser/archive/2005/12/14/433191.aspx"&gt;this post&lt;/a&gt; from Bil and &lt;a href="http://sharingpoint.blogspot.com/2005/12/does-sharepoint-play-well-with-others.html"&gt;this one&lt;/a&gt; from yours truly), here's a Top Ten list to start the New Year off on the right foot. For anyone about to dive into heavy SharePoint customization, this is a good list to keep handy (or to use for lining your cat's litter box, whichever you find more appropriate).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1. Simple HTML&lt;br /&gt;&lt;/strong&gt;Keep your HTML layout code as simple as possible. Use the minimum number of formatting elements (DIV&amp;rsquo;s, SPANs, Tables, etc.). SharePoint creates a tremendous amount of extraneous code at runtime; the less you add, the less chance for something unexpected to happen. Also, you&amp;rsquo;ll be cutting and pasting a LOT of code; fewer lines means fewer mistakes.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. User Controls &lt;br /&gt;&lt;/strong&gt;Reuse as much code as possible by placing repetitious elements into user controls. Rather than repeating the layout code that defines web part zones and code areas on page after page, place it in an ASCX file, register the file location at the top of the page, and reference it in the page body. This creates a template-like effect for site definition pages in which you only have to modify one file to have a global effect. An added benefit is that code which cannot be executed within presentation files can be executed within a user control.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3. Custom User Menus&lt;br /&gt;&lt;/strong&gt;SharePoint menus take up a great deal of valuable screen real estate. There&amp;rsquo;s nothing magical about the left-hand navigation area; extract the menu elements and place them into collapsing DIV&amp;rsquo;s or pop-outs. While they&amp;rsquo;ll never be perfect, a basic set of menu layouts can free up 125 &amp;ndash; 300 pixels of screen width. Place them in user controls to simplify maintenance.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. Nested Style Sheets&lt;br /&gt;&lt;/strong&gt;SharePoint style sheets are a confusing maze of endless CSS code. Nest common code elements in your custom style sheets just like you would with HTML; create parent styles, indent each child style, and keep everything together in logical groupings. Copy existing styles from OWS.CSS and SPS.CSS into your custom sheet to overwrite the defaults and maintain compatibility.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. Minimal Site Definitions&lt;br /&gt;&lt;/strong&gt;There are few occasions where more than one or two custom site definitions are necessary (in addition to the required SPS, SPSMSITE, SPSPERS, SPSSITES and STS, all of which can be replaced with a custom definition by modifying the WEBTEMP files). Each definition exponentially increases the amount of customization and future maintenance. Use the bare minimum number of definitions to meet the requirements.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6. Server Controls&lt;br /&gt;&lt;/strong&gt;Custom code elements that do not require user manipulation should be implemented as server controls instead of web parts. The layout is easier to design with fewer web part zones, the code is much more compact, and render times are much faster. Store them in the /Bin directory along with the user controls for layout.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7. Preserve Zone Names&lt;br /&gt;&lt;/strong&gt;Some functions, such as &amp;lsquo;Edit in DataSheet&amp;rsquo; require a specific zone to be present on the page. To avoid erratic behavior, preserve the default zone names whenever possible but change their location to meet your requirements. This also reduces the amount of edits to the various SCHEMA.XML files.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8. Comments Before Deletions&lt;br /&gt;&lt;/strong&gt;Before deleting existing code, comment it out and test it with your modifications. Once you have a working page, go back and delete the extraneous elements one by one. There are some pages that absolutely must have certain elements in place &amp;ndash; even if they&amp;rsquo;re hidden - or they won&amp;rsquo;t render properly. You&amp;rsquo;ll save yourself a great deal of frustration by working backwards through commented code than trying to add it back in later.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9. Assumption = Frustration&lt;br /&gt;&lt;/strong&gt;Never assume that the modifications you make in one definition will work in another. This is especially true of SPS and its deviations; the root portal definition is quite different from the subarea definitions. Diff the original files extensively before copying changes to a new definition. This rule applies in spades to administration pages, where there are multiple shared code structures and many one-off files.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10. Make CAML Your Friend&lt;br /&gt;&lt;/strong&gt;Much of what drives SharePoint lives in ONET.XML and SCHEMA.XML. The more extensive the modifications, the more you&amp;rsquo;ll need to work with these files. Learn the ins and outs of CAML and how to tweak it to meet your needs. Although at first intimidating, it&amp;rsquo;s nothing more than a structured XML superset. Begin by adding list definitions and move from there into creating custom lists and mastering views.&lt;/p&gt;&lt;p&gt;Happy SharePointing!!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113633210134959505?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113633210134959505/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113633210134959505' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113633210134959505'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113633210134959505'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2006/01/top-ten-tricks-for-customizing.html' title='Top Ten Tricks for Customizing SharePoint'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113597051858604274</id><published>2005-12-30T11:12:00.000-08:00</published><updated>2005-12-30T11:21:58.610-08:00</updated><title type='text'>SharePoint RPC Methods</title><content type='html'>I was browsing through &lt;a href="http://heathersolomon.com/blog/articles/148.aspx"&gt;Heather's list of SharePoint resources&lt;/a&gt; when I found &lt;a href="http://digitalmelon.com/posts/214.aspx"&gt;this link&lt;/a&gt; to an RPC method that I was unaware of.  That led to &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/spptsdk/html/SPPTWSSRPC_SV01072919.asp"&gt;this article&lt;/a&gt; that documents the various RPC methods and provides even more links to other information.&lt;br /&gt;&lt;br /&gt;If I'm not mistaken, isn't this just the sort of "associative trail" that &lt;a href="http://en.wikipedia.org/wiki/Vannevar_Bush"&gt;Vannevar Bush&lt;/a&gt; had in mind all along???&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113597051858604274?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113597051858604274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113597051858604274' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113597051858604274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113597051858604274'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/12/sharepoint-rpc-methods.html' title='SharePoint RPC Methods'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113589768337771891</id><published>2005-12-29T17:45:00.000-08:00</published><updated>2005-12-29T15:43:24.446-08:00</updated><title type='text'>Extreme SharePoint Design: Adding a Second 'Save and Close' Link to Surveys</title><content type='html'>Surveys are usually short and to the point but sometimes they can be quite long, especially if there a large number of multiple-choice questions. Users often complain about having to scroll back up to the top of the page to save their responses after filling out the form (this is true of any list, not just surveys). Adding a second 'Save and Close' link to the bottom of the page is an effective solution for improving usability.&lt;br /&gt;&lt;br /&gt;Like everything else in SharePoint, implementing this functionality is not quite as simple as it might first appear to be. First off, the pages that display the 'Save and Close' link, newform.aspx and editform.aspx, are just container pages for dynamically-rendered CAML (Collaborative Application Markup Language, that tangle of XML gobbledygook that makes SharePoint go). The real meat is in SCHEMA.XML under /Lists/Voting in the various site definitions (60/Template/1033/SPS and so on). This means that there is no direct HTML for you to edit; you have to modify the proper sections in the schema file.&lt;br /&gt;&lt;br /&gt;To begin with, locate the following line:&lt;br /&gt;&lt;br /&gt;&amp;lt;Form Type="EditForm" Url="EditForm.aspx" WebPartZoneID="Main"&amp;gt;&lt;br /&gt;&lt;br /&gt;This is the beginning of the definition section for the Edit Response form on EDITFORM.ASPX. There are four main sections which define the form display: &amp;lt;ListFormOpening&amp;gt;, &amp;lt;ListFormButtons&amp;gt;, &amp;lt;ListFormBody&amp;gt;, and &amp;lt;ListFormClosing&amp;gt;. The HTML for the toolbar that contains the 'Save and Close' link is found in the &amp;lt;ListFormButtons&amp;gt; section. If you haven't worked with CAML before this can be a bit intimidating. It helps to keep the following in mind:&lt;br /&gt;&lt;br /&gt;1. It's just XML. Fancy XML, yes, but still XML. All the same rules apply. What's different is the terminology and a whole slew of new tags.&lt;br /&gt;&lt;br /&gt;2. All presentation code is encapsulated in &amp;lt;HTML&amp;gt;&amp;lt;/HTML&amp;gt; tags, and the code itself is encoded within &amp;lt;![CDATA[ blocks. Once the proper tag elements are in place, it's regular old HTML in between.&lt;br /&gt;&lt;br /&gt;The first code you will see following the section open tag for &amp;lt;ListFormButtons&amp;gt; is an If...Then expression that checks to see if content approvals are enabled. The &amp;lt;Switch&amp;gt; tag is much the same as an "If" in VB, C# or JavaScript; the &amp;lt;Expr&amp;gt; tag (for 'Expression') is the actual expression and the &amp;lt;Case&amp;gt; tag is the comparison value. The &amp;lt;Default&amp;gt; tag then contains the "Else" value. So, another way of writing this:&lt;br /&gt;&lt;br /&gt;&amp;lt;Switch&amp;gt;&lt;br /&gt;&amp;lt;Expr&amp;gt;&amp;lt;ListProperty Select="ModeratedList"/&amp;gt;&amp;lt;/Expr&amp;gt;&lt;br /&gt;&amp;lt;Case Value="0"/&amp;gt;&lt;br /&gt;&amp;lt;Default&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;lt;p&amp;gt;Hellow World!&amp;lt;/p&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;/Default&amp;gt;&lt;br /&gt;&amp;lt;/Switch&amp;gt;&lt;br /&gt;&lt;br /&gt;Would be this:&lt;br /&gt;&lt;br /&gt;function CompareValue()&lt;br /&gt;{&lt;br /&gt;if ModeratedList.Value = 0&lt;br /&gt;{&lt;br /&gt;return;&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;document.write("&amp;lt;p&amp;gt;Hellow World!&amp;lt;/p&amp;gt;");&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;For this example, we'll leave the expression in place but take out the messages pertaining to content approvals; since the button at the top of the page will already contain this information, we don't need to repeat it. Removing the redundant code is easy - just strip out everything between the HTML tags so the resulting code looks like the following:&lt;br /&gt;&lt;br /&gt;&amp;lt;Switch&amp;gt;&lt;br /&gt;&amp;lt;Expr&amp;gt;&amp;lt;ListProperty Select="ModeratedList"/&amp;gt;&amp;lt;/Expr&amp;gt;&lt;br /&gt;&amp;lt;Case Value="0"/&amp;gt;&lt;br /&gt;&amp;lt;Default&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;/Default&amp;gt;&lt;br /&gt;&amp;lt;/Switch&amp;gt;&lt;br /&gt;&lt;br /&gt;NOTE: Generally, it is a good idea to leave as much of the original code in place as possible. For one thing, you don't know what other elements on the page might be affected (such as nested TD's or DIV's) as it is nearly impossible to read the HTML structure within CAML; for another, a control on the page might rely upon the element to work properly. In this case, the table is stand-alone and there are no ID or NAME tags for a control to reference so the HTML code is obviously discrete and can safely be removed.&lt;br /&gt;&lt;br /&gt;Next, we'll copy the toolbar code and append it to the end of the &amp;lt;ListFormBody&amp;gt; section. Cut and paste the following block of code just before the closing &amp;lt;/ListFormBody&amp;gt; tag:&lt;br /&gt;&lt;br /&gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ &amp;lt;TABLE class="ms-toolbar" style="margin-left: 3px;" cellpadding=2 cellspacing=0 border=0&amp;gt; &amp;lt;TR&amp;gt; &amp;lt;TD class="ms-toolbar"&amp;gt; &amp;lt;table cellpadding=1 cellspacing=0 border=0&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td class="ms-toolbar" nowrap&amp;gt; &amp;lt;a tabindex=2 ID=diidIOSaveItem class="ms-toolbar" title=]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;"Save"&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ ACCESSKEY=S href="javascript:SubmitForm()" target="_self"&amp;gt; &amp;lt;img src="/_layouts/images/saveitem.gif" ID="tbbuttonstart1" alt=]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;"Save"&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ border=0 width=16 height=16&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td nowrap&amp;gt; &amp;lt;a tabindex=2 ID=diidIOSaveItem class="ms-toolbar" ACCESSKEY=S href="javascript:SubmitForm()" target="_self"&amp;gt; &amp;lt;LocID ID="L_EditFormSave"&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;HTML&amp;gt;Save and Close&amp;lt;/HTML&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;lt;/LocID&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/TD&amp;gt; &amp;lt;TD class=ms-separator&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;TD class="ms-toolbar"&amp;gt; &amp;lt;table cellpadding=1 cellspacing=0 border=0&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td class="ms-toolbar" nowrap&amp;gt; &amp;lt;a tabindex=2 ID=diidIODeleteItem class="ms-toolbar" title=]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;"Delete"&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ ACCESSKEY=X href="javascript:DeleteItem()" target="_self"&amp;gt; &amp;lt;img src="/_layouts/images/delitem.gif" ID="tbbuttonstart1" alt=]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;"Delete"&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ border=0 width=16 height=16&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td nowrap&amp;gt; &amp;lt;a tabindex=2 ID=diidIODeleteItem class="ms-toolbar" ACCESSKEY=X href="javascript:DeleteItem()" target="_self"&amp;gt; &amp;lt;LocID ID="L_EditFormDelete"&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;Delete Item&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;lt;/LocID&amp;gt;&amp;lt;/a&amp;gt; &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/TD&amp;gt; &amp;lt;TD class=ms-separator&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;TD class="ms-toolbar"&amp;gt;&amp;lt;table cellpadding=1 cellspacing=0 border=0&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td colspan=2 nowrap&amp;gt;&amp;lt;a tabindex="2" class="ms-toolbar" ACCESSKEY=G ID=diidIOGoBack href="]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;ListProperty Select='DefaultViewUrl'/&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[" ONCLICK="javascript:GoBack(']]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;ScriptQuote NotAddingQuote="TRUE"&amp;gt;&amp;lt;ListProperty Select="DefaultViewUrl"/&amp;gt;&amp;lt;/ScriptQuote&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[');return false;" target="_self"&amp;gt;&amp;lt;LocID ID="L_EditFormGoBack"&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;Go Back to Survey&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;lt;/LocID&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;td width=100%&amp;gt;&amp;lt;img src="/_layouts/images/blank.gif" alt=""&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/TR&amp;gt; &amp;lt;/TABLE&amp;gt; &amp;lt;table width=100% border=0 cellpadding=0 cellspacing=2&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td colspan=5 height=3&amp;gt;&amp;lt;img border=0 width=1 height=3 src="/_layouts/images/blank.gif" alt=""&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;&amp;lt;font size=1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/font&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;&lt;br /&gt;Now we need to reformat the toolbar code to get rid of the 'Go back to the survey' link and shorten the length to the size of a normal button. Here is the altered CAML (you might want to cut and paste each block into an editor, restore the formatting and diff the files to see the changes):&lt;br /&gt;&lt;br /&gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ &amp;lt;table width="100%" cellpadding="0" cellspacing="0" border="0"&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td width="100%" height="20"&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;TABLE class="ms-toolbar" style="margin-left: 3px;" cellpadding=2 cellspacing=0 border=0 width="115"&amp;gt; &amp;lt;TR&amp;gt; &amp;lt;TD class="ms-toolbar"&amp;gt; &amp;lt;table cellpadding=1 cellspacing=0 border=0&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td class="ms-toolbar" nowrap&amp;gt; &amp;lt;a tabindex=2 ID=diidIOSaveItem class="ms-toolbar" title=]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;"Save"&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ ACCESSKEY=S href="javascript:SubmitForm()" target="_self"&amp;gt; &amp;lt;img src="/_layouts/images/saveitem.gif" ID="tbbuttonstart1" alt=]]&amp;gt;&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;"Save"&amp;lt;/HTML&amp;gt;&amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ border=0 width=16 height=16&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;td nowrap&amp;gt; &amp;lt;a tabindex=2 ID=diidIOSaveItem class="ms-toolbar" ACCESSKEY=S href="javascript:SubmitForm()" target="_self"&amp;gt; &amp;lt;LocID ID="L_EditFormSave"&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;HTML&amp;gt;Save and Close&amp;lt;/HTML&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;lt;/LocID&amp;gt; &amp;lt;/a&amp;gt; &amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt; &amp;lt;/TD&amp;gt; &amp;lt;/TABLE&amp;gt; &amp;lt;table width=100% border=0 cellpadding=0 cellspacing=2&amp;gt; &amp;lt;tr&amp;gt; &amp;lt;td colspan=5 height=3&amp;gt;&amp;lt;img border=0 width=1 height=3 src="/_layouts/images/blank.gif" alt=""&amp;gt;&amp;lt;/td&amp;gt; &amp;lt;/tr&amp;gt; &amp;lt;/table&amp;gt;&amp;lt;font size=1&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/font&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;&lt;br /&gt;In essence, all we've done is shorten the original toolbar, removed the separator and second link, and added a second table that acts as a spacer (a DIV or clear gif would work just as well). Once finished with EditForm.aspx move on to NewForm.aspx and repeat the process (don't just cut and paste the modified code from EditForm - the two files work a bit differently).&lt;br /&gt;&lt;br /&gt;After modifying these two sections, save the file and copy it to the site definition directory on your front-end web server(s). Remember, when altering any of the XML files, you must perform an IISRESET on each FE to see the changes. After resetting, view any survey to see the results. You should have a survey form that looks similar to the following:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.theegroup.net/Image%20Library/surveyform.GIF" /&gt;&lt;br /&gt;&lt;br /&gt;This same technique can be used for any list with forms that extend beyond the fold and you can always modify the HTML code apply a different style to the toolbar (like, for example, the wizard buttons in SharePoint) or add javascript drop-downs, mouseovers, etc.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113589768337771891?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113589768337771891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113589768337771891' title='24 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113589768337771891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113589768337771891'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/12/extreme-sharepoint-design-adding.html' title='Extreme SharePoint Design: Adding a Second &apos;Save and Close&apos; Link to Surveys'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>24</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113519743927496626</id><published>2005-12-21T12:20:00.000-08:00</published><updated>2005-12-21T12:37:19.290-08:00</updated><title type='text'>How To or What For?</title><content type='html'>&lt;a href="http://www.graphicalwonder.com/"&gt;Shane&lt;/a&gt; believes we need more &lt;a href="http://www.graphicalwonder.com/2005/12/sharepoint_who_will_teach_the.html"&gt;end-user material on the web&lt;/a&gt;.  &lt;a href="http://www.heathersolomon.com/blog/"&gt;Heather&lt;/a&gt; thinks thats all fine and well but &lt;a href="http://heathersolomon.com/blog/archive/2005/12/20/3229.aspx"&gt;nobody would use it&lt;/a&gt;.  Who's right?&lt;br /&gt;&lt;br /&gt;For once, I agree with them both (see, I can be agreeable from time to time.  It is Christmas after all).  One of the most frustrating aspects of new portal deployments is end-user training; there's so much to teach in so little time.  Users only retain a fraction of what I show them and, if they don't go use it right away, forget the little that they did learn.  I've wanted to put together a bunch of short tutorials for well over a year on SharePoint basics but just can't seem to find the time.&lt;br /&gt;&lt;br /&gt;On the other hand, I've also had Heather's experience; what I have created is rarely used by anyone.  Users ask for guidance but what most of them really want is for you do it for them.  Let's face it; the average job description doesn't include "wrestling with SharePoint" in the 'Duties and Responsibilities' section. &lt;br /&gt;&lt;br /&gt;So what to do?  Perhaps the best solution is to publish what we've got, expose it to the users, and if they learn from it, fine; if they don't, hey, we tried.  If we all contributed a bit here and there to some central blog somewhere we could probably cobble together a good resource in a jiffy.  Nobody would have to take on the whole responsibility and we could all syndicate the content via XML to our individual portals (like an FAQ, of sorts, but shared by everyone).  Set some categories, let all the SharePointers post to it, and see how it flies.  Track it via Google Analytics and see if anyone is using it.&lt;br /&gt;&lt;br /&gt;I'm game.  I'll even go first with a few short step-by-step tutorials.  I can't manage the blog though - too much on my plate right now.  Anybody else want to chip in???&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113519743927496626?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113519743927496626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113519743927496626' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113519743927496626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113519743927496626'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/12/how-to-or-what-for.html' title='How To or What For?'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-113510035907542433</id><published>2005-12-20T11:45:00.000-08:00</published><updated>2005-12-20T09:39:19.100-08:00</updated><title type='text'>Enabling the 'Modify Item-Level Security' Link for Document Libraries</title><content type='html'>A common method for handling list item access in public lists is to restrict users to viewing/editing only those items they have created.  Each SharePoint list, with the exception of document and picture libraries, has a 'Modify item-level security' link on the left of the page, accessible from the 'Change permissions for this list' link in the 'Modify Settings and Columns' options.  This handy feature prevents users from changing or viewing what other users have posted but allows them to freely edit their own items.&lt;br /&gt;&lt;br /&gt;To enable this functionality for document/picture/forms libraries, you must edit the administration pages that control the display of list options.  The first page, SHROPT.ASPX, is responsible for showing user permissions and the Actions menu for anonymous access, access requests, and item-level security.  When this page is called from a document or picture library, the item-level security link is hidden.  To display it, remove the lines 333 and 354:&lt;br /&gt;&lt;br /&gt;Line 333   &amp;lt;% if ((m_auim == AclUIMode.LIST)&amp;&amp;amp;(m_list.BaseType != SPBaseType.Issue)) { %&amp;gt;&lt;br /&gt;&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Line 354   &amp;lt;% } %&amp;gt;&lt;br /&gt;&lt;br /&gt;Leave the HTML code between the opening and closing curly braces intact.  The item-level security link will now be displayed on SHROPT.ASPX for all document and picture libraries.&lt;br /&gt;&lt;br /&gt;Next, you will need to remove several references to the document library type from LSTSETNG.ASPX.  This file contains groups of menu items that are used for all types of lists; if...then blocks in the code control which options are shown for each list type.  For example, the following block controls the display of the Document Version options for document libraries:&lt;br /&gt;&lt;br /&gt;&amp;lt;%if ( iBaseType == SPBaseType.DocumentLibrary &amp;&amp;amp; !bIsCustomTemplate){%&amp;gt;&amp;lt;!-- Versioning Settings--&amp;gt;&lt;br /&gt;[HTML Code Removed to Conserve Space]&lt;br /&gt;&amp;lt;%}%&amp;gt;&lt;br /&gt;&lt;br /&gt;The function works by checking the base type of the current list against the list of base types in the object model; in this case, it checks to see if the current list type (iBaseType) is a document library (SPBaseType.DocumentLibrary).  By removing references to SPBaseType.DocumentLibrary in key sections of the file, those elements will then be displayed on the page.&lt;br /&gt;&lt;br /&gt;Begin by modifying line 630, changing it from this:&lt;br /&gt;&lt;br /&gt;&amp;lt;% if ((iBaseType != SPBaseType.DocumentLibrary) &amp;&amp;amp; (iBaseType != SPBaseType.Issue))&lt;br /&gt;&lt;br /&gt;To this:&lt;br /&gt;&lt;br /&gt;&amp;lt;% if (iBaseType != SPBaseType.Issue)&lt;br /&gt;&lt;br /&gt;Next, re-enable the hidden table row on line 646, going from this:&lt;br /&gt;&lt;br /&gt;&amp;lt;% switch ( iBaseType ) { case SPBaseType.DocumentLibrary:%&amp;gt; &amp;lt;tr style="display:none;"&amp;gt;&amp;lt;%break;default:%&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;%break;}%&amp;gt; &lt;br /&gt;&lt;br /&gt;To this:&lt;br /&gt;&lt;br /&gt;&amp;lt;% switch ( iBaseType ) { case SPBaseType.DocumentLibrary:%&amp;gt; &amp;lt;tr&amp;gt;&amp;lt;%break;default:%&amp;gt;&amp;lt;TR&amp;gt;&amp;lt;%break;}%&amp;gt;&lt;br /&gt;&lt;br /&gt;Note: If you prefer, you can set the table row display to 'inline' instead of removing the style tag altogether.&lt;br /&gt;&lt;br /&gt;Now do the same on line 654, changing it from:&lt;br /&gt;&lt;br /&gt;&amp;lt;% if ((iBaseType != SPBaseType.DocumentLibrary) &amp;&amp;amp; (iBaseType != SPBaseType.Issue))&lt;br /&gt;&lt;br /&gt;To:&lt;br /&gt;&lt;br /&gt;&amp;lt;% if (iBaseType != SPBaseType.Issue)&lt;br /&gt;&lt;br /&gt;That's it.  You can now set item-level permissions for document, picture and form libraries.  Test it by uploading a few items, changing the permissions, then logging in as a different (non-admin) user; if you set the view option to 'Only their own', the new user won't be able to see your documents.  If you set the Edit option to 'Only their own', all users can see your items but when they try to save any edits they will be prompted for a login and thus prevented from making any changes.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113510035907542433?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113510035907542433/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113510035907542433' title='30 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113510035907542433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113510035907542433'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/12/enabling-modify-item-level-security.html' title='Enabling the &apos;Modify Item-Level Security&apos; Link for Document Libraries'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>30</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113468851219539948</id><published>2005-12-19T15:27:00.000-08:00</published><updated>2005-12-19T13:30:05.893-08:00</updated><title type='text'>Does SharePoint Play Well With Others?</title><content type='html'>In the spirit of Bil Simser's &lt;a href="http://weblogs.asp.net/bsimser/archive/2005/12/14/433191.aspx"&gt;advice for SharePoint newbies&lt;/a&gt;, here's my half-cent's worth of contributions for those just starting down our treacherous path:&lt;br /&gt;&lt;br /&gt;A common mistake that I see organizations make with large portal implementations is succumbing to the mysteriously irresistible urge to add all sorts of custom, third-party and external applications to their SharePoint server farm. Perhaps because they have invested heavily in the hardware to scale their portal and want to wring every last drop of processing power from the cluster, or they have a desire to maintain some sort of URL continuity (like decreeing that all applications from this point forward will start with &lt;a href="http://somecompanyportal/"&gt;&lt;span id="highlight_tag" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-: color:yellow;" &gt;&lt;span id="highlight_tag" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: "&gt;http&lt;/span&gt;&lt;/span&gt;://somecompanyportal/&lt;/a&gt; whether they need to or not), or maybe because SharePoint exerts some sort of Bermuda Triangle effect on administrators, attracting web applications like giant moths to the flame, within a month of a new installation I invariably discover all sorts of strange things going bump in the front-end web servers.&lt;br /&gt;&lt;br /&gt;While there is no set rule on what should and should not be added to a SharePoint server - and SharePoint certainly has the ability to live side-by-side with all other types of creatures - common sense should dictate that just because you can heap on every web app the company has ever developed into a tangled maze of unmanaged paths, that doesn't mean you should. There are a few important things to consider before you go installing that nifty new copy of Crystal Reports Server on your FE's:&lt;br /&gt;&lt;br /&gt;1. ISAPI Filters&lt;br /&gt;&lt;br /&gt;SharePoint works a lot of it's magic through a custom ISAPI filter called STSFLTR. This filter handles all incoming and outgoing traffic through IIS, passing requests to the proper DLL's and sending back customized responses (like alternate URL's). In order to redirect traffic around STSFLTR you have to create an unmanaged path; that is, a virtual directory that is not part of SharePoint. When STSFLT intercepts traffic to/from any virtual directory, it first checks to see if that path has been marked as excluded. If so, it stops processing and hands the traffic off; if not, it handles all traffic for that path. As you can imagine, the more unmanaged paths, the harder STSFLTR has to work. Since it already does a tremendous amount of heavy lifting, the more overhead you add vis-a-vis managed paths the greater the impact on performance.&lt;br /&gt;&lt;br /&gt;As if unmanaged paths aren't bad enough, many applications install their own ISAPI filters. Depending upon what order these filters are in on any given virtual server, you may experience anything from the odd quirky page to complete portal failure. ISAPI filters exist for the very purpose of managing traffic before it gets to the web application; the more hurdles your traffic has to clear before getting to its destination, the greater the odds that something will get fall down along the way. While third-party ISAPI filters may or may not be a supported configuration, I can assure you that it is not a recommended configuration. I have yet to meet an ISAPI filter that has not wreaked havoc upon the portal at some point or another.&lt;br /&gt;&lt;br /&gt;Bottom line - avoid adding any ISAPI filters to a virtual server running SPS or WSS. Capice?&lt;br /&gt;&lt;br /&gt;2. Hardware Resources&lt;br /&gt;&lt;br /&gt;Ever watched the performance counters on a medium server farm with 3000 users? All those people uploading files, making web-part connections, polling the virtual servers for web part galleries, querying web services for data view web parts, and the umpteen gazillion database calls make the trace grid look like a politician's polygraph in the last week of an election. Now image what might happen when you bolt on that payroll app that uses an ODBC client to suck every last byte out of the Peoplesoft Oracle database. It ain't pretty when all that CPU crunching brings the virtual server to its knees. About the time it starts taking users 20 minutes to add a content editor web part to their personal site is when your Blackberry starts smoking like a Rastafarian bus driver.&lt;br /&gt;&lt;br /&gt;Network traffic is another hidden minefield for any portal administrator. Chatty programs are the death of web applications; all those bits running amok makes it hard for the good stuff to get through. Remember that pre-SP2 most SharePoint implementations used host headers, adding overhead to every web request handled by the FE's. Be wary of any applications which make too many TCP-based database calls or custom ports, which are often a good sign that a lot of yapping is about to occur. &lt;span id="highlight_tag" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-: color:yellow;" &gt;&lt;span id="highlight_tag" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: "&gt;Http&lt;/span&gt;&lt;/span&gt; traffic is &lt;span id="highlight_tag" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-: color:yellow;" &gt;&lt;span id="highlight_tag" style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; PADDING-BOTTOM: 0px; COLOR: #ee6600; PADDING-TOP: 0px; BACKGROUND-COLOR: yellow; EE6600: "&gt;http&lt;/span&gt;&lt;/span&gt; traffic, and the more of it the NIC has to handle the less bandwidth available for those big portal pages (have you ever looked at the total size of a standard web part page when all the linked content has been rendered? Here's a hint - OWS.JS alone is nearly 400k. You do the math). Sure, you can put in gig switches and prioritize traffic and add NICs and so on but I've got a better idea: how about you just put that stuff on a different server and save yourself the headaches?&lt;br /&gt;&lt;br /&gt;3. Service Levels&lt;br /&gt;&lt;br /&gt;It never fails - users start screaming that the portal is down and everyone points their finger at the SharePoint admins. Like that data view web part you just added really caused all the WSS sites to implode like the outer wall during the battle of Helm's Deep. Please. While we may shoot ourselves in the foot from time to time as we try to figure out how to do something simple in the ever-so-elegantly-designed SPS admin pages (That's sarcasm, in case you missed it. Hello, Redmond, are you listening?), eight times out of ten some rinky-dink app has caused the worker processes to lock up and slammed the door on our highly-scalable, disaster-resistant, backed-up and failed-over portal cluster.&lt;br /&gt;&lt;br /&gt;Is it really a good idea to jeopardize your hard-earned five nines with that ever-so-important holiday party RSVP app? If you absolutely have to know if Suzy Smartypants is bringing her husband and thirteen children to the summer picnic, is it too much to ask for the developers to write a web part instead of redirecting to a clunky ASP page? Last time I checked, Web Part Library is on the same page as ASP.NET Application under New Project in Visual Studio. Newsflash: SharePoint is an enabling platform; that means you can use it to D-E-V-E-L-O-P W-E-B A-P-P-S. Now quit asking us to add another virtual directory for your latest project "just this once" and learn what Protected Override Void RenderWebPart(HtmlTextWriter output) does. Got it?&lt;br /&gt;&lt;br /&gt;Now, go forth and erect thy fortresses of SharePoint, letting no man (or wayward application) penetrate thy defenses...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt; After reading this post, a colleague pointed out that in some cases the business justification for a high-performance cluster includes the value of running other applications alongside SharePoint (as in "We need this hardware but we can't get it without giving some CPU cycles to the Finance app:). Okay, that's a fair rebuttal - it's harder than ever to get management to sign off on big capital expenditures so you do what you have to do to get what you need.&lt;br /&gt;&lt;br /&gt;In such cases the argument shifts from how the SharePoint environment SHOULD be constructed to how much RISK you are willing to assume based on business needs. I don't have any solid metrics to apply here, but it should be fairly easy to come up with a quick value matrix that weights such factors as performance degradation, anticipated downtime, CPU cycles, disk cost, etc. and score each projected application using these factors. This would provide you with a rough idea of the impact each addition would have on your SharePoint environment. You can then respond to other stakeholders with that information and, depending upon the relative importance of each application, let the powers that be determine what level of risk they are willing to assume.&lt;br /&gt;&lt;br /&gt;If you follow the guidelines mentioned here when designing your matrix and ensure that new applications do not violate any of these key factors (forcing all other apps to use their own virtual servers and application pools, for example, or adding bandwidth for chatty programs such as web services) you can at least minimize the impact of living with troublesome neighbors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113468851219539948?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113468851219539948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113468851219539948' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113468851219539948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113468851219539948'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/12/does-sharepoint-play-well-with-others.html' title='Does SharePoint Play Well With Others?'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113329711715146462</id><published>2005-11-29T12:35:00.000-08:00</published><updated>2005-11-29T12:57:49.633-08:00</updated><title type='text'>To Brand or Not to Brand...What Was the Question?</title><content type='html'>While I was &lt;a href="http://sharingpoint.blogspot.com/2005/11/sharepoint-vnext-upgrade-issues.html"&gt;pontificating&lt;/a&gt; on the need for improved customization in SharePoint v.Next, &lt;a href="http://sharepointblogs.com/andymay/archive/2005/11/23/4262.aspx"&gt;Andy May suggests&lt;/a&gt; that it might be a good idea to find out if your client really wants to tackle the task of branding their portal. A fair question, and one that my clients have answered in multiple ways, from nothing more than an altered site logo to full, file-by-file customization of definitions and templates. As &lt;a href="http://heathersolomon.com/blog/archive/2005/11/29/3126.aspx"&gt;Heather points out&lt;/a&gt;, it's not that difficult to brand a portal implementation if you leave the underlying architecture definitions alone.&lt;br /&gt;&lt;br /&gt;In my mind, there are three distinct types of scenarios:&lt;br /&gt;&lt;br /&gt;1) Stock Portal - No branding or customization required. If you have limited resources or need to focus your resources elsewhere, such as application development or training, this might be the best option. This scenario is often chosen by those with little exposure to Intranet/Portal applications who just need a quick and affordable solution.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.theegroup.net/Image%20Library/sps_crosstex.jpg" /&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2) Branding - Applying a custom logo, colors, backgrounds, borders, fonts, buttons and other visual elements can be done in a few days from scratch or a few hours if you have a CSS template to work from. Assuming that time and resources are available, branding is an effective way to reinforce a corporate identity and create continuity with other line-of-business applications. Organizations with existing Intranets or portal-like applications often choose this route as it is both affordable and relatively painless. It is also a very good way to learn more about how SharePoint works behind the scenes.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.theegroup.net/Image%20Library/sps_egroup.jpg" /&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3) Customization - Let there be no doubt: full portal customization is difficult, time consuming, expensive, and requires a high degree of skill and patience. Only clients who have deployed extensive portal solutions in the past request this level of modification, and rightly so; they have a solid understanding of the cost and risks involved. At best, a complete portal customization can be done in 30 days (I've done it and it was no picnic, believe me); at worst, it could take several months. And that's assuming that you're well-versed in all the mysteries of SharePoint; a neophyte who has to learn on-the-fly may never make it out of SharePoint Customization Hell alive (figuratively speaking, of course, and thanks to Heather for the &lt;a href="http://heathersolomon.com/blog/archive/2005/11/28/3124.aspx"&gt;highly appropriate terminology&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;&lt;img src="http://www.theegroup.net/Image%20Library/sps_cbconnect.jpg" /&gt;&lt;/img&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In the final analysis, it is up to you as the consultant or subject matter expert to explain these options to your client (or decision makers if you are part of the organization), make sure they understand the risk/reward ratio, and provide a realistic estimate of time and cost. One of the most common mistakes I see when consulting with clients regarding customization is the perception that SharePoint is limited in what you can do with the user interface. True, there are certain parameters which influence what the final outcome will be, but the truth is that there are very few things you can do with any web application that you cannot do with SharePoint.&lt;br /&gt;&lt;br /&gt;I've discovered that even those who have worked with SharePoint for a good while are unaware of how extensively the product can be customized; not surprising, considering that most people probably give up after fighting with multiple site definitions, scads of similar-but-slightly-different list pages, CAML, never-ending XML files and a confusing maze of CSS. I don't blame 'em - it's enough to give anyone a headache (I keep an emergency supply of Advil on hand at all times).&lt;br /&gt;&lt;br /&gt;Personally, I prefer a branded or fully-customized implementation over the stock look-and-feel simply from a business perspective. You wouldn't create an application or web site for a client without taking their corporate identity into consideration; the same applies to a portal implementation - you shouldn't avoid it just because SharePoint makes it more difficult than it really ought to be.&lt;br /&gt;&lt;br /&gt;Here are a few tips to ease the pain:&lt;br /&gt;&lt;br /&gt;1. Lean which CSS classes need to be modified to achieve your branding objectives and place them into a separate file, then use the custom CSS setting in portal admin to implement your alternate style sheets.&lt;br /&gt;&lt;br /&gt;2. When overriding the default CSS classes, create a consistent structure that makes it easier to customize the files in the future (I like to nest related classes and define common elements, such as default fonts and colors, at the top of the file).&lt;br /&gt;&lt;br /&gt;3. Once you've established the bare minimum required for branding a portal, use that CSS file as a template so you can apply it to subsequent implementations.&lt;br /&gt;&lt;br /&gt;4. Study the Site Definition structures for patterns. Many of the files have similar code elements but for a few variances; learn what they are and where they occur. Once you have created a working definition, copying the files to new defs is mostly search-and-replace (your life will be much simpler with good diff and HTML search/replace tools; I suggest &lt;a href="http://www.scootersoftware.com"&gt;Beyond Compare&lt;/a&gt; and &lt;a href="http://www.htmlworkshop.com"&gt;Search &amp; Replace 98&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;5. Do the same for admin pages in the /layouts/1033 directory. Take note of what works where (some pages are WSS only; others SPS; many are both). Learn which pages alternateheader.aspx works on and what it's limitations are.&lt;br /&gt;&lt;br /&gt;6. Make extensive use of user controls (ascx pages). Like the include files of old, user controls give you the capability to modularize your definitions, sharing common code structures throughout the portal. All they require is a simple code registration in the header to tell the page where to find the file and what it's called. This can save you an immense amount of time and frustration. And, best of all, user controls allow you to execute code that may be blocked within certain files (did I mention alternateheader.aspx yet?).&lt;br /&gt;&lt;br /&gt;7. Learn which web controls (&amp;lt;SPSWC:&amp;gt;&lt;spswc:&gt; elements) pages require and which can be deleted. Most pages can simply be wiped out and replaced with your own code but some, like txtlstvw.aspx, require fixed page elements in order to render properly (here's a hint: just comment them out, change the ID values, then substitute your own custom elements with the original ID's). Many Admin pages require the PortalHeader element but that doesn't mean you have to display it - just hide that pesky critter and go on about your business.&lt;br /&gt;&lt;br /&gt;8. Watch those registrations! Some pages that look the same on the surface use different components to achieve similar results. Check the registrations at the top of the page to make sure that you have the right elements on the page. If you make extensive use of inline code blocks in user controls or admin pages be sure to include Microsoft.SharePoint.WebControls or the code will fail.&lt;br /&gt;&lt;br /&gt;9. Look closely at the XML configuration pages. CAML is nothing more than a fancy superset of XML; anyone with a little bit of coding background can quickly determine what the programmer was trying to achieve and duplicate/alter it accordingly.&lt;br /&gt;&lt;br /&gt;10. Get the &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyID=aa3e7fe5-daee-4d10-980f-789b827967b0&amp;displaylang=en"&gt;SPS SDK&lt;/a&gt; and use it. It doesn't cover everything but there's a lot of good information in there that will help you out when you get into a bind.&lt;br /&gt;&lt;br /&gt;11. Don't be afraid to break something! Test your changes extensively in an isolated sandbox that you can wipe out if things to awry. Keep a full copy of the original 60 hive handy to replace any modifications that don't work. Modify in small increments and test after each change, then proceed to more full-scale alterations.&lt;br /&gt;&lt;br /&gt;12. Ask for help. There's no better resource at your fingertips than the SharePoint community. Yes, we all have day jobs, but we're happy to lend a hand if you need us. It takes time to maintain a blog or answer newsgroup postings; if we didn't care, we wouldn't do it. If we don't know the answer we can probably point you in the right direction.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Good luck!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113329711715146462?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113329711715146462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113329711715146462' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113329711715146462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113329711715146462'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/to-brand-or-not-to-brandwhat-was.html' title='To Brand or Not to Brand...What Was the Question?'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-113320382439440831</id><published>2005-11-28T10:46:00.000-08:00</published><updated>2005-11-28T10:52:00.286-08:00</updated><title type='text'>List-Level Permissions in SharePoint Portal Server</title><content type='html'>WARNING! WARNING! WARNING!&lt;br /&gt;&lt;br /&gt;This may just be the most unsupported tip I have ever posted, and for someone who is known for finding creative ways to enable or implement features that often fall into the 'unsupported' category, that's saying quite a bit. I struggled with whether or not to post this for a few days but in the end I decided that the value outweighs the cost. You're all big boys and girls so you can make your own decisions on whether or not to implement this solution. If you do, you are completely on your own - although I've tested it in at least three scenarios without incident, that is no guarantee that it won't completely crash your portal implementation. So...&lt;br /&gt;&lt;br /&gt;READ ON AT YOUR OWN RISK!!!&lt;br /&gt;&lt;br /&gt;Now that the disclaimers are out of the way (this is serious - don't do this if you're uncertain of how it will effect your portal), let's get down to business. One of the most frustrating restrictions in SPS is the inability to assign list-level permissions to individual lists. Unlike WSS, SPS lists inherit permissions from the portal area they live in. This means that you must create a new subarea in order to implement individual list ACL's.&lt;br /&gt;&lt;br /&gt;This limitation is enforced by the ExternalSecurityProvider value specified in the ONET.XML file for each site definition. According to the SDK, this COM GUID, which is static for all SPS implementations, defines the security context for the search crawler. Strangely enough, it is also referenced on line 522 of the listedit.aspx file, which obviously has nothing to do with search and indexing. When present, the 'Change Permissions for this List' link is hidden; when removed, it is displayed. By commenting out the associated 'if' statement (lines 522 through 537), the 'Change permissions...' link becomes active for all lists; clicking on it takes the user to the Change Permissions page (shropt.aspx).&lt;br /&gt;&lt;br /&gt;Unfortunately, disabling the SecurityProvider check is not enough to enable list-level permissions. As one will quickly discover, clicking on the 'Add Users' button on any subarea (but not the root SPS area) will lead to an endless authentication loop. This confounded me as it seemed to work fine in the SPS definition but nowhere else. When the same issue came up with Jan Tielens' UserAlerts web part and some custom web parts a colleague was developing, I realized they were all related.&lt;br /&gt;&lt;br /&gt;The difference is due to a small change to the ExternalSecurityProvider GUID in the ONET.XML file of the SPS site definition and all other definitions (STS, you will note, does not have such a setting). At the bottom of SPS ONET.XML file you will find the following entry:&lt;br /&gt;&lt;br /&gt;&amp;lt;Components&amp;gt; &amp;lt;FileDialogPostProcessor ID="C6659361-1625-4746-931C-36014B146679" /&amp;gt; &amp;lt;ExternalSecurityProvider ID="A373E6A7-7A87-11D3-B1C1-00C04F68155C" Type="Microsoft.SharePoint.Portal;Microsoft.SharePoint.Portal.SiteData.&lt;br /&gt;CategoryWebSecurityProvider" /&amp;gt;&amp;lt;/Components&amp;gt;&lt;br /&gt;&lt;br /&gt;Look closely at the ExternalSecurityProvider ID value. For most of the other Site Definitions the first octet ends in an '8' instead of '7' (i.e. A373E6A8 instead of A373E6A7). Looking into the WEBS table of the _SITE database, I discovered that this GUID is stored in the SecurityProvider column for each area (interestingly, bucket areas have a '9' at the end of the first octect instead of a '7' or an '8'). Apparently, whenever the DLL retrieves this value from the DB, if it does not match a certain value range, access to the function being called is not allowed, which results in the authentication loop. At first, I assumed that this only applied to list permissions as listedit.aspx is the only file in which the ExternalSecurityProvider setting is referenced; however, I discovered that several object-model queries (user.alerts and user.roles) also share the same restrictions. Any code that accesses these methods from a portal subarea will fail.&lt;br /&gt;&lt;br /&gt;The solution to these problems is simple yet potentially dangerous (if you are still reading now would be a good time to bail out). It involves modifying the listedit.aspx page (not supported), changing the GUID value in the ONET.XML file for your custom site definition (OK as far as I can tell - it's your definition, after all), and, if any areas have already been created, updating the WEBS table with the new GUID value (definitely not supported).&lt;br /&gt;For the bold and brave, here's the procedure:&lt;br /&gt;&lt;br /&gt;1. Modify the 'listedit.aspx' file by commenting out (//) lines 522 - 537, as follows:&lt;br /&gt;&lt;br /&gt;// if (!spWeb.HasExternalSecurityProvider)// {%&amp;gt; &amp;lt;TR&amp;gt; &amp;lt;TD&amp;gt; &amp;lt;/TD&amp;gt; &amp;lt;TD class=ms-propertysheet colspan=4&amp;gt;&amp;lt;IMG SRC="/_layouts/images/rect.gif" alt=""&amp;gt; &amp;lt;A ID=onetidListEdit7 target=_self &amp;lt;% if (iBaseType == SPBaseType.DocumentLibrary) { %&amp;gt; HREF="ShrOpt.aspx?obj=&amp;lt;%SPEncode.WriteUrlEncode(Response, spList.ID.ToString("B").ToUpper());%&amp;gt;,doclib" &amp;lt;% } else { %&amp;gt; HREF="ShrOpt.aspx?obj=&amp;lt;%SPEncode.WriteUrlEncode(Response, spList.ID.ToString("B").ToUpper());%&amp;gt;,list" &amp;lt;% } %&amp;gt; &amp;gt;&amp;lt;% switch (iBaseType) { case SPBaseType.DocumentLibrary: if (SPListTemplateType.PictureLibrary == iServerTemplate) { %&amp;gt;Change permissions for this picture library&amp;lt;% } else if (SPListTemplateType.XMLForm == iServerTemplate) { %&amp;gt;Change permissions for this form library&amp;lt;% } else if (SPListTemplateType.ListTemplateCatalog == iServerTemplate SPListTemplateType.WebTemplateCatalog == iServerTemplate SPListTemplateType.WebPartCatalog == iServerTemplate) { %&amp;gt;Change permissions for this gallery&amp;lt;% } else { %&amp;gt;Change permissions for this document library&amp;lt;% } break; case SPBaseType.DiscussionBoard: %&amp;gt;Change permissions for this discussion board&amp;lt;% break; case SPBaseType.Survey: %&amp;gt;Change permissions for this survey&amp;lt;% break; default:%&amp;gt;Change permissions for this list&amp;lt;% break; }%&amp;gt;&amp;lt;/A&amp;gt;&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&amp;lt;%// }&lt;br /&gt;&lt;br /&gt;2. Change the first octet of GUID value in ONET.XML file from 'A373E6A8' to 'A373E6A7', as follows:&lt;br /&gt;&lt;br /&gt;&amp;lt;ExternalSecurityProvider ID="A373E6A7-7A87-11D3-B1C1-00C04F68155C" Type="Microsoft.SharePoint.Portal;Microsoft.SharePoint.Portal.SiteData.&lt;br /&gt;CategoryWebSecurityProvider" /&amp;gt;&lt;br /&gt;&lt;br /&gt;3. Run the following SQL statement on the SITE database in SQL Query Analyzer:&lt;br /&gt;&lt;br /&gt;UPDATE Webs SET SecurityProvider = '{A373E6A7-7A87-11D3-B1C1-00C04F68155C}' WHERE SecurityProvider = '{A373E6A8-7A87-11D3-B1C1-00C04F68155C}'&lt;br /&gt;&lt;br /&gt;That's it. You now have list-level permissions in portal subareas. As I mentioned, this may have unintended consequences; this value may by used elsewhere and cause something that was working to break or disable some dependent functionality. In my test scenarios I was unable to find any negative effects but that doesn't mean they don't exist. Try it at your own (considerable) risk.&lt;br /&gt;&lt;br /&gt;BTW, if anyone from Microsoft reads this and knows what effect a change in the SecurityProvider GUID might have on portal operation, please enlighten us as it is not documented anywhere that I could find.&lt;br /&gt;&lt;br /&gt;As an aside, I am certain that this post will officially exclude me from MVP consideration for the rest of my life ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113320382439440831?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113320382439440831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113320382439440831' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113320382439440831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113320382439440831'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/list-level-permissions-in-sharepoint.html' title='List-Level Permissions in SharePoint Portal Server'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113319498643774230</id><published>2005-11-28T08:16:00.000-08:00</published><updated>2005-11-28T08:23:06.506-08:00</updated><title type='text'>SharePoint v.Next Upgrade Issues</title><content type='html'>&lt;a href="http://blogs.msdn.com/arpans/default.aspx"&gt;Arpan Shah&lt;/a&gt; has a good &lt;a href="http://blogs.msdn.com/arpans/archive/2005/11/24/496759.aspx"&gt;post&lt;/a&gt; on things to consider in preparation for the upgrade to SPS/WSS 3.0.  I generally make a concerted effort to toe the line with regards to &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/odc_SP2003_ta/html/WSSSharePointCodeReuse.asp"&gt;guidelines&lt;/a&gt; from Microsoft but when something is seriously out of whack I have to take exception.  Two of the 'Golden Rules' of SharePoint customization that Arpan repeats in his post have me seriously concerned that Microsoft is not taking into account their customer's desire to fully customize SPS in the next release; namely, 1) Database access, and 2) File/Definition modifications.  As Arpan states:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;1. Don't touch the database. Modifying is a big no-no... reading it -- there's no guarantee that the schema will be the same. If you want to ensure a smooth upgrade, don't touch it or use partner technologies that modify the database.&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;2. Don't modify out of the box files/directories/stylesheets, et cetera. Whenever possible, you should be creating copies and then modifying vs. modifying the out of the box files. Service Packs or future versions can overwrite files and you can lose your customizations. Net/net: follow customization guidelines!&lt;br /&gt;&lt;/em&gt;&lt;br /&gt;This is all well and good but both of these 'rules' completely ignore the realities of full-scale customization.  First, I defy you to create a portal-wide, collapsible, dynamic navigation menu (a la MSDN menus) or a nested drop-down navigation bar that includes both SPS areas and WSS sites without reading from the database.  Sure, you can cobble together an object-model server control but it will be a) V-E-R-Y S-L-O-W and b) very buggy.  Not to mention the fact that you can't make the association between WSS sites and SPS areas without reading from the WEBS and SITES tables.  I completely support the notion that modifying the database is BAD IDEA but not being allowed to read from it overly restricts development and customization.   &lt;br /&gt;&lt;br /&gt;Second, you absolutely cannot deploy a fully branded and customized portal solution without modifying the SPS, SPSPERS, SPSMSITE, and SPSSITES site definitions.  Add WSS sites and you must also customize the STS definition (although you can work around that limitation by getting fancy with the WEBTEMP.XML files).  What good are stand-alone area customizations if they don't integrate with the rest of the portal?  We're talking about customizations far beyond portalheader.aspx and alternateheader.aspx - full page layout and design changes cannot be achieved without editing the core definitions.  (NOTE: You can modify WEBTEMPSPS.XML and replace the default definitions with custom definitions using the same ID but it doesn't always work right, especially when replacing the SPS definition, and besides, according to the guidelines, we're not supposed to modify the base XML files either).&lt;br /&gt;&lt;br /&gt;Third, administration pages are a unique animal unto themselves.  At last count I have discovered at least half a dozen shared code structures just for admin page headers (sorry to disappoint, but alternateheader.aspx only works in about a third of those pages, and it's functionality is limited at best) and a bunch of stand-alone configurations.  Many don't include references to custom CSS files or all the code registrations necessary for including server controls (you do want a common navigation scheme at the top of ALL your pages, don't you?).  Remember that many of these pages are accessed regularly by portal users - spsviewlsts, lstman, aclinv, catman, create, listedit, and so on - so modifying them is required if you wish to maintain any sort of continuity in portal design.&lt;br /&gt;&lt;br /&gt;I understand that customization in the current product is tricky at best but v.Next is supposed to address that issue, is it not?  I thought so but Arpan's post makes me wonder if that will be the case.  Word to the mother ship - CUSTOMERS DEMAND CUSTOMIZATION!!!  Neglect the ability to customize the product and customer satisfaction will plummet.  I sincerely hope this requirement has been taken into consideration and the final release will take full advantage of .NET 2.0 features to provide scalable, extensible customization options without restricting the customer to a less-than-desireable mish-mash of 'works here but doesn't work there' compromises.&lt;br /&gt;&lt;br /&gt;Don't get me wrong - SharePoint is a great product and I appreciate the customization flexibility that Microsoft has given us (even if some of it is inadvertent).  I also appreciate the wisdom from on high provided by &lt;a href="http://blogs.msdn.com/arpans/default.aspx"&gt;Arpan&lt;/a&gt;, &lt;a href="http://blogs.msdn.com/mikefitz/"&gt;Fitz&lt;/a&gt;, &lt;a href="http://www.bluedoglimited.com/SharePointThoughts/default.aspx"&gt;Maurice&lt;/a&gt;, and others.  I just hope that the lessons of v2 influence the features of v3 inasmuch as customization is no longer an option but a requirement. &lt;br /&gt; &lt;br /&gt;For those of you that have already done extensive customization to your portal deployment, here are some practical suggestions to prepare for the v.Next upgrade:&lt;br /&gt;&lt;br /&gt;1. Insure that you have copies of all the original, unaltered files, definitions and directory structures.&lt;br /&gt;2. Make a copy of all modified files, definitions and directories.&lt;br /&gt;3. Make a copy of all database additions, such as stored procedures, logins and custom indexes.&lt;br /&gt;4. Prior to upgrading, restore the original files/defs/dirs and remove any custom CSS files, images, etc. from the 60 hive.&lt;br /&gt;5. Remove all database additions.&lt;br /&gt;6. Perform the upgrade to a test portal.&lt;br /&gt;7. Determine what impact the new changes have on your customization scheme and modify/redeploy accordingly (many of the hard-coded mods my no longer be necessary as Master Pages will replace much of the file-by-file alterations necessary in the current version).&lt;br /&gt;8. Revise your database additions to account for any schema changes and redeploy.&lt;br /&gt;9. Test and modify your web parts and server controls (especially those that read from the DB).&lt;br /&gt;10. Test, test, and test again, then downgrade the live portal deployment to a basic install, upgrade to the new version, and deploy your customized portal elements.&lt;br /&gt;&lt;br /&gt;Bear in mind that these are just suggestions - without having the new version to test against there is no way of knowing what the actual procedure will be.  The more extensive the customizations the sooner you should begin testing and planning the upgrade to v.Next for your clients/organization.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113319498643774230?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113319498643774230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113319498643774230' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113319498643774230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113319498643774230'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/sharepoint-vnext-upgrade-issues.html' title='SharePoint v.Next Upgrade Issues'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-113276169141856497</id><published>2005-11-23T07:59:00.000-08:00</published><updated>2005-11-23T08:01:31.440-08:00</updated><title type='text'>Extreme SharePoint Design: Custom User Menus, Part 2</title><content type='html'>In a &lt;a href="http://sharingpoint.blogspot.com/2005/09/extreme-sharepoint-design-creating.html"&gt;previous post&lt;/a&gt;, I described at length the process for creating custom user menus in SharePoint. In the associated code samples, I neglected to account for windowed controls that might obscure the menu drop-downs on a page.  As anyone who has designed extensively for IE knows, windowed controls (such as ActiveX or Select boxes) ignore the 'z-index' property assigned to DOM elements and take precedence in the display; that is, they are drawn on top of all other controls.  If you use the hidden DIV method I outlined there are some instances, such as opening a document library in datasheet view, where the menu options disappear behind the web part.&lt;br /&gt;&lt;br /&gt;There is no direct solution for this problem but there is a workaround using IFRAMEs and javascript.  First, let's re-familiarize ourselves with the code that draws that the hidden div and the script that activates it when the user clicks the menu button:&lt;br /&gt;Page Code (in DEFAULT.ASPX or a custom user control):&lt;br /&gt;&lt;br /&gt;&amp;lt;td valign="top" align="right" nowrap onclick="SwitchMenu('ActionsMenu')" class="spsWPZ_ActionsMenu_Header"&amp;gt;Actions&amp;lt;img src="/_layouts/images/menudark.gif" align="absbottom" &amp;gt; &amp;lt;div id="ActionsMenu" onmouseover="this.style.display='inline'" onmouseout="this.style.display='none'" class="spsWPZ_PageHeaderMenu_Div" &amp;gt;  &amp;lt;table width="100%" cellpadding="0" cellspacing="0" border="0" class="spsWPZ_PageHeaderMenu"&amp;gt;   &amp;lt;!-- Toolbar Elements Here --&amp;gt;  &amp;lt;/table&amp;gt; &amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&lt;br /&gt;Javascript (in the page header or OWS.JS):&lt;br /&gt;&lt;br /&gt;function SwitchMenu(obj){var el = document.getElementById(obj);var parent = el.parentElement;var x = getPageOffsetLeft(parent);var y = getPageOffsetTop(parent) + parent.offsetHeight;var p = parent.offsetWidth;  if(el.style.display == "inline") {  el.style.left = (x - (175 - p)) + "px";  el.style.top  = (y - 7) + "px";  el.style.display = "none"; } else {  el.style.left = (x - (175 - p)) + "px";  el.style.top  = (y - 7) + "px";  el.style.display = "inline"; }}&lt;br /&gt;&lt;br /&gt;The code above displays a table cell ('Actions') that acts as a menu button and creates a DIV element ('ActionsMenu') that is hidden when the page loads.  When the user clicks within the table cell the SwitchMenu function is called, which activates the ActionsMenu DIV, positions it below the cell and displays it on the page.  The onMouseOver and onMouseOut events cause the DIV to disappear when the user moves the mouse outside the DIV boundary, mimicking the behavior of a regular Windows menu.&lt;br /&gt;&lt;br /&gt;This works just fine until a windowed control is placed on the page that intersects with the ActionsMenu DIV, at which time the control will obscure the DIV, making it impossible to access the menu functions.  In some cases, the page becomes unusable because all the operations ('Modify Settings and Columns', 'Edit Page', etc.) are hidden.  To resolve this issue an IFRAME must be placed immediately below the ActionsMenu DIV that is the same width and height and exposed in response to the user click on the table cell. &lt;br /&gt;&lt;br /&gt;First, create a hidden IFRAME within the ActionsMenu DIV and place it immediately before the content table as follows:&lt;br /&gt;&lt;br /&gt;&amp;lt;div id="ActionsMenu" onmouseover="this.style.display='inline'" onmouseout="this.style.display='none'" class="spsWPZ_PageHeaderMenu_Div" &amp;gt; &amp;lt;IFRAME style="display: none;" id="ActionsMenuFrame" name="ActionsMenuFrame" src="javascript:false;" frameBorder="0" scrolling="no" &amp;gt;&amp;lt;/IFRAME&amp;gt; &amp;lt;table width="100%" cellpadding="0" cellspacing="0" border="0" class="spsWPZ_PageHeaderMenu"&amp;gt;  &amp;lt;!-- Toolbar Elements Here --&amp;gt; &amp;lt;/table&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;br /&gt;The style of the IFRAME is set to "none" to keep it hidden until the DIV is exposed.  The NAME and ID settings are important as these will be used in the SwitchMenu function later.  The SRC property calls a dummy javascript instead of referencing a blank HTML file, which can lead to client-side security warnings in an HTTPS environment.&lt;br /&gt;&lt;br /&gt;Next, update the SwitchMenu function with methods to display and position the IFRAME:&lt;br /&gt;&lt;br /&gt;function SwitchMenu(obj){var el = document.getElementById(obj);var parent = el.parentElement;var x = getPageOffsetLeft(parent);var y = getPageOffsetTop(parent) + parent.offsetHeight;var p = parent.offsetWidth;var aFrame = document.getElementById('ActionsMenuFrame');  if(el.style.display == "inline") {  el.style.left = (x - (175 - p)) + "px";  el.style.top  = (y - 1) + "px";  el.style.display = "none"; } else {  el.style.left = (x - (175 - p)) + "px";  el.style.top  = (y - 1) + "px";  el.style.display = "inline";    aFrame.style.zIndex = el.style.zIndex - 1;  aFrame.style.display = "inline";  aFrame.style.position = "absolute";  aFrame.style.top = "0px";  aFrame.style.left = "0px";  aFrame.style.height = el.offsetHeight;  aFrame.style.width = "175px"; }}&lt;br /&gt;&lt;br /&gt;The function now uses a variable called 'aFrame' to access the properties of the IFRAME('ActionsMenuFrame').  The IFRAME is then positioned one level below the DIV by setting the zIndex property.  The display type is then changed to 'inline' and the IFRAME is set to the top and left position of the parent DIV.  The most difficult part of positioning the IFRAME is matching the height of the parent object; because the ActionsMenu DIV does not have an explicit height setting (it expands or contracts based on the content in the child table), the el.style.Height value cannot be used; instead, the function uses the offsetHeight property, which is accessible once the control is drawn (which happens in the preceding IF...ELSE blocks). &lt;br /&gt;&lt;br /&gt;The menu will now overlay all page controls, as IFRAME is a unique IE element that is aware of the zIndex values of both browser elements and windowed controls (the zIndex for the ActionsMenu DIV is set in a CSS file).  The page will now render with the windowed controls on the bottom, then the IFRAME, then the DIV on top.  This will prevent any ActiveX controls, select boxes, or other page elements from obscuring the menus and limiting usability.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113276169141856497?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113276169141856497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113276169141856497' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113276169141856497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113276169141856497'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/extreme-sharepoint-design-custom-user.html' title='Extreme SharePoint Design: Custom User Menus, Part 2'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113172556844781425</id><published>2005-11-11T08:10:00.000-08:00</published><updated>2005-11-11T08:12:48.470-08:00</updated><title type='text'>Cracking Open STP Files</title><content type='html'>&lt;a href="http://mindsharpblogs.com/todd/"&gt;Todd Bleeker&lt;/a&gt; has a great &lt;a href="http://mindsharpblogs.com/todd/archive/2005/11/11/853.aspx"&gt;post&lt;/a&gt; on manipulating data within STP files.  Timely information, as I was just working on a similar problem the other day.  Thanks, Todd!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113172556844781425?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113172556844781425/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113172556844781425' title='17 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113172556844781425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113172556844781425'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/cracking-open-stp-files.html' title='Cracking Open STP Files'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>17</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113164048120015374</id><published>2005-11-10T08:27:00.000-08:00</published><updated>2005-11-10T08:34:41.220-08:00</updated><title type='text'>Changing the SharePoint Admin Password</title><content type='html'>Before installing SharePoint it is important to give some thought to the account that will be used as the portal administrator. Not only is the admin account referenced throughout the portal (area/site ownership, document metadata, list properties, etc.) but it's also used for many basic functions that are central to portal operation - connections to the configuration database, content crawling, application pool identity, and so on. Because the portal administrator must have complete and total control over the SharePoint server(s), a good practice would be to use an account specifically for this purpose that has limited rights elsewhere in the domain.&lt;br /&gt;&lt;br /&gt;Assuming that you have followed this methodology in your portal deployment, the next obvious question is: What happens when you change the portal administrator password? Alas, this is a simple question with a not-so-simple answer. There are several steps required to successfully implement this change and they must be done in a specific order. Download the following article which outlines the scope and implications of modifying administrative account properties and defines a procedure for implementing changes.&lt;br /&gt;&lt;br /&gt;NOTE: This procedure has been tested for accuracy but each deployment is different; if you run across any variations please post comments and I will update the document accordingly.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.theegroup.net/Sharepoint%20Portal%20Server/Sharepoint%20Articles/Modifying%20Administrative%20Account%20Properties.pdf"&gt;Modifying Administrative Account Properties&lt;/a&gt; (PDF)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113164048120015374?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113164048120015374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113164048120015374' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113164048120015374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113164048120015374'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/changing-sharepoint-admin-password.html' title='Changing the SharePoint Admin Password'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113140913123922929</id><published>2005-11-07T16:11:00.000-08:00</published><updated>2005-11-08T08:02:01.346-08:00</updated><title type='text'>Extreme SharePoint Design: Validating Area Titles</title><content type='html'>Most web-savvy tech types know better than to use "special" characters in URL fields - apostrophes, question marks, carets, ampersands, and the like. Unfortunately, this rule of thumb is lost on the average SharePoint user and an open text box with no validation is an invitation to wreak havoc on your carefully constructed portal navigation. IE will overlook most illegal characters but some third-party or custom developed navigational controls will not, so a good practice would be to discourage the use of symbols in Title and URL fields.&lt;br /&gt;&lt;br /&gt;You can, of course, add big warnings to the admin pages warning against such malfeasance but we all know that the bigger the warning, the more often it is overlooked. So what to do? The best way to handle this situation is to check the user input against a list of disallowed characters and force text modifications before the field is posted. Fortunately, if your portal consists mostly of WSS sites, you've got it made - the WSS site creation form (scsignup.aspx) has built-in validation to prevent users from entering illegal characters in certain fields; however, if you make extensive use of SPS areas, the solution is not quite so simple. Here's how to replicate the WSS behavior in SPS:&lt;br /&gt;&lt;br /&gt;First, create a script to check the user's input against your list of illegal characters, similar to the following:&lt;br /&gt;&lt;br /&gt;&amp;lt;script&amp;gt;&lt;br /&gt;function validateSiteName(ctlId)&lt;br /&gt;{&lt;br /&gt;var iChars = "!@#$%^&amp;*()+=[]';,./{}\":&amp;lt;&amp;gt;?";&lt;br /&gt;var ctlName = document.getElementById(ctlId) for (var i = 0; i &amp;lt; ctlName.value.length; i++)&lt;br /&gt;{&lt;br /&gt;if (iChars.indexOf(ctlName.value.charAt(i)) != -1)&lt;br /&gt;{&lt;br /&gt;alert ("The Title field contains special characters which are not allowed. Please remove them and try again.");&lt;br /&gt;ctlName.focus();&lt;br /&gt;return false;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;br /&gt;This script defines the list of illegal characters (iChars), gets the ID of the input box (ctlName), then, if the text box isn't empty, steps through each character and matches it against the list. If a character matches one of the illegal characters, the script displays an alert box asking the user to remove the offending characters and returns the focus to the input field, preventing them from saving the form without fixing the problem.&lt;br /&gt;&lt;br /&gt;Second, paste the script into the &amp;lt;HEAD&amp;gt; section of the area creation and modification pages (spnewcategory.aspx and speditcategory.aspx, respectively) or append the function to OWS.JS file (which is called from every page within the portal).&lt;br /&gt;&lt;br /&gt;Third, call the script using the onBlur method from the form. Find the following code block on the page:&lt;br /&gt;&lt;br /&gt;&amp;lt;SPSWC:InputFormTextBox&lt;br /&gt;runat="server"&lt;br /&gt;id="TextBoxTitle"&lt;br /&gt;IsTextTrimmed = "true"&lt;br /&gt;LabelTextLocId="SiteAdminCreateCategory_Title_Colon_Text" AccessKeyLocId="SiteAdminCreateCategory_Title_AccessKey"/&amp;gt;&lt;br /&gt;&lt;br /&gt;Then add the onBlur event to the end:&lt;br /&gt;&lt;br /&gt;&amp;lt;SPSWC:InputFormTextBox&lt;br /&gt;runat="server"&lt;br /&gt;id="TextBoxTitle"&lt;br /&gt;IsTextTrimmed ="true"&lt;br /&gt;LabelTextLocId="SiteAdminCreateCategory_Title_Colon_Text" AccessKeyLocId="SiteAdminCreateCategory_Title_AccessKey"&lt;br /&gt;onBlur="validateSiteName(this.id);"/&amp;gt;&lt;br /&gt;&lt;br /&gt;This will fire the validateSiteName function whenever the user clicks or tabs out of the input field.&lt;br /&gt;&lt;br /&gt;Finally, save the modified pages to the 60\TEMPLATE\LAYOUTS\1033 directory and users will be unable to enter any illegal characters into the area title field, which is used by SPS to construct the bucketed URL, thereby preventing any incompatabilities with navigational tools and utilities.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113140913123922929?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113140913123922929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113140913123922929' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113140913123922929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113140913123922929'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/extreme-sharepoint-design-validating.html' title='Extreme SharePoint Design: Validating Area Titles'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-113086472090797089</id><published>2005-11-01T08:38:00.000-08:00</published><updated>2005-11-01T09:05:20.993-08:00</updated><title type='text'>MySite Permissions</title><content type='html'>The MySite site definition (SPSMSITE) is intended to provide only the 'Private' and 'Public' page views for a user's personal site; all other functionality (lists, doc libs, etc.) is handled by the Personal definition (SPSPERS).  When customizing these definitions (if you want to provide MySite functionality, you have no choice but to customize the existing definition - I know it's not supported but it's there just isn't any other way), it is important to remember that SPSMSITE is a full definition, with the same base set of included lists as all other defs. &lt;br /&gt;&lt;br /&gt;While there are no direct links in the GUI for working with MySite lists, users can add list web parts from the tool pane and, by default, modify the list contents.  Since MySite content is global (personal site content is localized to the individual user account), any changes to MySite lists will show up for all users; not an ideal situation. &lt;br /&gt;&lt;br /&gt;To work around this issue, change the MySite permissions for Members and Contributors.  Use the following URL syntax to access the MySite security page  (there is no 'Manage Security' link for this area):&lt;br /&gt;&lt;br /&gt;   http://%lt;server name%gt;/mysite/_layouts/1033/spcatsec.aspx&lt;br /&gt;&lt;br /&gt;Check the Contributor and Member groups (and any others you wish to modify), click 'Edit', and uncheck the 'Add Items' right under the Select Rights section.  This will prevent users from doing and end-run around list security by dropping list web parts onto the MySite pages and modifying the content.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-113086472090797089?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/113086472090797089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=113086472090797089' title='29 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113086472090797089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/113086472090797089'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/11/mysite-permissions.html' title='MySite Permissions'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>29</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112964761080079647</id><published>2005-10-18T07:52:00.000-07:00</published><updated>2005-10-18T08:00:14.596-07:00</updated><title type='text'>New Customer Success Story</title><content type='html'>From time to time, when we're engaged on a project that is a bit out of the ordinary or involves a great deal of customization, I like to do a case study to highlight the challenges, achievements and lessons learned during the course of the engagement.  We recently completed such a challenging assignment for a premier architectural services firm based in Ft. Worth, Texas.  Their story contains valuable insights for companies of similar size who are considering a new portal implementation using SharePoint Products and Technologies.&lt;br /&gt;&lt;br /&gt;If you, your firm, your clients, partners or other SharePointers are interested in reading the case study, it is available for download &lt;a href="http://www.theegroup.net/About/Customer%20Success%20Stories/Carter-Burgess%20Customer%20Success%20Story.pdf"&gt;here&lt;/a&gt;.  &lt;br /&gt;&lt;br /&gt;If you have any questions or would like more details on the technical architecture/development/etc., feel free to post a comment with your email addy and I'll respond accordingly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112964761080079647?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112964761080079647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112964761080079647' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112964761080079647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112964761080079647'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/10/new-customer-success-story.html' title='New Customer Success Story'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112898037056364298</id><published>2005-10-10T16:32:00.000-07:00</published><updated>2005-10-10T14:39:30.570-07:00</updated><title type='text'>Extreme SharePoint Design: Custom MySite Titles</title><content type='html'>When customizing personal sites (MySite), it is important to remember that you're really working with two site definitions - SPSMSITE (which provides the Public and Private default pages) and SPSPERS (which contains all the lists and libraries). SPSMSITE is nothing more than a launching pad for SPSPERS - the bulk of the functionality is in the personal site definition.&lt;br /&gt;&lt;br /&gt;This is important to remember when modifying the menus, links and other navigational elements. In some instances, such as the public and private pages, you will be referring to MySite url's (/mysite/); in others, such as document libraries and lists, you will be referring to Personal url's (/personal/[username]/). This can be quite confusing when, for example, you need to create a site title that is displayed on every page and links back to either the public or private view.&lt;br /&gt;&lt;br /&gt;The SharePoint object model has some built-in functions that help you determine your site context but they don't span multiple contexts (in other words, there's no way to know which mysite is associated with the current personal path a page is in) and they don't always expose data the way you need it. In the following example, we'll use various properties of the GetContextWeb method to create a personal site title based on the user's full name from Active Directory that, when viewed by the site owner, links back to the private home page, and when viewed by a reader, links back to the public page.&lt;br /&gt;&lt;br /&gt;//Retrieve the site title, which should be the user's full name from AD&lt;br /&gt;string strFullName = SPControl.GetContextWeb(Context).Title;&lt;br /&gt;string strTitle;&lt;br /&gt;int intLocation, intLength;&lt;br /&gt;&lt;br /&gt;// Determine length of string, find comma separator if one exists&lt;br /&gt;intLength = strFullName.Length;&lt;br /&gt;intLocation = strFullName.IndexOf(", ");&lt;br /&gt;&lt;br /&gt;// If a comma is not found (the user name is not separated into Last Name, First Name), set the Title value to the full Title from AD; otherwise, parse out the first name and last name, remove the comma and space, and reverse the strings to read First Name Last Name&lt;br /&gt;&lt;br /&gt;if (intLocation == -1)&lt;br /&gt;strTitle = strFullName;&lt;br /&gt;else&lt;br /&gt;strTitle = strFullName.Substring(intLocation + 1) + " " + strFullName.Substring(0,intLocation );&lt;br /&gt;&lt;br /&gt;// Determine if the current user is the site author; if so, set the link href value to mysite and write out the Title. If the current user is only a reader, set the link href to the public url and write out the same Title value.&lt;br /&gt;&lt;br /&gt;if (SPControl.GetContextWeb(Context).CurrentUser.LoginName == SPControl.GetContextWeb(Context).Author.LoginName)&lt;br /&gt;{&lt;br /&gt;Response.Write("&amp;lt;a href='/mysite/default.aspx'&amp;gt;" + strTitle + "&amp;lt;/a&amp;gt;");&lt;br /&gt;}&lt;br /&gt;else&lt;br /&gt;{&lt;br /&gt;Response.Write("&amp;lt;a href='/mysite/public.aspx?accountname=" +&lt;br /&gt;SPControl.GetContextWeb(Context).Author.LoginName + "'&amp;gt;" + strTitle + "&amp;lt;/a&amp;gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;Note that you will only be able to execute this code from a user control; standard web part pages won't allow code execution. To call a user control from within a web part page, create an .ascx file, insert the required registrations (be sure to utilize Microsoft.SharePoint.WebControls) and code, then register the page location (usually the /bin folder on the virtual server), and call the registration from within the web part page.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112898037056364298?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112898037056364298/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112898037056364298' title='16 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112898037056364298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112898037056364298'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/10/extreme-sharepoint-design-custom.html' title='Extreme SharePoint Design: Custom MySite Titles'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112811504518311567</id><published>2005-09-30T16:17:00.000-07:00</published><updated>2005-09-30T14:17:25.200-07:00</updated><title type='text'>Search Index Rules Syntax</title><content type='html'>SharePoint does a pretty good job of handling long, complex or unique URLs within the interface; many lists use relative pathing, Area and Site URLs preserve spaces for easy readability, and so on. One instance where this is definitely NOT the case is the application of rules for inclusion and exclusion of content sources.&lt;br /&gt;&lt;br /&gt;When creating a rule that references a URL path, such as &lt;a href="http://servername/Area"&gt;http://servername/Area&lt;/a&gt;, you must replace any spaces and special characters (ampersands, apostrophes, commas, etc.) with the proper URL encoding (%20, %26, %2C, etc.). Otherwise, the MSSearch process will ignore the rule and continue evaluating results against valid rules.&lt;br /&gt;&lt;br /&gt;Also, remember that the order of the rules is important. If you are trying to exclude the above URL, the Portal_Content index will have a default inclusion rule of &lt;a href="http://servername/"&gt;http://servername/&lt;/a&gt;; any new rules you create will be processed after this rule is satisfied. Since the default rule includes all content, any antecedent rules will be ignored. To address this issue, simply move your exclusions to precede the blanket inclusion and the search service will properly exclude the specified content source.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112811504518311567?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112811504518311567/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112811504518311567' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112811504518311567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112811504518311567'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/search-index-rules-syntax.html' title='Search Index Rules Syntax'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112794170939972284</id><published>2005-09-29T09:28:00.000-07:00</published><updated>2005-10-28T07:31:33.173-07:00</updated><title type='text'>Extreme SharePoint Design: 'Go Back To [Area/Site]' Link</title><content type='html'>The ability to call pages in the /_layouts/1033/ directory is very convenient; all the administration pages can be stored in one location and referenced from any area or site within the portal. SharePoint uses the SPControl.GetContextWeb(Context) and SPControl.GetContextSite(Context) functions to determine what context the user is in when a page is called, then presents the appropriate content. Pretty slick.&lt;br /&gt;&lt;br /&gt;There's just one problem: when accessing these pages, users often get lost with no way to return to where they came from. Nothing is more frustrating than finding yourself seven steps into a wizard with no way to bail out but to smack the 'Back' button repeatedly. The solution is a 'Go Back To [Area/Site]' link at the top of each administration page which gives the user one-click access to the place they started from.&lt;br /&gt;&lt;br /&gt;Insert the following code into AlternateHeader.aspx or directly into your administration pages just after the PageHeader section (if you're using heavily customized Site Definitions as I often do, most of your admin pages will have header code in them to overwrite AlternateHeader and PortalHeader; just paste the following code into the appropriate section and format it as needed):&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;Response.Write ("&amp;lt;a href='" + SPControl.GetContextWeb(Context).Url + "'&amp;gt;Go Back to " + SPControl.GetContextWeb(Context).Title + "&amp;lt;/a&amp;gt;");&lt;br /&gt;}&lt;br /&gt;catch&lt;br /&gt;{Response.Write ("Portal Administration Page");&lt;br /&gt;}&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;br /&gt;The 'try' block creates a link back to the root of the referring area/site using the title field as the link text. The 'catch' block writes out a general statement that you can replace with anything you like, just in case the link fails to render properly.&lt;br /&gt;&lt;br /&gt;NOTE: In '&lt;a href="http://www.theegroup.net/Sharepoint%20Portal%20Server/Sharepoint%20Articles/Extreme%20SharePoint%20Design%20-%20Creating%20Custom%20User%20Menus.pdf"&gt;Extreme SharePoint Design: Creating Custom User Menus&lt;/a&gt;', I used the same function to replicate the behavior of the 'Home' button on WSS sites. Use SPControl.GetContextWeb(Context) anytime you want to refer to the root URL of an area or site; use SPControl.GetContextSite(Context) to reference the site collection the current site belongs to.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt;&lt;/strong&gt; I forgot to mention that you'll need to insert the following code at the top of alternateheader.aspx in order for SharePoint to parse inline code blocks on the page (otherwise you will receive the dreaded 'External component has thrown an exception' error):&lt;br /&gt;&lt;br /&gt;&amp;lt;%@ Page language="C#" %&amp;gt;&lt;br /&gt;&amp;lt;%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %&amp;gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112794170939972284?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112794170939972284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112794170939972284' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112794170939972284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112794170939972284'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/extreme-sharepoint-design-go-back-to.html' title='Extreme SharePoint Design: &apos;Go Back To [Area/Site]&apos; Link'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112800110462402060</id><published>2005-09-29T06:26:00.000-07:00</published><updated>2005-09-29T06:38:24.636-07:00</updated><title type='text'>Updated SharePoint Resources List</title><content type='html'>&lt;a href="http://heathersolomon.com/blog"&gt;Heather&lt;/a&gt; has updated her &lt;a href="http://heathersolomon.com/blog/articles/148.aspx"&gt;SharePoint Resources List &lt;/a&gt;with a bunch of new content.  This should be your first stop for tips, tricks, and general How-To's.&lt;br /&gt;&lt;br /&gt;If you're looking for a list of tools and utilities, including commercial and non-commercial software, web parts, add-ons, and the like, I maintain a brief list &lt;a href="http://www.theegroup.net/Sharepoint%20Portal%20Server/Lists/Sharepoint%20Tools%20and%20Utilities/AllItems.aspx"&gt;here &lt;/a&gt;and &lt;a href="http://jopx.blogspot.com"&gt;Joris Poelmans&lt;/a&gt;  has a monster list &lt;a href="http://jopx.blogspot.com/2005/08/sharepoint-tools-galore-v4.html"&gt;here&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;BTW, whatever happened to the &lt;a href="http://weblogs.asp.net/bsimser/archive/2005/08/11/422281.aspx"&gt;Sharepoint Template Project&lt;/a&gt;???&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112800110462402060?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112800110462402060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112800110462402060' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112800110462402060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112800110462402060'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/updated-sharepoint-resources-list.html' title='Updated SharePoint Resources List'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112793583801306259</id><published>2005-09-28T12:27:00.000-07:00</published><updated>2005-09-28T12:30:38.013-07:00</updated><title type='text'>New Blog Template</title><content type='html'>&lt;a href="http://www.graphicalwonder.com/"&gt;Shane &lt;/a&gt;was kind enough to let me know that the blog template I was using didn't render properly in Firefox, so I switched it up to something new.  Not very compelling, I know, but I don't have time at the moment to whip up a better one (the stock Blogger templates just don't give you much to choose from).&lt;br /&gt;&lt;br /&gt;Drop a comment and let me know if this one works any better...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112793583801306259?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112793583801306259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112793583801306259' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112793583801306259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112793583801306259'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/new-blog-template.html' title='New Blog Template'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112735530426281598</id><published>2005-09-27T11:10:00.000-07:00</published><updated>2005-09-27T09:11:29.016-07:00</updated><title type='text'>Extreme SharePoint Design - Creating Custom User Menus</title><content type='html'>Finally, after much delay, the lastest installment in the Extreme SharePoint Design series is finished. In this installment we will explore the creation of custom menus using the default Actions and Views menus in SharePoint Portal Server 2003.&lt;br /&gt;&lt;br /&gt;Originally intended to be a much shorter article, I kept finding additional things I felt needed to be included to present a complete picture, so the final version is rather lengthy. Hence the linked PDF as opposed to one big blog post. Download the article here (right-click, choose 'Save Target As'):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.theegroup.net/Sharepoint%20Portal%20Server/Sharepoint%20Articles/Extreme%20SharePoint%20Design%20-%20Creating%20Custom%20User%20Menus.pdf"&gt;Extreme SharePoint Design - Creating Custom User Menus (PDF, 464k)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Enjoy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112735530426281598?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112735530426281598/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112735530426281598' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112735530426281598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112735530426281598'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/extreme-sharepoint-design-creating.html' title='Extreme SharePoint Design - Creating Custom User Menus'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112673533776590747</id><published>2005-09-14T14:44:00.000-07:00</published><updated>2005-09-14T15:10:29.750-07:00</updated><title type='text'>New SharePoint Features</title><content type='html'>I'll take &lt;a href="http://heathersolomon.com/blog/archive/2005/09/14/2014.aspx"&gt;Heather's cue&lt;/a&gt; and refrain from judging the new SharePoint features until I've had a chance to get my hands on them, but here are a few thoughts based on &lt;a href="http://blogs.msdn.com/mikefitz/archive/2005/09/14/466345.aspx"&gt;Fitz's post&lt;/a&gt; from PDC:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RSS. Everything about sites, lists, libraries, etc., can be syndicated via RSS automatically.&lt;br /&gt;Blogs and Wikis. Templates and features in the box. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Excellent. This will save a great deal of frustration with email-based alerts.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Content Types. These aren’t just like SPS 2001’s document profiles. They define sets of metadata, but they also contain view information. And associated workflows. And events bound to them (synchronous or asynchronous). And you can have more than one in the same list/library. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Hmm...not sure. Will this help with the problem of retrieving views via web services?&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Workflow. Windows Workflow Foundation is embedded in WSS. It’s used everywhere.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;I want to jump up and shout for joy...BUT...if they don't include a visual designer embedded into the UI ala &lt;a href="http://www.nintex.com/Product-SmartLibrary.aspx"&gt;Nintex SmartLibrary&lt;/a&gt; then they will have completely missed the boat. LOB managers, content editors, and designers cannot AND WILL NOT be forced to rely upon developers to create workflows.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Recycle Bin. We did it. It’s scoped to a site and captures deleted documents, items, etc. It has a user restore and an administrative restore. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Now that deserves a jump and a shout (assuming, of course, that it applies to SPS as well).&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Per-item security. Even on list items.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;I can die happy now. Is it really true? Oh, please, let it be so!&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;FrontPage has evolved into a feature set that makes it truly a SharePoint site designer. (Ghosting’s still around, but it won’t be a problem anymore. I’ll explain why in an upcoming post. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Interesting. This could make the job of customization a bit easier, which would make my life a much better place.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Forms services in Office “12” servers. That’s right — design a form in the InfoPath rich client, publish it as a SharePoint site, and it can be either viewed/filled out in the full smart client or in a browser as HTML. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;One word: S-W-E-E-T!&lt;/em&gt;&lt;br /&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Search. Better APIs. Better results. Alternate search suggestions (misspelled words,etc.). A highly customizable default Web-based UI. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;I'm definitely excited about this. Search is a bit of a blessing and a curse, so any improvement will be welcome.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Office “12” servers will also contain a Business Data Catalog, a facility that registers LOB application data and Web services. Once that’s happened, BDC-aware Web Parts can pull data from them, we can index them, and a lot more. There’s a session on this tomorrow. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Not sure about this one. Sounds interesting, though.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Office “12” servers will also be able to take a spreadsheet published to a SharePoint site and reneer it as an HTML application. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Like it but not sure how useful that will be...&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Mobile views of SharePoint lists. That’s right, a way to render a list on a mobile device. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Very nice.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Lists now have a Business Data type that will use the aforemntioned Business Data Catalog&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Unsure on this one. Need more info.&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Access will be able to treat SharePoint site data as fulll-blown data sources.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;em&gt;Yeah, baby!&lt;/em&gt;&lt;/p&gt;&lt;p&gt;All in all, it sounds promising. So, looking back, how'd they do with regards to my various &lt;a href="http://sharingpoint.blogspot.com/2005/07/sharepoint-and-cms-update.html"&gt;predictions&lt;/a&gt;, &lt;a href="http://sharingpoint.blogspot.com/2005/07/different-view-on-document-libraries.html"&gt;rants&lt;/a&gt; and &lt;a href="http://sharingpoint.blogspot.com/2005/06/forms-pages-and-web-parts.html"&gt;ravings&lt;/a&gt;? Not bad, I'd say. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112673533776590747?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112673533776590747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112673533776590747' title='35 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112673533776590747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112673533776590747'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/new-sharepoint-features.html' title='New SharePoint Features'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>35</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112604718901684636</id><published>2005-09-06T15:37:00.000-07:00</published><updated>2005-09-06T16:01:07.950-07:00</updated><title type='text'>Extreme SharePoint Design: Modifying The 'Grouped By' Headers</title><content type='html'>When applying grouping to a list view, the default style sheet prepends the field label and a colon to the group header. While this may be helpful in determing what category the data is grouped by it is certainly not the most visually appealing method. Fortunately, the style can be modified in the stdview.xml file located in the XML folder of your custom site definition (you are using a custom defintion, aren't you?). Locate the following code on or about line 278:&lt;br /&gt;&lt;br /&gt;&amp;lt;GroupByHeader&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ &amp;lt;TBODY id="titl]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;GetVar Name="GroupByLevelString"/&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA["&amp;gt;&amp;lt;TR]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;Switch&amp;gt; &amp;lt;Expr&amp;gt;&amp;lt;GetVar Name="GroupByIndent"/&amp;gt;&amp;lt;/Expr&amp;gt; &amp;lt;Case Value="0"&amp;gt; &amp;lt;HTML&amp;gt; &amp;lt;![CDATA[ class="ms-gb" ]]&amp;gt; &amp;lt;/HTML&amp;gt; &amp;lt;/Case&amp;gt; &amp;lt;Default&amp;gt; &amp;lt;HTML&amp;gt; &amp;lt;![CDATA[ class="ms-gb2" ]]&amp;gt; &amp;lt;/HTML&amp;gt; &amp;lt;/Default&amp;gt; &amp;lt;/Switch&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;gt;&amp;lt;TD colspan="100" nowrap&amp;gt;&amp;lt;img src="/_layouts/images/blank.gif" alt="" height=1 width=]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;GetVar Name="GroupByIndent"/&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;gt;&amp;lt;a href="javascript:" onclick="javascript:ExpCollGroup(']]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;GetVar Name="GroupByLevelString"/&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[','img_]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;GetVar Name="GroupByLevelString"/&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[');return false;"&amp;gt;&amp;lt;img id="img_]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;GetVar Name="GroupByLevelString"/&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[" src="/_layouts/images/minus.gif" alt="]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;HTML&amp;gt;Expand/Collapse&amp;lt;/HTML&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[" border="0"&amp;gt;&amp;lt;/a&amp;gt; ]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;GetVar Name="GroupByField" HTMLEncode="TRUE" /&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ : ]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;GetVar Name="GroupByValue"/&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[&amp;lt;/TD&amp;gt;&amp;lt;/TR&amp;gt;&amp;lt;/TBODY&amp;gt;]]&amp;gt;&amp;lt;/HTML&amp;gt; &amp;lt;/GroupByHeader&amp;gt;&lt;br /&gt;&lt;br /&gt;Remove the field label and colon by deleting or commenting out the following code from this section:&lt;br /&gt;&lt;br /&gt;&amp;lt;GetVar Name="GroupByField" HTMLEncode="TRUE" /&amp;gt; &amp;lt;HTML&amp;gt;&amp;lt;![CDATA[ : ]]&amp;gt;&amp;lt;/HTML&amp;gt;&lt;br /&gt;&lt;br /&gt;You may also wish to change the drab gray style by modifying ms-gb and ms-gb2 or assigning a class in a custom style sheet.&lt;br /&gt;&lt;br /&gt;Once you're finished editing the file, save it and reset IIS. Note that this is a global change that will affect all lists in the definition. For localized changes, create a Data View Web Part and modify the XSL accordingly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112604718901684636?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112604718901684636/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112604718901684636' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112604718901684636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112604718901684636'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/extreme-sharepoint-design-modifying.html' title='Extreme SharePoint Design: Modifying The &apos;Grouped By&apos; Headers'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112603574558560294</id><published>2005-09-06T12:33:00.000-07:00</published><updated>2005-09-06T12:42:25.596-07:00</updated><title type='text'>Compiling Locally Without SharePoint Installed</title><content type='html'>A vexing issue for SharePoint developers is the need to have WSS installed on your development machine due to DLL dependencies.  Anyone who has tried to compile a web part in a stand-alone environment has run across the following errors:&lt;br /&gt;&lt;br /&gt;     The dependency 'Microsoft.SharePoint.Security' could not be found.&lt;br /&gt;     The dependency 'Microsoft.SharePoint.Dsp' could not be found.&lt;br /&gt;     The dependency 'Microsoft.SharePoint.Library' could not be found.&lt;br /&gt;&lt;br /&gt;To circumvent this issue, extract the underlying DLL's from the GAC and copy them to your local machine.   You'll need to perform the copy from the command prompt as Windows Explorer does not expose the full directory structure for the GAC.  Each DLL resides in a directory with a path similar to the following:&lt;br /&gt;&lt;br /&gt;c:/windows/assembly/gac/[Strong Name]/[Version Number]__[Public Key]/[Strong Name].dll&lt;br /&gt;&lt;br /&gt;Once you have the DLL's you can include them as a reference in your project and compile without errors.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112603574558560294?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112603574558560294/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112603574558560294' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112603574558560294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112603574558560294'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/09/compiling-locally-without-sharepoint.html' title='Compiling Locally Without SharePoint Installed'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112544189970497272</id><published>2005-08-30T15:27:00.000-07:00</published><updated>2005-08-30T15:49:05.350-07:00</updated><title type='text'>SharePoint Blogsearch Expands to Mexico</title><content type='html'>For our friends from Latin America, &lt;a href="http://spaces.msn.com/members/lduso/"&gt;Luis Du Solier's Spanish-language blog &lt;/a&gt;has just been added to the &lt;a href="http://www.theegroup.net/txtlstvw.aspx?LstID=0c510949-16ba-486f-a03a-369f7102b97f"&gt;SharePoint Blogsearch &lt;/a&gt;index. As I grew up in El Paso (which is right on the Mexican-American border), I am quite fond of our neighbors to the south and glad to see Luis is making a contribution to the SharePoint community. If I continue to get multilingual submissions I'll create a content source for each language to make native searches a bit easier.&lt;br /&gt;&lt;br /&gt;Para todos nuestros amigos latinos, bienvenido por favor Luis Du Solier a la familia de &lt;a href="http://www.theegroup.net/txtlstvw.aspx?LstID=0c510949-16ba-486f-a03a-369f7102b97f"&gt;SharePoint Blogsearch&lt;/a&gt;. Como soy de EL Paso, Tejas y orgullosa de nuestros vecinos al sur. Estoy alegre ver que Luis está haciendo una contribución a la comunidad de SharePoint. Su &lt;a href="http://spaces.msn.com/members/lduso/"&gt;blog&lt;/a&gt; es muy bueno, Luis!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112544189970497272?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112544189970497272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112544189970497272' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112544189970497272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112544189970497272'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/sharepoint-blogsearch-expands-to.html' title='SharePoint Blogsearch Expands to Mexico'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112500467425868762</id><published>2005-08-25T14:14:00.000-07:00</published><updated>2005-08-25T14:17:54.270-07:00</updated><title type='text'>Database Permissions</title><content type='html'>I'd been wondering for a long time how the ACL's in the SharePoint database work.  In fact, I was just discussing the issue this morning with a colleague when - voila! - &lt;a href="http://weblogs.asp.net/paolopia/"&gt;Paolo&lt;/a&gt; posts the &lt;a href="http://weblogs.asp.net/paolopia/archive/2005/08/25/423624.aspx"&gt;answer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Now that's what the blogosphere is all about!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112500467425868762?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112500467425868762/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112500467425868762' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112500467425868762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112500467425868762'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/database-permissions.html' title='Database Permissions'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112482392945762535</id><published>2005-08-23T11:57:00.000-07:00</published><updated>2005-08-23T12:05:29.480-07:00</updated><title type='text'>Working with SharePoint Lists</title><content type='html'>A colleague of mine is working on a custom application which makes extensive use of SharePoint lists to store data.  He has written a webpart that rolls-up the XML data from various lists, transforms it with XSL, and renders it in a way-cool tabbed control.  While putting this together, he found this link on &lt;a href="http://weblogs.asp.net/paulballard/archive/2005/05/08/406197.aspx"&gt;Using Data from Sharepoint 2003 Lists&lt;/a&gt;.  Very cool and a big thanks to &lt;a href="http://weblogs.asp.net/paulballard/"&gt;Paul Ballard&lt;/a&gt; for his post.&lt;br /&gt;&lt;br /&gt;Perhaps if we needle him enough, &lt;a href="mailto:info@theegroup.net"&gt;Scot&lt;/a&gt; will be nice enough to post his nifty code and show us how it's done.  Or, he could just get a blog and start sharing his wizardry with the rest of the world, eh???&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112482392945762535?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112482392945762535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112482392945762535' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112482392945762535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112482392945762535'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/working-with-sharepoint-lists.html' title='Working with SharePoint Lists'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112480439271416048</id><published>2005-08-23T06:35:00.000-07:00</published><updated>2005-08-23T06:41:17.726-07:00</updated><title type='text'>Hiding the Site Settings Link</title><content type='html'>One of the most common user complaints in new implementations is links that are exposed to users who don't have rights to access the content - like the 'Site Settings' link at the top of every page. &lt;a href="http://heathersolomon.com/blog/"&gt;Heather Solomon&lt;/a&gt; has figured out how to &lt;a href="http://heathersolomon.com/blog/archive/2005/08/23/1662.aspx"&gt;hide that pesky critter&lt;/a&gt; for good.&lt;br /&gt;&lt;br /&gt;Where does she find this stuff? More importantly, how on earth would I make it through the week without her blog???&lt;br /&gt;&lt;br /&gt;Heather for MVP!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112480439271416048?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112480439271416048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112480439271416048' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112480439271416048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112480439271416048'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/hiding-site-settings-link.html' title='Hiding the Site Settings Link'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112464642338751389</id><published>2005-08-21T10:44:00.000-07:00</published><updated>2005-08-21T10:47:03.393-07:00</updated><title type='text'>SharePoint Templates Article</title><content type='html'>While following up on a comment from &lt;a href="http://www.sharepointers.org/default.aspx"&gt;Claudia&lt;/a&gt; I found her &lt;a href="http://www.sharepointers.org/Shared%20Documents/Forms/Document%20View.aspx?RootFolder=%2fShared%20Documents%2fJune%2028%202005%20Demos&amp;View=%7bBDB48D75%2dC84A%2d40E6%2d90E6%2d2EB0D59ACD7F%7d"&gt;article &lt;/a&gt;on WSS themes.  Good stuff - go check it out.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112464642338751389?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112464642338751389/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112464642338751389' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112464642338751389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112464642338751389'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/sharepoint-templates-article.html' title='SharePoint Templates Article'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112419942282591951</id><published>2005-08-19T18:24:00.000-07:00</published><updated>2005-08-19T16:20:34.363-07:00</updated><title type='text'>Extreme SharePoint Design Series</title><content type='html'>Site definitions and custom templates are essential to delivering a customized SharePoint experience. While there are several good resources for information on how to deploy a custom site definition, such as the SDK, MSDN, and Heather Solomon's excellent &lt;a href="http://heathersolomon.com/blog/"&gt;site&lt;/a&gt;, there aren't many in-depth examples of custom code for UI modifications. It's time to change that, don't you think?&lt;br /&gt;&lt;br /&gt;Over the next few months I'll be presenting "Extreme SharePoint Design", a regular blog series with advanced tips and tricks for designers. Topics won't be in any particular order, just cool stuff as I come across it with lots of code to copy and paste. Watch this space for updates, often daily but sometimes weekly, depending upon my travel schedule.&lt;br /&gt;&lt;br /&gt;As always, feel free to share your thoughts or suggest ideas.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;UPDATE:&lt;/span&gt; I'll be posting a lengthy article next week on customizing various context menus (Actions, Views, etc.) - it's a bigger task than I thought at first but well worth the effort.  Stay tuned!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112419942282591951?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112419942282591951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112419942282591951' title='38 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112419942282591951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112419942282591951'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/extreme-sharepoint-design-series.html' title='Extreme SharePoint Design Series'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>38</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112420083929805991</id><published>2005-08-16T06:38:00.000-07:00</published><updated>2005-08-16T07:06:07.943-07:00</updated><title type='text'>Extreme SharePoint Design: Site Definition File Differences</title><content type='html'>Creating a custom site definition from scratch can be a daunting task. Each file in the folder structure serves a particular purpose and many of them vary slightly from folder to folder - allitems.aspx is not the same in DOCLIB as it is in VOTING (see &lt;a href="http://heathersolomon.com/blog/articles/159.aspx"&gt;Heather's post&lt;/a&gt; for a complete list of files in each folder). Due to slight variances, there is no way to do a global search and replace to copy your customizations. Getting the correct code in each file is essential to maintaining SharePoint's functionality. Isn't there an easy way to solve this problem?&lt;br /&gt;&lt;br /&gt;The answer is - sort of. First, begin with a blank template file that has all the necessary components for that type (allitems.aspx, for example). Remember that many page elements require specific registrations and script files, so make sure your [HEAD] tags include all the necessary code blocks. Once you have a working template file, copy it into each directory, then add the code necessary for each list type.&lt;br /&gt;&lt;br /&gt;I have compiled a list of each file type along with the code elements that are unique to each list (folder) below, using the SPS site definition as a baseline (60\templates\1033\SPS). The code goes in various places but I tried to keep it sequential; that is, the first code block (individual blocks are separated by ***) goes first, then the second, and so on. Some are contextual (they contain more than just the unique code) to make searching and replacing easier. I also tried tgo keep all script elements together to insure that no code gets orphaned. Once you've modified a couple of files you'll know exactly where to place each block.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.theegroup.net/Sharepoint%20Portal%20Server/Sharepoint%20Articles/Site%20Definition%20Original%20Code%20(SPS).txt"&gt;Site Definition Original Code (SPS)&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Please note that I did not include files that are specific to a certain list type (such as calendar.aspx in EVENTS) only those that recur in multiple folders. In a subsequent post, we'll look at how these files differ from those in STS to show how a custom deployment can seamlessly incorporate both SPS and WSS in a unified design.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;NOTE ON CODE SAMPLES:&lt;/span&gt; Few things frustrate me more than not being able to cut and paste HTML code into Blogger's editor.  You would think they could solve this with a special tag like many discussion forums do, but if they have I sure don't know about it.  Until such a thing comes along, all  &lt;&gt;  tags will be displayed as [  and  ].  Sorry for the inconvenience.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112420083929805991?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112420083929805991/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112420083929805991' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112420083929805991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112420083929805991'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/extreme-sharepoint-design-site.html' title='Extreme SharePoint Design: Site Definition File Differences'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112325367721142659</id><published>2005-08-05T10:02:00.000-07:00</published><updated>2005-08-05T08:02:51.426-07:00</updated><title type='text'>Optimizing External Site Crawls</title><content type='html'>After launching &lt;a href="http://www.theegroup.net/txtlstvw.aspx?LstID=0c510949-16ba-486f-a03a-369f7102b97f"&gt;SharePoint Blogsearch&lt;/a&gt;, I discovered (with some help from &lt;a href="http://www.greghughes.net/rant/"&gt;Greg&lt;/a&gt;) that the SharePointPSSearch (SPSSearch) service needs a few tweaks to work well on external web sites. After doing some digging around in the documentation, looking into the packets with a protocol analyzer, and generally scratching my head in confusion, I learned a few things:&lt;br /&gt;&lt;br /&gt;1. SPSSearch does not always honor robots.txt files (this is a text file placed in the root directory of a web site that tells crawlers how to behave). Yes, the documentation says it does, and you can modify the id string in the registry, but it doesn't always seem to work. I'm still trying to come up with an answer to this one.&lt;br /&gt;&lt;br /&gt;2. By default, the crawler will request as many documents from the target site as it can fit into the available threads or until it starts receiving TCP errors; in other words, it will hammer an external site into submission. Fortunately, you can control this errant behavior. Go to &lt;strong&gt;SharePoint Central Site Administration Manage Search Settings&lt;/strong&gt;. In the &lt;strong&gt;'Site Hit Frequency Rules'&lt;/strong&gt; section, click on &lt;strong&gt;'Manage Site Hit Frequency Rules'&lt;/strong&gt;. Click &lt;strong&gt;'Add Update Rule'&lt;/strong&gt; on the toolbar. In the &lt;strong&gt;Site Name&lt;/strong&gt; field, enter &lt;strong&gt;"*"&lt;/strong&gt; for all web sites (you can also set rules by explicit name, domain, etc.). Next, click the &lt;strong&gt;'Limit number of documents requested simultaneously'&lt;/strong&gt; radio button and enter a small number (minimum is 1, max is 999, I used 5) in the &lt;strong&gt;Number of Documents&lt;/strong&gt; field. This will significantly reduce the load on target servers.&lt;br /&gt;&lt;br /&gt;3. Incremental updates are SUPPOSED to ignore content that has not been changed, crawling only those docs that have changed. In reality, this is not the case. I noticed that all documents were being processed even though the content was static. I tested a full update and incremental update on a static site and the exact same load was generated (packet count, bytes, etc.) in both a full and incremental update. This could be a bug or it could be some hidden registry setting somewhere that I haven't found yet. Any ideas would be appreciated.&lt;br /&gt;&lt;br /&gt;4. Adaptive updates only appear to work on SPS/WSS sites. According to the docs, adaptive updates make an educated guess, based on historical patterns, as to what content may have changed on a site. In theory, this should greatly reduce the load on a crawled site and it may very well work that way in SPS/WSS. It doesn't seem to have any effect on other types of sites but my test configuration was limited so I may not have all the data. Again, if anyone has any ideas, please share.&lt;br /&gt;&lt;br /&gt;More on this topic as I continue to tweak the settings.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/span&gt; If you want to learn more about search optimization, here is a &lt;a href="http://support.microsoft.com/default.aspx?scid=kb;en-us;284022"&gt;KB article&lt;/a&gt; to get you started.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;Update 2:&lt;/strong&gt;&lt;/span&gt; Here's another tip.  When creating an inclusion rule for a subdirectory on a site the default behavior is to also include the parent site.  For example, a new inclusion rule for &lt;a href="http://www.theegroup.net/blogs/"&gt;http://www.theegroup.net/blogs/&lt;/a&gt; would create two entries - one for the full path and one for the parent &lt;a href="http://www.theegroup.net"&gt;http://www.theegroup.net&lt;/a&gt;.  This means that any links to other URL's on the same site would be processed which greatly expands the scope of the crawl.  To restrict this behavior, change the parent rule to an exclusion and leave the child URL as an inclusion.  This will restrict the crawler to links under the child URL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112325367721142659?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112325367721142659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112325367721142659' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112325367721142659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112325367721142659'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/08/optimizing-external-site-crawls.html' title='Optimizing External Site Crawls'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112285856302031771</id><published>2005-07-31T18:07:00.000-07:00</published><updated>2005-07-31T18:29:54.103-07:00</updated><title type='text'>Custom Lists Article</title><content type='html'>&lt;a href="http://heathersolomon.com/blog/articles/1300.aspx"&gt;Here's&lt;/a&gt; a fantastic article from &lt;a href="http://heathersolomon.com/blog/"&gt;Heather&lt;/a&gt; on adding custom lists to a site definition.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112285856302031771?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112285856302031771/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112285856302031771' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112285856302031771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112285856302031771'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/custom-lists-article.html' title='Custom Lists Article'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112264696287873138</id><published>2005-07-29T07:15:00.000-07:00</published><updated>2005-07-29T07:22:42.896-07:00</updated><title type='text'>Useful Shortcuts</title><content type='html'>I love it when I'm just wandering around and find something truly useful (OK, I wasn't wandering - I used &lt;a href="http://www.theegroup.net/txtlstvw.aspx?LstID=0c510949-16ba-486f-a03a-369f7102b97f"&gt;SharePoint Blogsearch&lt;/a&gt; to find one thing and stumbled across another).  Here's a &lt;a href="http://mindsharpblogs.com/todd/archive/2005/02/11/285.aspx"&gt;post&lt;/a&gt; from &lt;a href="http://mindsharpblogs.com/todd/"&gt;Todd Bleeker&lt;/a&gt; regarding javascript links that toggle page modes in SPS and WSS.  I already new about appending ?toolpaneview=2 to the URL but this is even easier - and he explains what all the options are.  Very cool.  I had no idea you could do this with IE favorites.&lt;br /&gt;&lt;br /&gt;Also, here's a great &lt;a href="http://weblogs.asp.net/soever/archive/2005/01/03/345535.aspx"&gt;post&lt;/a&gt; from &lt;a href="http://weblogs.asp.net/soever/"&gt;Serge van den Oever&lt;/a&gt; on FrontPage and Data View Web Parts.  Very thorough and a must read.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112264696287873138?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112264696287873138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112264696287873138' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112264696287873138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112264696287873138'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/useful-shortcuts.html' title='Useful Shortcuts'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112256285134080263</id><published>2005-07-28T07:57:00.000-07:00</published><updated>2005-07-28T08:00:51.346-07:00</updated><title type='text'>Sharepoint Resource List</title><content type='html'>While responding to a &lt;a href="http://heathersolomon.com/blog/archive/2005/07/28/1272.aspx"&gt;post&lt;/a&gt; from &lt;a href="http://www.heathersolomon.com/Blog/"&gt;Heather&lt;/a&gt; on the proper uses of FrontPage with SPS 2003, I discovered her list of &lt;a href="http://heathersolomon.com/blog/articles/148.aspx"&gt;SharePoint resources&lt;/a&gt;.  Very handy.  Thanks, Heather!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112256285134080263?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112256285134080263/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112256285134080263' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112256285134080263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112256285134080263'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/sharepoint-resource-list.html' title='Sharepoint Resource List'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112233328667657623</id><published>2005-07-25T16:12:00.000-07:00</published><updated>2005-07-25T16:14:46.683-07:00</updated><title type='text'>SPS Report Utility</title><content type='html'>&lt;a href="http://blogs.msdn.com/ryanrogers/default.aspx"&gt;Ryan&lt;/a&gt; has posted a cool new utility for gathering SPS and system info.  Get it &lt;a href="http://blogs.msdn.com/ryanrogers/archive/2005/07/25/443147.aspx"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112233328667657623?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112233328667657623/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112233328667657623' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112233328667657623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112233328667657623'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/sps-report-utility.html' title='SPS Report Utility'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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-11919785.post-112231208203083950</id><published>2005-07-25T10:19:00.000-07:00</published><updated>2005-07-25T10:21:22.036-07:00</updated><title type='text'>TechEd 2005 SharePoint Webcasts Online</title><content type='html'>The webcasts from TechEd 2005 are now online.  Get them &lt;a href="http://www.wssdemo.com/Pages/TechED2005.aspx?menu=Resources"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112231208203083950?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112231208203083950/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112231208203083950' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112231208203083950'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112231208203083950'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/teched-2005-sharepoint-webcasts-online.html' title='TechEd 2005 SharePoint Webcasts Online'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112199462548883456</id><published>2005-07-21T17:54:00.000-07:00</published><updated>2005-07-21T18:36:28.733-07:00</updated><title type='text'>SharePoint Blogsearch</title><content type='html'>While &lt;a href="http://www.feedster.com"&gt;Feedster&lt;/a&gt; and &lt;a href="http://www.technorati.com"&gt;Technorati&lt;/a&gt; do a fine job searching general blog content we SharePointers are a bit out in the cold when it comes to searching posts from our fellow bloggers - not all posts have the keyword "sharepoint" and there is no way to set up a group of blogs to search. What are we to do?&lt;br /&gt;&lt;br /&gt;Well, thanks to the much-maligned-but-ever-so-useful SPS search, we have an answer. I've taken my &lt;a href="http://services.newsgator.com/ngws/Blogroll.aspx?uid=34141&amp;mid=1"&gt;blogroll&lt;/a&gt; and created content sources and a new search scope on my &lt;a href="http://www.theegroup.net"&gt;website&lt;/a&gt;. Just select the 'SharePoint Blogs' scope and go to it. Incremental updates run every 4 hours - I'll adjust it as necessary depending on search results and bandwidth consumption.&lt;br /&gt;&lt;br /&gt;If you've got a blog you want added to the list, &lt;a href="mailto:eshupps@theegroup.net"&gt;email&lt;/a&gt; me and I'll add it. Also, if you want to access the indexes (or any web services, for that matter) from your site and need a login account, just let me know.&lt;br /&gt;&lt;br /&gt;Happy searching!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112199462548883456?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112199462548883456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112199462548883456' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112199462548883456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112199462548883456'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/sharepoint-blogsearch.html' title='SharePoint Blogsearch'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112189560446611896</id><published>2005-07-21T09:00:00.000-07:00</published><updated>2005-07-21T06:58:50.680-07:00</updated><title type='text'>The SharePoint Vision</title><content type='html'>&lt;a href="http://www.heathersolomon.com/blog/"&gt;Heather&lt;/a&gt; kicked-off a mini-tsunami with her &lt;a href="http://heathersolomon.com/blog/archive/2005/07/19/1063.aspx"&gt;post&lt;/a&gt; on the SharePoint vision. &lt;a href="http://andrewconnell.com/blog/"&gt;Andrew&lt;/a&gt; then jumped in with a few more thoughts (&lt;a href="http://andrewconnell.com/blog/archive/2005/07/20/1764.aspx"&gt;here&lt;/a&gt; and &lt;a href="http://andrewconnell.com/blog/archive/2005/07/20/1769.aspx"&gt;here&lt;/a&gt;). &lt;a href="http://weblogs.asp.net/bsimser"&gt;Bil's&lt;/a&gt; got a few ideas in his response to Heather's article (see her original post).&lt;br /&gt;&lt;br /&gt;This is a good discussion. Anytime we stop writing code and start talking about the user is a step in the right direction. Heather has some very good points but one in particular is striking enough for me to add my two cents (I think we're up to a buck by now with everyone's input - or about 50 pence for my friends across the pond). She wonders why there aren't more general use web parts available to the SharePoint community. It's a good question with some uncomfortable answers:&lt;br /&gt;&lt;br /&gt;1) Skilled SharePoint developers are few and far between. Sure, there are lots of people who have worked with SharePoint in some capacity but very few who know what they are doing and are actually good at it. This is by far the most common complaint I hear from clients and one that causes me a great deal of grief when trying to find adequate resources for a project. We NEED more and better training. We NEED SharePoint certifications (Are you listening Microsoft? Four years on the market and no cert track? Are you kidding me?).&lt;br /&gt;&lt;br /&gt;2) The object model is preposterous. Yes, I know SPS was cobbled together quickly to meet market demands and WSS is just not that mature (props to MS for delviering a good product under those conditions despite what &lt;a href="http://www.informit.com/articles/article.asp?p=391848&amp;rl=1"&gt;Mike Drip&lt;/a&gt; may think); however, they've got to clean up the OM in the next release. I've seen firsthand how it frustrates many .NET programmers who could otherwise be writing good code instead of wrestling with SharePoint nuances. Simplify and productivity will improve.&lt;br /&gt;&lt;br /&gt;3) Due to #1 and #2 commercial web parts are very expensive. Solve these issues and the number of web parts will increase dramatically with a corresponding drop in prices. Developers should always be encouraged to profit from their efforts, so let's not expend a bunch of energy arguing about open source, community, freeware and so on. The profit motive is the most effective, so let's continue to encourage commercial development and take advantage of basic supply and demand principles - the more providers the lower the price. In fact, I'd like to see MS encouraging the &lt;a href="http://www.microisv.com/"&gt;Micro-ISV&lt;/a&gt; concept with new partner programs and support.&lt;br /&gt;&lt;br /&gt;4) No centralized web part repository. As Bil astutely points out, we have to scour the web to find web parts like we're caught in some gigantic SharePoint treasure hunt. We need a better way to organize, categorize, rank, and share feedback on every web part out there. MS has taken a good first step with the component directory but it's just cut-and-paste marketing speak - no objective reviews or comments. I'm all for Bil's SharePointForge idea.&lt;br /&gt;&lt;br /&gt;5) Corporate intellectual property restrictions. Many organizations don't want the result of their employee's efforts released into the wild without compensation. I see this happen more often than you might think. Right or wrong, and it's often a mix of both, they worry that competitors will benefit from their investment or that employees will spend their time supporting people other than their own internal users. Not to mention the most significant concern of all - liability. All it takes is one lawsuit to stop the flow of good code altogether. This is mostly a corporate culture issue but could be solved in some instances by better communication with management and pre-authorization from legal and marketing.&lt;br /&gt;&lt;br /&gt;Those are just a few of my thoughts. I encourage the community to keep this discussion fresh and in the fore.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;UPDATE I:&lt;/span&gt; While I'm on this soapbox, allow me to put in a plea to the developer community for standardization in product packaging. It's not that hard to compile a CAB file - don't make users jump through hoops to implement your code. Perhaps this should be a requirement in whatever centralized directory scheme is (hopefully) implemented - poor packaging equals poor ranking and fewer downloads. Some sort of incentive system for highets rankings and most downloads would be great as well.&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#ff0000;"&gt;UPDATE II:&lt;/span&gt; For anyone that is interested I would be willing to host the directory on my SharePoint server (c'mon, it has to be in SharePoint, doesn't it?). I don't think I can handle the storage and bandwidth for all the downloads but I would be more than happy to host and maintain the code. Any takers?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112189560446611896?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112189560446611896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112189560446611896' title='25 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112189560446611896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112189560446611896'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/sharepoint-vision.html' title='The SharePoint Vision'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>25</thr:total></entry><entry><id>tag:blogger.com,1999:blog-11919785.post-112195366269752944</id><published>2005-07-21T06:43:00.000-07:00</published><updated>2005-07-21T06:47:42.710-07:00</updated><title type='text'>Site Navigator v2.0 Beta</title><content type='html'>&lt;a href="http://sharepoint.advis.ch"&gt;Advis&lt;/a&gt; has just released a beta version of &lt;a href="http://sharepoint.advis.ch/default.aspx?tabid=44"&gt;Site Navigator v2.0&lt;/a&gt;.  This is by far my favorite site navigation web part.  &lt;a href="http://sharepoint.advis.ch/Default.aspx?tabid=41"&gt;Download&lt;/a&gt; the free beta release now (registration required) and post some feedback to the Advis team - they're a crack bunch who really want to hear about any product issues and/or feature requests.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/11919785-112195366269752944?l=sharingpoint.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://sharingpoint.blogspot.com/feeds/112195366269752944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=11919785&amp;postID=112195366269752944' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112195366269752944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/11919785/posts/default/112195366269752944'/><link rel='alternate' type='text/html' href='http://sharingpoint.blogspot.com/2005/07/site-navigator-v20-beta.html' title='Site Navigator v2.0 Beta'/><author><name>Eric Shupps</name><uri>http://www.blogger.com/profile/05832504036790762785</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>4</thr:total></entry></feed>
