Hedgehog Development recently hosted the April edition of the Sitecore Virtual Users Group meeting. The guest speaker for April was Nick Wesselman CTO at Active Commerce. Nick gave a great presentation and demo of Active Commerce’s latest release Active Commerce 3.1.

Active_Commerce_scaled

 

Nick covers a range of topics including:

  • Active Commerce 3.1′s Architecture
  • Why Active Commerce chose a server-side adaptive approach to mobile instead of using a responsive approach
  • How Active Commerce uses Angular

You can watch the video below.  Added Bonus: At the 37 minute mark our own Dave Peterson gets a mention for his terrific posts on Angular.

Dave’s Angular + Sitecore Blog Posts

Building a Single Page Application with AngularJS and Sitecore: Part 1

Building a Single Page Application with AngularJS and Sitecore: Part 2

 

{ 0 comments }

Here is what’s going on at ISITE sponsored Sitecore User Groups around the country in April:

Philadelphia

On April 17th at the Philadelphia Sitecore User Group Sean Holmesby of Hedgehog Development will give a hands on demonstration of Team Development for Sitecore 5.0.

Team Development for Sitecore 5.0 Team Development for Sitecore has become the best practice tool when it comes to Sitecore development. By giving developers to check their code into Source Control, fire off Continuous Integration, and safely work as a team it allows developers more freedom than ever before. Since its initial release in 2009 TDS is now getting ready to launch TDS 5.0. With plenty of new features including cross project referencing, new project wizard, validation scans, and many more features developers can use to improve their development.

More Details: Team Development for Sitecore (TDS) 5.0 Demo

 

New England

On April 23rd Matt Friedlander of Hedgehog Development will giving a hands on demonstration of  Hedgehog Team Development for Sitecore 5.0 at the New England Sitecore User Group.

Team Development for Sitecore has become the best practice tool when it comes to Sitecore development. By giving developers to check their code into Source Control, fire off Continuous Integration, and safely work as a team it allows developers more freedom than ever before.  Since its initial release in 2009 TDS is now getting ready to launch TDS 5.0. With plenty of new features including cross project referencing, new project wizard, validation scans, and many more features developers can use to improve their development.

More Details: Hedgehog Team Development for Sitecore 5.0

 

Portland

On April 28th Coveo will be presenting Coveo for Sitecore at the Portland Sitecore User Group. Representatives from Coveo share details about:

  • Coveo Sitecore Integration
  • Behavioral Search Features including geo-location and boosting rules
  • Coveo Developer Support

More Details: Coveo for Sitecore

Stay tuned for more information on what was shared at these user group meetings!

{ 0 comments }

Dave Peterson, ISITE Design Developer and 2014 Sitecore MVP, is a well-known figure in the Sitecore community. Along with his hard-earned MVP recognition, he’s a co-organizer of the popular Sitecore Users Group in Philadelphia and a frequent contributor to open-source code libraries and other parts of the community.

We spoke to Dave from his home office in Philadelphia, just before he left for Oregon to join his technical colleagues at our first-ever internal “T Week”.

Q. Tell us about yourself, Dave. Sitecore MVP Dave Peterson

I grew up in Brookline, MA, a suburb close to Boston. After high school, I attended Drexel University in Philadelphia where I studied computer science and met my wife, Melanie. We moved back to the Boston area after graduation and I worked as a software developer with some companies in the area.

In 2012, I joined ISITE Design and, soon after, relocated with my wife back to Philadelphia. We live outside the city, have 2 beautiful daughters, Katelyn and Emily, and are expecting a third girl in June. Life is good!

Q. How did you become so passionate about technology?

My dad worked in IT so even as a kid I was exposed to computers and software. In high school—this was just before the web really caught on—I was already going online with AOL and even running a small bulletin board service. It wasn’t that long ago that I was using a dial-up phone modem! I also had the chance to take a number of computer-related courses before I got to Drexel. With this background, my decision to study computer science and make it my career was pretty easy.

Q. Why did you gravitate towards Sitecore development as your core skill? 

I was working at a company that was still using a custom-built content management system. As they thought about replacing it, we looked at several enterprise solutions. Sitecore came recommended by a trusted friend so I looked into it pretty closely.

