Shopping Cart

The Shopping Cart app is a paragraph app which handles everything related to adding products to cart and completing an order.

More specifically the Shopping Cart app does the following:

  • Keeps a record of the items added to cart
  • Shows the items in the cart to the customer
  • Handles the checkout process
  • Shows an order receipt
  • Sends out order confirmation emails

Once the app is added to a paragraph you can configure it using the app settings. The app settings consist of sections controlling different aspects of the app behavior, as outlined below.

The first settings are used to set a shop and (optionally) an order context for the cart (Figure 1.1). You can also check checkout to quote if this is supposed to be a quotes cart.

Figure 1.1 Associating the cart app with a shop or context

If no shop is selected, orders are created under the default shop, as defined in the website Ecommerce settings.

Next, you can define the checkout flow – the steps the customer will go through to complete an order (Figure 2.1).

Figure 2.1 The standard checkout flow

A standard checkout flow typically consists of three or four steps, e.g.:

  1. Show cart
  2. Information
  3. Checkout (required)
  4. Receipt

A one-page checkout will have a single step before checkout, a multi-step checkout will have several.

In either case, the customer is asked to supply information and select e.g. a payment and shipping method and submit these to card using a form – in order for the cart to receive this information, the input fields being submitted must have specific named, ids & values. See more in the Submitting to Cart section of this article.

 

The notification emails section is used to create email notifications for both customers and staff – most commonly an order confirmation email.

To create a notification click Add notification to open the Edit email window (Figure 3.1) and configure the notification.

Figure 3.1 Creating a notification email

To configure the notification you must first specify a recipient – this can be done in several ways:

  • Send to billing email or shipping email
  • Check Send to order field email to select a custom order field
  • Manually specify a recipient email – also accepts a list of email addresses separated by commas

For each notification you must also:

  • Provide a subject
  • Select/create an email template
  • Provide a sender name and sender email
  • Select an encoding (defaults to UTF-8)
  • (Optional) Select an attachment to include with the email

Tip: You can use {OrderID} in the subject to insert the order number in the confirmation email.

The field validation settings (Figure 4.1) allow you to apply validation rules during checkout.

Figure 4.1 The field validation settings

You can:

  • Toggle a check for terms and conditions
  • Toggle a check for stock status – this field is required if product reservation is enabled.
  • Select a validation group to apply during checkout

Prior to Dynamicweb 9.8, three shipping fields were auto-validated - Name, Address, and Country - but as of 9.8 and forward only Country is automatically validated. You must therefore use field validation groups - as linked to above - to set up further validation of shipping fields. 

A number of other settings ara available on the shopping cart app - these are described below.

The Newsletter section(Figure 6.1) is used to make it possible to update the email permission field for the user during checkout. The current value is available via the Ecom:Cart.UseNewsletterSubscription tag.

Figure 6.1 The newsletter settings

The Empty cart settings (Figure 7.1) control what a user will see when they view an empty cart.

Figure 7.1 The empty cart settings

You have three options:

  • Redirect to an internal page lets you select a specific page on your website to redirect users to
  • Show template allows you to select a custom template to show instead of the cart. You can then add cool stuff to the template, of course, like suggested or personalized products and news.
  • Take no special action does exactly what it says, and simply displays the first step of the order process as with a full cart. However, you can use the Ecom:Order.IsEmpty tag to test for and do stuff if a cart is empty.

The User management section (Figure 8.1) allows you to control how the cart interacts with the Users area of Dynamicweb.

Figure 8.1 The user management settings

Basically, you can do two things:

  • Apply user details to order – this setting applied user field like Name, Address, Phone, and so on to an order during checkout. You usually always want this enabled unless you’re creating orders on behalf of anonymous users.
  • Create user during checkout – this option creates users during checkout. Additional settings are available when this setting is enabled:

Setting

Use

Comments

Groups for new users

Add the new users to these groups

 

Update existing users based on email match

