为Orchard创建一个模块,用于存储来自前端的数据

时间:2013-08-07 17:37:25

标签: asp.net-mvc orchardcms orchardcms-1.6

一旦我在我的开发机器前,代码就会出现,尽管希望在此期间有人可以提供帮助....

我正在尝试在Orchard CMS v1.6.1上开发。目前我正在尝试开发一个模块,基本上允许我在前端(或我选择的任何其他地方)的前端放置一个Newsletter订阅视图。

我已经按照了几个教程,他们似乎都展示了如何仅从管理员那里存储数据 - 我需要将数据存储在FRONT端以及管理员...这就是我正在寻求帮助的地方。 ..

所以,到目前为止,我的模块具有所有“常用”驱动程序/处理程序/ editorTemplates视图/迁移/ contentpart / contentpartrecord,我可以在管理员中创建订阅条目 - 我有我的内容类型设置并查看我的模块管理员。

选择你喜欢的模块上的任何教程,这就是我所遵循的路径 - 在创建模块和通过管理员存储数据方面,它们似乎都是相同的。

通过其他问题的答案,我设法让模块显示在前端 - 这是通过覆盖我的驱动程序中的显示并使用shapeHelper.DisplayTemplate()方法。

虽然有些奇怪的事情 - 当前端(我的表单现在显示感谢Placement.info)页面首次加载时,我在数据库表(订阅表)中得到一个空白条目 - 这种情况发生时没有实际回发。我几乎不知道代码的哪一部分导致了这种情况发生。这不需要发生 - 我只想在用户填写表单并点击提交时存储数据。

其次,我需要一些指导来实际存储用户在前端输入的数据..

通常我的模块应该有什么来存储在前端输入的数据?

我不是在追求实际代码 - 只是想知道我应该做什么。我通常以网络形式开发,所以MVC对我来说有点新鲜。

我应该有控制器/路线等吗?

我在前端显示的表单是否与我创建的模块有些分开?

有人能指出我在Orchard中存储数据的正确方向吗?

我想在这一点上任何帮助都会很棒......

更新

感谢您迄今为止给出的答案。在这种情况下,我可以使用自定义表单,但不想这样做。理想情况下,我希望将数据存储在自己的表中。

此外,这个模块将为我提供创建更复杂模块的基础,这些模块将存储来自前端的数据。我似乎无法理解Orchard如何将这一切拼接在一起.I。通过控制器将数据存储到果园系统中......我需要在表格中创建一个新行代码?

3 个答案:

答案 0 :(得分:7)

嗯,您在管理员中所做的是创建内容类型。我不确定你真的需要以这种方式存储订阅。但也许我不了解您的情况,所以如果您希望继续这样做,您可能需要查看Orchard自定义表格。我承认,最初不清楚如何从前端创建内容类型。您可以查看本教程,了解如何使用Orchard自定义表单。 http://devdirective.com/post/160/how-to-create-custom-forms-in-orchard-cms-with-email-and-recaptcha他们创建的示例是联系表单。它实际上非常简单,非常强大。我相信它包含在核心中。至少1.7。

但是,对于您订阅时事通讯的情况,我会说您可能想要一种不同的方法,只需在自己的表格中存储订阅您的时事通讯的电子邮件列表。

为此,您需要创建自己的小部件,其中一个部分显示链接到您自己的自定义控制器的表单,该控制器提交电子邮件然后保存。这一切都将使用简单的MVC完成,你可以查看相关的教程。

如果您的用户必须登录才能订阅您的简报,那么您可能会更加聪明并为用户添加一部分,并在他们说要订阅您的简报时更新。但现在我在唠叨。

我对如何创建自己的小部件以显示表单提出了一些非常含糊的想法。如果您认为这是一条您可能想要走的路线,我很乐意提供更多细节。否则......我太懒了^ _ ^

更新:

好的,所以我看到尼克给了你一些如何解决这个问题的建议。我开始阅读但感到无聊,认为这听起来非常好。以为我只是加上我的两个便士价值。我不是Orchard的专家,但这就是我的一切。对我的废话的更正非常感激。

将零件拼接到内容类型上。一部分由几个部分组成......你明白我的意思。

  • 驱动程序:这基本上是一个控制器。它显示人们将在前端看到的视图以及创建内容项时将显示的编辑器。它还在创建内容项,验证等时处理回发。
  • 模型:您可以在此处存储有关零件的数据。因此,如果您有与该部件相关的任何设置。这继承了一个将它连接到内容项的id。不记得这个名字。
  • 处理程序:这基本上是"处理"创建您的内容项。它会将您的数据放入存储库,并可以做其他聪明的事情。您可以将自定义逻辑放入其提供的服务中。但不要担心,只要留下来做它的东西。
  • 视图:内容部分有几个与之关联的视图。编辑器视图和显示视图。这些存储在单独的文件夹中。 EditorTemplates / Parts / ...是存储编辑器的位置(在创建内容项时显示)。 Parts / ...是存储显示前端内容的视图的地方。
  • 展示位置:此文件包含有关您的部件在内容项中的显示位置的信息。这很酷。

所以我们首先要做的就是创建零件本身。你可以自己写。但是,当你是新手时,忘记一些事情是很乏味的。我总是忘记重要的事情。某些地方提供了vs模板。我通常只使用一个很酷的小代码生成模块。所以去画廊下载并启用piotr szmyd的Code Generation Extensions。您现在可以运行命令行应用程序Orchard.exe。它存储在Orchard.Web中的bin文件夹中。有关如何使用此模块的详细信息,请查看此博客文章。 http://www.szmyd.com.pl/blog/generating-orchard-content-parts-via-command-line

是的,我们将使用此命令创建一个名为NewsletterPart的部件。

  

