U4-1226 Umbraco:image control

This commit is contained in:
Morten Bock
2013-06-19 16:18:15 +02:00
committed by Sebastiaan Janssen
parent 530fcf0ea3
commit f386c9d024
3 changed files with 210 additions and 192 deletions

View File

@@ -1,84 +1,97 @@
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Web;
using Umbraco.Core.Media;
using umbraco;
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Globalization;
using System.Linq;
using System.Web;
using Umbraco.Core.Media;
using umbraco;
namespace Umbraco.Web.Media
{
public class ImageUrl
{
[Obsolete("Use TryGetImageUrl() instead")]
public static string GetImageUrl(string specifiedSrc, string field, string provider, string parameters, int? nodeId = null)
{
string url;
var found = TryGetImageUrl(specifiedSrc, field, provider, parameters, nodeId, out url);
return found ? url : string.Empty;
}
namespace Umbraco.Web.Media
{
public class ImageUrl
{
public static string GetImageUrl(string specifiedSrc, string field, string provider, string parameters, int? nodeId = null)
public static bool TryGetImageUrl(string specifiedSrc, string field, string provider, string parameters, int? nodeId, out string url)
{
string url;
var imageUrlProvider = GetProvider(provider);
var parsedParameters = string.IsNullOrEmpty(parameters) ? new NameValueCollection() : HttpUtility.ParseQueryString(parameters);
var queryValues = parsedParameters.Keys.Cast<string>().ToDictionary(key => key, key => parsedParameters[key]);
if (string.IsNullOrEmpty(field))
{
url = imageUrlProvider.GetImageUrlFromFileName(specifiedSrc, queryValues);
}
else
{
var fieldValue = string.Empty;
if (nodeId.HasValue)
var imageUrlProvider = GetProvider(provider);
var parsedParameters = string.IsNullOrEmpty(parameters) ? new NameValueCollection() : HttpUtility.ParseQueryString(parameters);
var queryValues = parsedParameters.Keys.Cast<string>().ToDictionary(key => key, key => parsedParameters[key]);
if (string.IsNullOrEmpty(field))
{
url = imageUrlProvider.GetImageUrlFromFileName(specifiedSrc, queryValues);
return true;
}
else
{
var fieldValue = string.Empty;
if (nodeId.HasValue)
{
var contentFromCache = GetContentFromCache(nodeId.GetValueOrDefault(), field);
if (contentFromCache != null)
{
fieldValue = contentFromCache.ToString();
}
else
{
var itemPage = new page(content.Instance.XmlContent.GetElementById(nodeId.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)));
var value = itemPage.Elements[field];
fieldValue = value != null ? value.ToString() : string.Empty;
}
}
else
{
var context = HttpContext.Current;
if (context != null)
{
var elements = context.Items["pageElements"] as Hashtable;
if (elements != null)
{
var value = elements[field];
fieldValue = value != null ? value.ToString() : string.Empty;
}
}
}
if (!string.IsNullOrWhiteSpace(fieldValue))
{
var contentFromCache = GetContentFromCache(nodeId.GetValueOrDefault(), field);
if (contentFromCache != null)
{
fieldValue = contentFromCache.ToString();
}
else
{
var itemPage = new page(content.Instance.XmlContent.GetElementById(nodeId.GetValueOrDefault().ToString(CultureInfo.InvariantCulture)));
var value = itemPage.Elements[field];
fieldValue = value != null ? value.ToString() : string.Empty;
}
int mediaId;
url = int.TryParse(fieldValue, out mediaId)
? imageUrlProvider.GetImageUrlFromMedia(mediaId, queryValues)
: imageUrlProvider.GetImageUrlFromFileName(fieldValue, queryValues);
return true;
}
else
{
var context = HttpContext.Current;
if (context != null)
{
var elements = context.Items["pageElements"] as Hashtable;
if (elements != null)
{
var value = elements[field];
fieldValue = value != null ? value.ToString() : string.Empty;
}
}
}
int mediaId;
url = int.TryParse(fieldValue, out mediaId)
? imageUrlProvider.GetImageUrlFromMedia(mediaId, queryValues)
: imageUrlProvider.GetImageUrlFromFileName(fieldValue, queryValues);
}
return url;
}
private static IImageUrlProvider GetProvider(string provider)
{
return ImageUrlProviderResolver.Current.GetProvider(provider);
}
private static object GetContentFromCache(int nodeIdInt, string field)
{
var context = HttpContext.Current;
if (context == null)
return string.Empty;
var content = context.Cache[String.Format("contentItem{0}_{1}", nodeIdInt.ToString(CultureInfo.InvariantCulture), field)];
return content;
}
}
}
url = string.Empty;
return false;
}
private static IImageUrlProvider GetProvider(string provider)
{
return ImageUrlProviderResolver.Current.GetProvider(provider);
}
private static object GetContentFromCache(int nodeIdInt, string field)
{
var context = HttpContext.Current;
if (context == null)
return string.Empty;
var content = context.Cache[String.Format("contentItem{0}_{1}", nodeIdInt.ToString(CultureInfo.InvariantCulture), field)];
return content;
}
}
}