If a user with this email exists, update the user with the checkout information details

 

Error messages

Specify validation error messages

 

If a user is logged in on two separate computers, the shopping cart content will be automatically synchronized.

Saving an address to user management

Dynamicweb supports saving an address on a logged in user on checkout. Look at the InformationSaveCart.hmtl template for example code.

The address will be saved to the addresses section of the user, if it doesn’t match an existing address.

On multi-shop solutions the payment & delivery section is used to control exactly which payment methods and shipping methods should be available on this cart (Figure 9.1).

Figure 9.1 The payment and delivery settings

To make a payment method or shipping method available for a cart, move it from the list of available methods (left column) to the list of selected methods (right column).

Leave as All if all methods should be made available, depending on the language context.

The behavior settings (Figure 10.1) control cart behavior in a variety of situations, as outlined below.

Figure 10.1 The behavior settings

You can control:

  • If the cart should show the first order step or show the last visited step for users returning to the cart after leaving the order flow. If you use validation groups on other steps than the first step, set to last visited to make sure you have access to validation loops in your templates.
  • How the cart selects which shipping and payment methods should be available – the options being billing country, shipping country, or shipping country if a shipping address has been selected.
    • Prices in the shopping cart are recalculated when the billing or shipping country is changed. VAT is recalculated when a new billing country is set, and Taxes are recalculated when a new shipping country is set.
  • If products which have become unavailable should be removed or ignored

In the checkout flow, the user is typically asked to provide information – e.g. and address – and make some selections and then submit the cart to become an order.

The cart can handle the following:

  • Billing details
  • Delivery details
  • Creating a user during checkout
  • Selecting a payment method
  • Selecting a shipping method
  • Applying vouchers
  • Paying with loyalty points
  • Using a gift card
  • Creating a recurring order
  • Paying with a saved card
  • Opt-ins
  • Custom fields

To submit something to cart you submit a form with the id ordersubmit and the features you want to implement:

<form name="ordersubmit" id="ordersubmit" method="post" role="form"> <!--Insert form content here--> <button type="submit" name='@GetValue("CartV2.CurrentStepButtonName")' id='@GetValue("CartV2.CurrentStepButtonName")'>@Translate("Update_order", "Update order")</button> <button type="submit" name='@GetValue("CartV2.NextStepButtonName")' id='@GetValue("CartV2.NextStepButtonName")'>@Translate("Create_order", "Create order")</button> </form>

In order for the cart to receive this information the input fields being submitted must have specific IDs, names & values. You can read more about each feature below.

Billing details are submitted using input fields with IDs listed below. Most of these can be matched with a specific user field, but a few are for billing-specific information like an EAN number or a VAT number. There’s also a comment field.

Field name & id

Notes

EcomOrderCustomerCompany

 

EcomOrderCustomerName

 

EcomOrderCustomerTitle

 

EcomOrderCustomerFirstName

 

EcomOrderCustomerSurname

 

EcomOrderCustomerMiddleName

 

EcomOrderCustomerHouseNumber

 

EcomOrderCustomerInitials

 

EcomOrderCustomerPrefix

 

EcomOrderCustomerAddress

 

EcomOrderCustomerAddress2

 

EcomOrderCustomerZip

 

EcomOrderCustomerCity

 

EcomOrderCustomerCountry

This field controls which payment methods & shipping methods can be selected on the cart.

EcomOrderCustomerRegion

 

EcomOrderCustomerPhone

 

EcomOrderCustomerFax

 

EcomOrderCustomerCell

 

EcomOrderCustomerEmail

 

EcomOrderCustomerVatRegNumber

 

EcomOrderCustomerEAN

 

EcomOrderCustomerRefId

 

EcomOrderCustomerComment

Maps to the customer comment order details field.

