Как получить информацию об элементе медиа в sitecore?
В настоящее время я работаю над созданием изображений Sitemap в sitecore. Поэтому мне нужны все изображения, используемые в определенном URL-адресе веб-сайта.
Здесь мне нужно получить подробную информацию обо всех элементах, в которых используется элемент мультимедиа. Или же мне нужно выяснить, какие элементы мультимедиа (изображения) используются в элементе (URL) в sitecore.
Я попытался получить поле изображения из элемента, и он работает нормально, но мне нужно получить все изображения, которые используются в элементе, которые добавляются через детали презентации.
Item currentitem = master.GetItem("/sitecore/content/International/Cars/New models/All new XC90");
public static string GetImageURL(Item currentItem)
{
string imageURL = string.Empty;
Sitecore.Data.Fields.ImageField imageField = currentItem.Fields["Image"];
if (imageField != null && imageField.MediaItem != null)
{
Sitecore.Data.Items.MediaItem image = new Sitecore.Data.Items.MediaItem(imageField.MediaItem);
imageURL = Sitecore.StringUtil.EnsurePrefix('/', Sitecore.Resources.Media.MediaManager.GetMediaUrl(image));
}
return imageURL;
}
3 ответа
Поскольку страница состоит из нескольких компонентов, вам необходимо выполнить итерацию по ним, извлечь все элементы из источника данных и проверить значения полей. Не забывайте, что изображения также могут быть размещены в полях Rich Text.
Чтобы убедиться, что вы захватили все это, вам, возможно, лучше сделать обратный вызов WebClient на сайт, по существу очистить отрендеренный HTML, а затем использовать HTMLAgilityPack/FizzlerEx/CsQuery для возврата всех изображений. При необходимости вы можете отфильтровать только те из медиатеки или определенного места.
using HtmlAgilityPack;
using Fizzler.Systems.HtmlAgilityPack;
//get the page
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load("http://example.com/requested-page");
HtmlNode page = document.DocumentNode;
//loop through all images on the page
foreach(HtmlNode item in page.QuerySelectorAll("img"))
{
var src = item.Attributes["src"].Value;
// do some stuff
}
Если вы хотите получать изображения только из Библиотеки мультимедиа, вы можете ограничить запрос:
foreach(HtmlNode item in page.QuerySelectorAll("img[src^='/-/media/']"))
{
//do stuff
...
}
Как указал jammykam, страница может состоять из нескольких компонентов. Тем не менее, сделать живой запрос HTML не всегда может быть оптимальным.
Альтернативным решением может быть использование Sitecore ContentSearch. Вы можете создать сохраненное вычисляемое поле, которое содержит список всех изображений в элементе страницы. Это было бы намного быстрее извлечь во время выполнения, и вы можете потратить еще несколько циклов ЦП, чтобы получить точный список изображений во время индексации.
Поле вычисляемого индекса может быть списком направляющих (media itme ids), URL-адресами изображений или любым другим форматом, который соответствует вашим потребностям.
Во время индексирования вы можете использовать LinkDatabase для поиска ссылочных элементов и отфильтровывать нужные вам элементы мультимедиа. Таким образом, вы получите изображения, на которые ссылаются из любого поля, включая встроенные изображения в полях с расширенным текстом.
Как упоминалось ранее, вы можете выполнять эти операции как для самого элемента, так и для ссылочных элементов, используемых макетом страницы. Вы можете просмотреть список ссылок на товары, полученный из item.Visualization.GetRenderings.
Обход всех страниц в sitecore является довольно сложной задачей, а также приводит к получению нежелательных изображений, таких как логотип, другие изображения заголовков. Вам следует рассмотреть возможность добавления поля дерева "Изображения Sitemap" в шаблоны страниц, чтобы содержать все релевантные изображения для страницы.