Sitecore has many strengths, but two things really caught my attention as a developer. First, Sitecore’s extensibility meant I’d be able to build custom functionality on top of it. This means more flexibility to solve very challenging problems. Second, I found Sitecore’s developer and user communities to be extremely supportive. From the start, I felt welcomed and knew they’d help me succeed.

Q. Congratulations on being named a 2014 Sitecore MVP, Dave! How did that come to pass?

I honestly never saw myself being named a Sitecore MVP at this point in my career. While I’ve worked hard at ISITE, been exposed to some tough problems, and done my best to be a leader in the community, I knew that the MVP bar is quite high. I work with Kam Figy, also a Sitecore MVP, and see that standard of excellence in everything he does.

So, it was a big deal to even be nominated. As I’ve told my friends, I would have been happy if it had all ended there. When I got word that I’d made the final MVP shortlist, it was an extremely special moment. The recognition from my peers perhaps meant the most to me.

Q. What advice would you give to up and coming young developers?

That’s easy: Get involved! Software developers may be part of larger teams, but we often work by ourselves on a day-to-day basis. It’s easy to overlook the skills and experience of other developers if they’re not part of your immediate team. That’s a big mistake in my mind.

I really like getting involved and have always found it fun. Outside of work, you’ll find me active in several online Sitecore developer communities, contributing to open source code libraries for other developers, and attending the Philadelphia Sitecore Users Group (which a few of us started up a while ago). Together, they represent a big commitment of time and energy, but I’ve learned a lot and met some great people through these side efforts. Get involved with your peers—you won’t regret it!

Q. Thanks for your time, Dave. How can people contact you?

I’m on Twitter a lot, so that’s the best way. You’ll also find me at most Philadelphia Sitecore Users Group meetings if you’re in the area. Or, you can call ISITE Design and talk to not only me but a whole bunch of other great Sitecore developers. We’d love to hear from you!

{ 0 comments }

This post was originally published on Kam’s Idea Log by Kam Figy on November 16, 2013. 

Introduction

There are many times where you need to extend the Sitecore data architecture in some way. One of the most obvious, and most used, is attaching an event handler to one of the item events (e.g. item:saved, item:renamed) but this is not by any means the only way to manipulate items before they get to the database.

This blog post came out of a discussion I had with Alex Shyba about the DataEngine, a few hours on a plane, and a lot of decompilation. I’m going to attempt to show what happens when an item gets saved and where you can plug into that.

The entry point

The most high level API is of course the Item class. Saving an item using this API is very simple:

using(new EditContext(item))
{
    item["MyField"] = "newValue";
}

When the EditContext goes out of scope, this causes item.Editing.AcceptChanges() to be invoked, and our journey down the rabbit-hole begins there.

The Item Manager

Our next step is the highest level item data API in Sitecore: the ItemManager. At first blush ItemManager appears to be a rather ugly giant static class, with tons of manipulaton methods: SaveItemAddVersion, etc. However, it’s not as bad as it looks. ItemManager is basically a static facade around the current ItemProvider.

The Item Provider

Here’s where things get interesting. You can register multiple item providers in the config under itemManager/providers. While this appears to provide a lot of power as an extension point – being able to plugin your own high level provider – it unfortunately seems to be rather ungainly. If multiple providers are registered you can access them directly using ItemManager.Providers, but the other ItemManager methods only execute against the default provider. You could replace the default provider with your own, but this is less than ideal as it can lead to contention for whose item provider gets used if more than one module wants to extend using it.

Extension points aside, the ItemProvider is the most broad data API Sitecore provides. It deals in high level objects and abstracts lower level concepts like databases and item definitions away. Most all methods in the ItemProvider result in invocations of the next lower level construct, the DataEngine.

UPDATENick Wesselman pointed out that some queries will bypass the Item Provider and go directly to the Data Engine. This gist has some examples of the types of things that bypass the Item Provider. In light of this I’d say the item provider is generally not a good candidate for extending things.

The Data Engine