RAZOR
<!--Billing Address Fields--> <div> <!--Personal Fields--> <div> <input class="form-control" type="text" name="EcomOrderCustomerName" id="EcomOrderCustomerName" value='@GetValue("Ecom:Order.Customer.Name")' /> <input class="form-control" type="text" name="EcomOrderCustomerPrefix" id="EcomOrderCustomerPrefix" value='@GetValue("Ecom:Order.Customer.Prefix")' /> <input class="form-control" type="text" name="EcomOrderCustomerTitle" id="Title" value='@GetValue("Ecom:Order.Customer.Title")' /> <input class="form-control" type="text" name="EcomOrderCustomerFirstName" id="EcomOrderCustomerFirstName" value='@GetValue("Ecom:Order.Customer.FirstName")' /> <input class="form-control" type="text" name="EcomOrderCustomerMiddleName" id="EcomOrderCustomerMiddleName" value='@GetValue("Ecom:Order.Customer.MiddleName")' /> <input class="form-control" type="text" name="EcomOrderCustomerSurname" id="EcomOrderCustomerSurname" value='@GetValue("Ecom:Order.Customer.Surname")' /> <input class="form-control" type="text" name="EcomOrderCustomerEmail" id="EcomOrderCustomerEmail" value='@GetValue("Ecom:Order.Customer.Email")' /> </div> <!--Address Fields--> <div> <input class="form-control" type="text" name="EcomOrderCustomerAddress" id="EcomOrderCustomerAddress" value='@GetValue("Ecom:Order.Customer.Address")' /> <input class="form-control" type="text" name="EcomOrderCustomerAddress2" id="EcomOrderCustomerAddress2" value='@GetValue("Ecom:Order.Customer.Address2")' /> <input class="form-control" type="text" name="EcomOrderCustomerHouseNumber" id="EcomOrderCustomerHouseNumber" value='@GetValue("Ecom:Order.Customer.HouseNumber")' /> <input class="form-control" type="text" name="EcomOrderCustomerZip" id="EcomOrderCustomerZip" value='@GetValue("Ecom:Order.Customer.Zip")' /> <input class="form-control" type="text" name="EcomOrderCustomerCity" id="EcomOrderCustomerCity" value='@GetValue("Ecom:Order.Customer.City")' /> <input class="form-control" type="text" name="EcomOrderCustomerRegion" id="EcomOrderCustomerRegion" value='@GetValue("Ecom:Order.Customer.Region")' /> <select class="form-control" name="EcomOrderCustomerCountry" id="EcomOrderCustomerCountry" onchange="updateCart();"> @foreach (var country in GetLoop("Countries")) { if (country.GetString("Ecom:Country.IsCustomerCountryOrDefault") == "true") { <option value='@country.GetValue("Ecom:Country.Code2")' selected>@country.GetValue("Ecom:Country.Name")</option> } else { <option value='@country.GetValue("Ecom:Country.Code2")'>@country.GetValue("Ecom:Country.Name")</option> } } </select> </div> <!-- Contact Fields--> <div> <h4>Contact</h4> <input type="text" name="EcomOrderCustomerPhone" id="EcomOrderCustomerPhone" value='@GetValue("Ecom:Order.Customer.Phone")' /> <input type="text" name="EcomOrderCustomerFax" id="EcomOrderCustomerFax" value='@GetValue("Ecom:Order.Customer.Fax")' /> <input type="text" name="EcomOrderCustomerCell" id="EcomOrderCustomerCell" value='@GetValue("Ecom:Order.Customer.Cell")' /> <input type="text" name="EcomOrderCustomerComment" id="EcomOrderCustomerComment" value='@GetValue("Ecom:Order.Customer.Comment")' /> </div> <!--Other fields--> <div> <input type="text" name="EcomOrderCustomerCompany" id="EcomOrderCustomerCompany" value='@GetValue("Ecom:Order.Customer.Company")' /> <input type="text" name="EcomOrderCustomerEAN" id="EcomOrderCustomerEAN" value='@GetValue("Ecom:Order.Customer.EAN")' /> <input type="text" name="EcomOrderCustomerVatRegNumber" id="EcomOrderCustomerVatRegNumber" value='@GetValue("Ecom:Order.Customer.VatRegNumber")' /> <input type="text" name="EcomOrderCustomerRefId" id="EcomOrderCustomerRefId" value='@GetValue("Ecom:Order.Customer.RefID")' /> <input type="text" name="EcomOrderCustomerInitials" id="EcomOrderCustomerInitials" value='@GetValue("Ecom:Order.Customer.Initials")' /> </div> </div>