codegen part YourModuleName NewsletterPart

这将生成所有必要的位和bob,驱动程序等。您的部分不应该真正需要任何设置。也许将来当它需要简单时,现在我们将模型留空。我们会将您的简报订阅者列表存储在不同的表中。在一点点。首先让它显示你的部分。您的Views / Parts /文件夹中应该有一个NewsletterPart.cshtml文件。在这里写一些随机单词,以便我们知道它正在显示。然后转到Placement.info文件并确保其中有一行告诉您的部件显示。例如:

  

< Place Parts_NewsletterPart ="内容:5" />

现在我们实际上需要创建您的部件并制作一个可以显示您的部件的小部件。这是通过迁移文件完成的。

    using System;
using Orchard.ContentManagement;
using Orchard.ContentManagement.MetaData;
using Orchard.Core.Contents.Extensions;
using Orchard.Data.Migration;
using Orchard.Environment.Extensions;

namespace MyModule {
    public class Migrations : DataMigrationImpl {

        public Migrations() {

        }

        public int Create() {
        // Create Newsletter part table
            SchemaBuilder.CreateTable("NewsletterPartRecord", table => table
                .ContentPartRecord()
            );

        // Create the part and make it attachable to content items
            ContentDefinitionManager.AlterPartDefinition("NewsletterPart", builder => builder.Attachable());

        return 1;
    }

    public int UpdateFrom1() {
        // Create Widget
        ContentDefinitionManager.AlterTypeDefinition("NewsletterWidget", cfg => cfg
                .WithPart("NewsletterPart")
                .WithPart("WidgetPart")
                .WithPart("CommonPart")
                .WithSetting("Stereotype", "Widget"));

            return 2;   
    }
    }

    }

您现在应该可以在仪表板上创建一个小部件,它将显示在页脚中。

现在我们需要创建一个小表单来显示一些东西。表单看起来像这样。将它放入零件显示视图中,而不是之前写的任何内容。

@model dynamic

@using (Html.BeginForm("Subscribe", "Subscription", FormMethod.Post))
{
    <fieldset>
        @Html.AntiForgeryTokenOrchard()    

        <label >
            Email:</label>
        @Html.TextBox("Email")<br />


        <button class="primaryAction" type="submit">@T("Submit")</button>
    </fieldset>
}

现在让我们让这个表单的模型起作用。在名为Subscription Model的models文件夹中创建一个文件,其格式如下:

using System;

namespace MyModule.Models
{
    public class SubscriptionModel
    {
        public SubscriptionModel() 
        {

        }

        public virtual int Id { get; set; }

        public virtual string Email { get; set; }


    }
}

这将存储您的电子邮件订阅者。现在你需要实际做这件事。我们可以创建将处理所有内容的控制器。创建一个名为Controllers的文件夹,然后添加一个名为SubscriptionController.cs的文件。添加一个名为Subscribe的方法,它看起来像这样:

public class SubscriptionController : Controller {

   private readonly IRepository<EmailModel> emailRepository;

   public SubscriptionController(IRepository<EmailModel> emailRepository) {


    this.emailRepository = emailRepository;

        [HttpPost]
        public ActionResult Subscribe(string email)
        {
            var record = new EmailRecord() {
        Email = email
        };

        this.emailRepository.Create(record);


            //return to return url
        }
   }
}

剩下要做的就是在数据库中创建您的emailrecord表。返回迁移并添加新方法。

public int UpdateFrom2() {
   SchemaBuilder.CreateTable("EmailModel", table => table
                .Column<string>("Email")
                .Column<int>("Id", column => column.PrimaryKey()));

   return 3;
}

我在记事本中写的样本很可能无法编译。比我想象的要长一点......我的错误。

答案 1 :(得分:2)

我现在正在做一些几乎完全相同的事情,我正在尝试创建我自己的表单模块,可以在不同的页面上重复使用,以允许用户订阅时事通讯。我们用于此的方法是捕获用户输入并将其发送到模块的控制器。这里有一个很好的例子:http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-6

从那里我们实际上已经建立了我们自己的实体框架模型来连接我们想要与果园表分开的数据,但你可以做同样的事情来存储你自己的表单提交的数据。如果您计划创建自己的更多自定义表单并希望存储在前端提交的数据,那么这可能会特别有用。

我自己对果园很陌生,但试着更直接地回答你的问题:

我会说你的模块中应该有一个控制器来处理前端提交的数据。

我没有看到您在前端显示的表单与您创建的模块分开的任何原因。在我的例子中,我在模块的零件视图中显示表单,该表单的操作位于模块的控制器中。

如果您不反对在果园数据库旁边设置实体框架连接,则可以使用它来存储从前端提交的数据。否则,您可以尝试设置果园记录来存储数据,并使用果园IRepository接口在其中存储记录(这会将数据放在自己的单独表中)。请查看此文档(特别是StateRecord),了解如何完成此操作:http://docs.orchardproject.net/Documentation/Creating-1-n-and-n-n-relations

我希望这有点帮助!

答案 2 :(得分:0)

听起来像Orchard.CustomForms就是你所需要的。它基本上包裹着编辑&#39;要在前端显示的内容项的形状。

以下教程可能会有所帮助: http://devdirective.com/post/160/how-to-create-custom-forms-in-orchard-cms-with-email-and-recaptcha

它是为Orchard 1.4编写的,因此有些位已发生变化(例如,不推荐使用“规则”模块并将其替换为1.7中的工作流程),但自那时起,自定义表单实现没有太大变化。

如果您想通过自己的模块/控制器管理提交,Orchard.CustomForms源将是一个调查起点的好地方。这演示了如何在前端显示和保存表单(编辑器形状) - 看看Orchard.CustomForms.Controllers.ItemController