Saturday, October 6, 2012

Adding Content to a SP 2010 Master Page

 

There are situations when we need some external content to be displayed in the master page, and at the same time allow users to easily update this content without much hassles of code-changes to the master page. I went hunting for the same and eventually identified a few of them. Here’s a compilation of what I felt beneficial to all. Let me know, if you have more on your list.

#1. You can create a user control and insert into the Master page footer. Click here for more details.

#2. You can insert the webpart directly into the Master page footer. Let’s see how.

<table cellpadding="0" cellspacing="0" width="875" align="left">
  <tr><td>
      <WebPartPages:ContentEditorWebPart AllowClose="true" AllowEdit="false" AllowHide="false"
                    AllowMinimize="false" AllowRemove="false" AllowZoneChange="false" ChromeType="None"
                    ContentLink="/Documents/Footer.htm" ID="vha_simple_footer" runat="server"
                    __WebPartId="{9AADFFEC-FA65-4BB7-BAE6-4DA3A85A56A0}" WebPart="true"></WebPartPages:ContentEditorWebPart>
   </td></tr>
  </table>

#3. In case your site pages are all based upon few Page Layouts, you “might” place some ContentPlaceHolders on these page-layouts, and then add the footer code into a content editor web part on a page that is based upon the Page Layout. Refer this article from Bamboo Solutions for a complete details on creating a custom page layout for a Publishing Site using Visual Studio 2010

#4. You may also use “Reusable Content” in SP Publishing HTML fields to achieve the same. Find here.

#5. Then there are IFrames, the old ways of displaying a web page content. Well, I know, most of us would start a discussion around the SEO, when we talk about IFrames on the pages. But it still works and provides another way to get external content into a master page. (Although, I personally know, how powerful iframes programing can be. Check here.)

This is how to get this in place. Insert the below piece of code, in the footer section of the master page:

<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr><td>
       <iframe src="/Documents/Footer.htm" scrolling="no" frameborder="0">[Your browser does not support frames or is currently configured not to display frames. Please use an up-to-date browser that is capable of displaying frames.]</iframe>
</td></tr></table>

Next, upload the “Footer.htm” file with appropriate code in the [Documents] document library of the root site. I have a sample code for this file as:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head></head>
<body>
<div align="center"><span style="font-size:10pt">External footer content example</span></div>  </body>
</html>

I agree, this one is not the best of the practices, and I would advice not to consider this as a first hand solutions when other options might be more suitable for similar scenarios.

Sunday, September 23, 2012

Site Image Logo in SP 2010

 

Seems very simple, when it comes to setting up a Logo Image for your SP 2010 Site and its sub-site.

Use the LogoImageUrl to set the path of the image (say in “Layouts” folder) in the <SharePoint:SiteLogoImage> as seen below:

<SharePoint:SPLinkButton runat="server" NavigateUrl="~sitecollection/">
             <SharePoint:SiteLogoImage LogoImageUrl="/_layouts/mysitename/my_site_logo.gif" runat="server"/>
</SharePoint:SPLinkButton>

But things get a little complicated, if a Site Admin sets a different image in the [Site Settings] – [Title, Description and Icon] under “Look and Feel”.

image

It seems that this property tends to override the master-page LogoImageUrl in the <SharePoint:SiteLogoImage> as shown in the code above.

So the Solution:

- Clear the [Title, Description and Icon] field under “Look and Feel” section in [Site Settings]. I mean set it to blank or update it to the same image as set in the master-page.

But what if you have 100s of sites/sub-sites (in my case, there were 1500 sub-sites).

Power-shell to our rescue….

PS script can help us do the update needed very conveniently. That’s why we all love PS in SP 2010.

So here it is. Simply replace your own site URL and the Image path and run this script.

$site = Get-SPSite http://www.mysitename.com
$site.AllWebs | foreach { $_.SiteLogoUrl = "/_layouts/mysitename/my_site_logo.gif"; $_.Update() }
$site.Dispose()

That’s all we need to do.Have a nice day !!!

Saturday, September 8, 2012

Custom 404 Page Not found in SharePoint 2010

 

Well, now that we have successfully upgraded the MOSS 2007 sites to SharePoint 2010, there was a slight change in the URL structure in the new environment. In 2010, the site collection was moved to the top root level, more details on how to do this can be found here, as described below:

MOSS 2007: http://www.domianname.com/sitename/Pages/Home.aspx

