好吧,您在管理员中所做的是创建内容类型。我不确定您是否真的需要以这种方式存储订阅。但也许我不明白你的情况,所以如果这是你希望的方式,你可能想查看 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;
}
只是我在记事本中写的示例,因此可能无法编译。比我预期的要长一点……我的失误。