DataEngine (generally accessed by databaseObject.DataManager.DataEngine) is a very interesting component for extension. Unlike the item provider, the DataEngine is database-specific. This is also the layer at which item event handlers (e.g. item:saved) are processed, but more interestingly is also a place where you can hook events in an uninterruptible fashion. Regular event handlers, such as item:saved, are vulnerable to being disabled when someone scopes an EventDisabler. Generally this is good, as events are disabled for performance reasons during things like serialization bulk load operations. But occasionally, such as in Unicorn, you need an event handler that cannot be disabled. Having a Unicorn event not fire would likely mean data being lost.

The internal architecture of DataEngine works something like this: – An engine method gets invoked – The engine creates and initializes an DataEngineCommand<> object, using a stored prototype of the command – The DataEngineCommand has its Execute method invoked.

The EngineCommand is a generic type, and each action that the engine can take has its own implementation – for example, there is a Sitecore.Data.Engines.DataCommands.SaveItemCommand class. Each of these command types is bootstrapped by a prototype system on the DataEngine itself. The engine, by way of its Commandsproperty, stores copies of each command type. When a new command is needed, the existing prototype command is cloned (Clone()), initialized (Initialize()), and then used to execute the action. These prototypes are settable, including via configuration, so this allows you to inject your own derived implementation of each command and thus inject ‘event handler like’ functionality into the DataEngine.

Item Buckets utilizes this type of functionality injection, replacing the AddFromTemplatePrototypewith its own extended implementation. This is the relevant section of Sitecore.Buckets.config:

  <database id="master" singleInstance="true" type="Sitecore.Data.Database, Sitecore.Kernel">
    <Engines.DataEngine.Commands.AddFromTemplatePrototype>
      <obj type="Sitecore.Buckets.Commands.AddFromTemplateCommand, Sitecore.Buckets" />
    </Engines.DataEngine.Commands.AddFromTemplatePrototype>
  </database>

This same functionality could be used to inject non-disableable event handler type functionality into other events, for example by replacing the SaveItemPrototype. Unfortunately this method also suffers from possible contention issues if multiple modules wished to patch these commands, so be careful when using them.

The DataEngineCommand

Once the DataEngine creates and executes a command, the command generally does two things: * Pass its task down to the Nexus DataApi to be handled * Fire off any normal item event handlers (item:saved), as long as events are not disabled

Most of the methods on DataEngineCommand are virtual so you could extend them. The most obvious candidate, of course, is the DoExecute method that performs the basic action of the command.

Further down the rabbit-hole we arrive to the Nexus APIs.

The Nexus DataApi

The Nexus assembly, due to it containing licensing code I believe, is the only obfuscated assembly in Sitecore. This makes following what the data API is doing rather difficult, but I’m pretty sure I traced it back out as a call to the databaseItem.DataManager.DataSource APIs, which thankfully are not obfuscated. It’s worth noting that the Nexus APIs appear to also be using a separatecommand-class based architecture internally. Given the sensitive nature of the Nexus assembly however, I would look elsewhere for extension points.

The DataSource

The Sitecore.Data.DataSource appears to largely be a translation layer between slightly higher level APIs, where things like Item are used, and the low level API of the data providers (which use constructs like IDs and ItemDefinition instead). The data source is very generic and does not appear to be designed for extension, which is fine because we can extend both above and below it.

Methods within DataSource eventually make calls down to static methods on the DataProviderclass.

The Data Provider

There are two faces to the DataProvider class. The internal static methods that the DataSourceis invoking are helper methods that invoke non-static methods on all of the data providers attached to the database. (Yes, you can have multiple data providers within the same database, which may not even look at the same backend database at all…hehe) The actual data provider instances are the lowest level data APIs in Sitecore. They deal with primitive objects and have a lot of unspoken rules about them that make them tougher to implement than most other extension points. However they are also the most powerful extension point there is. Using a data provider you can manipulate the content tree in nearly any fashion for example Rhino, a data provider that makes serialized item files on disk appear to be real content items in Sitecore.

You’re still reading this?

Hopefully this is a useful post for some crazy nuts like myself who like to bend the guts of Sitecore. It’s definitely a long and byzantine road from saving an item to it getting to the database. Rather amazing that Sitecore is as fast as it is with all of these layers. Part of me suspects that some are baggage from Sitecore 4 for backwards compatibility.