SP 2010: http://www.domianname.com/Pages/Home.aspx

The issues that were identified:

#1. Bookmarked URLs might break for current users.

#2. The embedded deep-links in various email notifications already sent, may not work anymore.

#3. The various links to many pages, made available on other sites may start breaking with a page not found error.

The quick resolution that was agreed upon:

To implement a generic, custom page that should be displayed each time a user hits a 404 page not found error. This page would have a generic message and a link to take the user back to the home page.

How we did this:

Step 1: Create a meaningful 404CustomPage in the Site-Collection

a. Open-up the site and create a new Web-Part page in the Pages Library. Call it :”MyCustom404.aspx”.

b. Note the page URL; it should be “/Pages/MyCustom404.aspx”.

c. Design the page as per the business requirements by inserting Content Editors and Image web parts.

d. Place a generic but meaningful text on a content editor along with a link pointing back to, say, Home page.

Step 2: Create the Web Config Entries for the Web Application

a. Open-up the web-config file for the web application.

b. Create an entry for <httpErrors> section within the <system.webServer> as below:

<httpErrors errorMode="Custom" existingResponse="Auto">

<remove statusCode="404" subStatusCode="-1" />

<error statusCode="404" prefixLanguageFilePath="" path="/Pages/MyCustom404.aspx" responseMode="ExecuteURL" />

</httpErrors>

c. Save the config file and do an IISRESET.

Now go back and try to browse to a non-existing page on the site and you should see the custom 404 page being displayed.

Improvements that I can think of:

1. We can have a redirect logic on our custom 404 page to programmatically fix the url and redirect the user to the new page url.

2. We can also create a SP 2010 Solution package to automate the process of updating the web config file. This really helps in a multi-environment deployments by the admins.

I hope to get this improvements in-place in the next couple of weeks. I’ll update this post with the link to my new post so till then, have a nice time.

Sunday, August 26, 2012

Office 365 Enterprise Preview & SP 2013

So….now we are all talking about Apps in SharePoint 2013 and its integration with Office 365. Well it’s all about developing in the “Cloud” and more like what we are used to hear about SharePoint Online, Apps, Agave, Napa, etc.…..

Microsoft has introduced so many new terms that it is becoming really challenging for all developers (and for the whole SharePoint community) to keep pace with the whole new stack of new technology. So you might be wondering…what are we trying to come out with here!

Well….I am going to simply bring some basic concepts of “Getting There”. Not try to deal all at once and confuse you all, lets try to begin with Office 365.

First of all we need to have an account to start using this. Microsoft has this Office 365 Registration Form where you can get an account created quickly. And this being the “Enterprise Preview”, you have the leisure of using it until the Preview is made available by Microsoft.

Once you have your account setup, your Dashboard should look like this:

image

Click on “service settings” from the left navigation. This will bring up a new top navigation bar, click “sites”. On the next page, click “Create site collection”.

image

Click OK and you’ll be taken to the below SharePoint Administration Center page:

image

If we open the first URL in the Site Collections, which should read something like: https://yourcompanyname.sharepoint.com

And because you are the Administrator of this site, you can see the Home page of your site.

image

Disclaimer: The steps mentioned in this post are for the “Office 365 Preview” only. Things are expected to change and may not be the same after the Preview ends and Microsoft moves on to a new release.

So this is all in this part. I’ll talk more about how and what we can do with the available Apps and Downloads sections that we see here.

Saturday, August 25, 2012

Conditional Javascript in QuickLaunch bar

 

This is a great help !

The ability to display some conditional pop-ups/dialog boxes to the end-users when they click on various links on the Quick Launch bar items, seems a great idea.

I was looking to present a message to the users, whenever they clicked a certain hyper-link on the left navigation.

I wanted them to understand, that they are navigating away from their current site to a page url that might be externally hosted.

This is what really helped me do the same:

javascript: if(confirm(‘You are being re-directed to a site hosted externally. Click OK to proceed, Cancel to stay on the page.’)) document.location=’http://www.bing.com’;

Note: The above line of code being typed in a single line.

Thanks to my colleague Mike Smith for posting this trick with many other options as well.

Friday, December 23, 2011

Deploying SSRS 2008 Reports to SharePoint 2010 sites in Integration mode

 

Scenario: We have SSRS 2008 R2 configured for SharePoint 2010 Integration mode.

