首页 > 解决方案 > Sitecore JSS 限制在链接字段中检索到的项目的深度

问题描述

我有一个A页面的 App Route 并且正在加载所有字段,包括一个链接到 Item App Route 的多列表B,它可以在多列表中具有指向 Item 的链接A,从而创建一个无限循环。有没有办法将深度设置为只有一个级别?

AppRoute A:
  fields:
    multifield:
      AppRoute B

AppRoute B:
  fields:
    multifield:
      AppRoute A

标签: sitecoresitecore-jss

解决方案


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

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

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

此类将信息添加到字段中:

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();
    }
  
}

这个类将是字段解析器:

    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);
    }
  }

这是将解析器类设置为您的字段的配置补丁。确保将您的 config(patch:before) 放在字段默认序列化配置之前,在这种情况下,GetMultilistFieldSerializer您可以在 multililist 中检查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>

推荐阅读