一旦我在我的开发机器前,代码就会出现,尽管希望在此期间有人可以提供帮助....
我正在尝试在Orchard CMS v1.6.1上开发。目前我正在尝试开发一个模块,基本上允许我在前端(或我选择的任何其他地方)的前端放置一个Newsletter订阅视图。
我已经按照了几个教程,他们似乎都展示了如何仅从管理员那里存储数据 - 我需要将数据存储在FRONT端以及管理员...这就是我正在寻求帮助的地方。 ..
所以,到目前为止,我的模块具有所有“常用”驱动程序/处理程序/ editorTemplates视图/迁移/ contentpart / contentpartrecord,我可以在管理员中创建订阅条目 - 我有我的内容类型设置并查看我的模块管理员。
选择你喜欢的模块上的任何教程,这就是我所遵循的路径 - 在创建模块和通过管理员存储数据方面,它们似乎都是相同的。
通过其他问题的答案,我设法让模块显示在前端 - 这是通过覆盖我的驱动程序中的显示并使用shapeHelper.DisplayTemplate()方法。
虽然有些奇怪的事情 - 当前端(我的表单现在显示感谢Placement.info)页面首次加载时,我在数据库表(订阅表)中得到一个空白条目 - 这种情况发生时没有实际回发。我几乎不知道代码的哪一部分导致了这种情况发生。这不需要发生 - 我只想在用户填写表单并点击提交时存储数据。
其次,我需要一些指导来实际存储用户在前端输入的数据..
通常我的模块应该有什么来存储在前端输入的数据?
我不是在追求实际代码 - 只是想知道我应该做什么。我通常以网络形式开发,所以MVC对我来说有点新鲜。
我应该有控制器/路线等吗?
我在前端显示的表单是否与我创建的模块有些分开?
有人能指出我在Orchard中存储数据的正确方向吗?
我想在这一点上任何帮助都会很棒......
更新
感谢您迄今为止给出的答案。在这种情况下,我可以使用自定义表单,但不想这样做。理想情况下,我希望将数据存储在自己的表中。
此外,这个模块将为我提供创建更复杂模块的基础,这些模块将存储来自前端的数据。我似乎无法理解Orchard如何将这一切拼接在一起.I。通过控制器将数据存储到果园系统中......我需要在表格中创建一个新行代码?
答案 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的专家,但这就是我的一切。对我的废话的更正非常感激。
将零件拼接到内容类型上。一部分由几个部分组成......你明白我的意思。
所以我们首先要做的就是创建零件本身。你可以自己写。但是,当你是新手时,忘记一些事情是很乏味的。我总是忘记重要的事情。某些地方提供了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