一旦我站在开发机器的前面,代码将稍后发布,尽管希望与此同时有人可以提供帮助。
我正在尝试在Orchard CMS v1.6.1上进行开发。目前,我正在尝试开发一个模块,该模块实际上将使我可以在前端的页脚(或我选择的其他任何位置)中放置新闻通讯订阅视图。
我遵循了一些教程,它们似乎都显示了如何仅从Admin存储数据-我需要在FRONT端以及Admin上存储数据。这就是我在寻求帮助的内容...
因此,到目前为止,我的模块具有所有“常用”的驱动程序/处理程序/ editorTemplates视图/ migrations / contentpart / contentpartrecord,并且我可以在管理员中创建订阅条目-我具有内容类型设置,并在管理员中看到我的模块。
选择您喜欢的模块上的任何教程,这就是我遵循的途径-在创建模块和通过管理员存储数据方面,它们似乎都是相同的。
有了其他问题的答案,我设法使模块显示在前端-通过覆盖驱动程序中的Display并使用shapeHelper.DisplayTemplate()方法。
但是,有些奇怪的事情-前端页面(首先通过Placement.info显示我的表单)首次加载时,我在数据库表(订阅表)中得到一个空白条目-发生这种情况时并没有实际回发。我几乎不知道代码的哪一部分导致了这种情况的发生。这不必发生-我只想在用户填写表单并单击提交时存储数据。
其次,在实际存储用户在前端输入的数据时,我需要一些指导。
通常,我的模块中应该有什么存储在前端输入的数据?
我不追求实际的代码-只是我应该做什么的想法。我通常以Web表单进行开发,因此MVC对我来说有点新。
我应该有控制器/路线等吗?
我在前端显示的表单是否应该与我创建的模块有所不同?
有人可以指出我在Orchard内部存储数据的正确方向吗?
我想在这一点上任何帮助都是很棒的...
更新资料
谢谢您迄今为止给出的答案。在这种情况下,我可以使用自定义表单,尽管不想这么做。理想情况下,我希望将数据存储在自己的表中。
另外,该模块将为我提供创建更复杂的模块(从前端存储数据)所需的基础。我只是似乎无法理解Orchard如何将所有这些缝合在一起。.IE通过控制器将数据存储到Orchard系统中。.我需要在表中创建新行的代码是什么?
最佳答案
好吧,您在管理员中正在执行的操作是创建内容类型。我不确定您是否真的需要以这种方式存储订阅。但是,也许我不了解您的情况,因此,如果您希望这样做,则可以查看Orchard自定义表单。我承认,最初尚不清楚如何从前端创建内容类型。您可以查看有关如何使用Orchard自定义表单的教程。 http://devdirective.com/post/160/how-to-create-custom-forms-in-orchard-cms-with-email-and-recaptcha他们创建的示例中有一个联系表。实际上,它非常简单,而且功能非常强大。我相信它已包含在核心中。至少为1.7。
但是,对于您订阅时事通讯的情况,我会说您可能需要一种不同的方法,只需将订阅了时事通讯的电子邮件列表存储在自己的表中。
为此,您将需要创建自己的窗口小部件,该窗口小部件的一部分将显示一个表单,该表单链接到您自己的自定义控制器,该控制器提交其电子邮件然后保存。所有这些都将使用简单的MVC完成,您将需要查看有关它的教程。
如果您的用户必须登录才能订阅您的时事通讯,您可能会更加聪明,将一部分附加到用户上,并在他们说要订阅时事通讯时对其进行更新。但是现在我在胡言乱语。
我只是对如何创建自己的小部件以显示表单提出了非常模糊的想法。如果您认为这是一条您可能想走的路线,我很乐意提供更多详细信息。否则...我太懒了^ _ ^
更新:
好的,所以我看到尼克为您提供了一些有关如何进行此操作的指示。我开始阅读,但感到无聊,但听起来似乎还不错。以为我只加我两便士的价值。我不是Orchard的专家,但是这对我来说似乎就是如此。更正我胡说八道。
零件被缝合到“内容类型”上。一个部分由几个部分组成...您明白我的意思了。
驱动程序:这基本上是一个控制器。它显示了人们将在前端看到的视图以及创建内容项时将显示的编辑器。当创建内容项,验证等时,它还处理回发。
模型:您将在其中存储有关零件的数据。因此,如果您有与零件相关的任何设置。它继承自为其赋予ID并将其连接到内容项的ID。不能记住名字。
处理程序:这基本上是“处理”内容项的创建。它将数据存储到存储库中,并且可以执行其他巧妙的操作。您可以将自定义逻辑放入其提供的服务中。但是不用担心,只要让它去做就可以了。
视图:内容部分具有与之关联的几个视图。编辑器视图和显示视图。这些存储在单独的文件夹中。 EditorTemplates / Parts / ...是您的编辑器的存储位置(创建内容项时显示)。零件/ ...是您存储显示前端内容的视图的地方。
放置:此文件包含有关零件将在内容项中显示的位置的信息。很酷
因此,我们需要做的第一件事就是自行创建零件。您可以自己编写。但是,当您不熟悉新事物时,这很乏味且容易忘记。我总是忘记一些重要的事情。在某处有vs模板可用。我通常只使用一个很酷的小代码生成模块。因此,请转到图库并下载并启用piotr szmyd的代码生成扩展。现在,您可以运行命令行应用程序Orchard.exe。这存储在Orchard.Web的bin文件夹中。查看此博客文章以获取有关如何使用此模块的详细信息。 http://www.szmyd.com.pl/blog/generating-orchard-content-parts-via-command-line
正确,因此我们将使用此命令创建一个名为NewsletterPart的部件。
代码生成部分YourModuleName新闻稿部分
这将生成所有必需的位和摆动,驱动程序等。您的零件实际上不需要任何设置。也许将来它需要变得简单,所以现在我们将模型留空。我们会将您的新闻通讯订阅者列表存储在其他表格中。一点点。首先,让它显示您的零件。您的Views / Parts /文件夹中应该有一个NewsletterPart.cshtml文件。在这里写一些随机的单词,这样我们就知道它正在显示。然后转到Placement.info文件,并确保其中有一行告诉您要显示的零件。例如:
<放置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>
}
现在,让该模型起作用。在models文件夹中创建一个名为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;
}
只是我在记事本中编写的示例,因此可能无法编译。比我预期的要长一点...我的错误。
关于asp.net-mvc - 为Orchard创建一个模块,用于存储前端数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18110063/