Sitecore JSS 限制在链接字段中检索的项目的深度

Sitecore JSS Limit depth of items retrieved in linked fields

我有一个页面的应用程序路由 A 并且正在加载所有字段,包括 link 的多列表到项目应用程序路由 B 可以在多列表中link 到项目 A,创建一个无限循环。有没有办法将深度设置为只有一个级别?

AppRoute A:
  fields:
    multifield:
      AppRoute B

AppRoute B:
  fields:
    multifield:
      AppRoute A

有两个选项,你可以为配置文件创建一个补丁来更新layoutService serializationMaxDepth,但这会影响所有的Items:

<configuration>
  <sitecore>
    <settings>
    <layoutService>
      <serializationMaxDepth>2</serializationMaxDepth>
    </layoutService>
  </sitecore>
</configuration>

或者您可以创建自定义字段序列化解析器。

此 class 会将信息添加到字段中:

public class CustomFieldSerializer : BaseFieldSerializer
{
    public CustomFieldSerializer (IFieldRenderer fieldRenderer)
      : base(fieldRenderer)
    {
    }


    protected override void WriteValue(Field field, JsonTextWriter writer)
    {
      writer.WriteStartObject();
      writer.WritePropertyName(field.Name);
      writer.WriteValue("Your custom field value here.");
      writer.WriteEndObject();
    }
  
}

这个 class 将是字段解析器:

    public class GetCustomFieldSerializer : BaseGetFieldSerializer
  {

    public GetCustomFieldSerializer(IFieldRenderer fieldRenderer)
        : base(fieldRenderer)
    {
    }


    protected override void SetResult(GetFieldSerializerPipelineArgs args)
    {
      Assert.ArgumentNotNull((object)args, nameof(args));
      args.Result = new CustomFieldSerializer(this.FieldRenderer);
    }
  }

这是将解析器 class 设置为您的字段的配置补丁。确保将您的配置(补丁:之前)放在字段默认序列化配置之前,在这种情况下,多重列表是 GetMultilistFieldSerializer 您可以在 https://<your-sitecore-domain>/sitecore/admin/showconfig.aspx:

中查看
<?xml version="1.0" encoding="utf-8" ?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <group groupName="layoutService">
        <pipelines>
          <getFieldSerializer>
            <processor patch:before="processor[@type='Sitecore.LayoutService.Serialization.Pipelines.GetFieldSerializer.GetMultilistFieldSerializer, Sitecore.LayoutService']" type="Foundation.FieldSerializer.GetCustomFieldSerializer, Foundation.LayoutService" resolve="true">
              <FieldTypes hint="list">
                <fieldType id="1">multilist</fieldType>
              </FieldTypes>
            </processor>
          </getFieldSerializer>
        </pipelines>
      </group>
    </pipelines>
  </sitecore>
</configuration>