Pages

Showing posts with label opentext. Show all posts
Showing posts with label opentext. Show all posts

Wednesday, April 22, 2015

Installing CMS 9 on Windows 2008 R2 with Oracle 10g

Recently I have been tasked with installing CMS 9 on Windows 2008 R2 with Oracle 10g.  It has been an adventure.
  1. Install the Oracle Client.  Make sure the oracle client version 10.2.0.0 or 10.2.0.1, NOT any other version because other versions are not recommended for CMS 9.  When asked what type of installation, select Administrator, which comes with almost all components, including the ones CMS 9 needed: SQL Plus, Oracle Provider for OLE DB, and Oracle Data Provider for .NET.
     
  2. Configure Oracle client and ensure the Oracle database is reachable via TNSPING.
     
  3. The existing CMS 9.0 installer is not Windows 2008 R2 compatible.  CMS 9 SP1 is Windows 2008 R2 compatible, but it is not available as a stand alone installer.  Download the CMS 9.0 installation .zip file, download the latest CMS 9 SP1 patch (9.0.1.95), unzip both .zip files, merge the two folders.
     
  4. Move the now merged CMS 9 installation folder to C:\.  Rename the CMS 9 installation folder to something simple with no special characters.  The path to the setup.exe is something like "C:\CMS9\setup.exe".  This is important, else one will encounter oracle connection errors later.
     
  5. Right click on setup.exe and click on "Run as Administrator" to begin the installation process.
     
  6. Ensure the CMS installation path is something simple like "C:\RedDot", else there will be oracle connection errors.
     
  7. Proceed through the installation process, before clicking on "finish", do the following to ensure the post installation database modification process starts after the oracle client, else there will be oracle connection errors.

    Open notepad, write "run once", press "ENTER".

    Clicking "finish" on CMS installation screen.  The installer will attempt to restart the machine, but the unsaved notepad file will halt it.

    Open regedit, navigate to "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\RunOnce"

    Copy and paste the installer entry value into notepad, save notepad file.

    Restart server.
  8. Open command prompt by "Run as Administrator", copy and paste in the runonce installer entry value saved previously, press "ENTER".
     
  9. Complete the rest of the CMS installation.

Friday, December 12, 2014

Last Modified Report

Download

Screenshot


Compatibility
  • 7.x
  • 9.x
  • 10.x
  • 11.x

Description
  1. Generate report based user name, content class, and last modified date
  2. Generated report can be saved to a CSV format

Accessibility
  • In SmartTree, Start -> Administer Content Classes, action menu, Last Modified Report
  • In SmartTree, Start -> Administer Content Classes -> [Content Class Folder] -> [Content Class], action menu, Last Modified Report

Thursday, November 13, 2014

Management Server and Content Server Integration Details

  1. A link a document is assigned in a text editor
  2. Going into source code view in the text editor, you should see
  3. [ioID]2D7611CC2E8D412EA25B5BD322333DC4 refers to the GUID of the integration folder
  4. In the project database end, the corresponding entry is created (via RQL by the application)
    THB3 is the folder guid
    THB1 is the mapping key from the text editor entry to the DB table entry
    THB4 is the mapping key information from Management Server to Content Server (NOTE OBJECTID)

Wednesday, September 10, 2014

Windows 2012 and Management Server 11 Installation Note

Even for basic installation, that is without the mobile client, prior to Management Server installation, ensure to go to Windows Server Manager, navigate to Add Roles and Features Wizard > Select Features > Features > .NET Framework 4.5 Features > WCF Services and select HTTP Activation.

This is important. Else one will get an error when creating a text placeholder or saving text to a text placeholder.

The error is a complaint about not about to access /cms/webservice/Elements.svc/

RedDot CMS Date Conversion in MS 11

Since COM and DCOM is going away in Management Server 11, the following RedDot date conversion code using "RDCMSAsp.RDPageData" may not work.

ASP (From RQL Manual)
...
' From an RQL assign a value to a variable
OldDate = EinObjekt("changedate")

' Convert value by calling the DecodeDate function
' and output in both variants.
response.write "Date from attribute=" & OldDate & " --> Convert date=" & DecodeDate(OldDate)
...

