So, now it’s time for me to say goodbye to the Tridion community and hello to Contentstack. It’s been great to be a member of Hotel Tridion for over 19 years – it has taken me to over 12 different countries and I’ve met many interesting people. I’m grateful to Tridion for believing in me all those years ago and for all my colleagues who helped me with endless questions.

Last month I checked out of Hotel Tridion and checked into ‘Suite’ Contentstack – a headless CMS that focusses on a great editor experience and solid APIs. I always joked that Tridion is like the song Hotel California – “you can check out anytime you like, but you can never leave”. https://www.youtube.com/watch?v=OWGFdL4tNW0

Living in Hotel Tridion taught me many things:

  • Sharing is good – especially when it is tutorials or helpful code snippets. For example, when I visited the Tridion Developer Summit event in India many people came up to me and told me that my blog saved them time.
  • Do things with positive intentions – When starting the Tridion Developer Summit my intention was to create an event to share solutions in a positive environment. It has been successful for 6 years with over 100 participants and 25 speakers each year. https://vimeo.com/378453697
  • It’s ok to say “I don’t know” – even after doing Tridion for more than 19 years, there are still things I don’t know how to do in the platform.
  • Being open and honest is always the best policy.
  • Providing positive feedback about the things we like is very helpful. Giving constructive feedback is welcome – but be careful of the tone and consider the audience.
  • People are always looking to improve things – ask what they would like to be improved and see if it’s possible to help
  • Be nice

I’m looking forward to using these experiences in my role as a Solutions Architect at Contentstack. So far the team has made me feel very welcome – and it’s great to be part of a company where the product is growing fast and the customers are happy. I’m still learning a lot of new things, and that’s another aspect of the new job I like – growing both technically and personally.

Thank you to everyone who has supported and helped me over the years in Hotel Tridion. SDL will be taking over the lead of the Tridion Developer Summit and I wish them the best of luck with the event. And, wishing you much success with everything Tridion related – and if you’re ever curious about headless Content Management then let me know and I’ll be happy to show you a demo of Contentstack.

This is a meeting of the community around the Tridion Content Management System. A chance for Tridion consultants and partners to show what they’ve built with Tridion and a chance for SDL Tridion show what they have built inside the product. For me, it was a motivation to bring together these two parts of the community and for all of us to learn and share with each other. I’ve taken the risk myself to host the event. And I am thankful that the community, the partners and SDL have supported the event from the beginning. It is still a mystery to me how we even got this started! I blame it mostly on Nuno Linhares, who created the awesome Tridion MVP program and showed me what a community really looks and feels like, and I wanted to share the same feeling with the entire community of Tridion. And also to Quirijn Slings, Ron Grisnich and Nuno for saying ‘Yes!’ when I presented the idea to them 6 years ago….

This year is the year to show a preview of what is coming in the next 1-2 years of Tridion (and I don’t call it SDL Tridion, because, for me, it is and always has been Tridion). That means Tridion version 9.5 and beyond….

And – why do we call it the Tridion Developer Summit? (hint: the name was decided from the original API call of ‘TDS’ – when we would do the most serious actions in the API).

This year, among other topics, we will hear about the future of ‘Content Delivery’. At the end of Day 1, both Raimond Kempees (currently working inside the firewall of SDL) will discuss the vNext of SDL Content Delivery and Quirijn Slings, creator of DD4T (currently lurking outside the firewall of SDL) and will share his dream of what a DD4T 3.0 could look like. And, this is one reason why you should attend – to hear these views, and more importantly, to share a drink with both of them.

Day 2 is all about integrations and Docs – and we will see and hear what SDL is up to in this area – both from an inside perspective (from Niclas Cedermalm and Ivo van de Lagemaat) and also from a partner perspective from Content Bloom.

Finally, if you’re curious about SDL Docs, or have already used it in a project, make sure to join us after lunch on Day 2.

If you cannot attend – don’t worry – we record all the talks and make them available for free online at http://www.vimeo.com/tridontv

And, if you’d like to attend this year – we still have space – www.tridiondevelopersummit.com
November 5-6, 2019 in Amsterdam

Tridion Ideas…

June 25th, 2019 | Posted by Robert Curlette in Uncategorized - (2 Comments)

