Content and Structure Folders

Developer Documentation

General Portal Documentation

Table of Contents

Developer Methodology

Content and Structure Folders

Content Folder in Detail

Webtrends

How to Add a new Product Category

FSI

Commercials

Consumer Insights (if reinstated)

Index Reference

Privileges and Workflows

Steps to confirm when changing an existing role’s name

Useful SQL Queries

Miscellaneous Content-Related Notes

Recalls

Free-Standing Inserts

Commericals

Pseudophendrine Regulations

Feature of the Month

New Products

Product Images

Site Status

Price Schedule

Overview of Edit Modifications

Function init()

Form.js

valiDate.js

validateEdit()

Notable Name

Quirks and Reasons for Them

Edit.js renamed to Edit

client.url.objectid Not Resolving on BeforeEdit and Edit pages

Site Status in Command Center incorrectly placed

Validation Order Finesse

Future Action Items

Remove Albertsons Portal

Version 1.0 / Page 1 of 13

General Portal Documentation

Developer Methodology

Content and Structure Folders

Each portal has two folders, the first for the content and the second for the structure that makes this content editable. The content folder is named for the portal itself since these pages will be visible in the URL. The structural pages are found in a folder named like the content folder with “Structure” appended. Current examples of this naming convention are: General, GeneralStructure and Convenience, ConvenienceStructure.

NOTE: The CommandCenter was not setup this way since no content is editable. However, the page incSiteStatus is editable, and therefore is in error. Since the GUID is different than that on Production, this will not be overwritten during a rollout.

NOTE: The Shared folders are named backwards from this. “Shared” is the structure while “SharedContent” has reused content pages.

Content Folder in Detail

The content folder contains three subfolders: Home, Includes and Site_Status. Home is where all the pages the user will access are stored. Includes contains snippets of content included by the other content pages. They are not directly accessible and stored here because they are content-owned. The pages within the Site_Status folder are technically includes also, but pulled out to make the folder structure more intuitive at a glance.

Webtrends

Pfizer uses Webtrends to track system access. The site user is given links that direct them to the content pages. Many of these pages are user-modified content pages that exist solely in the content folder. Of the system pages within the portal such as adding a New Feature of the Month, there are URL-friendly content pages that contain an include to a Structure page and the webtrends javascript ssdc tag. All styles of these pages contain a reference to the SSDC.

Example: Convenience/Home/_New_Products/Add_a_New_Product includes ConvenienceStructure/Home/_New_Products/Add_a_New_Product.

How to Add a new Product Category

Category Management

1. Add new Category to Existing Index Values.

2. Add event and results to --/eprise/main/ConvenienceStructure/Home/Category_Management


Index Reference

Index Name / Definition
idx_CnvCatMan_Active / Flag for if the Category Management file is active or not.
values: Yes (open), No (closed).
content: /eprise/main/Convenience/Home/_Category_Management/
idx_CnvCatMan_Link / Provides the link name to a Category Management file.
content: / eprise/main/Convenience/Home/_Category_Management /
idx_CnvCatMan_Section / Provides the Section name to where a Category Management file will be grouped.
content: / eprise/main/Convenience/Home/_Category_Management /
idx_CnvCStorePS_UploadDate / C-Store Price Schedule store the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/_CStorePriceSchedule/
idx_CnvFeature_DPage
NOT USED AT PRESENT / Store the GUID of the page the Feature Details Page that is associated with.
content: /eprise/main/Convenience/Home/_Features/
idx_CnvFeature_EffectiveDate
NOT USED AT PRESENT / The date a Feature is to be live.
content: /eprise/main/Convenience/Home/_Features/
idx_CnvFeature_ExpirationDate
NOT USED AT PRESENT / The date a Feature is to be hidden.
content: /eprise/main/Convenience/Home/_Features/
idx_CnvFeature_SPage
NOT USED AT PRESENT / Store the GUID of the page the Feature Details Page that is associated with.
content: /eprise/main/Convenience/Home/_Features/
idx_CnvFeature_UploadDate
NOT USED AT PRESENT / Feature store the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/_ Features /
idx_CnvHelp_UploadDate / Help stores the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/_ Help/
idx_CnvNP_AppearOnHomePage / Flag for if the New Product is active or not.
values: Yes (open), No (closed).
content: /eprise/main/Convenience/Home/_New_Products/
idx_CnvNP_DPage / Store the GUID of the page the New Product Details Page that is associated with.
content: /eprise/main/Convenience/Home/_New_Products/
idx_CnvNP_EffectiveDate / The date a New Product is to be live.
content: /eprise/main/Convenience/Home/_New_Products/
idx_CnvNP_ExpirationDate / The date a New Product is to be hidden.
content: /eprise/main/Convenience/Home/_New_Products/
idx_CnvNP_SPage / Store the GUID of the page the New Product Summary Page that is associated with.
content: /eprise/main/Convenience/Home/_New_Products/
idx_CnvNP_UploadDate / New Products stores the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/_ NewProducts/
idx_CnvPromo_LinkName / Provides the link name to a Promotion.
content: / eprise/main/Convenience/Home/_Promotions/
idx_CnvPromo_Quarter / Provides the Quarter to a Promotion.
values: 1,2,3, or 4.
content: / eprise/main/Convenience/Home/_Promotions/
idx_CnvPromo_Size / Provides the Size to a Promotion.
values: Wide, Narrow
content: / eprise/main/Convenience/Home/_Promotions/
idx_CnvPromo_SSDG / Store the GUID for the Promotion Image that the Promotion is associated with.
content: /eprise/main/Convenience/Home/_New_Products/
idx_CnvPromo_SSDG_UpldDate / Promotions SellSheet/Deal Grid stores the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/_ Promotions/
idx_CnvPromo_Year / Provides the Year to a Promotion.
content: / eprise/main/Convenience/Home/_Promotions/
idx_CnvPromoCalendarUploadDate / Promotional Calendar stores the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/_ _Promotional_Calendar/
idx_CnvPromoPricing_UploadDate / Promotional Pricing stores the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/ _PromotionPricing/
idx_CnvSRBContacts_UploadDate / Pfizer Consumer Healthcare Contacts stores the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/ _SalesRepBrokContacts/
idx_CnvSTSContacts_UploadDate / Sell-Thru Service Contacts stores the Date().valueOf() they were uploaded. The greatest value is the most recent upload.
content: /eprise/main/Convenience/Home/_STSContacts

