5 votes

Comment générer un lien vers un élément multimédia avec un identifiant au lieu d'un chemin dans Sitecore ?

Quelqu'un sait comment générer des liens dans Sitecore avec l'ID au lieu du chemin de l'article ?

Si vous utilisez la méthode GetMediaUrl de l'API, je peux obtenir cette URL :

/~/media/Images/Archive/content/News and Events/News_and_Events_Level2/20070419162739/iwhiz3.jpg

Le problème avec cette approche est que si quelqu'un change le nom de l'élément multimédia, le supprime quelque part ou le supprime, le lien ci-dessus sera rompu.

J'ai remarqué que si j'insère un lien média à partir de l'éditeur de texte enrichi, j'obtiens le lien ci-dessous :

/~/media/14BDED00E4D64DFD8F74019AED4D74EB.ashx

Le second lien est meilleur parce qu'il utilise l'identifiant de l'élément, donc si l'élément média actuel est renommé, retiré ou supprimé, tous les liens associés seront également mis à jour. En plus de cela, lorsque Sitecore rendra la page, il convertira le lien ci-dessus et affichera le chemin de l'élément pour qu'il soit lisible.

J'utilise Sitecore 6.5 et je fais actuellement une migration de contenu. Je dois donc m'assurer que tous les liens internes sont correctement mis à jour.

Puis-je savoir s'il existe une méthode pour générer le second lien en utilisant l'API de Sitecore ?

Gracias.

15voto

Kevin Obee Points 1479

En GetMediaItemUrl La méthode d'extension semble vous donner ce que vous voulez.

public static class ItemExtensions
{
    public static string GetMediaItemUrl(this Item item)
    {
        var mediaUrlOptions = new MediaUrlOptions() { UseItemPath = false, AbsolutePath = true };
        return Sitecore.Resources.Media.MediaManager.GetMediaUrl(item, mediaUrlOptions);
    }
}

[TestFixture]
public class when_using_items_extensions
{
    [Test]
    public void a_url_based_on_media_item_id_can_be_generated()
    {
        // Arrange
        Database db = global::Sitecore.Configuration.Factory.GetDatabase("master");
        Item item = db.GetItem("/sitecore/media library/Images/MyImage");

        // Act
        var mediaUrl = item.GetMediaItemUrl();

        // Assert
        Assert.That(mediaUrl, Is.EqualTo("/~/media/17A1341ABEEC46788F2159843DCEAB03.ashx"));
    }
}

3voto

Stephen Pope Points 3451

Ils sont appelés dynamic links et vous pouvez normalement les générer en utilisant le LinkManager par exemple

Sitecore.Links.LinkManager.GetDynamicUrl(item)

mais je ne suis pas sûr de la méthode pour faire cela avec les liens média (il y en a probablement une mais je ne la trouve pas et elle n'est pas sur le site de la Commission européenne). MediaManager ) mais la syntaxe de base est :

"/~/media/" + item.ID.ToShortID() + ".ashx"

1voto

Dappergoat Points 479

Si vous voulez toujours utiliser les ID au lieu des chemins, vous pouvez changer ce paramètre dans webconfig en false (comme ceci) :

<setting name="Media.UseItemPaths" value="false"/>`

Voici ce que le webconfig décrit à ce sujet :

 MEDIA - USE ITEM PATHS FOR URLS
 This setting controls if item paths are used for constructing media URLs.
 If false, short ids will be used.
       Default value: true

Vous pouvez alors utiliser l'implémentation par défaut (sans paramètres supplémentaires) :

Sitecore.Resources.Media.MediaManager.GetMediaUrl(item);

0voto

aspnetdeveloper Points 99

C'est ce que j'utilise :

var imgField = ((Sitecore.Data.Fields.ImageField)currentItem.Fields["Icon"]);
MediaUrlOptions opt = new MediaUrlOptions();
opt.AlwaysIncludeServerUrl = true;
// Absolute Path works as well. So either use AbsolutePath or AlwaysIncludeServerUrl
opt.AbsolutePath = true;
string mediaUrl = MediaManager.GetMediaUrl(imgField.MediaItem, opt);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X