Delivery details are submitted to cart in the same way as billing details – and are in fact almost identical to billing details.

The 'Copy customer info to delivery info fields if empty'-checkbox under Settings > Ecommerce > Advanced Configuration > Shopping cart allows you to copy billing address field values to the delivery address fields if no part of the delivery address has been filled out.

Field name & id

Notes

EcomOrderDeliveryCompany

 

EcomOrderDeliveryName

 

EcomOrderDeliveryFirstName

 

EcomOrderDeliveryTitle

 

EcomOrderDeliverySurname

 

EcomOrderDeliveryHouseNumber

 

EcomOrderDeliveryMiddleName

 

EcomOrderDeliveryInitials

 

EcomOrderDeliveryPrefix

 

EcomOrderDeliveryAddress

 

EcomOrderDeliveryAddress2

 

EcomOrderDeliveryZip

 

EcomOrderDeliveryCity

 

EcomOrderDeliveryCountry

 

EcomOrderDeliveryRegion

 

EcomOrderDeliveryPhone

 

EcomOrderDeliveryFax

 

EcomOrderDeliveryCell

 

EcomOrderDeliveryEmail

 

RAZOR
<!--Delivery Address Fields--> <div> <!--Personal Fields--> <div> <input type="text" name="EcomOrderDeliveryName" id="Name" value='' /> <input type="text" name="EcomOrderDeliveryPrefix" id="Prefix" value='' /> <input type="text" name="EcomOrderDeliveryTitle" id="Title" value='' /> <input type="text" name="EcomOrderDeliveryFirstName" id="EcomOrderDeliveryFirstName" value='' /> <input type="text" name="EcomOrderDeliveryMiddleName" id="EcomOrderDeliveryMiddleName" value='' /> <input type="text" name="EcomOrderDeliverySurname" id="EcomOrderDeliverySurname" value='' /> <input type="text" name="EcomOrderDeliveryEmail" id="EcomOrderDeliveryEmail" value='' /> </div> <!--Address Fields--> <div> <input type="text" name="EcomOrderDeliveryAddress" id="EcomOrderDeliveryAddress" value='' /> <input type="text" name="EcomOrderDeliveryAddress2" id="EcomOrderDeliveryAddress2" value='' /> <input type="text" name="EcomOrderDeliveryHouseNumber" id="EcomOrderDeliveryHouseNumber" value='' /> <input type="text" name="EcomOrderDeliveryZip" id="EcomOrderDeliveryZip" value='' /> <input type="text" name="EcomOrderDeliveryCity" id="EcomOrderDeliveryCity" value='' /> <input type="text" name="EcomOrderDeliveryRegion" id="EcomOrderDeliveryRegion" value='' /> <select name="EcomOrderDeliveryCountry" id="EcomOrderDeliveryCountry" onchange="updateCart();"> <option>Select delivery country</option> @foreach (var country in GetLoop("Countries")) { if (country.GetString("Ecom:Country.IsDeliveryCountry") == "true") { <option value='@country.GetValue("Ecom:Country.Code2")' selected>@country.GetValue("Ecom:Country.Name")</option> } else { <option value='@country.GetValue("Ecom:Country.Code2")'>@country.GetValue("Ecom:Country.Name")</option> } } </select> </div> <!-- Phone Fields--> <div> <input type="text" name="EcomOrderDeliveryPhone" id="EcomOrderDeliveryPhone" value='' /> <input type="text" name="EcomOrderDeliveryFax" id="EcomOrderDeliveryFax" value='' /> <input type="text" name="EcomOrderDeliveryCell" id="EcomOrderDeliveryCell" value='' /> </div> <!--Other fields--> <div> <input type="text" name="EcomOrderDeliveryCompany" id="EcomOrderDeliveryCompany" value='' /> <input type="text" name="EcomOrderDeliveryInitials" id="EcomOrderDeliveryInitials" value='' /> </div> </div>

