<reddot:cms> <foreach itemname="ArrayItem" object="Escape:Text(Test1,Test2).Split(Escape:Text(,))"> <htmltext> <h2><%!! Store:ArrayItem !!%></h2> </htmltext> </foreach> </reddot:cms>
Showing posts with label navigation manager. Show all posts
Showing posts with label navigation manager. Show all posts
Thursday, January 31, 2013
Foreach Rendertag in Text Array Processing
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.
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 14, 2012
Algorithm for Converting Old Navigation to Navigation Manager
This appears to be a frequently asked question for projects that are using the old list pull through container navigation method (the one with a connector page with a list and a container insider another container), so I am going to give out the algorithm I use.
Old sites use the list container method so they can have separate publication package for each branch. Also, each branch’s landing page is named index.htm. These landing pages must be renamed or at least considered to avoid file overwrite.
Also, one must set expectation with the customer that the publishing file path for landing pages will be different since all landing pages will share the same lst_navigation and publication package.
- Lock down system from editors prior to running algorithm
- Create lst_navigation for all foundation content classes
- Make all foundations with lst_navigation a master page
- Review navigation connector page (the little page with a list that goes into a container) logic and rewrite it into navigation templates and navigation areas
- Foreach page instance of navigation connector, reconnect pages connected to the navigation connector list to lst_navigation of the parent page (the page with container), and delete navigation connector page instance
- Go into navigation manager, in the right pane, right click, click "disconnected pages" and then right click, "import pages"
- Depending on the size of the site, wait 30 to 45 minutes
- Go into navigation manager, in the right pane, right click, click "disconnected pages", find the root nood of your site, right click, "adopt page"
- Done
Old sites use the list container method so they can have separate publication package for each branch. Also, each branch’s landing page is named index.htm. These landing pages must be renamed or at least considered to avoid file overwrite.
Also, one must set expectation with the customer that the publishing file path for landing pages will be different since all landing pages will share the same lst_navigation and publication package.
Monday, March 5, 2012
Breadcrumb: Rendertag Vs Placeholder
Generally, there are two ways to generate a breadcrumb
Method #1: Rendertag
Method #2: Placeholder
Instead of using rendertag, it is best practice to use native placeholder to generate the breadcrumb for the following reasons:
Method #1: Rendertag
<%!! Navigation:OutputArea(Breadcrumb) !!%>
Method #2: Placeholder
<!IoRangeBreadCrumb><%anc_breadcrumb%> » <!/IoRangeBreadCrumb> <%hdl_title%>
Instead of using rendertag, it is best practice to use native placeholder to generate the breadcrumb for the following reasons:
- When using rendertag to generate breadcrumb, the page must be in navigation structure. For performance reasons, it is unwise to have a page in navigation structure for the sole purpose having a breadcrumb because this will not scale for sites with 200+ pages. Large navigation structure = slow project.
- Hiding a page from breadcumb requires additional rendertag logic, which is another performance cost. Whereas using breacrumb placeholder, simply select page, click "edit properties", and enable "Do not use for breadcrumb"
Wednesday, December 7, 2011
Navigation Emulation
What is it?
Allow a page, even a non navigation page, to display the exact navigation area as displayed on any page.Why is it useful?
When a page is not in navigation manager, the page cannot display navigation because it is not part of navigation manager.However, a page should not be in navigation manager simply because it needs to display navigation. For example, news article pages should not be in navigation manager because number of navigation pages in navigation manager negatively impacts project performance.
However, news article pages must display navigation area for the shake of accessibility. Hence, news article page can use navigation emulation to emulate the navigation of its parent page, the new archive page.
Simple Method
<!IoRangeDynLink> <!IoRangeNoRedDotMode><!IoRangeRedDotMode><%anc_link%><!/IoRangeRedDotMode><!/IoRangeNoRedDotMode> <%!! Navigation:OutputArea(LeftNavArea, Bool:True, Guid:<%inf_page_guid%> !!%> <!/IoRangeDynLink>
Advanced Method
<reddot:cms> <if> <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id"> <!-- This Page is in Navigation Structure --> <htmltext> <%!! Navigation:OutputArea(Left Navigation, Bool:False, Context:CurrentMasterPage.Id, Bool:False) !!%> </htmltext> </query> <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id"> <!-- The Page 1 Level Up is in Navigation Structure --> <htmltext> <%!! Navigation:OutputArea(Left Navigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.Id, Bool:False) !!%> </htmltext> </query> <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id"> <!-- The Page 2 Levels Up is in Navigation Structure --> <htmltext> <%!! Navigation:OutputArea(Left Navigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.Id, Bool:False) !!%> </htmltext> </query> <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id"> <!-- The Page 3 Levels Up is in Navigation Structure --> <htmltext> <%!! Navigation:OutputArea(Left Navigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.Id, Bool:False) !!%> </htmltext> </query> <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id"> <!-- The Page 4 Levels Up is in Navigation Structure --> <htmltext> <%!! Navigation:OutputArea(Left Navigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.Id, Bool:False) !!%> </htmltext> </query> <query valuea="Context:Indexes.GetIndexByPage(Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage).GetRootIndex().Id" operator="==" valueb="Context:Indexes.RootIndexList[Int:0].Id"> <!-- The Page 5 Levels Up is in Navigation Structure --> <htmltext> <%!! Navigation:OutputArea(Left Navigation, Bool:False, Context:CurrentMasterPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.MainLink.OwnerPage.Id, Bool:False) !!%> </htmltext> </query> </if> </reddot:cms>
Subscribe to:
Posts (Atom)