| Site Build Management | |
Products are content items within Sitecore. Use MVC to display product details.
At the Content Editor
_Products.cshtml
@model ProductViewModel
@{
var mod = (ProductViewModel)Model;
}
<div class="row">
<div class="span5" id="productImages">
<img src="@mod.FirstImagePath(ImageSize.Large)" alt="">
</div>
<div class="span4">
<h3>@Model.DisplayNameRender</h3>
<p>
@Model.DescriptionRender
</p>
</div>
<div class="span3">
<h3>Price</h3>
<span id="price">@Model.ListPriceRender</span>
</div>
</div>
<div class="row">
<div class="span12">
@if (Model.Upsells != null && Model.Upsells.Any())
{
<h3>Upsells</h3>
<ul class="thumbnails" id="productUpsells">
@foreach (var product in Model.Upsells)
{
<li class="span3">
@Html.Partial("~/Views/Catalog/_ProductSummary.cshtml", new ProductViewModel(product))
</li>
}
</ul>
}
</div>
</div>
_ProductSummary.cshtml
@model ProductViewModel
@{
var mod = (ProductViewModel)Model;
}
<a href="@Sitecore.Links.LinkManager.GetDynamicUrl(mod.Item)">
<div class="thumbnail">
<img src="@mod.FirstImagePath(ImageSize.Detail)" alt="">
<div class="productLabel">
<span class="label label-success">@mod.ListPriceRender</span><span class="label label-productName">@mod.DisplayNameRender</span>
</div>
<div class="detailsFloatOver">
<h4>@mod.DisplayNameRender </h4>
<p>@mod.ListPriceRender</p>
</div>
</div>
</a>
public class ProductViewModel : Sitecore.Mvc.Presentation.RenderingModel, IImageEntity
{
private Item _item;
public ProductViewModel() {}
public ProductViewModel(Item item)
{
this._item = item;
Upsells = new List<Item>();
}
public override Item Item
{
get
{
if (this._item == null)
return base.Item;
return this._item;
}
}
public string ProductId
{
get { return this.Item.Name; }
set { this.Item.Name = value; }
}
public string Description { get; set; }
public HtmlString DescriptionRender
{
get { return PageContext.Current.HtmlHelper.Sitecore().Field("Description", this.Item); }
}
public string DisplayName { get; set; }
public HtmlString DisplayNameRender
{
get { return PageContext.Current.HtmlHelper.Sitecore().Field(Sitecore.FieldIDs.DisplayName.ToString(), this.Item); }
}
public decimal? ListPrice
{
get
{
var selectedCurrency = HttpContext.Current.Request.Cookies["currency"];
if (selectedCurrency != null)
{
if (this.Item["Price_" + selectedCurrency.Value] != null)
{
return decimal.Parse(this.Item["Price_" + selectedCurrency.Value].Replace("$", string.Empty), CultureInfo.InvariantCulture);
}
}
return decimal.Parse(this.Item["ListPrice"].Replace("$", string.Empty), CultureInfo.InvariantCulture);
}
set
{
this.Item["ListPrice"] = value.ToString();
}
}
public HtmlString ListPriceRender
{
get
{
var selectedCurrency = HttpContext.Current.Request.Cookies["currency"];
if (selectedCurrency != null)
{
if (!string.IsNullOrEmpty(this.Item["Product_Price_" + selectedCurrency.Value]))
{
return PageContext.Current.HtmlHelper.Sitecore().Field("Product_Price_" + selectedCurrency.Value, this.Item);
}
}
return PageContext.Current.HtmlHelper.Sitecore().Field("ListPrice", this.Item);
}
}
public string ImageFilename
{
get { return this.Item["Image_filename"]; }
set { this.Item["Image_filename"] = value; }
}
public List<Item> Upsells { get; set; }
public void Initialize(Rendering rendering)
{
base.Initialize(rendering);
}
}
The example shown below displays product image, name, description, price and relationships. Relationships are a field on the item, where variants would be children of the item.
public ActionResult Product()
{
var productViewModel = GetProductViewModel(this.Item, this.CurrentRendering);
return View(this.CurrentRenderingView, productViewModel);
}
protected ProductViewModel GetProductViewModel(Item productItem, Rendering rendering)
{
if (HttpContext.Items[_CurentProductViewModelKeyName] == null)
{
var productViewModel = new ProductViewModel();
productViewModel.Initialize(rendering);
// get upsells
if (productItem != null && productItem.Fields.Contains(CommerceConstants.KnownFieldIds.RelationshipList) && !string.IsNullOrEmpty(productItem[CommerceConstants.KnownFieldIds.RelationshipList]))
{
var upsells = new List<Item>();
RelationshipField field = new RelationshipField(productItem.Fields[CommerceConstants.KnownFieldIds.RelationshipList]);
if (field != null)
{
// display the upsells for this productItem
var relationships = GetRelationshipsFromField(field, "upsell");
if (relationships != null)
{
upsells = relationships;
}
}
productViewModel.Upsells = upsells;
}
HttpContext.Items[_CurentProductViewModelKeyName] = productViewModel;
}
return (ProductViewModel)HttpContext.Items[_CurentProductViewModelKeyName];
}
/// <summary>
/// Gets a lists of target items from a relationship field
/// </summary>
/// <param name="field">the relationship field</param>
/// <param name="relationshipName">the relationship name, for example upsell</param>
/// <returns>a list of relationship targets or null if no items found</returns>
protected List<Item> GetRelationshipsFromField(RelationshipField field, string relationshipName)
{
IEnumerable<Item> relationships = field.GetRelationshipsTargets(relationshipName);
return relationships != null ? new List<Item>(relationships) : null;
}