3

我们有一个项目,我们在 Sitecore 中存储用户个人资料照片。我们的用户群将与 LDAP 集成(这意味着我们将拥有数以万计的用户,如果不是更多的话),并且将在用户第一次登录时创建个人资料。用户以后可以更改他们的个人资料照片,我们有一个自定义的 Sitecore 配置文件,它有一个属性来存储配置文件照片媒体项的 ID。

我想做的是找出一种方法来避免打破 100 项限制并将照片存储在 Sitecore 媒体库中。我们不想使用项目存储桶,我们想利用 Sitecore 缓存,因此在外部存储图像是不可能的。我在考虑基于用户名的十级深度文件夹结构,但这有点脏。

有没有人有任何可能有帮助的建议?

先感谢您。

站点核心 6.6

4

2 回答 2

6

避免打破 100 个孩子的限制是一个非常好的做法,您应该确保遵循这一点。

要在您的场景中实现这一点,您肯定需要某种文件夹结构。创建这样的结构并不有趣。您可以通过将事件处理程序添加到item:created事件并自动移动新创建的项目来自动化它。

我编写了快速代码,应该检查当前文件夹是否包含最多 50 个项目,如果不是,它会尝试以递归方式创建具有单个字符作为名称的其他文件夹并将项目移动到文件夹中。

您写道,您将参考存储为 ID,因此移动项目不会破坏参考。

请告诉我我没有测试过代码,所以它可能需要调整。

<event name="item:created">
  <handler type="My.Assembly.Namespace.ProfilePhotoHandler, My.Assembly" method="OnItemCreated" />
</event>
protected void OnItemCreated(object sender, EventArgs args)
{
    ItemCreatedEventArgs eventArgs = Event.ExtractParameter(args, 0) as ItemCreatedEventArgs;

    if (eventArgs == null || eventArgs.Item == null)
        return;
    Item item = eventArgs.Item;

    if (item == null
        || !item.Paths.IsMediaItem
        || !item.Paths.FullPath.Contains("/profile-images/")
        || item.TemplateID.ToString() == "{FE5DD826-48C6-436D-B87A-7C4210C7413B}")

        // we want to move only media items in profile-images and not media folders
        return;

    string guid = item.ID.ToShortID().ToString();

    MoveItemToProperDirectory(guid, item, item.Parent, 0);
}

private void MoveItemToProperDirectory(string guid, Item item, Item folder, int level)
{
    if (folder.Children.Count < 1)
    {
        if (item.Parent.ID != folder.ID)
        {
            item.MoveTo(folder);
        }
        return;
    }

    using (new SecurityDisabler())
    {
        // take next letter from the hash or random char if the hash is too short
        string newSubfolderName = (level < guid.Length)
                                        ? guid[level].ToString()
                                        : ('a' + new Random((int)DateTime.Now.Ticks).Next(24)).ToString();

        Item subfolder = folder.Children.FirstOrDefault(c => c.Name == newSubfolderName);
        if (subfolder == null)
        {
            // create new Media Folder and move the item there
            subfolder = folder.Add(newSubfolderName, new TemplateID(ID.Parse("{FE5DD826-48C6-436D-B87A-7C4210C7413B}")));
        }
        MoveItemToProperDirectory(guid, item, subfolder, level + 1);
    }
}
于 2013-11-07T14:26:24.563 回答
2

如果以某种方式无法选择更新,您可以考虑以下事项: 内容编辑器不使用图像,因此从内容编辑器中,不使用项目。这使得隐藏包含图像的节点成为可能,就像存储桶一样。将此与文件夹结构(在导入期间或在句柄中创建)相结合是一个很好的解决方案。

于 2013-11-08T06:20:53.100 回答