{ 0 comments }

Here is what’s going on at ISITE sponsored Sitecore User Groups around the country in March:

New England

On March 12th Tim Braga will be presenting on Solr at the New England Sitecore User Group. This presentation will walk you through a real-life Solr implementation Velir’s GoCollette.com project. Tim will be showing you how to create a custom index, one that contains a list of Country Items from Sitecore, another that takes hundreds of items, does some computation and translates that into one document within the index. He will also be touching on computed fields, switching cores on rebuild, custom and built-in indexing strategies and custom crawlers. If there is time, we can decipher the Solr config file and take a look at the Solr admin.

More Details: SOLR in Action!

Philadelphia

On March 20th at the Philadelphia Sitecore User Group Gauthier Robe of Coveo will discuss:

- How to quickly build (and easily manage) compelling and sophisticated search experiences within Sitecore 7
- How to securely expand and enhance your website’s search capabilities to include content residing beyond the Sitecore stack
- How to leverage Sitecore DMS and Coveo for Sitecore to personalize and contextualize website search for your visitors

More Details: Coveo Search Integration

Portland

On March 31st at the Portland Sitecore User Group, we will be hosting an evening with John West Sitecore’s CTO. John will talk about where Sitecore has been and where it’s headed.

More Details: An evening with John West Sitecore CTO

Stay tuned for more information on what was shared at these user group meetings!

 

{ 0 comments }

Sitecore ushered in its 2014 class of MVPs yesterday which recognizes outstanding community contributions and excellence on the Sitecore platform. The MVPs reign from around the world and include ISITE Design’s own Kam Figy and David Peterson.

For the first time, Sitecore is also making a distinction between Technical MVPs and Digital Strategy MVPs, which is exciting to see with the growth of the Digital Marketing System and the specialized strategic expertise required.

To celebrate the new MVP set, we again created an infographic (available for download below). Feel free to use it, repost it, share it, and sleep with it under your pillow. We apologize in advance if there are any errors — Drop of a comment below and we’ll be quick to fix them.

Congratulations from all of us at ISITE Design.

sitecore_mvp_2014

If you’d like to embed the infographic on your site, feel free to copy and paste the code below.

<p><a href="http://www.isitedesign.com/sitecore/wp-content/uploads/2014/02/sitecore_2014_FINAL.jpg" target="_blank"><img class="alignnone size-full wp-image-750" alt="sitecore MVPs 2014" src="http://www.isitedesign.com/sitecore/wp-content/uploads/2014/02/sitecore_thumb-2014.png" width="530" height="1100" /></a></p>

{ 3 comments }

If you have a form that needs to show up on multiple pages, it makes sense to declare it on a Layout or Sublayout. To do this, you must go to the configuration/system.web/pages/controls element of the Web.config file and add the form rendering namespace to the list.

<pages validateRequest="false">
 <controls>
 <add tagPrefix="sc" namespace="Sitecore.Web.UI.WebControls" assembly="Sitecore.Kernel" />
 ….
 <add namespace="Sitecore.Form.Core.Renderings" tagPrefix="frm" assembly="Sitecore.Forms.Core" />
 </controls>
</pages>

Once this is complete, calling a WFFM form rendering is as easy as calling any other rendering.  Supply the datasource as shown below.

<div class="cm-form">
 <frm:FormRender runat="server" DataSource="{1FY0UR3A-LLYL-0V32-PLAY-W1THSIT3C0R3}" /> 
</div>

Web Forms for Marketers made it easy for us to replicate a subscribe form across the Wharton Executive Education site we just completed.

You can read the full Wharton case study here.

{ 0 comments }

Digital Clarity Group (DCG) hosted a half hour web-based briefing today with their “rapid reaction” to Sitecore’s acquisition of Commerce Server. The briefing was led by DCG’s Tim Walters, Partner and Principal Analyst and Scott Liewehr, President and Principal Analyst. They will be posting the full recording on their website shortly. I appreciated both the insight and the timely nature of webinar less than a week after the acquisition was announced.