To create a user or update an existing user during checkout, submit a field with the name and ID EcomUserCreateNewOrUpdate alongside fields specifying a user name and a password.

Field name & Id

Notes

EcomUserCreateNewOrUpdate

Older implementations used EcomUserCreateNew

EcomUserCreateUserName

 

EcomUserCreatePassword

 

EcomUserCreateConfirmPassword

 

RAZOR
<!--Create user during checkout--> @{ var isLoggedIn = Dynamicweb.Security.UserManagement.User.IsExtranetUserLoggedIn(); } @if (!isLoggedIn) //If user is not logged in { <input type="checkbox" name="EcomUserCreateNewOrUpdate" id="EcomUserCreateNewOrUpdate" checked='@GetBoolean("Ecom:User.CreateNew")' /> <input type="text" name="EcomUserCreateUserName" id="EcomUserCreateUserName" /> <input type="password" name="EcomUserCreatePassword" id="EcomUserCreatePassword" /> <input type="password" name="EcomUserCreateConfirmPassword" id="EcomUserCreateConfirmPassword" /> }

Payment methods are submitted to cart using input elements with the name EcomCartPaymethodID and an id of the type EcomCartPaymethodID_{PaymentMethodID}, with PaymentMethodID replaced by a valid id.

Field Name & ID

Notes

EcomCartPaymethodId

 

Some payment methods support inline payment in which case the payment form can be rendered directly in the cart template. The contents of the payment form is payment method-specific and typically comes from a template on the payment method.

RAZOR
<!--Payment Methods--> @foreach (var paymentmethod in GetLoop("Paymethods")) //Loop through payment methods { <div class="radio"> <label > @if (@paymentmethod.GetString("Ecom:Cart.Paymethod.IsSelected") == "true") // check if payment method is selected { <input type="radio" name="EcomCartPaymethodID" id='EcomCartPaymethodID_@paymentmethod.GetValue("Ecom:Cart.Paymethod.ID")' value='@paymentmethod.GetValue("Ecom:Cart.Paymethod.ID")' checked='checked' /> } else { <input type="radio" name="EcomCartPaymethodID" id='EcomCartPaymethodID_@paymentmethod.GetValue("Ecom:Cart.Paymethod.ID")' value='@paymentmethod.GetValue("Ecom:Cart.Paymethod.ID")' /> } @paymentmethod.GetValue("Ecom:Cart.Paymethod.Name") </label> </div> } <!--Inline Payment Forms--> @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Cart.PaymentInlineForm"))) { @GetString("Ecom:Cart.PaymentInlineForm") }

Shipping methods are submitted to cart using input elements with the name EcomCartShippingMethodId and an id of the type EcomCartShippingMethodId_{ShippingMethodID} with ShippingMethodID being replaced by a valid id.

Field Name & ID

Notes

EcomCartShippingmethodId

 

EcomCartPaymethodId

 

Some shipping providers can provide you with more content – e.g. a list of parcel shops or parcel types – which must also be submitted to cart. This information is shipping method specific, and typically comes from a template set on the shipping method.