The idea to submit new ideas to a Tridion Ideas site is not new….we have had this opportunity for many years now, originating with a request to Customer Support for a specific idea over a decade ago. The latest incarnation of this idea of Ideas being submitted to an Idea site is the SDL Community SDL Tridion DX Ideas site. So far, this is the site with the longest name, and that means….well, I don’t know what that means, but it exists and it’s THE place to be for getting your great ideas to the big minds behind the SDL firewall and in front of people who decide what goes in, and out, of the product.

First, sign-in and create an account at https://community.sdl.com. If you get an error while logging in (like me), chances are you once had logged in with that browser sometime before their update, and now you need to either delete your cookies, or just try with another browser. I tried with Firefox and I got back in.

Next, start browsing the current ideas – there’s some really great ones there! Upvote liberally, and feel free to comment and leave your own 2 cents, or your mark on the next greatest feature.

Finally, this is the time to tell the world the idea that you’ve been dreaming about for ages.

I’ve submitted a few ideas recently.

First, I would like to see the location an item is published to in the Tridion GUI. So, I added an idea to the site and you can see it here: https://community.sdl.com/ideas/sdl-tridion-dx-ideas/i/sdl-tridion-sites-ideas/add-icons-to-list-view-to-show-if-page-component-is-published-to-staging-or-live

Another idea I submitted was to see the filename in the Tridion GUI.

https://community.sdl.com/ideas/sdl-tridion-dx-ideas/i/sdl-tridion-sites-ideas/add-a-filename-column-to-the-structure-group-list-view

This was a request from a client many years ago and I implemented it as a GUI Extension. (See a similar example here) However, for most clients they don’t have this option in their GUI. Finding an index page in a long list of Pages can be painful if we need to open each individual page, but with the extension we can see all the Pages (and URLs) in the list view. Will Price added a comment to my idea, and suggested it’s also a quick and easy way to review URLs for SEO. The community at work with ideas exchange!

Finally, the last idea is to not re-publish Multimedia Components if they have not changed since the Page was last published. This would improve performance time a lot and also reduce the load on the Publisher and Deployer. https://community.sdl.com/ideas/sdl-tridion-dx-ideas/i/sdl-tridion-sites-ideas/do-not-re-publish-binaries-if-they-have-not-changed-and-have-been-previously-published-to-that-target

How to stay on top of new ideas? If you would like to get an email with a list of the new ideas on a daily or weekly basis, head over to https://community.sdl.com/ideas/ and at the bottom select the Email digest options. Then, in the Tridion ideas site, turn ‘Ideation notifications’ on. That’s it!

What can you do now? Create a new idea, blog about it, write it on the Ideas Exchange wall, and maybe we will see it in a product release soon and we will have shared the idea to the world and maybe have made it a little better….

And come to the next Tridion Developer Summit in Amsterdam on 5-6 November, 2019!

As 2018 is coming to a close many people are planning their projects next year and an upgrade might be part of it.  The good news with the latest SDL Tridion Release, named ‘Tridion Sites 9’, is that the word ‘Tridion’ is back in the name!  OK, all kidding aside, the other good news is that little has changed in the product since Web 8 and Web 8.5.  Meaning, if you’re thinking to upgrade from 8.1 or 8.5, expect few hidden bumps or issues.  However, the bad news is also that little has changed since Web 8.1 or Web 8.5.  So, if you were expecting to see some of the suggestions on the SDL Ideas Site, then you’ll have to wait a bit longer.  One long-standing request that is implemented (I’m aware of it since at least 2007) is image cropping and re-sizing within the backend GUI.  Yay!  And if you’re curious what’s coming out in 2019 and beyond, watch the Tridion Developer Presentation by the SDL team about the GUI vNext here.  For a complete list of the new features in SDL Tridion Sites 9, check out the release notes.  Despite the good and bad news, the fact is that it is important we keep our software current, as it both gives us the latest and greatest version, happier users, a larger version number (just kidding!), and also longer support.  In this article I will give a list of some of the things to consider when upgrading.

Upgrade Process

The upgrade process is usually somewhat confusing, as the architecture of Tridion in an enterprise setup can be complex and a bit overwhelming.