Function DecodeDate(OldDate)
    Dim objIO As Object                              ' Define object
    Set objIO = CreateObject("RDCMSAsp.RDPageData")  ' Create object
    DecodeDate = objIO.decodedate(OldDate)           ' Convert number into date
End Function

Here are the new code that should work in all versions.

ASP
Function ConvertToRedDotDate(DateObject)
    ConvertToRedDotDate = DateDiff("d","12/30/1899", DateObject)
End Function

Function ConvertFromRedDotDate(RedDotDate)
    Dim DateObj, Int_Days
    DateObj = "12/30/1899"
    Int_Days = Int(RedDotDate)
    DateObj = DateAdd("d",RedDotDate,DateObj)
    DateObj = DateAdd("s",(RedDotDate-Int_Days)*86400,DateObj)
    ConvertFromRedDotDate = DateObj
End Function

C#
DateTime DecodeFromOADate(double OADate)  
{  
    return DateTime.FromOADate(OADate);  
}  
  
double EncodeToOADate(DateTime RegDate)  
{  
    return RegDate.ToOADate();  
}  

JavaScript
function ConvertToRedDotDate(DateObj)
{
    // day in milliseconds
    var DAY_IN_MILLISECONDS = 1000 * 60 * 60 * 24;
    var BEGINING_DATE_MIllISECONDS = new Date(1899,11,30).getTime();

    var DateObj_Milliseconds = DateObj.getTime();

    return Math.round(Math.abs(DateObj_Milliseconds - BEGINING_DATE_MIllISECONDS)/DAY_IN_MILLISECONDS);
}

function ConvertFromRedDotDate(ReddotDate)
{  
    var days = Math.floor(ReddotDate);
    var milliseconds = Math.round((ReddotDate-days)*86400000);
    var adjusted_days_in_millseconds = (days-25569) * 86400000;
    var RetDate = new Date();
    RetDate.setTime(adjusted_days_in_millseconds + milliseconds);
    var ajusted_minutes = RetDate.getTimezoneOffset();
    RetDate.setMinutes(RetDate.getMinutes() + ajusted_minutes);
 
    return RetDate;  
}

Monday, August 25, 2014

CMS/WSM/MS won't accept a license key

If CMS doesn’t accept a key that is supposed to be working, you might want to update the database settings manually.

  1. Logon to the Database and navigate to Databases -> IoAdministration -> Tables -> dbo.IO_CMP
  2. Right click and choose open table
  3. Make sure that there is the correct server name or the IP address of the CMS server is in the column CMP2. CMP1 is the connection name and you may change this as well. The proper license key should be entered in the column CMP6.

Credit goes to the Anjam for remembering this and David Vogt for writing it down

Tuesday, June 3, 2014

Template won't save, especially CSS

The template editor is written in ASP. "Maximum Requesting Entity Body Limit" is the mechanism used to transit and save the code in the template editor.  By default, ASP setting in IIS is configured to accept a maximum of 200KB.

Solution: increase your "Maximum Requesting Entity Body Limit" setting under ASP under your CMS web application.  http://stackoverflow.com/questions/9466081/how-to-increase-request-accept-limit-for-asp-classic

Thursday, May 8, 2014

Getting Current Management Server RedDot CMS Project Name via JavaScript

This is the easiest way to get current project name without complicated rendertag or preexecution. Just make sure you are already use the JQuery.js library.
<script type="text/javascript">
 var TheRealUIContainerPage;
 var ProjectLabelText;
 if(window.opener){
  if(window.opener.name == 'ioActionMenu'){
   // smarttree
   TheRealUIContainerPage = top.opener.parent.parent.parent.parent.document;
   ProjectLabelText = $(TheRealUIContainerPage).find('body #ctl00_ctl00__bodyPlaceHolder__infoMenu_2 .ca_tb_txt').text();
  }
 }else{
  // smartedit
  TheRealUIContainerPage = window.parent.document;
  ProjectLabelText = $(TheRealUIContainerPage).find('body #ctl00_ctl00_ctl00__bodyPlaceHolder__infoMenu_2 .ca_tb_txt').text();
 }

 alert(ProjectLabelText);
</script>

Rendertag to Escape Double Quote and Single Quote

This is a solution posted by Tim Davis on https://groups.google.com/forum/#!topic/reddot-cms-users/ImqWdAN4XIY