RAZOR
<!--Shipping methods--> @foreach (var shippingmethod in GetLoop("Shippingmethods")) { <div class="radio"> <label> @if (shippingmethod.GetString("Ecom:Cart.Shippingmethod.IsSelected") == "true") { <input type="radio" name="EcomCartShippingmethodID" onclick="updateCart();" id='EcomCartShippingmethodID_@shippingmethod.GetValue("Ecom:Cart.Shippingmethod.ID")' value='@shippingmethod.GetValue("Ecom:Cart.Shippingmethod.ID")' checked="checked" /> } else { <input type="radio" name="EcomCartShippingmethodID" onclick="updateCart();" id='EcomCartShippingmethodID_@shippingmethod.GetValue("Ecom:Cart.Shippingmethod.ID")' value='@shippingmethod.GetValue("Ecom:Cart.Shippingmethod.ID")' /> } @shippingmethod.GetValue("Ecom:Cart.Shippingmethod.Name") </label> </div> <!--Shippingmethod Content - e.g. Parcel shops or Parcel types--> if (!string.IsNullOrWhiteSpace(shippingmethod.GetString("Ecom:ShippingProvider.Content"))) { @shippingmethod.GetString("Ecom:ShippingProvider.Content") } }

Vouchers are applied to an order by submitting a valid voucher code in a field with the ID EcomOrderCustomerVoucher.

Field Name & ID

Notes

EcomOrderVoucherCode

 

<!--Vouchers--> <input type="text" name="EcomOrderCustomerVoucher" id="EcomOrderCustomerVoucher" value='@GetString("Ecom:Order.Customer.VoucherCode")' />

To apply loyalty points to an order you submit a field with the ID EcomOrderPointsToUse and a value in loyalty points

Field Name & ID

Notes

EcomOrderPointsToUse

 

In this example I first check of the current user is logged in – if she is, I retrieve her points balance and check if she can pay with points.

RAZOR
@{ var isLoggedIn = Dynamicweb.Security.UserManagement.User.IsExtranetUserLoggedIn(); var currentUser = Dynamicweb.Security.UserManagement.User.GetCurrentExtranetUser(); double pointsbalance = 0; } <!--Pay with points--> @if (isLoggedIn) { pointsbalance = Dynamicweb.Ecommerce.Services.Loyalty.GetPointsBalance(currentUser.ID); <div>Your points: @pointsbalance</div> @if (pointsbalance > 0) { <input class="form-control" type="text" name="EcomOrderPointsToUse" id="EcomOrderPointsToUse" value='@GetValue("Ecom:Order.PointsToUse")' /> } else { <input class="form-control" type="text" name="EcomOrderPointsToUse" id="EcomOrderPointsToUse" value='' disabled title="No loyalty points available" /> } } else { <div><i>Sign in to see your loyalty points balance.</i></div> }

Gift Cards are applied to an order by submitting a valid gift card code to a field with the ID EcomOrderGiftCardCode.

Field Name & ID

Notes

EcomOrderGiftCardCode

 

RAZOR
<input type="text" name="EcomOrderGiftCardCode" id="EcomOrderGiftCardCode" value="" />

To create a recurring order you must first check of the payment method supports recurring orders. If it does, you must submit a boolean field with the id & name EcomRecurringOrderCreate alongside an interval, an interval unit, and a start and end date.

Field Name & ID

Notes

EcomRecurringOrderCreate

 

EcomOrderRecurringInterval

 

EcomOrderRecurringIntervalUnit

 

EcomOrderRecurringEndDate

 

EcomOrderRecurringEndDate_year

 

EcomOrderRecurringEndDate_month

 

EcomOrderRecurringEndDate_day

 

EcomOrderRecurringStartDate

 