I tend to think of it from a bird’s eye perspective, and divide the architecture into 3 large pieces:  Content Management, Publishing, and Content Delivery.  These pieces all affect various parts of the organization and the ways they work – and this is something we should consider as part of our plan when we upgrade various mission-critical pieces to the new version.

Before we begin, if you’re using a web framework such as DXA, then you need to check if the version of DXA is compatible with the version of the Tridion upgrade.

First, I always suggest to start with a ‘sandbox’ server, which can be a copy of the Development environment.  This is a place where if we make any mistakes, we won’t do any harm.  We try to get as close to production as possible, but sometimes we might not have various components such as load balancing configurations or other third-party systems.  Regardless, we try our best to have a fairly decent environment here that resembles production.  We should also have all of our latest Templates, Event System Code and other Tridion extensions in this environment.  This is where most of our risk lies, and where we will want to have time and a safe place to try the old code in the new version – to fix any potential issues that pop up.  Once we analyze and try out our customizations in the Tridion environment and prove they don’t break the newly upgraded system, then we can relax that most of the risk of the upgrade is handled.

In the sandbox environment, most of the customizations and extensions in the Tridion system are in the CMS or the Publishing side, although many people also extend and use the Content Delivery APIs as well (using Java or .Net).

I suggest we start with the Content Manager server upgrade, as it is fairly quick and fairly painless, and the CME / DB usually upgrades without any major issues.  This then allows us to test our Templates and backend customizations.  Next up would be the Publisher upgrade, and again it is fairly painless.  Finally, we would upgrade Content Delivery, and the Micro Services.  This is a bit more time consuming and also can be trickier, given the number of moving pieces and numerous configuration files.  However, if you’re upgrading from 8.1 or 8.5, your experience should be fairly smooth, since as I mentioned above, little has changed…  Please refer to the SDL Docs Upgrade documentation for more details.

The first thing we want to try after we upgrade is to Publish.  This tests that all the layers of the architecture are working together and we can deploy content changes.  If the publishing doesn’t work, common issues are a configuration issue in the Deployer_conf file (check the Database settings, etc) or that the items hang in the Publishing queue and might need a Publisher restart.  Once items are publishing you can move onto testing Publishing other pages, and page types.  We usually suggest to try to re-publish an entire site, or sites, if it is possible within your environment.  If not, then select a subset of pages which represent the main page types and publish them to be sure the mechanism works for these as well.

Next we would want to look at any advanced extensions or customizations.  I would suggest that someone who has been a member of the Dev team for a while make a list of the customizations, the locations of the files, what the customization does, and how to test it.  This is very helpful not only during the upgrade, but in the future for testing as well.

If you’re using the excellent Alchemy Framework, make sure to check if the plugins continue to work with the new GUI, and also check to see if a new version of Alchemy is out and you could upgrade to take advantage of new features and compatibility.  Other common things to check are ‘Custom Pages’, Event System code, GUI Extensions, Core Service apps and templates that call external services.

Assuming everything still works, then we would want to update the Event System, GUI Extension, and Core Service apps to reference the latest Tridion Sites 9.0 DLLs instead of the 8.1 or 8.5 ones.

And, again, test everything to make sure that nothing breaks, and celebrate that this step in the upgrade has gone well.

Next up would be to look at any Publisher / Deployer customizations, as it is common to publish content to various search engines or databases.  Usually this code is written in Java, and with a bit of luck you will have a Java developer handy that is familiar with the code and Tridion, and can update the app to use the latest Tridion JARs, and test it on his local development machine.  This sometimes can be a but tricky if the developer doesn’t know Java, or doesn’t know Tridion.  So, if you have one of these types of extensions, then before the upgrade begins you might want to confirm the availability of the Java developer to support your team.  He or she will not need to help out in the above steps.  Also, the upgrade can be done on a local development machine and tested with Deployment Packages, and in that way the Java dev can use their local IDE such as Eclipse or NetBeans to debug the code.

Finally, if we are using any Content Delivery APIs, we would want to upgrade our WebApps to take advantage of the latest features.  This includes both .Net and Java environments.  The Tridion installation media includes the latest DLLs or JAR files, and we would then need to update our WebApps and re-compile them to take advantage of the latest version.  If you have some automated tests of the live website and it’s possible to run them here, that would be great and very helpful.  Also, it’s a good time to check some basic performance numbers, if possible.

