避免打破 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);
}
}