RAZOR
@if (@GetBoolean("Ecom:Order.PaymentMethod.RecurringSupport") == true) { <!--Checkbox to create recurring orders--> <input type="checkbox" name="EcomRecurringOrderCreate" id="EcomRecurringOrderCreate" checked='@GetBoolean("Ecom:User.CreateNew")' /> <!--Interval--> <input type="text" name="EcomOrderRecurringInterval" id="EcomOrderRecurringInterval" value='1' /> <select name="EcomOrderRecurringIntervalUnit" id="EcomOrderRecurringIntervalUnit" value="0"> <option value="0">Days</option> <option value="1" selected>Weeks</option> <option value="2">Months</option> </select> <!--Start Date--> <input type="date" name="EcomOrderRecurringStartDate" id="EcomOrderRecurringStartDate" min="@DateTime.Today.ToString("yyyy-MM-dd")" value='@DateTime.Today.ToString("yyyy-MM-dd")' /> <!--End Date--> <input type="date" name="EcomOrderRecurringEndDate" id="EcomOrderRecurringEndDate" min="@DateTime.Today.AddDays(7).ToString("yyyy-MM-dd")" value='@DateTime.Today.AddDays(7).ToString("yyyy-MM-dd")' /> }

Saved cards – which are actually saved payment methods – are saved by submitting a boolean field with the id EcomOrderSavedCardCreate_{PaymethodID} alongside a field specifying the name of the saved card. You should also check that the payment method supports saved cards.

To use a saved card you submit a field with the ID EcomCartSavedCardID_{SavedCardId}, with SavedCardId being the id of a saved card. Make sure you clear any previously selected payment method when a saved card is submitted.

Field Name & ID

Notes

EcomOrderSavedCardCreate_{PaymethodID}

Paymethod – not PaymentMethod

EcomOrderSavedCardName

 

 

 

EcomCartSavedCardID_{SavedCardID}

 

RAZOR
<!--Saving a card --> @foreach (var paymentmethod in GetLoop("Paymethods")) //Loop through payment methods { if (paymentmethod.GetString("Ecom:Cart.Paymethod.SupportSavedCard") == "true" && @paymentmethod.GetString("Ecom:Cart.Paymethod.IsSelected") == "true") // Check if this method supports saved cards & is selected { <input type="checkbox" name="EcomOrderSavedCardCreate" id="EcomOrderSavedCardCreate_@paymentmethod.GetString("Ecom:Cart.Paymethod.ID")" value="true" /> <input type="text" name="EcomOrderSavedCardName" id="MySavedCardName" value='My @paymentmethod.GetValue("Ecom:Cart.Paymethod.Name") Card' /> } } @{ var savedcards = GetLoop("SavedCards"); } @if (savedcards.Any()) //Checks if this user has any saved cards { foreach (var savedcard in savedcards) { <div class="radio"> <label> @if (@savedcard.GetString("Ecom:SavedCard.IsSelected") == "true") //Checks if the saved card is selected { <input type="radio" name="EcomCartSavedCardID" id="EcomCartSavedCardID_@savedcard.GetString("Ecom:SavedCard.ID")" value="@savedcard.GetString("Ecom:SavedCard.ID")" checked="checked" /> } else { <input type="radio" name="EcomCartSavedCardID" id="EcomCartSavedCardID_@savedcard.GetString("Ecom:SavedCard.ID")" value="@savedcard.GetString("Ecom:SavedCard.ID")" /> } @savedcard.GetString("Ecom:SavedCard.Name") </label> </div> } }

From the cart you can change the value of the Email permission field on the logged in user, and the user can be asked to accept the Terms & Conditions.

Field Name & Id

Notes

EcomOrderSubscribeToNewsletter

 

EcomOrderCustomerAccepted

 

In your template, you can check if the shopping cart has Use email subscription checked in the cart settings:

RAZOR
@if (GetString("Ecom:Cart.UseNewsletterSubscription") == "True") { <div> <input type="checkbox" name="EcomOrderSubscribeToNewsletter" id="EcomOrderSubscribeToNewsletter" checked='@GetBoolean("Ecom:Order.Customer.NewsletterSubscribe")' /> <label for="EcomOrderSubscribeToNewsletter">Subscribe to newsletter</label> </div> } else { <div>This cart does not have the 'Use email subscription' field checked in the app settings</div> }