If you’re using a Web Framework such as DXA, then you might need to also upgrade that to the latest version to be compatible with the latest Tridion version.  This would be part of the ‘upgrade WebApp’ step.

At this point most of the article and attention has been on customizations and the ‘risky’ part of the upgrade.  I haven’t discussed TopologyManager or MicroServices in detail, as they already exist in Web 8.1 and 8.5 and should continue to operate in more or less the same way, without any major changes.  If you’re upgrading from Tridion 2013 then you would need to plan a but more time to handle the MicroServices and TopologyManager sides of the upgrade.

So, we come back to our original question:  Why Upgrade?  It’s a good one and it’s sometimes hard to answer.  With large software packages that rely on many external systems (Database, Server, etc) it is good that we maintain them and keep them all in alignment – so they can all operate efficiently and also as expected.  We also stay on a same version as other customers, and with that, we benefit from any hotfixes or service packs that solve open issues.  Finally, we help provide our end users with the best that Tridion Sites has to offer at this point in time.  I’m a big believer that we can always do better, and if you’re using an older version of Tridion, probably the business and users would be happier and more efficient using the latest version of the product.

If you need support or help for an upgrade please feel free to contact me at robert.curlette@gmail.com

 

 

 

 

 

 

DevReach Conference 2018

December 6th, 2018 | Posted by Robert Curlette in .NET | Conference - (0 Comments)

Being a Developer means we must constantly update our knowledge with the latest tools and techniques, frameworks and cloud options. One of the best ways to do that is attend a developer conference, where we can get a lot of information in a few days, and also network with fellow developers.

This year I was happy to return to DevReach in Sofia, an event organized by Progress Software (in the past, Telerik) and focussed on the Microsoft .Net technology stack. The first time I attended was in 2013 at a local cinema in Sofia, and I was impressed by the quality of the organization and high quality of talks an speakers. The event was one of the inspirations for me when I created the Tridion Developer Summit conference. This year did not disappoint! We were back to the cinema, with a very full agenda with several tracks and high quality speakers. The speakers were all industry experts, mostly from Microsoft or Progress software, and were very familiar with the content they spoke about.

A full list of sessions is available at https://devreach.com/sessions/

They also have a Facebook page with photos of the event.  https://www.facebook.com/DevReach/

All talks were recorded and will show up on the Progress YouTube channel here:  https://www.youtube.com/channel/UCwr0eQsblxgpjkUXbiCjrRA

The agenda was littered with talks on AI and Machine Learning, Serverless and Docker, and also cloud and Azure. We had a few sessions about .Net, and these were well attended, with people standing in the aisles, or sitting on the floor in front, all with their eyes glued to the code on the screen, and listening to the speakers unraveling the code on the screen in front of us. The talks were very well attended and I had to sit on the floor a couple of times to attend a talk. A good sign, if you ask me!

