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

Dar*_*ght 4 asp.net-mvc orchardcms orchardcms-1.6

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

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

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

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

选择你喜欢的模块上的任何教程,这就是我遵循的路径 - 它们在创建模块和通过管理员存储数据方面看起来都是一样的....

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

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

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

通常我应该在模块中存储哪些数据来存储在前端输入的数据?

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

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

如果我在前端显示的表格与我创建的模块有些分开吗?

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

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

更新

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

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

Haz*_*zza 7

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

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

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

如果您的用户必须登录才能订阅您的简报,您可能会更加聪明,并在用户说他们想要订阅您的简报时更新此部分.但现在我在bab呀学语.

关于如何创建自己的窗口小部件以显示表单,我有点夸大其思.如果您认为这是一条您可能想要的路线,我很乐意提供更多细节.否则......我太懒了^ _ ^

更新:

好的,所以我看到尼克给了你一些关于如何解决这个问题的建议.我开始阅读但感到无聊,认为这听起来非常好.以为我只是加上我的两个便士值得.我不是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

这将生成所有必要的位和bobs,驱动程序等.您的部分不应该真正需要任何设置.也许将来当它需要简单时,现在我们将模型留空.我们会将您的简报订阅者列表存储在不同的表中.在一点点.首先让它显示你的部分.您的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;   
    }
    }

    }
Run Code Online (Sandbox Code Playgroud)

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

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

@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>
}
Run Code Online (Sandbox Code Playgroud)

现在让我们让这个表单的模型起作用.在名为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; }


    }
}
Run Code Online (Sandbox Code Playgroud)

这将存储您的电子邮件订阅者.现在你需要实际做这件事.我们可以创建将处理所有内容的控制器.创建一个名为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
        }
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

   return 3;
}
Run Code Online (Sandbox Code Playgroud)

我在记事本中写的样本可能不会编译.比我想象的要长一点......我的错误.