Working with User Data

We have already talked about various aspects of how Customer's Canvas integrates with web-to-print sites in the Integration with E-commerce Overview topic. This article dwells on how Customer's Canvas handles user accounts and login sessions initiated on the host site. Technically Customer's Canvas does not require deep integration with the authentication system of the host site, as it acts only as a web-to-print editor. All it needs is to receive product settings from the e-commerce module, display the product template in the editor, let the end user personalize it, and then, when the user is done with changes, return the personalized product details back to the website. The website is responsible for extracting product settings and passing them on to the editor. And the website handles output from the editor and stores the customized product details among the order attributes.

Customer's Canvas only deals with login sessions once. It needs a way to differentiate uploaded files and personalized products so that a user does not have access to content belonging to someone else. To get around this, the website has to initialize Customer's Canvas with a unique user identifier. The web-to-print editor should associate personalized products with the same user identifier to specify that they were created by the corresponding user. If the user uploads photos to the image gallery when personalizing a print product during the first session, the photos will be available to the user when they return to the website and create another order.

E-commerce platforms always identify user accounts registered in the system by a unique identifier. When integrating Customer's Canvas, you will need to find the technical documentation for your platform and look up information on how to retrieve the identifier using the platform's API.

In some scenarios it may be more beneficial to create an identifier yourself in the code initializing Customer's Canvas on the website, store it in a custom user attribute in the e-commerce system, and then pass it to the editor. Next time the editor signs in, the code will check if the attribute is already filled with a value and, if so, retrieve and use it as the user's identifier in Customer's Canvas.

In order to initialize the editor with a user identifier, you should pass it to the loadEditor method as a part of the editor configuration:

JavaScript
...
configuration = { userId: "e02e4ced-b56e-caee-4e88-a2482976db73" };
CustomersCanvas.IframeApi.loadEditor(iframe, product, configuration);
...

When a user identifier is not specified, the default value is used. To change the default user identifier use the DefaultUserId parameter in web.config.

Customer's Canvas creates a separate subfolder for each user whose identifier it has ever been initialized with. The path to the folder where all these subfolders are stored is set up using the UserDataFolder parameter in web.config. By default it has a value of UserDataFolder which means that all user subfolders are stored in the /UserDataFolder/ folder in the web application root. Each user subfolder contains the following:

  • \UserDataFolder\someUserId\states\ - the folder contains products created by someUserId user.
  • \UserDataFolder\someUserId\images\ - the folder contains images uploaded by someUserId user.

The default user identifier and the folder path where user data is stored are set via the DefaultUserId and UserDataFolder parameters in web.config as follows:

XML
<appSettings>
…
    <add key="DefaultUserId" value="default" />
    <add key="UserDataFolder" value="~/UserDataFolder" />
…
</appSettings>

The UserDataFolder path is relative to the web application root.

Using Customer's Canvas on Public Websites

Customer's Canvas offers two modes that can be used on public websites: demonstration and anonymous. Both modes allow users to customize a product without authorization. The main difference between modes is automatic clean-up of user files. In the demonstration mode Customer's Canvas automatically cleans up user files, including saved products, while in anonymous mode no files are cleaned up automatically.

Let us discuss both modes in detail.

Anonymous Mode

The anonymous mode allows users to customize products without authorization. The editor in this mode treats each session as belonging to a unique user. So, on a public website it allows keeping user files separated, preventing a user from accessing another user's images and products.

The usual workflow using the anonymous mode is as follows:

  1. An anonymous user customizes a product.
  2. The user continues working with the previously customized product as many times as they want.
  3. The user signs in or signs up and orders the product. Your system uses the Product.setUserId method to set unique user identifier and move user files to the user folder.
  4. The system calls the Editor.finishProductDesign method and gets the hi-res output URLs.

To activate the anonymous mode set the AnonymousModeEnabled parameter to True in web.config:

XML
<appSettings>
…
    <add key="AnonymousModeEnabled" value="True" />