One of my favorite talks at the event was the Docker presentation by Chris Klug (https://twitter.com/ZeroKoll). He not only knew his content, he presented it in a very funny and interesting way. He walked us through why to use Docker, and how he uses it to run .Net Core in an isolated and trusted way on his laptop. Slides were at a minimum and he spent lots of time at the command prompt, issuing commands like a true console ninja, and wow’ing us in the process. He ran over on time, but he still wanted to show his last demo, so he fired off a few commands at the command prompt, hit return, waited 10 seconds, and it all worked…or it seemed to.

Another nice talk was the session after his was by Tibi Covaci (from Codemag) on the state of .Net – what is happening in the Core and with the latest version of the .Net Framework 4.6. This was a really nice summary and the presenter knew his content really well.

I also attended a few AI talks, which mostly focussed on the business case and were an introductory level, showing code only within Powerpoint. I hope next year we see more live demos and live coding, and also more deep talks.

On day 2 I was really looking forward to the Sitefinity Headless CMS, since I have a background in Content Management and wanted to see how Sitefinity would handle this new trend. After some basic concepts were explained, we were shown the OData response in the browser, and then shown a WebApp and Mobile App that consumed the CMS data from the OData service. I have used OData in the past and not been too impressed with it. Seems to get difficult when filtering results, or doing more advanced queries of the dataset. One of the participants made some comments about exactly this, and then said he had later figured it out. But, unfortunately the talk was very short, using less than half of the time for the talk, and didn’t seem well prepared. I would have liked to see more code, more behind the scenes of how he consumed the data, and in general more discussion around the idea of headless versus standard.

After this talk I listened in on a .Net Rocks live show, always funny and a pleasure to listen to the topics discussed and how they move through so many different ideas. The discussion went to Serverless and tooling, with one of the guests speaking about VIM and her use of the editor. Others spoke about VS Code, and how helpful the debugger is in it.

Finally, the day wrapped up with a very inspirational talk from Neal (reverentgeek), titled ‘You Are Awesome!’. He comes from my home State of Georgia, and it was nice to hear a familiar accent. 🙂 Very inspiring, authentic and from the heart, Neal shared with us that we can all get better at something by putting in the time and dedication to the task, and continue practicing. For example, a few years ago Neal discovered he likes to draw, made some sketches for a conference talk of a man, and then 3 years later made the same sketch. The level of detail and quality had improved a lot! That reminded me that we need to practice a bit, every day, and to be nice to ourselves and allow us to fail sometimes, but keep moving forward. Big thanks to Neal for sharing his honest story.

We were all invited to a 10 year celebration party at a nearby hotel, where a famous Bulgarian rock band performed while we networked with the speakers and other attendees.

Overall, the event was very well organized and offered a lot to the participants. Big thanks to Progress for hosting the event! I hope they are able to continue providing such a high quality Developer event to the Balkan region.

DXA 2 promises to publish less verbose JSON, sending smaller JSON items into the Publishing Queue and therefore speeding up our publish times.  It will also consume less space in the Broker DB.  So they say!  But, what does the new and old JSON look like and is it much lighter?  In this article I’ll highlight only the diffs between the rendering of a Keyword field JSON and Textfield JSON.  And, you might be wondering why I even care (aside from curiosity), but I’ve built a TBB that amends the Published DXA JSON and injects Structure Group Metadata fields masquerading as Page Metadata fields (in the JSON) and therefore available to our DXA Frontend WebApp.  OK, so here it is:

DXA 1.7 Keyword Field

"people": {
 "Name": "people",
 "Values": [ "Public and Member Communications", "Public Interest people", "Publications and Databases" ],
 "NumericValues": [ ],
 "DateTimeValues": [ ],
 "LinkedComponentValues": [ ],
 "FieldType": 3,
 "CategoryName": "people List",
 "CategoryId": "tcm:11-11393-512",
 "XPath": "Metadata/custom:people",
 "KeywordValues": [
 {
 "IsRoot": false,
 "IsAbstract": false,
 "Description": "",
 "Key": "",
 "TaxonomyId": "tcm:11-11393-512",
 "Path": "\\people List\\Public and Member Communications",
 "RelatedKeywords": [ ],
 "ParentKeywords": [ ],
 "MetadataFields": { },
 "Id": "tcm:11-106852-1024",
 "Title": "Public and Member Communications"
 },
 {
 "IsRoot": false,
 "IsAbstract": false,
 "Description": "",
 "Key": "",
 "TaxonomyId": "tcm:11-11393-512",
 "Path": "\\people List\\Public Interest people",
 "RelatedKeywords": [ ],
 "ParentKeywords": [ ],
 "MetadataFields": { },
 "Id": "tcm:11-106848-1024",
 "Title": "Public Interest people"
 },
 {
 "IsRoot": false,
 "IsAbstract": false,
 "Description": "",
 "Key": "",
 "TaxonomyId": "tcm:11-11393-512",
 "Path": "\\people List\\Publications and Databases",
 "RelatedKeywords": [ ],
 "ParentKeywords": [ ],
 "MetadataFields": { },
 "Id": "tcm:11-106853-1024",
 "Title": "Publications and Databases"
 }
 ]
}

DXA 2.0 Keyword Field

"people": {
 "$type": "KeywordModelData[]",
 "$values": [
 {
 "Id": "106852"
 },
 {
 "Id": "106848"
 },
 {
 "Id": "106853"
 }
 ]
},

DXA 1.7 Text Field

"language": {
 "Name": "language",
 "Values": [ "English" ],
 "NumericValues": [ ],
 "DateTimeValues": [ ],
 "LinkedComponentValues": [ ],
 "FieldType": 0,
 "XPath": "Metadata/custom:language",
 "KeywordValues": [ ]
},

DXA 2.0 Text Field

"language": "English",

Summary

So, there we have it, the new DXA 2.0 JSON delivers what it promises – much leaner and meaner JSON for the benefit of us all.

During a recent DXA project we experienced strange errors when publishing some content.  We are moving to DXA and the new DXA templates try to render every field of the Component and linked-to Components.  This is usually great, but if your content is a bit stale or outdated, or possibly contains an invalid value (like mine did) then the following script might be helpful.  (You should create a normal Core Service app, mine is a Console App, and reference all the usual Tridion Assemblies).

It was complaining that a Category did not contain the Keyword.  The error message was ‘Keyword with title ‘Long Lost Keyword’ does not exist in Category ‘Amazing Category’ [tcm:7-12345-512].’ After some digging we found a Multimedia Component with invalid Metadata.   To view the invalid Metadata we used the excellent Tridion Alchemy Plugin Show Item XML from the team at Content Bloom.  If you haven’t yet tried Alchemy yet, now is the perfect time, and this plugin alone makes it worth the (free) install.  You can even just install it on your Dev server if you want.

The simple solution for our invalid metadata problem would be to change it in the GUI, but the GUI didn’t show the value, and we were stuck.  So, we decided to write a small Core Service script that updates the Metadata field or Removes it.  Hope this helps.

 

Currently as part of the Publish process, in a post-build event I am sending JSON to an external search engine.  As part of that process, I wait for a response from the search engine that the content arrived successfully.

However, when it doesn’t arrive, I wold like to notify authors via the PublishQueue status that it didn’t get there.  One solution is to update the Publish Status on the published item, setting it to Warning or Failed, and also update the text in the Publish Transaction.  The code below shows how we can do this.  I implemented it as a WebService, so it is possible to be called from any external system, including the event system.

 public void Get(string transactionUri)
 {
      string uri = "tcm:" + transactionUri;
      string binding = "netTcp_201501";
      SessionAwareCoreServiceClient client = new SessionAwareCoreServiceClient(binding);
      PublishTransactionData trans = client.Read(uri, new ReadOptions()) as PublishTransactionData;
      string title = trans.Title;
      trans.State = PublishTransactionState.Warning;
      trans.Information = "Didn't make it to Search Index - please publish again";
      client.Update(trans, new ReadOptions());
 }

 

Here are some helpful tips when working with JSON.NET.  It is sometimes challenging to find the right method or property to use because we don’t have access to intellisense when using the ‘dynamic’ object type often preferred by JSON.NET.Here are some helpful tips when working with JSON.NET.  It is sometimes challenging to find the right method or property to use because we don’t have access to intellisense when using the ‘dynamic’ object type often preferred by JSON.NET.
The context is that I get an existing JSON document, and I need to add new properties and nodes into the document.

Hope this was of some help to you with providing some more examples of the excellent JSON.NET library.  If you have any more tips or suggestions for the code I am happy to hear them.  Thanks.

While creating some JSON for the Metadata on a Structure Group in C# I came across an interesting challenge to display the URI and Title of the Embedded Schema. Initially I was using a FieldDefinition instead of an EmbeddedFieldDefinition and then the ID and Title properties were not available of the Embedded Field. Casting the variable to an EmbeddedSchemaFieldDefinition was the proper way to access the EmbeddedField definition info.

 

EmbeddedSchemaField right1Field = pageMetaFields[fieldName] as EmbeddedSchemaField;
EmbeddedSchemaFieldDefinition def = right1Field.Definition as EmbeddedSchemaFieldDefinition;

embeddedSchemaFieldDef.RootElementName = def.EmbeddedSchema.RootElementName; //"Content";
embeddedSchemaFieldDef.Id = def.EmbeddedSchema.Id; // "tcm:11-123-8";
embeddedSchemaFieldDef.Title = def.EmbeddedSchema.Title; // "Metadata fieldname";