Professional Documents
Culture Documents
AdvanCloud - 170710 - Template Development
AdvanCloud - 170710 - Template Development
Template Development
Version: 1.0.23
Date: 7th July 2017
Author: Keonn Technologies S.L.
Change Document record
Date revision Author Changes
Captures
Capture 1: Initial browser..............................................................................................8
Capture 2: WYSIWYG browser........................................................................................9
Capture 3: RFID emulator............................................................................................10
Capture 4: Receiving a product from the emulated RFID..................................................11
• HTML
• CSS
• JavaScript
Theoratically any browser that supports the latest revisions of HTML and HTML5
technologies can be used to develop and view these templates but at the moment
Google Chrome is the browser we always use in the actual AdvanLook hardware so it is
the only recommended development browser.
• JQuery
• JQuery Mobile
This two libraries allow higher level JavaScript document manipulation and provide
components that adapt to the touchscreen environments.
• Internet connection
Just decompress the Template development anywhere on your disk. You will find a batch
file in the root of the created directory. The batch file contains a command similar to this:
"%ProgramFiles(x86)%\Google\Chrome\Application\chrome.exe" --disable-web-security
--user-data-dir="%CD%/userdata" "file://%CD%/demo/index.html?
device=com.keonn.demo.shop02.001.fittingroom&branding=demo&token=demo&protocol=https
&host=demonew.keonn.com"
where:
• Device - is the name of the device you want to emulate (refer to the AdvanCloud
infrastructure documentation). To do tests you can leave it as it is.
• Token – the identifier of the server application this template . To do tests you
should leave it as it is.
Warning: Google Chrome browsers opened with the “–disable-web-security” flag should
Once you got the batch file correctly modified (corrected paths to both Google Chrome
and the template) and we made sure no other instance of Chrome is open we can double
click on the batch file. A window of Chrome like this will appear:
Depending on the configuration of the cloud you might not already see the template and
see an error message instead (“no connection”). In this case you will need to open
another Chrome window or tab and log to the cloud server by using your username and
password and then choose the Templates/Developer tab:
Two remarks:
• yellow line at the top of the browser warning you about the disabled web security
flag. You can click on the cross to close it.
• the template has been designed for a resoultion of 1080x1920 and we are viewing
it in a window that is much smaller, so the rendered HTML comes through kind of
distorted. You can use the Chrome developer tools to force a emulation resolution
to view what will actually get rendered on the AdvanLook screen.
Once these two small details have been corrected we get the final AdvanLook screen
emulation:
Type one valid EPC code or EAN into the “Own EPCs” box and press the “Post Read Code”
button, the product should then appear in the virtual AdvanLook running in our computer.
You can use the mouse button to emulate the AdvanLook touch interactions.
Please note that except for the HTML files containing the templates you should only be
doing changes in the “branding” directories. Directories you should not touch are
marked with red.
3.1- Handlebars
At the moment, template definitions are still implemented inside the HTML files. The
template system we use is Handlebars.
Handlebars is a template mechanism that allows formatting of data structures into HTML
markup. You can find more information about this templating system in the following URL:
http://handlebarsjs.com/
There is more information in the given URL, but basically you can reference attributes
from the formated data structure by using the double curly braces syntax:
<p class="title">{{name}}</p>
Each template is contained in a script tag outside of the document body and given an it is
given an id that is used to reference it and also a handlebars type:
<script id="detailscolumnview" type="text/x-handlebars-template">
All standard Handlebar operators can be used and AdvanLook also provides with a list of
additional helpers.
Renders the given block if the given JavaScript expression is evaluated to trueish
Generates a final image URL for the given image resouce url. The maxsize parameter
indicates the maximum size of the image (either maximum width or height, depending on
the aspect ratio). Requesting images in the actual size they are going to be presented with
maximizes image quality and bandwidth efficiency.
Generates a final URL from the given (relative/absolute/virtual) URL. This is done so to
guarantee that URLs are correctly generated in all the different environments (local PC
emulation, final server deployment, etc...)
Generates a thumbnail for the given resource URL, either an image or a video.
Formats the given markdown-coded text as HTML. The Github Markdown dialect is used.
Color is a color specification stucture instance (with code, name, etc...) or value coding a
color. Several “formattypes” are implemented:
• “sample” – returns some HTML that can be used to present a color. If only the
name is known, the name. If a code exists you will get a small square filled with
the actual color.
Creates HTML generating data attributes for all the data properties. Data attributes will
have the data-key_property names.
Presents the first value from a list of attributes that is not blank or empty. If none of the
values is not empty then the “defaultattribute” attribute is shown. The list is specified as a
configuration value. For example, if we define this configuration entry:
• "pricePath": "price,rangePrice"
This means that if the “price” attribute exists, it will get used, but if it does not exist then
“rangePrice” will be tried.
The fact that the path is specified as a configuration parameter makes it more flexible
because it can be modified without editing the template.
If the “country” configuration variable has been defined for the shop or app as “nl”, the
function will try the following keys:
• price_nl
• price
and it will retrieve the first that has been specified (even if it's value is '').
– “config__”
Gives access to the configuration values. For example config__.branding would contain the
current branding value.
By using this mechanism you can prevent unnecessary flickering and also let the user
maintain the state unless something really changes.
3.2- Brandings
Given a basic template, a branding is a “Look and Feel” customization on top of it
(changing the logo, styles, some literals, etc...). Most of the components of the basic
templates (like the JavaScript, CSS files, images, litearals, etc...) are identic in all the
versions of the AdvanLook templates. Normally template developers should favor adding
modifications to the given branding over directly modifying the basic files. Doing so allows
generating new versions of the base files and updating it in all the templates with greater
ease.
At the moment HTML and Handlebars templates can only be updated in the main template
files. This will probably change in a newer version.
3.3- Multilanguage
Advanlook supports developing multilanguage applications. We have several language files
with literal definitions in JSON format for each language. These files should be edited
using a UTF8 editor. Exotic language code pages are also supported.
3.3.2- html.lang_*
Language subsystem sets a class attribute with the form “lang_*” (where * is to be
replaced with the current active language extension) on the html DOM node that indicates
the currently active language.
This makes possible writing CSS rules that rely on the currently active language.
5.1- productlist
Whenever a new product is scanned a new item is appended to components with role
“productlist”. The actual HTML that will get added is specified by the given template and
can be customized by modifying it.
The data provided when rendering the template is the product data retrieved from the
server plus some additional attributes:
• “cid” - unique id for each item. This item is also required when using the
“productlistitem” krole and should be added as a data-cid on the root of the
template generated HTML to enable the manipulation.
– Attributes
• updatetemplate (required) – The template that is used to format the newly added
item.
– Example
<ul id="itemsList"
data-krole="productlist" data-updatetemplate="productlinetemplate">
</ul>
5.2- productlistitem
– Attributes
– Example
<li class="gallery-item" data-krole="productlistitem" data-cid="{{cid}}"></li>
5.3- productlistclear
When tapped this item will remove all the items from the product list.
– Example
<a data-krole="productlistclear" data-inline="true" data-role="button">
Clear List
</a>
Whenever a resource gets shown on them the following attributes are added to the tag:
– Example
<div id="productbigimageCellImage" data-krole="productimage"></div>
6.2- productthumbnail
When tapped these items show the referenced resource in the “productimage” viewer.
Resource can be an image or a video. When initially loaded the image shown in the big
viewer is set from the first productthumbnail found in the document.
“productthumbnailselected” class is automatically added to the thumbnail that is currently
being shown in the big image view.
– Example
<div class="thumbimage"
data-krole="productthumbnail"
data-thumbnailresourcetype="{{this.resourcetype}}"
data-thumburl="{{this.url}}"
style=" background-image: url('{{resourcethumbnail this 220}}');}">
<img src="img/video-play.png" class="thumbmainimagearrow"/>
</div>
6.3- productdetails
Components of this type should be used to present data about the product. They are
recalculated whenever new updated product data is available, for example when the users
changes the size or the color or a new product has been selected.
– Attributes
– Example
<div id="lookbookdiv"
data-krole="productdetails"
data-updatetemplate="lookbooktemplate">
</div>
6.4- requeststatus
Presents a request status. Status can be related to the currently selected product or can
be an assistant request status. Component can be specified to be shown when the status
is on or off. If the status does not match, the component is hidden. If it matches it uses
the given template to replace the contained markup.
– Attributes
◦ cid – we want to present the status regarding this currently chosen product
◦ off – component is visible whenever there is no request of the given type going
on
– Example
<div class="productdatacenteredbutton" data-krole="requeststatus"
data-requestname="assistance" data-requesttype="off">
<button data-krole="assistancerequest" data-role="button" >Assistance</button>
</div>
6.5- productrecommendationshow
Clicking on these components makes the referenced product be shown as the main
product (navigation to original product is available through the “productback” component).
Recursively traverses the DOM tree up looking for a node with class “gotoproduct” and
looks for the “data-productcode” attribute in it.
– Attributes
• class gotoproduct specifies the DOM node that contains the productcode data
attribute
– Example
<img src="{{formatimageurl thumbimg 200}}"
data-krole="productrecommendationshow" data-productcode="{{code}}">
6.6- productback
When tapped these items bring back the originally selected product. When formatting the
product data two additional parameters are provided:
– Example
<h4 data-ld="keonn.fittingroom.backtoproduct" data-krole="productback">
Back to product
</h4>
6.7- productattribute
“change” events triggered in these components force the revaluation of product attributes
and the update of relevant parts of the page.
– Example
<div id="product_productcolorschoose"
data-krole="productattribute" data-selectiontype="buttons">
{{#each colors}}
<div class="btn colorouter">
<div>{{formatcolor this 'color'}}</div>
<input class="hide" type="radio"
name="product_color" value="{{formatcolor this 'value'}}">
6.8- productrequest
Requests the assistant to bring the currently viewed product.
– Example
<div data-krole="productrequest" > Pedir talla </div>
6.9- productshare
Shares the currently viewed product. It typically will open a popup that will let the users
access an online app with their smartphone that allows them to post to Facebook and
Twitter.
– Example
<button data-krole="productshare" data-role="button">
</button>
6.10- productemail
Emails the currently viewed product. Opens a popup that allows the user to enter an email
address. An email is sent to that address.
– Example
</button>
6.11- assistancerequest
Requests the presence of the assistant. An assistance request item will appear in the
device of the Assistant.
– Example
<button data-krole="assistancerequest" data-role="button" data-inline="true">
Request to Assistant
</button>
6.12- productpropertiesclose
Closes the product properties page.
– Example
<li class="back">
<a data-krole="productpropertiesclose"></a>
</li>
– Variables
– Attributes
• updatetemplate (required) – The template that is used to format the list of basket
items
– Example
<div data-krole="basketitemslist" data-updatetemplate="tryonlisttemplate"></div>
7.2- basketitemadd
Adds the currently viewed item to the list of basket items.
– Example
<button data-role="button" data-krole="basketadd">
Add to try on
</button>
7.3- basketitemselect
– Attributes
– Example
<div data-krole="basketitemselect" data-cid="{{cid}}">
...
</div>
7.4- basketitemremove
Removes the basket item.
– Attributes
– Example
<div data-krole="basketitemselect" data-cid="{{cid}}">
<img src="img/ico-close-button.png">
</div>
...
</div>
7.5- basketitemsrequest
– Example
<button data-krole="basketitemsrequest"
data-ld="keonn.fittingroom.tryonlist.request" data-role="button">
Request
</button>
7.6- basketitemsshare
Shares the basket items. This typically will open a popup dialog with a QR that the user
can scan to access an AdvanCloud mobile sharing application.
– Example
<button data-krole="basketitemsshare"
data-role="button">
Share
</button>
7.7- basketitemsemail
Sends the basket items via email. This typically will open a popup dialog where the user
can enter her email address.
– Example
<button data-krole="basketitemsemail"
data-role="button">
</button>
– Attributes
• productcode (required) – The product code whose data will be requested to the
server. This should be the EAN code as registered in AdvanCloud.
– Example
<div class="recommendationitem" data-krole="templateproduct"
data-productcode="{{this}}" data-updatetemplate="recommendedtemplatefullpage"></div>
8.2- kslider
Creates a horizontal or vertical carrousel if a minimum number of child items exists.
– Attributes
• kslider_minitems (required) - Specifies the minimum number of items for which the
slider will be shown. If less kslideritems exist, the markup will be left unchanged.
– Parts
The template designer must mark with classes several parts of the slider markup:
• kslider_downarrow – Down arrow. Whenever the user taps on them the slider will
move in the other direction
• kslider_items – Should contains the items that will be managed by the slider.
• kslider_item – Should be used to mark every item. It will be used by the system to
count the number of items.
– Example
<div data-krole="kslider" data-kslider_minitems="3" data-kslider_mode="vertical" data-
kslider_slides="2">
<div class="kslider_uparrow"><img src="branding/clinique/img/uparrowsmall.png"></div>
<div class="kslider_downarrow"><img
src="branding/clinique/img/downarrowsmall.png"></div>
<div class="kslider_items">
{{#each recommendedcid}}
<div class="kslideritem">...</div>
{{/each}}
/div>
</div>
8.3- kscroll
Creates a horizontal or vertical scrolling area.
Kscroll container should contain a child that is absolutely positioned for it to work.
– Attributes
– Example
<div id="horizontalimages" data-krole="kscroll"
data-kscroll_mode="horizontal" data-kscroll_goto="2">
<div id="horizontalimagescontainer">
{{#each resources}}
<div class="imagebighorizontal" data-krole="kscroll_item"
style="background-image: url('{{resourcethumbnail this 1520}}');}">
</div>
{{/each}}
</div>
</div>
8.4- languageselect
Allow changing the language when selected. You can specify the target language with an
additional “data-language” attribute.
Ilustración 2: languageselect
– Attributes
– Example
<li data-krole="languageselect" data-language="en"><a>ENG</a></li>
<li data-krole="languageselect" data-language="fr"><a>FR</a></li>
<li data-krole="languageselect" data-language="es"><a>ESP</a></li>
8.5- popupurl
– Attributes
– Example
8.6- fullscreen
Shows the user of the application a resource in full screen format. Resources can be
images, videos, etc...
The tag checks its own attributes or goes up the DOM hierarchy until it finds a node that
has a data-thumbnailresourcetype and data-thumburl attributes.
A template is used to format the full screen view and should be present when this tag is
used. The id of the used template is resourcetype+fullscreentemplate, for example for
images it would be “imagefullscreentemplate” and for videos it would be
“videofullscreentemplate”.
– Example
<div class="videoimage" data-krole="fullscreen" data-thumbnailresourcetype=”video”
data-thumburl="{{resourcedata this.resource 'video' 'url'}}"
style="background-image: url('{{resourcedata this.resource 'video' 'thumbnail'
438}}');}">
<img src="img/video-play.png" class="videoimagearrow"/>
</div>
– Attributes
8.8- parenttoggle
Utility to toggle a class of parent DOM nodes. Toggling a class means removing it if it
exists and adding it if it doesn't.
– Attributes
• parentselector (required) – selector that will be used to match the parent DOM
nodes whose class will be toggled
– Example
<div class="openedcontainer">
<img
data-krole="parenttoggle"
data-toggleparentselector=".openedcontainer"
data-toggleparentclass="opened" src="img/rightarrowsmall.png"/>
</div>
8.9- parentremove
Utility to remove this node up to a certain parent node. The parent nodes are matched
against the selector given as an attribute.
– Attributes
– Example
<div class="videofullscreen_stop" data-krole="parentremove"
data-parentselector=".removeparent">
<img src="img/ico-close-button-128.png">
</div>
The attribute used to store the codes is “sessioncodes”. These attributes are removed
when a new session starts.
Usually used to present animations that won't appear again once the user has already
seen them (this is easily implemented with CSS rules).
– Attributes
• sessioncode – the code that will get stored in the html “sessioncodes” attribute
– Example
<div id="chooseproductanimation" data-krole="touchbubble" data-sessioncode="cproduct">
8.11- addsessioncode
Utility to attach a sessioncode to a certain scope (adds a class to a certain parent node
identified by the scope).
Sessioncodes are erases whenever the scope changes (the session is invalidated, the page
is closed, etc ...)
– Attributes
• data-scope (required) – specifies the scope to attach this sessioncode to. For
example “page”
– Example
<a data-krole="addsessioncode" data-scope="page" data-sessioncode="ksession-
popupreviews">
8.12- removesessioncode
Utility to remove a sessioncode from a certain scope (adds a class from a certain parent
node identified by the scope).
– Attributes
• data-scope (required) – specifies the scope to remove this sessioncode from. For
example “page”
– Example
<div class="popup-ok-button" data-krole="removesessioncode" data-scope="page" data-
sessioncode="ksession-popupdetails">OK</div>
8.13- removesessioncodes
– Attributes
– Example
<a class="popup-size-ok-button" data-krole="removesessioncodes" data-
sessioncodematch="ksession-popup">OK</a>
You must take into account that we are developing a Single-page application here
(http://en.wikipedia.org/wiki/Single-page_application). Whenever any Javascript
resources are initialized (window callbacks, timeouts, etc...) they must also be freed or
otherwise they will cause a memory leak that will, over time, degrade the performance
and ultimately end up killing the browser process.
We provide the following mechanisms to deal with template lifecycles, initialization and
release of Javascript resources:
Templates:
Elements:
• You can associate “data-knotify” attributes to elements whose removal from the
page you want to track down. These elements will trigger a 'kremoved' event when
removed from the DOM that you should use to free the related resources. You
should verify that you recognize the “knotify” attribute value of the received
element before processing it.
Browser
Cloud
AdvanLook Server
List of items and
requests
Assistant
A “Low Level App” subscribes to the service of the PluginLook while AdvanLook in the
background only manages the status of the list of items and requests. AdvanLook just
manages this list and the connection to the server and the rest of devices in the network
like the assistants without doing any kind of UI while the “Low Level App” is in charge of
the UI and can construct it however it wants with whatever tools it wants to.
An example template for sandbox testing this low level API is provided.
The Javascript interface uses Jquery events as the notification method. The events are
always triggered on the document level. To catch these events we just need to register:
$(document).on("klookstatus",function(ev,status,exdata){
console.log("received klookstatus "+status+" "+exdata);
}
• “productcode” - The product code, this is the code of the product that this sku
belongs to
“color”: “colorkey0102”,
“size”: “20”
You can obtain the different coordinate “axes” and possible values for a certain product by
using the “getProductVariationVariables” function from the “PluginLook” type.
9.2.2.1- Parameters
▪ code: the code entered by the assistant in the assistant application. In some
configurations this code can be used with the product API to obtain
additional information about the assistant like name and a photo.
9.2.3.1- Parameters
9.2.4.1- Parameters
For example:
$(document).on("klookitemstatus",function(ev,itemid,status){
if(iteminfo){
if(itemtype=='product')
{
...
}
else if(itemtype=='assistance'){
...
}
}
})
9.2.5.1- Parameters
• readdata – Data structure specifying the information that has been read. It will
contain the following fields:
◦ “value” – the identififer that has been read, typically the EPC of an RFID tag.
• allows us to retrieve the list of readings and requests and interact with them
• additional utilities
– “setStartUI(enableUI)”
Applications that want to control the User Interface should call this method with “false” in
the “klookstatus” “start” event. For example:
var klookinst;
if(status=='start')
{
klookinst=exdata;
klookinst.setStartUI(false);
}
});
In this code we are preventing the standard AdvanLook Templating System to start (we
want to control the interface) by calling “setStartUI(false)” and we are storing the
“PluginLook” instance for later use.
– “setProcessSensor(processSensor)”
Allows disabling the processing of the read events by the Advanlook system. This makes
sense if the application is already processing the read events (e.g. subscribing to the
“klookread” event to process them).
Applications that want to disable the Advanlook processing the read events should call this
method with “false” in the “klookstatus” “start” event. For example:
var klookinst;
$(document).on("klookstatus",function(ev,status,exdata){
if(status=='start')
{
klookinst=exdata;
klookinst.setStartUI(false);
klookinst.setProcessSensor(false);
}
});
$(document).on("klookread",function(ev,readdata){
– “getLookItemIds()”
Returns the list of current managed item ids (RFID readings and requests).
– “getLookItemInfo(itemid)”
Returns the stored information for the given itemid (can be a reading or a request).
– “removeItem(itemid)”
Removes the item with the given identifier from the list.
– “removeAllItems()”
– “getProductKeyForCode(code)”
Retrieves the product coordinates for the given code (can be an EAN, epc or any other
code the Server can handle). To obtain this information a round-trip to the Server may be
required so this function is asynchronous and returns a Jquery promise. The retun value
will be an object with the product coordinates (productcode, cutomerdata). For example:
{
“productcode”: “P1235”,
“customerdata”: {
“color”: “colorkey0102”,
“size”: “20”
}
}
– “getProductVariationVariables(productcode)”
◦ “data” - the complete coordinate data as specified in the import files (can be
used to show value specific colors or texts)
[{
"variable": "color",
"options": [{
"value": "color01",
"data": {
"name": "AZUL MARINO",
"code": "#363D5A"
}
},
{
"value": "color02",
"data": {
"name": "INDIGO",
"code": "#517bd5"
}
}]
},
{
"variable": "size",
"options": [{
"value": "40",
"data": "40"
},
{
"value": "42",
"data": "42"
},
{
"value": "44",
"data": "44"
}]
}]
– “getProductRenderProperties(productcode,customerdata)”
Obtains the information for the given product and coordinates from the server. To obtain
this information a round-trip to the Server may be required so this function is
asynchronous and returns a Jquery promise.
All of the variables available on the Server are retrieved. For example you could call:
klookinst.getProductRenderProperties(productcodevalue,customerdata)
.then(function(result){
console.log(result);
});
– “requestAssistance()”
Initiates a request assistance item if one does not already exist. The new assistance item
will appear on the list of items.
– “requestProduct(productcode, customerdata)”
Requests the given product. The request will not be created if a request for the same
product variation already exists.
– “sendEmailProducts(productkeys, email)”
Sends an email with the given list of products to the given email address.
[
{
“productcode”: “P1235”,
“customerdata”: {
“color”: “colorkey0102”,
“size”: “20”
The function returns a promise that will be called when the sending email process is
completed (either successfully or not).
klookinst.sendEmailProducts(arrproductkeys,email).then(
function(){
alert("Email sent");
},function(){
alert("Error sending");
}
);
– “shareProducts(productkeys)”
Obtains an URL (typically presented to the user as a QR) allowing her to share a list of
products using Social services (Twitter, Facebook, etc...) and her own mobile device.
The function returns a promise that will be called when the the URL has been obtained (or
not).
klookinst.shareProducts(arrproductkeys).then(
function(url){
alert("Share URL "+url);
},function(){
alert("Error sharing");
}
);
– “shareAnyData(data)”
Uploads a certain share data structure to the server and returns a URL to get presented to
the user.
– “getResourceImageUrl(imageresource,maxsize)”
From the retrieved JSON we can see that images (and resources in general) are provided
as realive resource identifiers:
...
"imageUrls": [
"515688940745_1.jpg",
"515688940745_2.jpg",
"515688940745_3.jpg",
"515688940745_4.jpg"],
...
To obtain an absolute URL for a given image we can use the “getResourceImageUrl”
function. This function also allows a second parameter that specifies the maximum size in
pixels (vertical or horizontal) that we want for the image.
klookinst.getResourceImageUrl("515688940745_1.jpg");
and it would return (will obviously depend on the actual server used):
http://localhost:8080/advancloud/publish/file/showroom/515688940745_1.jpg
– “getResourceVideoUrl(videoresource)”
Exactly the same as “getResourceImageUrl” but to retrieve the video URLs. The only
difference is that resizing is not supported.
– “getResourceAssetUrl(resource)”
– “getConfigurationEntry(configurationkey)”
Taps into the AdvanLook configuration to retrieve the value for a configuration variable.
The return value is the value for that configuration property in the System if defined.
– “getLDString(lang,ldkey,parameters)”
Taps into the AdvanLook “i18n” System to retrieve the value for a language token. This
functionality is available but is obviously not required to be used.
– “getInformationFromEpc(epc)”
Decomposes the given EPC (Electronic Product Code) and returns the data components it
contains. Several formats for EPC (for example “SGTIN96”) are supported.
It returns an object whose properties contain the retrieved information. Possible data
components include:
• “eas” - whether the EPC had the EAS flag activated or not
– “uploadBlobToPrivateFiles(blob)”
• “filename” - The filename of the blob in the server, this can be used to later retrieve
it
klookinst.uploadBlobToPrivateFiles(blob).then(function(data){
});
– “getPrivateFilesUrl(filename)”
Retrieves an URL to download or present an uploaded blob. This can be used to for
example present a previously uploaded photo to the user.
– “commitLogJsonData(logtype,logdata,logextra)”
Uploads and stores a JSON data log in the Cloud. Stored Logs can later be exported and
allow for Report generation on them.
– “getId()”
– “getType()”
– “getStatus()”
• “remove” - item has been removed, this status is temporary during notifications,
the item ir actually removed after the notifications
– “getProductCode()”
– “getCustomerData()”
– “getEpcs()”
The index.html file must appear in the root of the zip file, you must be careful no to put
absolute or additional directories when generating the zip file.
Now we press the select file button and choose our template zip, press save and if we get
the “template updated” message, the template process has been successfully completed.