…
</appSettings>

Demonstration Mode

The demonstration mode allows users to play with the editor. It does not require user authorization, and it prevents your system from overfilling with user files. The editor in demo mode treats each session as belonging to a unique user. So, on a public website it allows keeping user files separated, preventing a user from accessing another user's images and products.

To activate the demonstration mode set the DemoModeEnabled parameter to True in the web.config file:

XML
<appSettings>
…
    <add key="DemoModeEnabled" value="True" />
…
</appSettings>
Important

Do not use the demonstration mode for real orders. In this mode user files, including hi-res output, saved products, proof images, etc. are cleaned up automatically after the session ends. So, if a user saved a customized product when the system was in demo mode and wants to order it later, it may be impossible: the customized product can be deleted already.

Load User Info Feature

Imagine your user is customizing a series of different products requiring to enter the same information in the fields. Filling out each product from scratch is drudgery. Fortunately, Customer's Canvas supports the pre-populating of fields with data loaded from the customer's account. For example, suppose the e-commerce system stores first and last names, phone number, and email addresses in user accounts. We can make Customer's Canvas pre-populate these fields in user generated products:

  1. On demand: enable the Load my info button in ~\Configuration\clientConfig.json:

    "loadUserInfoButtonEnabled": true

    After that, when page opens or reloads, Load my info button is displayed in the user interface:

    The Load my info button.

  2. Automatically on product load: enable the autoLoadUserInfo feature in ~\Configuration\clientConfig.json:

    "autoLoadUserInfo": true

    In this case, when a product is loaded into the editor, it is already populated with data; the Load my info button is not displayed in the user interface.

Populating Products with Predefined Data

The data to populate a product with should be loaded from your e-commerce system and passed to the loadEditor method as a part of the editor configuration:

JavaScript
...
configuration = { userInfo: {"FirstName": "John", "LastName": "Snow", "Phone": "0123456789", "Email": "john.snow@mail.com"} };
CustomersCanvas.IframeApi.loadEditor(iframe, product, configuration);
...

The userInfo property accepts data in the JSON format, where keys are layer names (without markers), in-string placeholder names, or image placeholder names in PSD templates. For example:

  • If a layer name is "FirstName<LC>", the corresponding key is "FirstName".
  • If a layer contains Position: [#Your_Position] in-string placeholder, the corresponding key is "Your_Position".
  • If a layer is an image placeholder named <PH>Logo, the corresponding key is "Logo". Values for image placeholders contain details about image location:
    • If the target image is stored in the user folder, then the value should contain user: prefix; for example, the following key-value pair "Logo": "user:myLogo.jpg" tells the editor to fill the Logo image placeholder with the myLogo.jpg from the user folder.
    • If the target image is stored in the public folder, then the value contains public: prefix; for example, the following key-value pair "Logo": "public:car_logos/ford.jpg" tells the editor to fill the Logo image placeholder with the ford.jpg logo from the \car_logos\ subfolder of the public image folder.

For populating a product with predefined data Customer's Canvas matches layer names and in-string placeholder names against keys passed in the userInfo dictionary. If a layer or a placeholder has a match, its value is replaced with a corresponding value from the dictionary.

Passing User Data to Loaded Editor

You may want to pass user data to a product at runtime. Editor.loadUserInfo allows to populate a product template with user data. Pass a data dictionary as the method parameter to populate the template with required values. The data dictionary has the same structure as userInfo. This method can be called without parameters, in this case it applies userInfo set when the Customer's Canvas editor has initialized.

JavaScript
...
// load web-to-print editor
CustomersCanvas.IframeApi.loadEditor(iframe, product, configuration)
.then(function (e) {
    // retrieve the loaded editor
    editor = e;
});
...
// populate a product with a user data
editor.loadUserInfo({ data: {"FirstName": "John", "LastName": "Snow", "Phone": "0123456789", "Email": "john.snow@mail.com"} })

See Also

Manual