You want to assign text placeholder content class a server side preexecution variable, but the text placeholder contains double quote, single quote and carriage return, which will cause preexecution error because the resulting code will be like this

Dim MyVar

MyVar = "<%txt_body%>"

'resulting code
'this cause syntax error, cannot have unescape quote inside quote
MyVar = "he says,"hello""

'this cause syntax error, cannot unclosed second line
MyVar = "first line
               second line"

What you can do is to use rendertag to escape the text. This method handles, &, ", ', accented character like (á, é, í, ó, ú, ü, ñ, ¿, ¡), and new line carriage return

Dim MyVar

MyVar = "<%!! Escape:HtmlEncode(<%txt_body%>) !!%>"

Wednesday, October 23, 2013

Using #include in a project

Why

The most common need to use an include directive is to include/reuse a common piece of component of the site, such as header, footer and advertisement.

Common Pitfalls

When using a media or image element in place of actual file name, the generated path contains ., which is invalid pathing by default unless enabled in IIS. The other issue with leading . in pathing is one cannot use that in #include virtual.

' Code in CMS template
<!--#include virtual="<%med_transformer_asp%>"-->

' Generated code in SmartEdit or Page Preview.  Invalid code
<!--#include virtual="../ImageCache/521E5D7461214F71889B2A99C6CAD3F4/514EAAB6BEBB4F86B85AF45DB2A09374/TR/transformer.asp"-->
' Code in CMS template
<!--#include virtual="<%anc_transformer_asp%>"-->

' Generated code in SmartEdit or Page Preview.  Invalid code
<!--#include virtual="./PreviewHandler.ashx?Action=Preview&Mode=0&blahblahblahblah"-->

When using #include file directive, the pathing uses \, CMS publish pathing as /. Though this is a minor issue since both syntax are acceptable.

' desired syntax
<!-- #include file="common\header.htm" -->

' generated syntax
<!-- #include file="common/header.htm" -->

The biggest issue with #include file in CMS is that the path returned is incorrect

' Code in CMS template
<!--#include file="<%med_transformer_asp%>"-->

' Generated code in SmartEdit or Page Preview.
<!--#include file="../ImageCache/521E5D7461214F71889B2A99C6CAD3F4/514EAAB6BEBB4F86B85AF45DB2A09374/TR/transformer.asp"-->
' This maps to
' ASP\ReddotTemp\ImageCache\521E5D7461214F71889B2A99C6CAD3F4\514EAAB6BEBB4F86B85AF45DB2A09374\TR\transformer.asp 
' Instead of
' ASP\ImageCache\521E5D7461214F71889B2A99C6CAD3F4\514EAAB6BEBB4F86B85AF45DB2A09374\TR\transformer.asp 
' Code in CMS template
<!--#include file="<%anc_transformer_asp%>"-->

' Generated code in SmartEdit or Page Preview.
<!--#include file="./PreviewHandler.ashx?Action=Preview&Mode=0&blahblahblahblah"-->
' This maps to
' ASP\ReddotTemp\BC498EE1113D41F7AC877F3D5BD0738E\PreviewHandler.ashx?Action=Preview&Mode=0&blahblahblahblah
' The path is correct, but the file gets deleted as soon as it is generated and displayed.

One can work around the pathing issue with manual path correction

<!IoRangePreExecute>
' Code in CMS template
<!--#include file="../<%med_transformer_asp%>"-->
<!/IoRangePreExecute>

' Generated code during publication mode, invalid code, the file is published
' to the asp folder on the web server.  The asp folder is not on the CMS
' server, so preexecution is trying to use a file that doesn't exist
<!--#include file="../asp/transformer.asp"-->

 

Solution

If you simply want to use include to include a static file, like header. In publishing mode, use #include, which uses a anchor placeholder to reference the header page. When not publishing, use the header container placeholder, which references the header page.

<reddot:cms>
<if>
    <query valuea="Context:CurrentRenderMode" operator="==" valueb="Int:2">
        <htmltext>
   <!--#include file="<%anc_header%>"-->
        </htmltext>
    </query>
    <query type="else">
        <htmltext>
            <%con_header%>
        </htmltext>
    </query>
</if>
</reddot:cms>

If you want to include an asp library and use the library during SmartEdit, Page Preview, and Publishing, reference the absolute path via #include virtual directive

