【问题标题】:Orchard CMS: Adding default data to fields and then querying themOrchard CMS:将默认数据添加到字段,然后查询它们
【发布时间】:2014-11-26 09:47:13
【问题描述】:

我已使用与内容类型同名的部分将名为 Website 的 LinkField 添加到内容类型。

ContentDefinitionManager.AlterTypeDefinition("MyContentType", a => a
    .WithPart("CommonPart")
    .WithPart("MyContentType")
    .Creatable());

ContentDefinitionManager.AlterPartDefinition("MyContentType", cft => cft
    .WithField("Website", a => a.OfType("LinkField").WithDisplayName("Website")
        .WithSetting("FieldIndexing.Included", "True"))
    .Attachable());

然后,我会在迁移期间创建一些默认内容项。
我在添加字段数据之前创建项目,因为在创建项目之前设置字段值时,我遇到了字段未更新的问题。 (请随意阐明这一点,但这不是我的问题)

var myItem = _orchardServices.ContentManager.New("MyContentType");
_orchardServices.ContentManager.Create(myItem);
var websitePart = myItem.Parts.FirstOrDefault(x => x.Fields.Any(y => y.Name == "Website"));
var websiteLinkField = websitePart .Fields.FirstOrDefault(x => x.Name == "Website") as LinkField;
websiteLinkField.Value = "http://www.google.com";
websiteLinkField.Text = "Link to google";
_orchardServices.ContentManager.Publish(myItem);

我意识到有更多动态的方法可以访问该字段,但这似乎也有效。 当我查看项目时会显示数据,但随后我会继续进行查询。 我使用 UI 构建了一个简单的查询,在 LinkField 的文本中查找单词“google”,然后点击预览。
没有找到结果。 然后我打开从迁移中创建的项目之一,然后简单地点击“保存”按钮。 然后我再次尝试预览,我现在保存的项目出现了。

据我所知,当我保存一个我没有从迁移中执行的内容项时,正在发生一些事情。但是我一直在遍历各个角度的代码,但我找不到它。 我怀疑也许应该触发一些处理程序以创建 FieldIndex'es ? (我知道如何触发 Lucene 索引的更新,但正如人们所期望的那样,它不会影响使用 Projections 模块查询字段,我现在真的迷路了。)

现在我只是在黑暗中盲目地刺伤。
真的很感激我能得到的任何帮助,即使它只是让我回到正确的方向。谢谢。

【问题讨论】:

    标签: c# orchardcms orchardcms-1.8


    【解决方案1】:

    你应该改变

    _orchardServices.ContentManager.Create(myItem);
    

    _orchardServices.ContentManager.Create(myItem, Orchard.ContentManagement.VersionOptions.Draft);
    

    为了理解,请查看 Orchard.Core.Contents.Controllers.AdminController 类的 CreatePOST 方法和 Orchard.ContentManagement.DefaultContentManager 类的 Publish 方法

    在您调用 Create(myItem) 的情况下,然后创建已发布的内容项,并且所有处理程序都被正常调用(但尚未设置所需的数据)。当您调用 Publish(myItem) 时,没有任何反应(不调用任何处理程序),因为您的内容已经发布。

    【讨论】:

    • 完美,谢谢。这让我很困惑。
    【解决方案2】:

    我已将此作为bug 提出,如果您认为它需要修复,请投票给它。

    @Alexander Petryakov 对正在发生的事情的描述是正确的,他的解决方法可能是正确的方法,但是这种行为没有意义,这就是我提出这个错误的原因。您问题中的代码设法在 Orchard_Framework_ContentItemVersionRecord 表中存储的数据的内容视图与 Orchard_Projections_StringFieldIndexRecord 表中存储的数据的 Projections 视图之间创建不一致。本质上,Orchard_Projections_StringFieldIndexRecord 包含 null,因为在您更新字段后它还没有处理发布事件。

    您拥有的代码基本上做了以下事情:

    • 创建内容项 + 发布其创作
    • 更新内容项字段之一,此更新不会更改内容的状态
    • 尝试发布不执行任何操作的内容项,因为它认为它已经发布。

    对我来说,如果您更新内容项上的字段,那么您正在处理的项的状态不应再发布(自发布后它已更改)。字段提供了挂钩,允许您在更新时收到通知,因此解决问题的另一种方法是创建一个实现接口IFieldStorageEvents 的类,该接口在更新字段时更新内容的发布状态。

    public class FieldUpdateEventHandler  : IFieldStorageEvents {
        public void SetCalled(FieldStorageEventContext context) {
            context.Content.ContentItem.VersionRecord.Published = false;
        }
    }
    

    这将允许您的原始代码在编写时运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多