Custom fields – such as order fields or a coupon field– are posted to the cart using input elements which take the system name as the field name. No ID is necessary.

RAZOR
<div> <label for="Coupons">Coupon</label> <input type="text" name="Coupons" value='' /> </div> <div> <label for="TrackingURLFromERP">TrackingURLFromERP</label> <input type="text" name="TrackingURLFromERP" value='' /> </div>

Finally, a small set of order fields are used on integrated solutions. Although they can also be submitted from frontend, this is not a typical use-case.

Field Name & ID

Notes

EcomCartRequisition

 

EcomOrderReference

 

EcomOrderShippingDate

 

EcomOrderIntegrationId

 

From Settings > Ecommerce > Advanced configuration > Shopping Cart you have access to a number of advanced configuration options for the Shopping Cart app.

Read about the settings in this article.

database

These are the database tables relevant for the Shopping Cart app and related functionality. 

EcomAddressValidatorSettings

Contains settings for providers in Settings -> Ecom -> Orders -> Address Validation.

Field name Data type Length
AddressValidatorSettingId int 4
AddressValidatorName nvarchar 255
AddressValidatorActive bit 1
AddressValidatorProviderSettings nvarchar Max
AddressValidatorUserGroupIds nvarchar Max

EcomValidationGroups

Contains validation groups as defined in Settings -> Ecommerce -> Orders -> Validation groups.

Field name Data type Length
ValidationGroupId nvarchar 50
ValidationGroupName nvarchar 255
ValidationGroupAutoId int 4
ValidationGroupDoNotValidateIfAllFieldsAreEmpty bit 1

EcomValidationGroupsTranslation

Contains translations (EcomValidationGroupsTranslationValidationGroupLanguageID) of validation groups (EcomValidationGroupsTranslationValidationGroupID).

Field name Data type Length
EcomValidationGroupsTranslationValidationGroupID nvarchar 50
EcomValidationGroupsTranslationValidationGroupLanguageID nvarchar 50
EcomValidationGroupsTranslationValidationGroupName nvarchar 255

EcomValidations

Contains field definitions (ValidationFieldName) for validation rules and keeps track of which validation groups it belongs to (ValidationGroupId).

Field name Data type Length
ValidationId nvarchar 50
ValidationGroupId nvarchar 50
ValidationFieldName nvarchar 255
ValidationUseAndOperator bit 1
ValidationFieldType nvarchar 255
ValidationAutoId int 4

EcomValidationRules

Contains validation rule definitions (ValidationRuleId) and keeps track of which fields (ValidationRuleValidationId) belong to a rule.

Field name Data type Length
ValidationRuleId nvarchar 50
ValidationRuleValidationId nvarchar 50
ValidationRuleType nvarchar 255
ValidationRuleParameters nvarchar Max
ValidationRuleAutoId int 4

EcomSavedForLater

Registers products (SavedForLaterProductId, SavedForLaterVariantId, SavedForlaterLangugageId) marked as Saved for Later during a session (SavedForLaterSessionId).

Field name Data type Length
SavedForLaterId int 4
SavedForLaterProductId nvarchar 30
SavedForLaterVariantId nvarchar 255
SavedForLaterLanguageId nvarchar 50
SavedForLaterSessionId int 4
SavedForLaterDateAdded datetime 8

EcomOrderContexts

Field name Data type Length
OrderContextId nvarchar 50
OrderContextName nvarchar 255
OrderContextAutoId int 4

EcomOrderContextAccessUserRelation

Field name Data type Length
OrderContextAccessUserAccessUserId int 4
OrderContextAccessUserOrderContextId nvarchar 50
OrderContextAccessUserOrderId nvarchar 50
OrderContextAccessUserRelationAutoId int 4

EcomOrderContextShopRelation

Field name Data type Length
OrderContextShopRelationContextId nvarchar 50
OrderContextShopRelationShopId nvarchar 50
OrderContextShopRelationAutoId int 4