4

只要我在我的开发机器前,代码就会稍后出现,但同时希望有人能提供帮助....

我正在尝试在 Orchard CMS v1.6.1 上进行开发。目前,我正在尝试开发一个模块,该模块基本上允许我在前端的页脚(或我选择的任何其他位置)中放置时事通讯订阅视图。

我已经遵循了几个教程,它们似乎都展示了如何仅从管理员存储数据 - 我需要在前端和管理员存储数据......这就是我正在寻求帮助的......

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

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

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

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

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

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

我不是在追求实际的代码——只是对我应该做什么的想法。我通常使用 Web 表单进行开发,所以 MVC 对我来说有点新。

我应该有一个控制器/路由等吗?

我在前端显示的表单是否应该与我创建的模块有所不同?

有人可以指出我在 Orchard 内存储数据的正确方向吗?

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

更新

感谢您到目前为止给出的答案。在这种情况下,我可以使用自定义表单,尽管不想。理想情况下,我希望将数据存储在它自己的表中。

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

4

3 回答 3

7

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

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

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

如果您的用户必须登录才能订阅您的时事通讯,您可能会更加聪明,将一部分附加到用户并在他们说他们想要订阅您的时事通讯时进行更新。但现在我在胡说八道。

关于如何创建自己的小部件以显示表单,我只是提出了非常模糊的想法。如果您认为这是您可能想要走的路线,我很乐意提供更多详细信息。否则……我太懒了^_^

更新:

好的,我看到尼克给了你一些关于如何去做的指示。我开始阅读但很无聊,但觉得听起来还不错。以为我会加上我的两便士价值。我不是果园方面的专家,但这就是我的感觉。对我的废话的更正非常感谢。

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

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

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

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

代码生成部分 YourModuleName NewsletterPart

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

< Place Parts_NewsletterPart="Content: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 的文件,其内容如下:

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

只是我在记事本中写的示例,因此可能无法编译。比我预期的要长一点……我的失误。

于 2013-08-08T09:21:36.143 回答
2

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

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

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

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

我看不出您在前端显示的表单与您创建的模块分开的任何理由。就我而言,我在模块的部分视图中显示表单,并且该表单的操作在模块中的控制器中。

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

我希望这会有所帮助!

于 2013-08-08T16:00:56.603 回答
0

听起来 Orchard.CustomForms 是您所需要的。它基本上包装了要在前端显示的内容项的“编辑器”形状。

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

它是为 Orchard 1.4 编写的,所以有些地方发生了变化(例如,'Rules' 模块已被弃用,并在 1.7 中被 Workflows 取代),但自那时以来,自定义表单的实现并没有太大变化。

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

于 2013-08-08T06:50:39.883 回答