Privileges and Workflows

Privileges / Workflows* / Permissions Assigned**
EditSharedRecalls / wrkRecalls / General/Home/_Recalls
EditSharedProdPortfolio / wrkProdPortfolio / General/Home/Product_Portfolio
EditSharedPseudophedrine / wrkPseudo / General/Home/_Pseudophedrine_Regulations
EditCnvCstorePrice / wrkCStorePriceShedule / Convenience/Home/_CStorePriceSchedule
EditCnvCategoryManagement / wrkCnvCategoryManagement / Convenience/Home/_Category_Management
EditCnvNewProducts / wrkConvenienceNewProducts / Convenience/Home/_New_Products
EditCnvPromotionPrice / wrkPromotionPricing / Convenience/Home/_PromotionPricing
EditCnvPromotionalCalendar / wrkCnvPromotionalCalendar / Convenience/Home/_Promotional_Calendar
EditCnvPromotions / wrkCnvPromotions / Convenience/Home/_Promotions
EditCnvBrokerContacts / wrkSTSContacts / Convenience/Home/_STSContacts
EditCnvSalesRepContacts / wrkSalesRepBrokContacts / Convenience/Home/_SalesRepBrokContacts

* All Workflows stored in ConvenienceStructure/Workflows folder.

**Privileges assigned for both modify and manage permissions.

Modify to edit content and show “Edit” links;

Manage to add files into the folder, and access the “Publish” button from Edit.

Miscellaneous Content-Related Notes

Shared Items

Recalls

  1. No way to delete if applicable.

Pseudophendrine Regulations

No known issues.

Product Images

No known issues.

Convenience-specific

C-Store Price Schedule

No known issues.

Category Management

No known issues.

New Products

  1. Size of images not taken into account. Currently no upload restrictions.
  1. Could not extract first forty words from details. (Visual editor not text area.)
  1. No size restrictions on summary text length.

Promotion Pricing

No known issues.

Promotional Calendar

No known issues.

Promotions

  1. Updating the Sell Sheet / Deal Grid carries automatically to update the image

Site Status

  1. No length or space restrictions on text input.

STS / Sales-Broker Contacts

No known issues.

Overview of Edit Modifications

This is written assuming the reader is familiar with the typical Edit.js in the Samples volume.

Function init()

Function init() in the body’s onLoad event initializes the form. The function calls setDateMaxLengths() to set date fields to have a maxLength of 8 using the ordinality of the fields in conjunction with the filetype. The function, prefillUnusedIndexes() assigns values to index fields based on ordinality in conjunction with filetype. The second function also forwards to the Publish page if the filetype matches those pages that the user does not need to edit.

Form.js

Used to supply reused form-related functions, form.js is included to validate data entry. Currently used to ensure the radio option for a colored box title is selected using checkRadios(). This file also ensures the user enters a valid date in the correct format. The text to alert is passed in a parameter from the function ValidateEdit().

validateEdit()

This is main function which stores the validation for each filetype. Note that all filetypes are mentioned here, also those auto-submitted via prefillUnusedIndexes().