The news was specific interest to us as a long-time Sitecore partner who also does work with eCommerce. We’ve seen increased demand for integrated content and eCommerce systems and have clients right now asking us for recommendations on commerce platforms that can specifically integrate with Sitecore.

Here’s a rundown of what DCG covered in the briefing with a focus on the implications to both Sitecore and Commerce Server as well as the overall marketplace, service partners and customers.

On DCG’s initial reaction to the acquisition

  • Too early to tell but the positive aspects of the alignment between the two companies far outweigh the negatives in DCG’s opinion
  • Overall a thumbs up for the marketplace and combined force of the two platforms, especially in the .NET space

On the press release from Sitecore

  • Sitecore’s claim for having the “first .NET based, enterprise-grade Customer Experience Management (CXM) platform with a fully integrated commerce engine” is not entirely true. DCG mentions Bridgeline’s iApps, EPiServer and Kentico as others but qualify that the word enterprise is subjective.

On the wider context of the acquisition

  • Content and eCommerce is a meaningful trend says DCG. To date they have seen parallel tracks for these platforms serving users in relatively distinct ways.
  • Clients are asking with increasing frequency how they can get content and commerce platforms to work together. It’s understood they need to support commerce with richer more personalized content.
  • DCG, however, advises organizations to frame this in a larger Customer Experience Management context with Commerce & eContent as a subset.

On Commerce Server’s market position and claim as a leading commerce vendor

  • This leadership claim is not accurate in DCG’s opinion. This is not a marriage of a superior commerce solution with a leading WCM platform. While Sitecore makes legitimate claims to being a leader, it’s no secret that Commerce Server has been lagging. Recent Gartner and Forrester reports on the eCommerce space support this point of view as well.
  • However, there have been investments in Commerce Server since it went to Ascentium (now SMITH). For one, they decoupled it from SharePoint and there is upside that Sitecore would seem to be the perfect home for the platform to evolve from within.
  • Commerce Server also has a significant install base of 3,000+ customers (which is about the same size as Sitecore’s) presenting significant opportunities for cross selling.

On the implications for Sitecore

  • This is the first major acquisition Sitecore have made (there have been smaller ones) and it fills a huge gap in their portfolio while addressing an emerging need for more integrated platforms.
  • Commerce platforms in general struggle with managing content and aligning with a WCM vendor should help accelerate improving these capabilities.
  • Sitecore is also gaining a very experienced development team of at least 20 people plus key executives

On the implications for end customers

  • There’s significant market opportunity within the .NET commerce space. In DCG’s opinion there is still no solid competitive .NET commerce solution that has emerged as a leader.
  • There’s opportunity for existing Sitecore customers to “stay in the family” and not look to an outside platform and also for existing customers to wade into eCommerce who are just starting to consider it.
  • There are 40+ integrations between the two companies already including Green Mountain Coffee and Jordan’s Furniture — showing a track record of the two platforms working together.

On the implications for WCM competitors

  • DCG acknowledges it puts pressure on the likes of Adobe and SDL, both of who have nice suites but lack integrated eCommerce capabilities
  • It also Puts a lot of pressure on some of the “stack vendors” like Oracle and IBM to better integrate products in their existing portfolios that have largely grown by acquisition.
  • Acquia is already in on the space with its Commerce Cloud indicating competition and positioning will be heating up from all angles
  • DCG predicts SAP may look to buy a WCM vendor (although Scott acknowledges he’s been saying this for two years)

On the implications for digital agencies & integrators

  • DCG hears agencies and integrators still complaining about the amount of system integration work needed to get platforms together
  • These systems coming together presents an additional opening to smooth out some of the friction points on how WCM and Commerce integrate
  • WCM-centric agencies looking to build capabilities in eCommerce need to realize that it requires a new set of competencies and domain expertise.

Thanks again to DCG for the insight and be sure to check out the full recording on their site when they post it. Stay tuned as well to this blog for additional thoughts on the Sitecore platform from our team. If you’d like our agency’s perspective on Sitecore and Commerce Server’s capabilities, you can drop us a line at results@isitedesign.com or call us at 888-269-9103.

