我有一个用例,用户需要从项目的下拉列表中选择一个字段值。这个问题是需要在每个项目上动态构建下拉列表(所有项目都使用相同的模板),以仅显示文件夹中具有与当前项目ID相等的字段值的项目。如果您已经丢失,以下是结构示例:
- sitecore
- content
- Home
- ContentItem1 (with droplist)
- Site Data
- SelectableItem1(ContentItem1 selected in 'itemid' field)
- SelectableItem2(ContentItem1 selected in 'itemid' field)
- SelectableItem3(ContentItem1 not selected in 'itemid' field)
- SelectableItem4(ContentItem1 not selected in 'itemid' field)
- templates
- ContentItem1Template
- Droplist field (source set to below query)
我希望我的查询动态分配ContentItem1的下拉列表字段来源,方法是获取一个项目列表,这些项目包含ContentItem1的id为其项目ID'字段的值,但是通过将字段值与ContentItem1 id的字段值进行比较。我尝试通过将字段值与id标记进行比较来尝试这样做:
query:/sitecore/content/Site Data/*[@#itemid#=$id]
无论我尝试使用什么价值(' $ id',$ id,@ id,' @ id',@ @ id,' @@ id&# 39;等等)它不想在项目级别上解析。有没有办法做到这一点,以便我可以为我需要相同功能的所有项目重用此ContentItem1Template?
答案 0 :(得分:2)
如果您使用的是Sitecore 7,则可以使用编码字段数据源。这将允许您使用您喜欢的任何自定义逻辑来指定应出现在列表中的项目。
创建一个实现IDataSource
的类和ListQuery()
方法,该方法返回Items列表作为字段的来源。然后使用code:
前缀将字段来源设置为方法,例如code:MyProject.Custom.FieldDataSource,MyProject.Custom
using System;
using Sitecore.Buckets.FieldTypes;
using Sitecore.Data.Items;
namespace MyProject.Custom
{
public class FieldDataSource : IDataSource
{
public Item[] ListQuery(Item item)
{
var root = item.Database.GetItem("/sitecore/content/my-item");
// some other logic to filter your item set
return root.Children.ToArray();
}
}
}
这些文章可以帮助您:
答案 1 :(得分:0)
您可能需要将ID包装在单引号中,如下所示:
query:/sitecore/content/#Site Data#/*[@itemid='$id']
也就是说,这似乎非常适合使用Sitecore链接数据库。每当您将SelectableItem与ContentItem相关联时,Sitecore都会将该关系存储在Link数据库中(只要您使用支持它的字段引用它,例如DropLink,DropTree,GeneralLink等)。
从那里,您可以使用Globals.LinkDatabase.GetReferrers(contentItem)
或contentItem.Links.GetValidLinks()
获取内容项的所有引荐项的列表。您可以在此处按模板ID过滤列表,以确保您只返回SelectableItems。