<!IoRangePreExecute>
' Code in CMS template
<!--#include virtual="/cms/plugins/asplib/transform.asp"-->
<!/IoRangePreExecute>

Thursday, May 9, 2013

Evolution of RQL and Management Server Plugins

In the Beginning

There was COM using VB, but susceptible to server timeout in large operations and cannot cancel the server side operation once it has started.

Set objIO = CreateObject("RDCMSASP.RdPageData")
objIO.XmlServerClassName = "RDCMSServer.XmlServer"
xmlData = "<IODATA sessionkey=""" & session("sessionkey") & """ loginguid=""" & session("loginguid") & """><PAGE action=""load"" guid=""" & strTreeGuid & """/></IODATA>" 
xmlData = objIO.ServerExecuteXml (xmlData, sError)
' parse that xmlData

Shortly After

There was COM using C#. It is a cleaner language, but one has to relax COM security for this to work. Also, it is susceptible to server timeout in large operations and cannot cancel the server side operation once it has started.

// look up how to transfer asp session to aspx session
// Basically, asp page loop through all sessions and submit them to aspx
// which then save the received sessions into aspx sessions
string _LoginGuid = HttpContext.Current.Session["projectguid"].ToString();
string _SessionKey = HttpContext.Current.Session["sessionkey"].ToString();
string _PageGuid = HttpContext.Current.Session["treeguid"].ToString();
object objRQL;

object[] RQL_Server = { "RDCMSServer.XmlServer" };
objRQL.GetType().InvokeMember("XmlServerClassName", BindingFlags.SetProperty, null, objRQL, RQL_Server);
object[] RQL_Command = { string.Format("<IODATA sessionkey=\"{0}\" loginguid=\"{1}\"><PAGE action=\"load\" guid=\"{2}\"/></IODATA>", _LoginGuid, _SessionKey, _PageGuid) };
object retObj = objRQL.GetType().InvokeMember("ServerExecuteXml", BindingFlags.InvokeMethod, null, objRQL, RQL_Command);

if (retObj != null)
{
	// parse that retObj
}

Not Long After

There was web service using C#. It has the benefit of a cleaner language and no need for extra configuration in COM security, but the plugin will be competing with Management Server for communication bandwidth because many core components are also using the web service. Also, it is susceptible to server timeout in large operations and cannot cancel the server side operation once it has started.

// look up how to transfer asp session to aspx session
// Basically, asp page loop through all sessions and submit them to aspx
// which then save the received sessions into aspx sessions
string _LoginGuid = HttpContext.Current.Session["projectguid"].ToString();
string _SessionKey = HttpContext.Current.Session["sessionkey"].ToString();
string _PageGuid = HttpContext.Current.Session["treeguid"].ToString();

// RqlService is a class manually generated using Visual Stuio by pointing to the web service URL
RqlService RqlServiceObj = new RqlService();

string RQL_Command = string.Format("<IODATA sessionkey=\"{0}\" loginguid=\"{1}\"><PAGE action=\"load\" guid=\"{2}\"/></IODATA>", _LoginGuid, _SessionKey, _PageGuid);
object retObj = RqlServiceObj.ExecuteString(RQL_Command);

if (retObj != null)
{
	// parse that retObj
}

Overtime

Some people advanced to AJAX against an ASP connector or the web service because these plugins are easy to write, troubleshoot, and no longer susceptible to server timeout in large operations and run away server side operation once it has started. It is best practice to use ASP connector instead of web service because ASP connector do not compete with core component for communication bandwidth and it is compatible with Management Server 6.x, 7.x, 9.x, 10.x, whereas the web service is only available beginning at 7.x, changes location at 10.x and 11.x. Hence plugins written against the web service is not all version compatible automatically.

// AJAX ASP
var strRQLXML = padRQLXML('<PAGE action="load" guid="<%= session("treeguid") %>">');

$.post('rqlaction.asp', { rqlxml: strRQLXML },
function(data){
	// parse $(data)
});

function padRQLXML(innerRQLXML)
{
	return '<IODATA loginguid="<%= session("loginguid") %>" sessionkey="<%= session("sessionkey") %>">' + innerRQLXML + '</IODATA>';
}
<?xml version="1.0" encoding="utf-8" ?>
<%
	' action.asp
	Response.ContentType = "text/xml"

	Dim objIO	'Declare the objects
	Dim xmlData, sError, retXml
	set objIO = Server.CreateObject("RDCMSASP.RdPageData")
	objIO.XmlServerClassName = "RDCMSServer.XmlServer"

	xmlData = Request.Form("rqlxml")
	
	xmlData = objIO.ServerExecuteXml (xmlData, sError) 

	Set objIO = Nothing
	
	If sError <> "" Then
        retXml = "<ERROR>" & sError & "</ERROR>"
	Else
        retXml = xmlData
	End If
	
	Response.Write(retXml)
%>
// AJAX web service
var SOAPMessage = '';
SOAPMessage += '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cms="http://reddot.de/cms/webservices/navigation/1_1"><soapenv:Header/><soapenv:Body><cms:ExecuteString><cms:command>';
SOAPMessage += padRQLXML(InnerRQL);
SOAPMessage += '</cms:command></cms:ExecuteString></soapenv:Body></soapenv:Envelope>';

$.ajax({
	type: 'POST',
	url: '/CMS/Navigation/Services/RQLService.asmx',
	data: SOAPMessage,
	contentType: 'text/xml; charset=utf-8',
	dataType: 'xml',
	beforeSend: function(xhr) {
		xhr.setRequestHeader('SOAPAction', '"http://reddot.de/cms/webservices/navigation/1_1/ExecuteString"');
	},
	success: function (data) {
		// parse $(data)
	},
	error: function (message) {
		//alert(message);
	}
});
	
function padRQLXML(InnerRQL)
{
	var Rql = '<IODATA loginguid="<%= session("loginguid") %>" sessionkey="<%= session("sessionkey") %>"><![CDATA[' + InnerRQL + ']]></IODATA>';
		
	return Rql;
}

Finally

Management Server is at version 11.x. One has to change the COM object name in ASP in order for VB plugins to continue to work, and this should only be a short term fix because as stated in the RQL manual, COM will be obsolete and web service will be the sole future. One also has to change the web service URL and SOAP format in order for AJAX web service plugins to continue to work in 11.x. The question: how to write a plugin that is 7.x to 11.x compatible automatically? Answer: use a AJAX RQL connector library at https://github.com/jhuangsoftware/j-rql-connector

<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="Rqlconnector.js"></script>
<script type="text/javascript">
var LoginGuid = '<%= session("loginguid") %>';
var SessionKey = '<%= session("sessionkey") %>';
var RqlConnectorObj = new RqlConnector(LoginGuid, SessionKey);

var strRQLXML = '<PAGE action="load" guid="' + PageGuid + '"/>';
RqlConnectorObj.SendRql(strRQLXML, false, function(data){
	// parse $(data)
});
</script>
' quick and short term change to make VB to continue to work
Set objIO = CreateObject("OTWSMS.AspLayer.PageData")
xmlData = "<IODATA sessionkey=""" & session("sessionkey") & """ loginguid=""" & session("loginguid") & """><PAGE action=""load"" guid=""" & strTreeGuid & """/></IODATA>" 
xmlData = objIO.ServerExecuteXml (xmlData, sError)
' parse that xmlData

NOTE

The AJAX RQL Connector is meant to be used on something small to medium things, like to automatically send some RQLs whenever a user does something in SmartEdit or Page Preview, or to send some RQLs based on user inputs in a plugin interface. Ideally, all plugins should use this connector library over other RQL libraries (Java, C#, PHP?) because a plugin should be plug-and-play with no dependency on any other external installations or configurations.

Does it mean other RQL libraries (Java, C#, PHP?) are bad? No. They are still useful for large implementations, where a plugin should really be called an application integration. However, please be aware that support for RQL libraries (Java, C#, PHP?) falls outside of OpenText support because in event of error, one has to proof the fault is at RQL level, not the library that encapsulates the RQL.

Wednesday, May 8, 2013

List versus Container Best Practices

There has been many confusions over when to use a list element or a container element. For Example, I want to have a slider module on my home page.

The flexslider has the following HTML code:

<div class="flexslider" id="myflexslider">
	<ul class="slides">
		<li>
			<img src="slide1.jpg" />
		</li>
		<li>
			<img src="slide2.jpg" />
		</li>
		<li>
			<img src="slide3.jpg" />
		</li>
		<li>
			<img src="slide4.jpg" />
		</li>
	</ul>
</div>
<script type="text/javascript" charset="utf-8">
    $('#myflexslider').flexslider();
</script>

The Bad Solution

Each slide is a page containing a slide image. Then a list placeholder is used to pull in images.

<!-- flexslider content class -->
<!IoRangeRedDotMode>
<div class="alert-reddot <!IoRangeNoEditMode>alert-error<!/IoRangeNoEditMode><!IoRangeRedDotEditOnly>alert-success<!/IoRangeRedDotEditOnly>">
    <div><!IoRedDotOpenPage> [<!IoRangeNoEditMode>Open to Edit<!/IoRangeNoEditMode><!IoRangeRedDotEditOnly>Close to Save<!/IoRangeRedDotEditOnly> Page]</div>
    <!IoRangeRedDotEditOnly>
    <div><!IoRedDot_lst_slides> [Manage Slides]</div>
    <!/IoRangeRedDotEditOnly>
</div>
<!/IoRangeRedDotMode>
<div class="flexslider" id="myflexslider">
    <ul class="slides">
        <!IoRangeList>
        <li>
            <!-- <%lst_slides%> -->
            <!IoRedDot_img_slide><%img_slide%>
        </li>
        <!/IoRangeList>
    </ul>
</div>
<script type="text/javascript" charset="utf-8">
    $('#myflexslider').flexslider();
</script>

This is a sub-optimal method because

  1. The slider pages will get published out as these useless HTML snippet pages, occupying space and unnecessarily indexed. Of course, one can prevent it by setting the template of the content class not to publish or use a content class without template. Nevertheless, it causes more work.
  2. After editing a slider page in SmartEdit, user can't submit or release the slider page because it is hidden behind a list. Of course, one can make the slider page hidden behind the list accessible in SmartEdit. Nevertheless, it causes more work.

The Current Best Practice Solution

Each slide is a page containing a slide image. Then a container placeholder is used to contain the pages.

<!-- flexslider content class -->
<!IoRangeRedDotMode>
<div class="alert-reddot <!IoRangeNoEditMode>alert-error<!/IoRangeNoEditMode><!IoRangeRedDotEditOnly>alert-success<!/IoRangeRedDotEditOnly>">
    <div><!IoRedDotOpenPage> [<!IoRangeNoEditMode>Open to Edit<!/IoRangeNoEditMode><!IoRangeRedDotEditOnly>Close to Save<!/IoRangeRedDotEditOnly> Page]</div>
    <!IoRangeRedDotEditOnly>
    <div><!IoRedDot_con_slides> [Manage Slides]</div>
    <!/IoRangeRedDotEditOnly>
</div>
<!/IoRangeRedDotMode>
<div class="flexslider" id="myflexslider">
    <ul class="slides">
        <%con_slides%>
    </ul>
</div>
<script type="text/javascript" charset="utf-8">
    $('#myflexslider').flexslider();
</script>
<!-- flexslider slide content class -->
<li>
    <!IoRedDotOpenPage><!IoRedDot_img_slide><%img_slide%>
</li>

Tuesday, April 2, 2013

Blockmark Usages

I hope the following blockmark usage examples would help clarify the many blockmarks and associated usages.

<!-- do not need conditional, no output if empty -->
<%stf_teaser%>


<!IoRangeConditional>
<div class="orange">
    <%stf_teaser%>
</div>
<!/IoRangeConditional>


<!IoRangeRedDotMode>
<!-- this is shown in SmartEdit, either open or closed
<div class="reddot-area">
    <!IoRedDotOpenPage>
    <!IoRangeNoEditMode>
    <!-- this is shown when this section is closed in SmartEdit -->
    <div class="reddot-closed">[Open to Edit]</div>
    <!/IoRangeNoEditMode>
    <!IoRangeRedDotEditOnly>
    <!-- this is shown when this section is open in SmartEdit -->
    <div class="reddot-opened">[Close to Edit]</div>
    <!/IoRangeRedDotEditOnly>
</div>
<!/IoRangeRedDotMode>


<!--
if you want to produce repeatable HTML with variable content,
and the links go to the DIFFERENT sub folder

<ul>
    <li><a href="/products/link1.htm">link 1</a></li>
    <li><a href="/news/link2.htm">link 2</a></li>
    <li><a href="/about-us/link3.htm">link 3</a></li>
</ul>
-->

<ul>
    <!IoRangeDynLink>
    <li><%anc_dyn_links%></li>
    <!/IoRangeDynLink>
</ul>


<!--
if you want to produce repeatable HTML with variable content,
and the links go to the SAME sub folder

<ul>
    <li><a href="/products/link1.htm">link 1</a></li>
    <li><a href="/products/link2.htm">link 2</a></li>
    <li><a href="/products/link3.htm">link 3</a></li>
</ul>
-->

<ul>
    <!IoRangeList>
    <li><%lst_links%></li>
    <!/IoRangeList>
</ul>

Monday, February 18, 2013

Management Server 11 with MSSQL 2008 Installation Checklist

Here is a simple checklist for Management Server 11 installation with MSSQL 2008.

Note that this checklist prepares the system for Management Server installation using local MSSQL accounts.


Download Doc

Monday, February 11, 2013

HTML5 in Management Server 9, 10, and 11

Just want to share a proof of concept project (proof that Management Server supports HTML5) I did based on Smashingmagzine's HTML5.

I wrote this project a few years back, when Management Server was still called CMS, to be more exact, CMS 9.

SmartEdit in CMS 9, IE8
SmartEdit in CMS 9, FireFox
SmartEdit in CMS 9, IE9
SmartEdit in CMS 10, IE9

It is recommended to use projects with HTML5 code after 10.1 SP2 HF18 (Build 10.1.2.391) because the Telerik/RadEditor text editor now also support HTML5 code and would not strip them out.


Download HTML5 Project Export (CMS 9)

Thursday, January 31, 2013

Foreach Rendertag in Text Array Processing

<reddot:cms>
<foreach itemname="ArrayItem" object="Escape:Text(Test1,Test2).Split(Escape:Text(,))">
 <htmltext>
  <h2><%!! Store:ArrayItem !!%></h2>
 </htmltext>
</foreach>
</reddot:cms>

Friday, April 27, 2012

UploadIt

Available for Purchase in North America via asowsm@opentext.com

Screenshot

Compatibility
  • 7.x
  • 9.x
  • 10.x

Description
  1. Batch image/file upload
  2. Compatible with folder authorization packages
  3. Easy installation
  4. Support sub folders
  5. Supports all browsers

Accessibility
  • SmartTree, Start -> Administer Project Settings -> Project -> Folders, Action Menu, UploadIt
  • SmartEdit, Open page, right click Plugin-ins, UploadIt

Thursday, March 22, 2012

Rendertag, Project Performance, Product Support

Project performance is closely tied to rendertag usage.  Here are some rendertag usage best practices that should be taken into consideration when implementing a project.

Store:Set( key, val )
This is a rendertag that allows storage of variable, but it is unofficial and unsupported. Should projects experience performance or content output issues while using this rendertag, product support may be denied or delayed due to slow priority since it not a product issue but an implementation issue.

Additionally, upon full site publish or multiple users accessing the same Store value may experience a race condition since everyone is trying to write and read from the same variable.  For example, generated link for Page B links to Page A because the link value was read milliseconds before it was updated.

.Elements.GetElement(), .GetPathArray()
A page object get loaded into memory prior to any page info marshaling/inspection call, wide usage in project cause the server to use up memory much quicker.  Since the memory garbage collector in .NET could not keep up with the clean up, server tend to become unresponsive more often.

Another issue with rendertag and this rendertag in particular is caching.  Content retrieve via rendertag get cached, but the cache do not get update notification upon targeted content change, hence rendertag continues to display old content.  Please note, this issue do not occur if rendertag is used within navigation template.

Foreach and Store
Content retrieved within foreach rendertag will experience caching issue.  Content output within foreach rendertag via Store rendertag will experience race condition upon heavy multiple access.

Wednesday, March 21, 2012

Find Page By Guid 2

Download

Screenshot


Compatibility
  • 7.x
  • 9.x
  • 10.x
  • 11.x

Description
  1. Find page by guid

Accessibility
  • In SmartTree, Start -> Administer Project Structure -> Project, Action Menu, Find Page By Guid