Share via


Another CRM -> Sharepoint integration

Here is my first blogpost in English since I received requests from non speaking
Swedes. The MSCRM team, Kjell-Sverre Jerijærvi
(Integrating
team-sites into MSCRM (part II)
) and allot of others has published different
ways of integrating MSCRM with Sharepoint. Guess what! Here is another solution
actually made back in 05’ as a Proof of concept solution… Each Account has its own
sharepoint library structured under an alphabetic label (dummy library). This is
done initial on setup of libraries A,B,C,D etc. A custom Sharepoint template is
used for MSCRM look and feel (not in scope of this blogpost)

For example Alfa Demo Account is stored as own library under letter A with it's
url stored on the MSCRM.

SPSite site = null;

try

{

site = new SPSite(wssServerUrl);

SPSite newSite = site.SelfServiceCreateSite(rootUrl, siteName,

description, 1053, "STS", @"custom\mscrm", "Admin",

"mscrm@custom.local", @"custom\mscrm", "Admin", "mscrm@custom.local");

SPWeb web = newSite.OpenWeb();

web.Webs.Add(nextLevelSiteName, nextLevelSiteName, description, language,
template, false, false);

}

catch (SPException err)

{

System.Diagnostics.Debug.WriteLine(err.Message);

throw;

}

catch (Exception err)

{

System.Diagnostics.Debug.WriteLine(err.Message);

throw;

}

finally

{

site.Dispose();

}

A new chrome remover file is stored under its own web.

MSCRM_iframe.aspx cleaner removes chromes
from library files

<%@ Page Language="C#" %>

<%string sUrl = Context.Request["url"];%>

<!DOCTYPEHTMLPUBLIC"-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>MSCRM
Integration</title>

<scriptlanguage="Jscript">

var iNavCount=0;var strValidPages="AllItems.aspx,Upload.aspx,Checkin.aspx,EditForm.aspx,DispForm.aspx,Versions.aspx,SubNew.aspx";var strOriginalUrl="<%=sUrl%>";function
evReadyStateChange()

{var oFrm=document.frames.mscrmShowPage;var
ofrmElement=event.srcElement;try{var sDoc=oFrm.location.pathname;sDoc=sDoc.substring(sDoc.lastIndexOf("/")+1);if(ofrmElement.readyState=='loading'){ofrmElement.style.display="none";oFrm.onerror=function(){return
true;}}else if(ofrmElement.readyState=='complete'){var
bValid=false;iNavCount++;var
arrTmp=strValidPages.split(",");for(var
s in arrTmp)if(arrTmp[s]==sDoc)bValid=true;if(!bValid){document.location.assign("MSCRM_error.aspx?rUrl="+location.href);}else{try{var
oTable=oFrm.document.all.tags("table")[0];oTable.rows(0).style.display="none";oTable.rows(1).style.display="none";oTable.rows(2).cells(0).style.display="none";oFrm.document.all("diidEditInGridButton")[0].parentNode.parentNode.style.display="none";oFrm.IMNShowOOUI=function(){return
false;};}catch(e){}

oFrm.document.body.insertAdjacentHTML("beforeEnd","<a href='#' onclick='window.open(location.href)'
class='ms-formdescription' style='position:absolute;top:10px;right:10px;color:blue'>In
new window</a>");ofrmElement.style.display="inline";}}}

catch(e)

{}}

</script>

</
head >

<
body style ="margin:0 0 0 0">

<%if (sUrl!=null) {%>

<iframeid="mscrmShowPage"frameborder="0"height="100%"width="100%"onreadystatechange="evReadyStateChange()"style="display:none"src="<%=sUrl%>"></iframe>

<%}%>

</
body >

</html>

On MSCRM server a new virtual directory
(or new web according to ISV rules) holds files to link it all to WSS or Sharepoint
side.

<divclass="tab"id="tabBody1"style="DISPLAY:
inline">

<tableid="Table0"style="TABLE-LAYOUT:
fixed"height="100%"cellSpacing="0"cellPadding="3"width="100%">

<tr>

<td>

<iframeid="Iframe0"frameborder="0"width="100%"height="100%"src="<%Response.Write(ConfigurationSettings.AppSettings["PathToMSCRM"].ToString());%>/SharePointConnector/_redirect.aspx?<%Response.Write(Request.QueryString);%>&Folder=1"></iframe>

</td>

</tr>

</table>

</div>

Clip from AccountCreateFrame.aspx .

I added 2 keys in MSCRM’s web.config
for dynamic settings

<appSettings>

<addkey="PathToMSCRM"value="https://crm/Beta.Crm.Sharepoint/"/>

<addkey="SharePointServerIframe"value="https://sharepoint/_layouts/CRM/MSCRM_iframe.aspx?url="/>

</appSettings>

I prefer to add everything on the leftside navigation
and that could be easily done by modification of ISV.config
or by injecting js script in from onLoad

Documents added in
ISV.config pointing <PathToMSCRM> Accountcreateframe.aspx

You can download all files here
and hopefully everything is clearer when you look at the code J

NOTE!!! You are required to
have licenses for SharePoint server

Not Supported example code.zip

Comments

  • Anonymous
    March 24, 2007
    PingBack from http://www.virtual-generations.com/2007/03/24/sharepoint-2007-link-love/

  • Anonymous
    October 05, 2007
    I have a HTTP handler as shown below. It works for one user (that's me), but not for other users on the fareast.corp.microsoft.com domain. I am on the same domain. What the problem could be? public class SyncHandler : IHttpHandler    {        byte[] fileBytes = new byte[256];        public bool IsReusable        {            get { return false; }        }        public void ProcessRequest(HttpContext context)        {            context.Request.SaveAs(@"c:\request.txt", true);            context.Response.Write("From main handler ");        }    } COuld it be that the handler dll, in which this class is defined, doesn't allow other users to access "c:"? Please advise. I couldn't find another place for this query. My apologies for any inconvenience. I am using handler to process POST requests for a SP site. So I have set WSS trust settings properly.

  • Anonymous
    July 25, 2008
    The comment has been removed