Requirement: We as a BI Developer, need to develop and deploy the reports to the SharePoint sites.

Walkthrough:

Step 1: Fire up BIDS – New Project – Select “Report Server Project” from the templates – Name the project “MyFirstReport” – Click OK.

Step 2: Let’s create the Shared DataSource. Right click the [Shared DataSources] in Solution Explorer and click “Add New DataSource” – Fill the [General] Section with the Name=”DataSource1”, Type=”Microsoft SQL Server” and edit the ConnectionString. We’ll select “Use Windows Auth” to connect to our DB for this example (This may vary based upon your Authentication mechanism).

Leave the [Credentials] Section with “Windows Auth” selected. Click Okay and you should see the DataSource1.rds created in the Solution Explorer.

Step 3: Now let’s create a report. Right click the [Reports] in Solution Explorer and click “Add New Report” – Go through the Report Wizard using the DataSource1.rds that we created earlier – Build your query by adding the appropriate tables – Select your Report Type (Table/Matrix, I’ll select Table) – Design your Table (I added all fields to the Details section) – Choose Table Style (Corporate) – Finish the wizard by naming the report “Report1”. You should see the Report1.rdl in the Solution Explorer.

Step 4: At this point, you can build the report and switch to the preview tab to view the report.

Step 5: It’s time for deploying our reports. Quite simple, just right-click on the project and deploy (if you want all the datasources and reports to be deployed in one go, else you can deploy them individually). Okay, right-click and deploy, uh Oh ! what happened. This is not what we wanted to see.

image

Okay, we never provided the SP Site URLs. Also, we need to make sure and plan where will our Datasources and reports should be deployed on the site.

Step 6: So let’s create the Document Libraries, one for Datasource and another for Reports. Browse the SP site and create them now. I created the following: [DataSources] and [Reports] without the braces [ ].

Step 7: Now, let’s get back to our BIDS project. Right click on the project and choose Properties. There you are, if you see the values there, they are the default values for SSRS in Native Mode.

image

So we need to change them to comply with our needs. Modify them as shown here:

image

Ok now that looks better. Let’s try to deploy again. It should do just fine. Browse to the “Reports” library on the site and click on the

You should be able to see the report.

Thursday, December 22, 2011

Configuring Anonymous access on SP2010 sites

The steps involved in enabling anonymous access to a SharePoint 2010 site are very similar to what we have been doing in MOSS 2007, so I won’t go into details of everything and do a quick walkthrough for achieving the same in SP 2010.

So here are the basic steps:

Step 1: Create the Web Application and the Site Collection.

Step 2: Select the Web App in [Manage Web App] section.

Step 3: In the ribbon, click [Authentication Providers].

Step 4: You’ll only see the “Default” zone, if you have just followed my instructions above and have not extended to any other zone. So, click the Default from the list.

Step 5: Select the check-box for [Enable Anonymous Access] and leave the [Windows Authentication] section as it is. You want this to sign-in using your AD account and grant access for “anonymous” users in the next step. (You may also want this to let you make additions/modifications to the site later.)

Step 6: Click Save.

Step 7: Next, login to your site using your AD account as the Site Collection owner.

Step 8: Go to [Site Permissions] – [Anonymous Access] on the ribbon – Then select “Entire Site” – Click “OK”.

Step 9: Once you are done with all changes/updates to your done, follow the Steps 2 through Step 5 again and uncheck the [Windows Authentication] and Click Save.

Step 10: You might get the error “401”, if you try to refresh the page after Step 9. In this case, clear your cache, close all the browser instances and try again. You’ll be able to get to the site without any login prompt.

So there it is. In just 10 steps you have been able to setup an anonymous site.

Thursday, November 3, 2011

Visual Studio Express 11 Preview – Designer not showing up

 

Okay, so now I have a Windows 8 Preview VM setup ready. The first thing that I wanted to get started with was the Metro Style Apps. Excellent !!!

Fired up my Visual Studio environment, created a new Metro C# Project and hit the very first wall. The designer view of my HelloMetro.xaml did not show up and instead gave me this error:

“Exception from HRESULT: 0x80270232" ………………

Wow, have worked quite a bit on Silverlight projects based on XAML but never seen anything such. Tried looking into the namespace of each of the .xaml and .cs files, even tried deleting and re-creating the project again.

But looks like there is a pre-requisites for the Metro-Style Apps here.