Notable Name

The edit page’s form needs to stay first in the ordinality of forms and named “editform”. There are three references to the form in various places of Edit (formerly Edit.js) and the edit page that refer to the form either by name or document.forms[0].

Quirks and Reasons for Them

Edit.js renamed to Edit

Originally Edit.js was rendering mergestrings within it. Around Oct. 21, 2004, errors started. The ObjectID would not resolve, yet the ParentID would show. The solution was to rename the file “Edit” to prevent client-caching and all references to this page to use <$include> versus <script>.

client.url.objectid Not Resolving on BeforeEdit and Edit pages

If the BeforeEdit or Edit page, does not resolve <$client.url.objectid> when using this mergestring. The solution to have these pages access the javascript function “getQueryStringVal(‘objectid’)” required updates to BeforeEdit’s URL building, Edit’s URL building and Edit(.js)’ function getQueryStringVal() to ensure case-insensitivity.

Validation Order Finesse

To validate the form fields from Edit, the fields must be referenced ordinally since there names are not known. For pagestyles, this order comes from the block number assigned to each block. However, for files being uploaded with elements obtained from CallGetElements, the order is based on the objectid of the index elements. The order of these elements changes if they are created in a non-alphabetical order and restored on another server. This hidden restriction constrains and hinders the development process when required fields are added or removed.

To ensure consistent ordering and therefore accurate validation, the Edit page sorts on ITEM_NAME. This field contains the block name for all blocks except element selectors. The standard blocks were then renamed on each pagestyle and child page. The naming convention became ffdPageStyle#FieldName where # becomes the order of the fields that begin with ffdPageStyle and PageStyle is the name of the PageStyle. Standard naming convention places all freeforms as “ffd”: freeform data element, “idx”: index and “ele”: element selector.

The element selector’s ITEM_NAME value is the name of its element. The only element selector being used is for the image that appears at the top of boxes from varying pagestyles. This element “BlockImage” was renamed “~BlockImage” to always appear last. Due to the ordinal validation, if an image is ever added when in the middle of the field list, all subsequent validation must be changed. Appearing after the 7-bit ASCII code for numbers and upper and lower case letters, the tilde ensures this array of varying length will always appear last.

Also worth noting: changing an element’s name changes the field ITEM_TYPE, changing an element’s block name changes ITEM_NAME for non-element-selectors. For element selectors, changing the element name changes ITEM_NAME as ITEM_TYPE is NULL. Syncing to style does not appear in the content-sync window when changing a page block’s name on a pagestyle.

Annual Promotions

The Annual Promotions list page which shows the promotions by quarter has a quirk to order the quarters correctly. Sorting the event in block 400 evgCIS_QP by idx_CnvPromo_Year, idx_CnvPromo_Quarter results fine on Dev and Stage; Production returns results out of order.

To get the correct output, I changed the sort order to "catalogpath" which succeeds because of the names of the search result pages. QP_2004_Q4, QP_2005_Q1, QP_2005_Q2 etc. This is important to preserve going forward.

For the interested, here is the query the event block to get the quarters is:

O.OBJECTID OBJECTID, NAME, OBJCREATED,OBJMODIFIED,READPERMISSION,MODPERMISSION,MANAGEPERM,PARENT,OBJCOMMENT,INHERITEDREADPERMISSION,INHERITEDMODIFYPERMISSION,INHERITEDMANAGEPERMISSION,CATALOGPATH, T646.VALUE "idx_CnvPromo_LinkName", T647.VALUE "idx_CnvPromo_Quarter", T648.VALUE "idx_CnvPromo_Year" FROM OBJECT O, OBJECT_DERIVED OD, INDEX_CHAR T646, INDEX_CHAR T647, INDEX_CHAR T648 WHERE O.OBJECTID = OD.OBJECTID AND (1=1) AND T646.VALUE = ' ' AND T646.INDEXID = 646 AND T647.VALUE > ' ' AND T647.INDEXID = 647 AND T648.VALUE >= '105' AND T648.INDEXID = 648 AND O.OBJECTID = T646.OBJECTID AND O.OBJECTID = T647.OBJECTID AND O.OBJECTID = T648.OBJECTID AND O.CLASSNAME = 'PAGE' ORDER BY "OBJCREATED" ASC

which is then followed by:

SELECT IB.INDEXNAME, I.OBJECTID, I.INDEXID, I.VALUE FROM INDEX_CHAR I, INDEX_BASE IB WHERE OBJECTID IN (17922,17923,17924,17925,17926,17930,17931,17932,17933,17934,17935,17936,17937,17938,17939,17940,17941) AND I.INDEXID=IB.INDEXID AND I.IND

Version 1.0 / Page 1 of 13