我对果园很陌生。
为了学习果园模块的开发,我遵循文档并尝试创建一个商业模块。
该模块由产品部分和具有产品部分的产品类型组成。
在启用模块期间,它将为该模块创建管理菜单和主菜单,分别为"商业"one_answers"商店"。
我的问题是
- 如何在启用模块期间使此模块成为主页。换句话说,我想要的Index方法模块的HomeController处理homeurl
- 如何使前端的商店菜单位于主菜单之后,或将此模块注册到主菜单
我附上了源代码,请从以下链接下载
下载源代码
要接管主页,标准的Orchard方法是实现IHomePageProvider。
当在模块中创建页面作为migration.cs的一部分时,您可以告诉Autoroute部分将您创建的页面的别名设置为主页:
//create a page page
var homepage = _contentManager.Create("Page");
homepage.As<TitlePart>().Title = "My Home";
_contentManager.Publish(homepage);
var homePageArp = homepage.As<AutoroutePart>();
homePageArp.DisplayAlias = String.Empty;
_autorouteService.PublishAlias(homePageArp);
这假设你从一个没有任何主页的干净的果园实例;如果你有一个现有的主页,你将不得不重新生成这些页面的别名作为你的模块的一部分。这是作为Orchard中AutoroutePartHandler的一部分完成的。Autoroute项目(在Publish Alias方法中):
// regenerate the alias for the previous home page
var currentHomePages = _orchardServices.ContentManager.Query<AutoroutePart, AutoroutePartRecord>().Where(x => x.DisplayAlias == "").List();
foreach (var current in currentHomePages) {
if (current != null) {
current.CustomPattern = String.Empty; // force the regeneration
current.DisplayAlias = _autorouteService.Value.GenerateAlias(current);
}
_autorouteService.Value.PublishAlias(current);
}
_autorouteService.Value.PublishAlias(part);
如果你深入研究autoroute项目的驱动程序和处理程序,你会学到很多关于内部的知识;当你勾选管理界面中的"设置为主页"框时,它会将路径设置为"/",然后它会被选中,触发旧主页重新连接,将"/"路径清除为String.Empty,然后发布空白别名,为你提供一个新的主页。
(此项自Orchard 1.6起有效)
如果你的模块要被其他人使用,那么最好制作一个可以添加到任何层(例如主页层)的小部件。这样,每个用户都可以决定你的模块在哪里发挥作用。如果您只为自己使用这个模块,那么您可以覆盖默认路由(标准mvc功能)。查看我的ExtendedRegistration模块(Routes.cs),了解它是如何完成的。
在这里,我正在覆盖标准的帐户/注册URL。应该没有什么可以阻止您覆盖默认的HomeController。
public class Routes : IRouteProvider
{
public void GetRoutes(ICollection<RouteDescriptor> routes)
{
foreach (var routeDescriptor in GetRoutes())
{
routes.Add(routeDescriptor);
}
}
public IEnumerable<RouteDescriptor> GetRoutes()
{
return new[] {
new RouteDescriptor {
Priority = 19,
Route = new Route(
"Users/Account/Register",
new RouteValueDictionary {
{"area", "itWORKS.ExtendedRegistration"},
{"controller", "Account"},
{"action", "Register"}
},
new RouteValueDictionary(),
new RouteValueDictionary {
{"area", "itWORKS.ExtendedRegistration"}
},
new MvcRouteHandler())
}
};
}
}