We need to set the VM resolution to anything higher than 1024X768.

There we go, it worked !!!

Sunday, October 23, 2011

InfoPath 2010 form publishing issues

Getting the InfoPath forms to render on the enterprise browsers may not be a simple approach.

I was left hunting for the below reason, when I started to publish a “Feedback Form” to a SharePoint 2010 Form Library.

I received the following error message “This form template is browser-compatible, but it cannot be browser-enabled on the selected site…”

image

Looking at the 3 different reasons listed in the popup, I knew I had my Form Services running. So wanted to check on which features should be available on the site collection.

Let’s go to Site Setting – Site Collection Features.

If we scroll down to verify the “SharePoint Server Enterprise Site Collection features”, that looks like was not activated by default. This feature as it describes enables the site collection to leverage the InfoPath Form Services along with several others. So let’s go ahead and “Activate” it.

image

Behind the scenes, it appears that activating this feature creates a “Form Templates” document library.

image

And that’s it. Let’s go ahead and try to publish our form again…successfully published !

Tuesday, October 18, 2011

DNS Validations in a SharePoint 2010 web parts

Recently, I got to perform a task during a SharePoint 2010 web part development, where it was required to check for the DNS validity. I needed to see if a newly built virtual-server was hosted correctly and DNS settings updated accordingly to make the server available over the enterprise network.

To start with, we need to make use of the class [IPHostEntry] available to us in the System.Net namespace. This will provide us a container class for Internet host address information. So we need to add this to the Project References and include the using statement:

using System.Net;

We will also use the [Dns] class in the System.Net namespace which will provide the simple domain name resolution functionality. This class has the GetHostEntry() method that will resolve the host name for us to an IPHostEntry instance.

So let’s jump into the code. Assuming, we have a textbox “txtServerName” and a button on the form named “btnValidate”.

protected void btnValidate_Click(object sender, EventArgs e)

{

  if (Page.IsPostBack)

  {

    string[] strRetValue = { "0", "0", "0" };

    strRetValue = ValidateDNS(txtServerName.Text.ToString());

    if (strRetValue[0].ToString() == "0")

    {

      //Display the error message: "DNS Validation failed!

      //Please  verify the name of the server or check if the server

      //has been provisioned correctly."

      …….

      //Your code when validation fails.

    }

    else

    {

// Display the Success message: "DNS Validation SUCCEEDED."

    …….

    //Your code.

   }

}

}

In the above code, we are simply trying to call the ValidateDNS() method. We pass the name of the server to be validated and grab the results of validation in the array of strings strRetvalue[].

This array contains two elements.

- 1st element would store either a “0” = InValid or “1” = Valid.

- 2nd element would store the actual host name if 1st element is “1” and NULL if it’s “0”.

- 3rd element would store any validation error messages generated.

So when we return from the ValidateDNS() call, we check to see the first element.

If it is equal to “0”, the validation had failed, else succeeded.

Now it’s time for the actual validation code.

Here’s what it looks like:

private string[] ValidateDNS(string p)

{

    string[] retValue = { "0", "0", "0" };

    try

    {

        IPHostEntry ipEntry; //The IP or Host Entry to lookup

        char[] myArray = "aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ-".ToCharArray(); //Value of alpha characters

      if (p.IndexOfAny(myArray) != -1) //If we see alpha characters,

      //that means it’s a forward lookup

     {

        //Resolve a host name to IPHostEntry instance.

        ipEntry = Dns.GetHostEntry(p.ToString());

        //Count returns number of elements in sequence.

        if (ipEntry.AddressList.Count() > 1)

       {

             retValue[0] = "1"; // Valid

             retValue[1] = ipEntry.HostName.ToString();

       }

      else

            retValue[0] = "0"; //InValid

   }

    //If no alpha characters, then it’s a reverse lookup

    else

    {

        ipEntry = Dns.GetHostEntry(p.ToString()); //Resolve it

    }

}

catch (System.Net.Sockets.SocketException se)

{

//The system had problems resolving the address passed.

retValue[2] = se.Message.ToString();

}

catch (System.FormatException fe)

{

//Some non-unicode characters were passed.

retValue[2] = fe.Message.ToString();

}

return retValue;  //Finally return the array.

}

I have explained each line of code with comments inline, so it shouldn’t be that hard to understand here.

This was all that was needed to do the DNS validation in a C# web-part code.

Technorati Tags: ,,