View File

@@ -1,91 +1,91 @@
using System.Collections.Generic;
using System.Xml.XPath;
using Umbraco.Core.Media;
using umbraco;
namespace Umbraco.Web.Media.ImageUrlProviders
{
public class ImageUrlProvider : IImageUrlProvider
{
public const string DefaultName = "umbracoUpload";
public string Name
{
get { return DefaultName; }
}
public string GetImageUrlFromMedia(int mediaId, IDictionary<string, string> parameters)
{
var url = string.Empty;
var nodeIterator = library.GetMedia(mediaId, false);
if (nodeIterator.Current != null)
{
var filename = GetProperty(nodeIterator, "umbracoFile");
var withThumb = AddThumbInfo(filename, parameters);
url = AddCropInfo(withThumb, parameters);
}
return url;
}
public string GetImageUrlFromFileName(string specifiedSrc, IDictionary<string, string> parameters)
{
var withThumb = AddThumbInfo(specifiedSrc, parameters);
return AddCropInfo(withThumb, parameters);
}
private static string AddThumbInfo(string filename, IDictionary<string, string> parameters)
{
var thumb = string.Empty;
if (parameters.ContainsKey("thumb"))
thumb = parameters["thumb"];
if (!string.IsNullOrEmpty(thumb))
{
var lastIndexOf = filename.LastIndexOf('.');
var name = filename.Substring(0, lastIndexOf);
var extension = filename.Substring(lastIndexOf, filename.Length - lastIndexOf);
return string.Format("{0}_thumb_{1}{2}", name, thumb, extension);
}
return filename;
}
private static string AddCropInfo(string filename, IDictionary<string, string> parameters)
{
var crop = string.Empty;
if (parameters.ContainsKey("crop"))
crop = parameters["crop"];
if (!string.IsNullOrEmpty(crop))
{
var lastIndexOf = filename.LastIndexOf('.');
var name = filename.Substring(0, lastIndexOf);
//var extension = filename.Substring(lastIndexOf, filename.Length - lastIndexOf);
//Built in cropper currently always uses jpg as an extension
const string extension = ".jpg";
return string.Format("{0}_{1}{2}", name, crop, extension);
}
return filename;
}
private static string GetProperty(XPathNodeIterator nodeIterator, string fileProp)
{
var xpath = UmbracoSettings.UseLegacyXmlSchema
? string.Format(".//data[@alias = '{0}']", fileProp)
: string.Format(".//{0}", fileProp);
var file = string.Empty;
var selectSingleNode = nodeIterator.Current.SelectSingleNode(xpath);
if (selectSingleNode != null)
file = selectSingleNode.InnerXml;
return file;
}
}
using System.Collections.Generic;
using System.Xml.XPath;
using Umbraco.Core.Media;
using umbraco;
namespace Umbraco.Web.Media.ImageUrlProviders
{
public class ImageUrlProvider : IImageUrlProvider
{
public const string DefaultName = "umbracoUpload";
public string Name
{
get { return DefaultName; }
}
public string GetImageUrlFromMedia(int mediaId, IDictionary<string, string> parameters)
{
var url = string.Empty;
var nodeIterator = library.GetMedia(mediaId, false);
if (nodeIterator.Current != null)
{
var filename = GetProperty(nodeIterator, "umbracoFile");
var withThumb = AddThumbInfo(filename, parameters);
url = AddCropInfo(withThumb, parameters);
}
return url;
}
public string GetImageUrlFromFileName(string specifiedSrc, IDictionary<string, string> parameters)
{
var withThumb = AddThumbInfo(specifiedSrc, parameters);
return AddCropInfo(withThumb, parameters);
}
private static string AddThumbInfo(string filename, IDictionary<string, string> parameters)
{
var thumb = string.Empty;
if (parameters.ContainsKey("thumb"))
thumb = parameters["thumb"];
if (!string.IsNullOrEmpty(thumb) && filename.Contains("."))
{
var lastIndexOf = filename.LastIndexOf('.');
var name = filename.Substring(0, lastIndexOf);
var extension = filename.Substring(lastIndexOf, filename.Length - lastIndexOf);
return string.Format("{0}_thumb_{1}{2}", name, thumb, extension);
}
return filename;
}
private static string AddCropInfo(string filename, IDictionary<string, string> parameters)
{
var crop = string.Empty;
if (parameters.ContainsKey("crop"))
crop = parameters["crop"];
if (!string.IsNullOrEmpty(crop) && filename.Contains("."))
{
var lastIndexOf = filename.LastIndexOf('.');
var name = filename.Substring(0, lastIndexOf);
//var extension = filename.Substring(lastIndexOf, filename.Length - lastIndexOf);
//Built in cropper currently always uses jpg as an extension
const string extension = ".jpg";
return string.Format("{0}_{1}{2}", name, crop, extension);
}
return filename;
}
private static string GetProperty(XPathNodeIterator nodeIterator, string fileProp)
{
var xpath = UmbracoSettings.UseLegacyXmlSchema
? string.Format(".//data[@alias = '{0}']", fileProp)
: string.Format(".//{0}", fileProp);
var file = string.Empty;
var selectSingleNode = nodeIterator.Current.SelectSingleNode(xpath);
if (selectSingleNode != null)
file = selectSingleNode.InnerXml;
return file;
}
}
}

View File

@@ -1,25 +1,30 @@
using System.Web.UI;
using System.Web.UI.HtmlControls;
using Umbraco.Core.Media;
using Umbraco.Web.Media;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using Umbraco.Core.Media;
using Umbraco.Web.Media;
namespace umbraco.presentation.templateControls
{
public class Image : HtmlImage
{
public string NodeId { get; set; }
public string Field { get; set; }
public string Provider { get; set; }
public string Parameters { get; set; }
protected override void Render(HtmlTextWriter writer)
{
int id;
bool hasid = int.TryParse(NodeId, out id);
int? nodeId = hasid ? id : (int?)null;
namespace umbraco.presentation.templateControls
{
public class Image : HtmlImage
{
public string NodeId { get; set; }
public string Field { get; set; }
public string Provider { get; set; }
public string Parameters { get; set; }
protected override void Render(HtmlTextWriter writer)
{
int id;
bool hasid = int.TryParse(NodeId, out id);
int? nodeId = hasid ? id : (int?) null;
Src = ImageUrl.GetImageUrl(Src, Field, Provider, Parameters, nodeId);
base.Render(writer);
}
}
string url;
bool imageFound = ImageUrl.TryGetImageUrl(Src, Field, Provider, Parameters, nodeId, out url);
Src = url;
if (imageFound)
{
base.Render(writer);
}
}
}
}