Declare Function PortalOpen PeopleCode FUNCLIB_PORTAL.PORTAL_GEN_FUNC FieldFormula; Function FindCRefByMenuComponentMarket(&oPortal As ApiObject, &sMenuComponentMarket As string) Returns ApiObject Local ApiObject &oNodeColl = %Session.GetNodes(); Local ApiObject &oNode = &oNodeColl.First(); While All(&oNode) If &oNode.IsLocal Then Local string &sTestURL = &oNode.ContentURI | &oPortal.Name | "/" | &oNode.Name | "/c/" | &sMenuComponentMarket; Local ApiObject &oTestCRef = &oPortal.FindCRefByURL(&sTestURL); If All(&oTestCRef) Then Return &oTestCRef; End-If; End-If; &oNode = &oNodeColl.Next(); End-While; Return Null; End-Function; Function FindCRefByUrl(&oPortal As ApiObject, &sURL As string) Returns ApiObject REM Have to remove any query strings before looking up the content reference; Local string &sTestURL = &sURL; Local number &nQueryPos = Find("?", &sURL); If &nQueryPos > 0 Then &sTestURL = Left(&sTestURL, &nQueryPos - 1); End-If; Local ApiObject &oTestCRef = &oPortal.FindCRefByURL(&sTestURL); Return &oTestCRef; End-Function; REM Takes in a reference ; Function iScript_DrillToCref() Local ApiObject &oPortal = PortalOpen(); Local ApiObject &oCref; Local string &sSearchingFor; Local boolean &bIsFolder = False; REM Are we drilling by the entire URL? ; Local string &sCrefURL = %Request.GetParameter("crefurl"); If All(&sCrefURL) Then &sCrefURL = Unencode(&sCrefURL); If Find("IsFolder=true", &sCrefURL) > 0 Then &bIsFolder = True; Local number &nFolderNameStart = Find("pt_fname=", &sCrefURL) + 9; Local number &nFolderNameEnd = Find("&", &sCrefURL, &nFolderNameStart); If &nFolderNameEnd = 0 Then &nFolderNameEnd = Len(&sCrefURL); End-If; Local string &sFolderName = Substring(&sCrefURL, &nFolderNameStart, &nFolderNameEnd - &nFolderNameStart); &oCref = &oPortal.FindFolderByName(&sFolderName); &sSearchingFor = " folder " | &sFolderName; Else &oCref = FindCRefByUrl(&oPortal, Unencode(&sCrefURL)); &sSearchingFor = &sCrefURL; End-If; Else REM Did we get the menu.component.market as one parameter? ; Local string &sMenuComponentMarket = %Request.GetParameter("menucomponentmarket"); If None(&sMenuComponentMarket) Then REM Otherwise take the parameters one by one; Local string &sMenu = %Request.GetParameter("menu"); If None(&sMenu) Then %Response.Write("menu is a required parameter"); End-If; Local string &sComponent = %Request.GetParameter("component"); If None(&sComponent) Then %Response.Write("component is a required parameter"); End-If; Local string &sMarket = %Request.GetParameter("market"); If None(&sMarket) Then REM Default to GBL; &sMarket = "GBL"; End-If; &sMenuComponentMarket = &sMenu | "." | &sComponent | "." | &sMarket End-If; &sSearchingFor = " component " | &sMenuComponentMarket; &oCref = FindCRefByMenuComponentMarket(&oPortal, &sMenuComponentMarket); End-If; If All(&oCref) Then REM Generate a URL to open the content reference in the portal admin page; Local string &sCRefAdminURL; Local string &sAdminComponent = Component.PORTAL_CREF_ADM; If &bIsFolder Then &sAdminComponent = Component.PORTAL_OBJ_LIST; End-If; &sCRefAdminURL = GenerateComponentContentURL(%Portal, %Node, MenuName.PORTAL_ADMIN, "GBL", @("Component." | &sAdminComponent), "", ""); If &bIsFolder Then &sCRefAdminURL = &sCRefAdminURL | "?PORTALPARAM_FNAME=" | &oCref.Name; Else &sCRefAdminURL = &sCRefAdminURL | "?Action=C&PORTALPARAM_PNAME=" | &oCref.ParentName | "&PORTALPARAM_CNAME=" | &oCref.Name; End-If; %Response.RedirectURL(&sCRefAdminURL); Else %Response.Write("Could not find content reference while searching for: " | &sSearchingFor); End-If; &oPortal.Close(); End-Function;