I Need Your Help!!! (an exciting announcement)

I have accepted an offer to come back to ServiceNow and join the UI team, focusing specifically on CMS. I'm very excited and humbled by this incredible opportunity. Now this is where I could really use your help. Below are 3 questions regarding your experience with CMS, if you could take a moment to provide some feedback I would really appreciate it. You will help in shaping the future of the ServiceNow content management system. With the existing CMS, what are some of the biggest pain points and frustrations? If ServiceNow were to build a new CMS, what would that look like and what features would you like to see? How important would a mobile portal be for your organization and users?

CMS Dynamic Edit Page Button

Jumping between the page preview and the page editor is always a pain. Even with multiple tabs I always seem to loose the edit page screen, so I've created this UI Macro which puts a "Edit Page" button on every page. When editing a page it changes to "View Page". Hope you enjoy and let me know if you find this useful. Create a UI Macro with: Name: "render_cms_edit_button" XML: [crayon-6390c9dd62995247624710/] Insert the content block in to your site layouts at very bottom using [crayon-6390c9dd629a0442782999/]

Modifying UI Pages & Macros without affecting upgrades

In the Wiki you will find solutions that include updating OOB Macros or UI Pages, however this will obviously cause those files to be skipped during the next upgrade. So how do you go about updating UI Pages and Macros (or other records) without future upgrades being impacted? The answer is actually quite simple. I discover this little nugget in the Wiki: By default, the Active field on a tracked table is treated as update_exempt even if the attribute is not present (starting with the Calgary release) This means that if we clone the original record, set the original record to "active=false", then we can continue to make changes to the copy record without affecting the upgrade process. The only thing to note is after an upgrade you will want to check the difference between the files so in the event there was a change, you can manually upgrade your updated record.

UI Pages without all the extra platform HTML

If you create a empty UI pages you will notice that without anything on the page, the platform has already loaded in a ton of platform code including JavaScript (js_includes), CSS (css_includes), as well as quite a bit of HTML. If you are looking to build a page that includes jQuery, Angular, Bootstrap, or other JavaScript or CSS library, chances are you will run into a conflict. The following trick was originally brought to my attention by Will Leingang, who recently wrote a blog post about it. However because I think this is a very important trick to know, I am going to post it as well. The solution is to append "?sysparm_direct=true" to the end of the URL (after .do). Before: After: This method technically also works for CMS pages, however because CMS pages also load some additional javascript files to the page, if you remove the framework template you will get several JavaScript errors. There are some ways around this as well but require overloading some platform files, so that will be beyond the scope of this blog post.

Using UI Pages in a CMS Site without iFrames

This may not seem so exciting at first, but once you realize the potential of this technique the results can be pretty powerful. It's no secret that a lot of content in ServiceNow's ESS Portal lives inside iframes. I don't want to get into why iframes suck or why having UI Pages and forms from the main interface showing in CMS is not ideal... so I'll just assume you've used it enough to understand why it's a problem. This is far from a complete solution, but it highlights one technique that could be used to get rid of those pesky iframes as it pertains to UI Pages. One of the challenges is that UI Pages usually need to live in both the CMS and the main interface. So the trick is to figure out how to distinguish between the two. The answer to that is in the URL that is used. If you visit: [instance]/kb_home.do it's loading the UI page as normal. However if you insert "ess/" in front of the ui page name ([instance]/ess/kb_home.do), it will also load in the style sheets from that CMS site. The "ess" refers to the "url_suffix" field on the site. It will also populate a new variable called $[current_site], which really is the GlideRecord of the site record based on the url_suffix. What this allows us to do is distinguish between different sites and the main UI. Consider the following code: [crayon-6390c9dd64889298505159/] In this example, if we had a header defined in a UI Macro included on our site, we could now also include that header (or footer, or custom markup) on any UI page when used with our site. This essentially removes the need for using iframes. Now it also opens up another can of worms, such as: instance upgrades, and modifying OOB records. However in my personal experimenting I have been able to use this method to bring the full service catalog and knowledge base into a CMS site, without using any iframes, and without causing upgrade issues. It does take some tinkering, but it's doable with a little bit of work. To start I would definitely suggest cloning the UI pages and experimenting with the copy. With this method we're really just styling UI pages to look like a CMS site, there are many other ways of doing it and I've experimented with several with great results. However this method is fairly quick to get you started. I'd love to hear your feedback, and let me know if you have any questions.

Building a Responsive ServiceNow ESS Portal with Twitter Bootstrap – Part 1

When I first started building portals on top of ServiceNow, one of my first goals was to try to make a responsive site using Twitter Bootstrap. After several attempts I realized it's not quite as simple as it sounds. In the next series of blog posts I will cover some simple steps to help get you started. In this post I assume you are at least familiar with Twitter Bootstrap and the ServiceNow CMS. Some of the challenges with the content management system (CMS): The out-of-box (OOB) ESS portal is full of tables, iframes, and inline styles. Bootstrap uses jQuery and ServiceNow uses Prototype and the two don't always play nicely together. The HTML markup cannot be changed for many of the content blocks. The site header/footer and layout is defined on the page itself, not the site Because ServiceNow is a platform, most issues can be solved with a little bit of coding. However for the sake of simplicity, I am going to use just the OOB CMS functionality. For part 1 of this series, I am going to cover replacing the header of the ESS portal. I will use some of the sample templates provided by Bootstrap (http://getbootstrap.com/examples/jumbotron/). Let's get started: Navigate to "Content Management > Dynamic" and create a new block. Copy paste the below html into the content block (within the <jelly> tags): [crayon-6390c9dd657c6576551442/] Save it, and grab the sys_id Now lets go into the site and create a new layout using the following html (within the <jelly> tags): [crayon-6390c9dd657cf572593822/] Next we will need to create a new page to try out the Bootstrap layout. Fill out the basic information and select the newly created layout from the layout field. From the page, create a new "Content Theme" In the "Style Sheet" related list, click new. Select "Link to External Style Sheet" from the drop down and paste this URL into the URL field: "//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css" and then submit. From the related list also bring in "Gray CSS - Menu". Go back to the page and click on "Edit Page" and then "Add content", now place two content blocks on to the page, I used "Portal - Block Menu" and "KB Top Five". If you did it all correct you should have a page that looks like: This is just a starting point, and we still don't have JavaScript and the portal is still using ServiceNow's table based blocks. But these will be covered in our next blog post. Hope you have enjoyed this tutorial and if you have any questions please, don't hesitate to post a comment.


The "content_page" object is a scriptable java object called 'GlideContentPage'. In a script you can simply do: [crayon-6390c9dd66526382417485/] Which will get you access to the following functions: getSiteID getID getURLSuffix getParentPage getName getDescription getMeta getTheme isValid getTitle getModelTable getModelID getDefaultLayout cloneable isFrameBuster

Enhancing CMS for Modern ServiceNow Powered Websites

Having built over a dozen ServiceNow ESS portals, I finally had enough of the issues and limitations and decided to do something about it. What resulted was a month long effort of enhancing the CMS framework to function more like WordPress or other content management systems. I set out with some basic goals: Follow best practices Use semantic HTML & CSS Responsive layouts for mobile & tablet Avoid using iFrames Don't touch OOB Macros & UI pages To accomplish these goals I ended up having to add on quite a bit of functionality such as: Custom content types Header & footer templates Live search Event driven notifications Bring UI pages into CMS Form content blocks In this video I do a quick demonstration of these enhancements and our latest theme: "Orebro".