Orchard CMS自定义表单中的奇怪行为

时间:2014-03-10 14:16:18

标签: c# orchardcms

我创建了一个名为SignUp的新内容类型定义,其中包含一些文本字段。 然后我创建了一个新的自定义表单,选项保存内容项一旦提交表单选择了内容类型SignUp。

到目前为止这个工作正常。但是,当我现在创建一个条目并希望在提交时在管理员中看到它,并单击内容项时,我只看到this

我做错了什么?我甚至不知道它是否保存了内容项

1 个答案:

答案 0 :(得分:0)

我假设你正在使用Orchard 1.7.2,因为自定义表单在这个版本中被破坏了(但it's already fixed in the 1.x branch,所以它将在Orchard 1.8中运行 - 即将推出)。

问题基本上是如何保存这些内容项,但数据不会丢失(并且可以被检索),只是保存到DB中的错误表(ContentItemRecord,而不是ContentItemVersionRecord)。 See the issue on CodePlex有关如何应用解决此问题的脏修复的说明(该修补程序需要应用于“Orchard.CustomForms / Controllers / ItemController”中的“CreatePOST”操作。

这是一段代码,修复了现有的提交内容。您只需将此控制器放入任何模块,例如Orchard.Users然后它将在路径“”〜/ Users / ContactFormEntryFix“上可用。如果将其放在其他模块中,则必须编辑命名空间,并且还必须将“_contentTypeId”属性更改为用于自定义表单的内容类型的ID:

using Orchard.ContentManagement;
using Orchard.ContentManagement.Records;
using Orchard.Data;
using Orchard.UI.Admin;
using System.Linq;
using System.Web.Mvc;

namespace Orchard.Users.Controllers
{
    [Admin]
    public class ContactFormEntryFixController : Controller
    {
        private readonly IRepository<ContentItemRecord> _contentItemRecords;
        private readonly IRepository<ContentItemVersionRecord> _contentItemVersionRecords;
        private readonly IContentManager _contentManager;
        private const int _contentTypeId = 26;


        public ContactFormEntryFixController(IRepository<ContentItemRecord> contentItemRecords, IRepository<ContentItemVersionRecord> contentItemVersionRecords, IContentManager contentManager)
        {
            _contentItemRecords = contentItemRecords;
            _contentItemVersionRecords = contentItemVersionRecords;
            _contentManager = contentManager;
        }


        public ActionResult Index()
        {
            var itemRecords = _contentItemRecords.Table.Where(record => record.ContentType.Id == _contentTypeId);
            var itemVersionRecords = _contentItemVersionRecords.Table.Where(versionRecord => itemRecords.Select(record => record.Id).Contains(versionRecord.ContentItemRecord.Id));

            foreach (var item in itemVersionRecords) item.Data = itemRecords.FirstOrDefault(record => record.Id == item.ContentItemRecord.Id).Data;

            var items = _contentManager.Query("ContactForm").List();
            foreach (var item in items) _contentManager.Unpublish(item);

            return Content(string.Format("{0} Contact Form version entry successfully fixed and {1} Contact Form item unpublished.", itemVersionRecords.Count(), items.Count()));
        }
    }
}

出于安全原因,提交的项目未发布(顺便说一句,使用自定义表单时,请确保您使用的类型是Draftable,当然除非您使用工作流来处理他们的数据,否则必须在提交时保存它们。)< / p>