What are your own thoughts on the news and the competitive landscape? Is this good for the marketplace and end customers? Leave a comment below with your thoughts.

{ 2 comments }

sitecore and angular

The November meetup for the Philadelphia Sitecore User Group will look at a proof of concept Single Page Application (SPA) built with AngularJS and Sitecore. Incorporating Angular into a Sitecore application creates an interesting approach pairing dynamic content with a sleek and fast engine for dynamic views. Here’s a sneak peek at what we’ll be covering:

Templating Similarities

Angular templating works much like Sitecore in how it allows for abstracting presentation in reusable views. With both Angular and Sitecore, a default layout is defined while allowing for dynamic views to be inserted. Sitecore, using placeholders and inserting renderings based on definitions in content, while Angular injects views into view directives from predefined routing .

Consider a scenario where instead of injecting an Angular view from the filesystem, we leverage Sitecore to provide the view by way of a Sitecore item’s presentation. Sitecore now becomes the view, allowing for dynamic content within an Angular application context.

Routing and Caching

How do we deal with caching issues?

Angular is fast. Angular’s speed comes from loading required resources at application start, requesting only things it needs for each page and leverages browser cache for everything else. With Sitecore, website content can be dynamic. Published content may not necessarily show in our Angular application right away.

We can get around these issues by dynamically building our routing table based on the Sitecore version number of the angular views published. With an MVC-like approach, Angular routing tables allow us to map URLs to Angular views by way of Sitecore items and item version number.

Alternate Approach

A more traditional approach is to build your SPA outside of Sitecore, adding Sitecore content as a dependency by way of the Sitecore Item Web API module. Your application and datasource, in this instance being Sitecore, are decoupled. Content is delivered over the wire via GET requests to our Sitecore instance. Layers of caching can be implemented within our Angular application, or ignored completely, allowing for fresh and up-to-date content at all times.

More to Come

Want to learn more? Come out to the November meetup. We’ll walk through a live demo, take a look at some code and review the configuration within Sitecore content.

We’ll dig into the Sitecore Item Web API, impact to the Sitecore client and various security and performance considerations.

Slides, coding samples and related posts will be made available after the meetup.

Hope to see you there!

{ 0 comments }

A few weeks back, the first ever Philadelphia Area Sitecore User Group gathered to discuss Web Forms for Marketers and DMS. With 20 members joining the inaugural meetup, attendees from various backgrounds in development, design and marketing took part in conversations around web forms and DMS, followed by a post-talk Q&A session.

With the help of Jamie Stump of Perficient and Debra Loggia from NorthPoint Solutions, the Philadelphia Area Sitecore User Group kicked off with two presentations:

  • Customizing Web Forms for Marketers by David Peterson, Senior Software Engineer, ISITE Design
  • Extending DMS to Include Non-Sitecore data by Jamie Stump, Sitecore Practice Architect, Perficient

Customizing Web Forms for Marketers

During the Web Forms for Marketers talk, the group reviewed an architectural overview, custom validation and save actions. Members kept the conversation moving, mostly with questions around best practices for implementation and when and when not to choose one form of customization over another.

The main message was this: It’s important to understand the circumstances in which customization is warranted within Web Forms for Marketers. Knowing that Web Forms for Marketers provides ultimate flexibility to marketers and content editors, whereas, over-customization in certain areas will limit their ability to be successful.

Extending DMS to Include Non-Sitecore Data

Through a real-life example, we learned how to extend DMS to trigger browsing events on a per-product basis. DMS out-of-the-box configuration allows for data collection to tailor content and personalize the user’s web experience.

What made this scenario unique was how products were tied to pages by query string, and not URL structure by way of unique Sitecore items per product. The sheer volume of products made this approach necessary.

Proper visitor identification was achieved by customizing the entry point into DMS data and creation of DMS persona scores for displayed products.

Future Meetups

It’s clear there’s a high level of interest for Sitecore in and around the Philadelphia region. In a few weeks, the group will be meeting again to discuss a Proof of Concept for a Sitecore-Backed Single Page Application built with AngularJS and Sitecore Web API.

We look forward to future meetups and continuing the success of the Philadelphia Area Sitecore User Group.

{ 0 comments }