|
using System; |
|
using System.Collections.Generic; |
|
using System.ComponentModel; |
|
using System.Linq; |
|
using System.Web.Mvc; |
|
using System.Web.Routing; |
|
|
|
using Telerik.Sitefinity.ContentLocations; |
|
using Telerik.Sitefinity.DynamicModules.Model; |
|
using Telerik.Sitefinity.Frontend.Mvc.Helpers; |
|
using Telerik.Sitefinity.Frontend.Mvc.Infrastructure; |
|
using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Controllers; |
|
using Telerik.Sitefinity.Frontend.Mvc.Infrastructure.Routing; |
|
using Telerik.Sitefinity.Model; |
|
using Telerik.Sitefinity.Mvc; |
|
using Telerik.Sitefinity.Personalization; |
|
using Telerik.Sitefinity.Services; |
|
using Telerik.Sitefinity.Taxonomies.Model; |
|
using Telerik.Sitefinity.Web; |
|
|
|
using SitefinityWebApp.Mvc.Models; |
|
|
|
|
|
namespace SitefinityWebApp.Mvc.Controllers |
|
{ |
|
[ControllerToolboxItem(Name = "CustomPressReleasesWidget_MVC", Title = "Press Releases Widget", SectionName = "CustomWidgets")] |
|
public class PressReleasesWidgetController : |
|
ContentBaseController, |
|
IContentLocatableView, |
|
IRouteMapper, |
|
IPersonalizable |
|
{ |
|
#region Properties |
|
public string ListTemplateName |
|
{ |
|
get { return this.listTemplateName; } |
|
set { this.listTemplateName = value; } |
|
} |
|
|
|
public string DetailTemplateName |
|
{ |
|
get { return this.detailTemplateName; } |
|
set { this.detailTemplateName = value; } |
|
} |
|
|
|
public bool OpenInSamePage |
|
{ |
|
get { return this.openInSamePage; } |
|
set { this.openInSamePage = value; } |
|
} |
|
|
|
public Guid DetailsPageId { get; set; } |
|
|
|
[TypeConverter(typeof(ExpandableObjectConverter))] |
|
public IPressReleasesWidgetModel Model |
|
{ |
|
get |
|
{ |
|
if (this.model == null) |
|
this.model = this.InitializeModel(); |
|
|
|
return this.model; |
|
} |
|
} |
|
|
|
#endregion |
|
|
|
#region Actions |
|
|
|
public ActionResult Index(int? page) |
|
{ |
|
ITaxon taxonFilter = TaxonUrlEvaluator.GetTaxonFromQuery(this.HttpContext, this.Model.UrlKeyPrefix); |
|
var fullTemplateName = this.listTemplateNamePrefix + this.ListTemplateName; |
|
var currentPageUrl = this.GetCurrentPageUrl(); |
|
|
|
this.ViewBag.CurrentPageUrl = currentPageUrl; |
|
this.ViewBag.RedirectPageUrlTemplate = this.GeneratePagingTemplate(currentPageUrl, this.Model.UrlKeyPrefix); |
|
this.ViewBag.DetailsPageId = this.DetailsPageId; |
|
this.ViewBag.OpenInSamePage = this.OpenInSamePage; |
|
|
|
this.SetRedirectUrlQueryString(taxonFilter); |
|
|
|
this.UpdatePageFromQuery(ref page, this.Model.UrlKeyPrefix); |
|
var viewModel = this.Model.CreateListViewModel(taxonFilter, this.ExtractValidPage(page)); |
|
this.AddCacheDependencies(this.Model.GetKeysOfDependentObjects(viewModel)); |
|
|
|
if (this.ShouldReturnDetails(this.Model.ContentViewDisplayMode, viewModel)) |
|
return this.Details((DynamicContent)viewModel.Items.First().DataItem); |
|
|
|
return this.View(fullTemplateName, viewModel); |
|
} |
|
|
|
public ActionResult ListByTaxon(ITaxon taxonFilter, int? page) |
|
{ |
|
var fullTemplateName = this.listTemplateNamePrefix + this.ListTemplateName; |
|
this.ViewBag.CurrentPageUrl = this.GetCurrentPageUrl(); |
|
this.ViewBag.RedirectPageUrlTemplate = this.ViewBag.CurrentPageUrl + "/" + taxonFilter.UrlName + "/{0}"; |
|
this.ViewBag.DetailsPageId = this.DetailsPageId; |
|
this.ViewBag.OpenInSamePage = this.OpenInSamePage; |
|
|
|
var viewModel = this.Model.CreateListViewModel(taxonFilter, this.ExtractValidPage(page)); |
|
if (SystemManager.CurrentHttpContext != null) |
|
this.AddCacheDependencies(this.Model.GetKeysOfDependentObjects(viewModel)); |
|
|
|
return this.View(fullTemplateName, viewModel); |
|
} |
|
|
|
public ActionResult Details(DynamicContent item) |
|
{ |
|
this.InitializeMetadataDetailsViewBag(item); |
|
|
|
var fullTemplateName = this.detailTemplateNamePrefix + this.DetailTemplateName; |
|
this.ViewBag.Title = item.ApplicationName; |
|
|
|
var viewModel = this.Model.CreateDetailsViewModel(item); |
|
if (SystemManager.CurrentHttpContext != null) |
|
this.AddCacheDependencies(this.Model.GetKeysOfDependentObjects(viewModel)); |
|
|
|
var page = this.HttpContext.CurrentHandler.GetPageHandler(); |
|
this.AddCanonicalUrlTagIfEnabled(page, item); |
|
|
|
return this.View(fullTemplateName, viewModel); |
|
} |
|
|
|
protected override void HandleUnknownAction(string actionName) |
|
{ |
|
this.ActionInvoker.InvokeAction(this.ControllerContext, "Index"); |
|
} |
|
|
|
#endregion |
|
|
|
#region IRouteMapper |
|
public bool TryMapRouteParameters(string[] urlParams, RequestContext requestContext) |
|
{ |
|
if (urlParams == null) |
|
throw new ArgumentNullException(nameof(urlParams)); |
|
|
|
if (requestContext == null) |
|
throw new ArgumentNullException(nameof(requestContext)); |
|
|
|
if (urlParams.Length == 0) |
|
return false; |
|
|
|
var url = RouteHelper.GetUrlParameterString(urlParams); |
|
|
|
var providerName = this.Model.ProviderName; |
|
var contentItemResolver = new ContentDataItemResolver(); |
|
var item = contentItemResolver.GetItemByUrl(url, this.Model.ContentType, providerName, out string redirectUrl); |
|
|
|
if (item != null) |
|
{ |
|
SystemManager.CurrentHttpContext.Items["detailItem"] = item; |
|
|
|
this.AddContentItemToRouteData(requestContext, redirectUrl, item); |
|
|
|
return true; |
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
protected void AddContentItemToRouteData(RequestContext requestContext, string redirectUrl, IDataItem item, bool setUrlParametersResolved = true) |
|
{ |
|
requestContext.RouteData.Values["action"] = "details"; |
|
|
|
var actionMethod = new ReflectedControllerDescriptor(this.GetType()).FindAction(this.ControllerContext, "Details"); |
|
var parameters = actionMethod.GetParameters(); |
|
|
|
if (parameters.Length > 0 && parameters[0].ParameterType.IsAssignableFrom(this.Model.ContentType)) |
|
{ |
|
requestContext.RouteData.Values[parameters[0].ParameterName] = item; |
|
} |
|
|
|
if (!redirectUrl.IsNullOrEmpty()) |
|
{ |
|
requestContext.RouteData.Values[Telerik.Sitefinity.Mvc.ControllerActionInvoker.ShouldProcessRequestKey] = redirectUrl; |
|
} |
|
} |
|
#endregion |
|
|
|
#region IContentLocatableView |
|
|
|
public bool? DisableCanonicalUrlMetaTag { get; set; } |
|
|
|
[NonAction] |
|
public IEnumerable<IContentLocationInfo> GetLocations() |
|
{ |
|
return this.Model.GetLocations(); |
|
} |
|
|
|
#endregion |
|
|
|
#region Private Methods |
|
private IPressReleasesWidgetModel InitializeModel() |
|
{ |
|
return ControllerModelFactory.GetModel<IPressReleasesWidgetModel>(this.GetType()); |
|
} |
|
|
|
private void SetRedirectUrlQueryString(ITaxon taxon) |
|
{ |
|
if (taxon == null || this.HttpContext == null) |
|
{ |
|
return; |
|
} |
|
|
|
var taxonQueryStringParams = HyperLinkHelpers.BuildTaxonQueryStringParams(taxon, this.Model.UrlKeyPrefix); |
|
|
|
this.ViewBag.RedirectPageUrlTemplate = this.ViewBag.RedirectPageUrlTemplate + taxonQueryStringParams; |
|
} |
|
#endregion |
|
|
|
#region Fields |
|
|
|
private IPressReleasesWidgetModel model; |
|
|
|
private string listTemplateName = "PressReleases"; |
|
private string listTemplateNamePrefix = "List."; |
|
private string detailTemplateName = "DetailPage"; |
|
private string detailTemplateNamePrefix = "Detail."; |
|
private bool openInSamePage = true; |
|
|
|
#endregion |
|
|
|
} |
|
} |