--HG--
branch : dev
This commit is contained in:
Renaud Paquay
2010-10-15 15:20:53 -07:00
65 changed files with 645 additions and 256 deletions

View File

@@ -13,7 +13,7 @@
service="Orchard.Environment.Configuration.IShellSettingsManager">
</component>
<component instance-scope="single-instance"
<component instance-scope="per-lifetime-scope"
type="Orchard.Azure.FileSystems.Media.AzureBlobStorageProvider, Orchard.Azure"
service="Orchard.FileSystems.Media.IStorageProvider">
</component>

View File

@@ -176,6 +176,98 @@
<Project>{9916839C-39FC-4CEB-A5AF-89CA7E87119F}</Project>
<Name>Orchard.Core</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Lucene\Lucene.csproj">
<Project>{D5D447D7-EF8E-43A6-B9A4-3B025DD9F45D}</Project>
<Name>Lucene</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.ArchiveLater\Orchard.ArchiveLater.csproj">
<Project>{1C981BB3-26F7-494C-9005-CC27A5144233}</Project>
<Name>Orchard.ArchiveLater</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Blogs\Orchard.Blogs.csproj">
<Project>{63FBD4D9-E1DA-4A7B-AA6A-D6074FE50867}</Project>
<Name>Orchard.Blogs</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.CodeGeneration\Orchard.CodeGeneration.csproj">
<Project>{C0C45321-B51D-4D8D-9B7B-AA4C2E0B2962}</Project>
<Name>Orchard.CodeGeneration</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Comments\Orchard.Comments.csproj">
<Project>{14C049FD-B35B-415A-A824-87F26B26E7FD}</Project>
<Name>Orchard.Comments</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.ContentTypes\Orchard.ContentTypes.csproj">
<Project>{0E7646E8-FE8F-43C1-8799-D97860925EC4}</Project>
<Name>Orchard.ContentTypes</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Email\Orchard.Email.csproj">
<Project>{05660F47-D649-48BD-9DED-DF4E01E7CFF9}</Project>
<Name>Orchard.Email</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Experimental\Orchard.Experimental.csproj">
<Project>{AB3C207C-0126-4143-8D62-1119DF80D366}</Project>
<Name>Orchard.Experimental</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Indexing\Orchard.Indexing.csproj">
<Project>{EA2B9121-EF54-40A6-A53E-6593C86EE696}</Project>
<Name>Orchard.Indexing</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.jQuery\Orchard.jQuery.csproj">
<Project>{8F116B06-1C0E-4E4C-9A0A-D2FAB851E768}</Project>
<Name>Orchard.jQuery</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Media\Orchard.Media.csproj">
<Project>{D9A7B330-CD22-4DA1-A95A-8DE1982AD8EB}</Project>
<Name>Orchard.Media</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Migrations\Orchard.Migrations.csproj">
<Project>{EA4F1DA7-F2AB-4384-9AA4-9B756E2026B1}</Project>
<Name>Orchard.Migrations</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Modules\Orchard.Modules.csproj">
<Project>{17F86780-9A1F-4AA1-86F1-875EEC2730C7}</Project>
<Name>Orchard.Modules</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.MultiTenancy\Orchard.MultiTenancy.csproj">
<Project>{72457126-E118-4171-A08F-9A709EE4B7FC}</Project>
<Name>Orchard.MultiTenancy</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Packaging\Orchard.Packaging.csproj">
<Project>{DFD137A2-DDB5-4D22-BE0D-FA9AD4C8B059}</Project>
<Name>Orchard.Packaging</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Roles\Orchard.Roles.csproj">
<Project>{D10AD48F-407D-4DB5-A328-173EC7CB010F}</Project>
<Name>Orchard.Roles</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Search\Orchard.Search.csproj">
<Project>{4BE4EB01-AC56-4048-924E-2CA77F509ABA}</Project>
<Name>Orchard.Search</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Setup\Orchard.Setup.csproj">
<Project>{8C7FCBC2-E6E1-405E-BFB5-D8D9E67A09C4}</Project>
<Name>Orchard.Setup</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Tags\Orchard.Tags.csproj">
<Project>{5D0F00F0-26C9-4785-AD61-B85710C60EB0}</Project>
<Name>Orchard.Tags</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Themes\Orchard.Themes.csproj">
<Project>{CDE24A24-01D3-403C-84B9-37722E18DFB7}</Project>
<Name>Orchard.Themes</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Users\Orchard.Users.csproj">
<Project>{79AED36E-ABD0-4747-93D3-8722B042454B}</Project>
<Name>Orchard.Users</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\Orchard.Widgets\Orchard.Widgets.csproj">
<Project>{194D3CCC-1153-474D-8176-FDE8D7D0D0BD}</Project>
<Name>Orchard.Widgets</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard.Web\Modules\TinyMce\TinyMce.csproj">
<Project>{954CA994-D204-468B-9D69-51F6AD3E1C29}</Project>
<Name>TinyMce</Name>
</ProjectReference>
<ProjectReference Include="..\..\Orchard\Orchard.Framework.csproj">
<Project>{2D1D92BB-4555-4CBE-8D0E-63563D6CE4C6}</Project>
<Name>Orchard.Framework</Name>

View File

@@ -1,9 +1,9 @@
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.web>
<!-- system.web>
<machineKey xdt:Transform="Remove" />
<machineKey xdt:Transform="Insert" validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" decryption="AES" />
</system.web>
</system.web -->
<system.web.extensions xdt:Transform="Remove" />
</configuration>

View File

@@ -1,9 +1,9 @@
<?xml version="1.0"?>
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
<system.web>
<!-- system.web>
<machineKey xdt:Transform="Remove" />
<machineKey xdt:Transform="Insert" validationKey="AutoGenerate" decryptionKey="AutoGenerate" validation="SHA1" decryption="AES" />
</system.web>
</system.web -->
<system.web.extensions xdt:Transform="Remove" />
</configuration>

View File

@@ -242,6 +242,9 @@ namespace Orchard.Tests.Modules.Widgets.Services {
Assert.That(widgetPart3.Position, Is.EqualTo(Position3), "Widget remained in the same position");
}
[Test, Ignore("Fix when possible")]
public void GetLayerWidgetsTest() {
LayerPart layerPart = _widgetService.CreateLayer(LayerName1, LayerDescription1, "");
_contentManager.Flush();
// same zone widgets

View File

@@ -6,7 +6,7 @@ namespace Orchard.Tests.DisplayManagement.Descriptors {
[TestFixture]
public class BasicShapeTemplateHarvesterTests {
private static void VerifyShapeType(string givenSubPath, string givenFileName, string expectedShapeType) {
var harvester = new BasicShapeTemplateHarvester(Enumerable.Empty<IShapeTemplateViewEngine>());
var harvester = new BasicShapeTemplateHarvester();
var harvestShapeHits = harvester.HarvestShape(new HarvestShapeInfo { SubPath = givenSubPath, FileName = givenFileName });
Assert.That(harvestShapeHits.Count(), Is.EqualTo(1));
Assert.That(harvestShapeHits.Single().ShapeType, Is.EqualTo(expectedShapeType));
@@ -31,38 +31,31 @@ namespace Orchard.Tests.DisplayManagement.Descriptors {
[Test]
public void DefaultItemsContentTemplate() {
VerifyShapeType("Views/Items", "Content", "Items_Content");
VerifyShapeType("Views/Items", "Content", "Content");
}
[Test]
public void ImplicitSpecializationOfItemsContentTemplate() {
VerifyShapeType("Views/Items", "MyType", "Items_Content__MyType");
VerifyShapeType("Views/Items", "MyType", "MyType");
}
[Test]
public void ExplicitSpecializationOfItemsContentTemplate() {
VerifyShapeType("Views/Items", "Content-MyType", "Items_Content__MyType");
VerifyShapeType("Views/Items", "Content-MyType", "Content__MyType");
}
[Test]
public void ContentItemDisplayTypes() {
VerifyShapeType("Views/Items", "Content", "Items_Content");
VerifyShapeType("Views/Items", "Content.Summary", "Items_Content_Summary");
VerifyShapeType("Views/Items", "Content.Edit", "Items_Content_Edit");
VerifyShapeType("Views/Items", "Content", "Content");
VerifyShapeType("Views/Items", "Content.Summary", "Content_Summary");
VerifyShapeType("Views/Items", "Content.Edit", "Content_Edit");
}
[Test]
public void ExplicitSpecializationMixedWithDisplayTypes() {
VerifyShapeType("Views/Items", "Content-MyType", "Items_Content__MyType");
VerifyShapeType("Views/Items", "Content-MyType.Summary", "Items_Content_Summary__MyType");
VerifyShapeType("Views/Items", "Content-MyType.Edit", "Items_Content_Edit__MyType");
}
[Test]
public void ImplicitSpecializationMixedWithDisplayTypes() {
VerifyShapeType("Views/Items", "MyType", "Items_Content__MyType");
VerifyShapeType("Views/Items", "MyType.Summary", "Items_Content_Summary__MyType");
VerifyShapeType("Views/Items", "MyType.Edit", "Items_Content_Edit__MyType");
VerifyShapeType("Views/Items", "Content-MyType", "Content__MyType");
VerifyShapeType("Views/Items", "Content-MyType.Summary", "Content_Summary__MyType");
VerifyShapeType("Views/Items", "Content-MyType.Edit", "Content_Edit__MyType");
}
[Test]

View File

@@ -55,7 +55,7 @@ namespace Orchard.Core.Common.Drivers {
protected override DriverResult Editor(BodyPart part, dynamic shapeHelper) {
var model = BuildEditorViewModel(part);
return ContentShape("Parts_Common_Body_Editor",
return ContentShape("Parts_Common_Body_Edit",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}
@@ -63,7 +63,7 @@ namespace Orchard.Core.Common.Drivers {
var model = BuildEditorViewModel(part);
updater.TryUpdateModel(model, Prefix, null, null);
return ContentShape("Parts_Common_Body_Editor",
return ContentShape("Parts_Common_Body_Edit",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}

View File

@@ -2,7 +2,7 @@
<Place Parts_Common_Metadata="-"/>
<Place Parts_Common_Metadata_Summary="-"/>
<Place Parts_Common_Metadata_SummaryAdmin="-"/>
<Place Parts_Common_Body_Editor="Primary:2"/>
<Place Parts_Common_Body_Edit="Primary:2"/>
<!-- show summary for all DisplayType by default -->
<Place Parts_Common_Body_Summary="Content:5"/>
<Match DisplayType="Detail">

View File

@@ -288,8 +288,7 @@ namespace Orchard.Core.Contents.Controllers {
return RedirectToAction("Edit", new RouteValueDictionary { { "Id", contentItem.Id } });
}
[HttpPost, ActionName("Remove")]
public ActionResult RemovePOST(int id, string returnUrl) {
public ActionResult Remove(int id, string returnUrl) {
var contentItem = _contentManager.Get(id, VersionOptions.Latest);
if (!Services.Authorizer.Authorize(Permissions.DeleteContent, contentItem, T("Couldn't remove content")))

View File

@@ -4,27 +4,27 @@ using Orchard.DisplayManagement.Descriptors;
namespace Orchard.Core.Contents {
public class Shapes : IShapeTableProvider {
public void Discover(ShapeTableBuilder builder) {
builder.Describe("Items_Content")
builder.Describe("Content")
.OnDisplaying(displaying => {
ContentItem contentItem = displaying.Shape.ContentItem;
if (contentItem != null) {
//Content-BlogPost
displaying.ShapeMetadata.Alternates.Add("Items_Content__" + contentItem.ContentType);
displaying.ShapeMetadata.Alternates.Add("Content__" + contentItem.ContentType);
//Content-42
displaying.ShapeMetadata.Alternates.Add("Items_Content__" + contentItem.Id);
displaying.ShapeMetadata.Alternates.Add("Content__" + contentItem.Id);
//Content.Summary
displaying.ShapeMetadata.Alternates.Add("Items_Content_" + displaying.ShapeMetadata.DisplayType);
displaying.ShapeMetadata.Alternates.Add("Content_" + displaying.ShapeMetadata.DisplayType);
//Content.Summary-Page
displaying.ShapeMetadata.Alternates.Add("Items_Content_" + displaying.ShapeMetadata.DisplayType + "__" + contentItem.ContentType);
displaying.ShapeMetadata.Alternates.Add("Content_" + displaying.ShapeMetadata.DisplayType + "__" + contentItem.ContentType);
}
});
builder.Describe("Items_Content_Editor")
builder.Describe("Content_Edit")
.OnDisplaying(displaying => {
ContentItem contentItem = displaying.Shape.ContentItem;
if (contentItem != null) {
//Content.Editor-Page
displaying.ShapeMetadata.Alternates.Add("Items_Content_Editor__" + contentItem.ContentType);
displaying.ShapeMetadata.Alternates.Add("Content_Edit__" + contentItem.ContentType);
}
});
}

View File

@@ -0,0 +1,11 @@
<div class="sections">
<div class="primary">
@Display(Model.Primary)
</div>
<div class="secondary">
@Display(Model.Secondary)
<fieldset>
<input class="button primaryAction" type="submit" name="submit.Save" value="@T("Save")"/>
</fieldset>
</div>
</div>

View File

@@ -1,8 +1,8 @@
@using Orchard.ContentManagement;
@using Orchard.Utility.Extensions;
@{
ContentItem contentItem = Model.ContentItem;
var returnUrl = ViewContext.RequestContext.HttpContext.Request.ToUrlString();
ContentItem contentItem = Model.ContentItem;
var returnUrl = ViewContext.RequestContext.HttpContext.Request.ToUrlString();
}
<div class="summary" itemscope="itemscope" itemid="@contentItem.Id" itemtype="http://orchardproject.net/data/ContentItem">
<div class="properties">

View File

@@ -381,7 +381,7 @@
<Content Include="ContentsLocation\Views\Web.config" />
<Content Include="Messaging\Views\Web.config" />
<Content Include="Contents\Views\Items\Content.cshtml" />
<Content Include="Contents\Views\Items\Content.Editor.cshtml" />
<Content Include="Contents\Views\Items\Content.Edit.cshtml" />
<Content Include="Contents\Views\Items\Content.Summary.cshtml" />
<Content Include="Contents\Views\Items\Content.SummaryAdmin.cshtml" />
<Content Include="Shapes\Views\Document.cshtml" />

View File

@@ -43,7 +43,7 @@ namespace Orchard.Core.PublishLater.Drivers {
protected override DriverResult Editor(PublishLaterPart part, dynamic shapeHelper) {
var model = BuildEditorViewModel(part);
return ContentShape("Parts_PublishLater_Editor",
return ContentShape("Parts_PublishLater_Edit",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}
protected override DriverResult Editor(PublishLaterPart part, IUpdateModel updater, dynamic shapeHelper) {
@@ -65,7 +65,7 @@ namespace Orchard.Core.PublishLater.Drivers {
//Services.Notifier.Information(T("{0} draft has been saved!", model.ContentItem.TypeDefinition.DisplayName));
break;
}
return ContentShape("Parts_PublishLater_Editor",
return ContentShape("Parts_PublishLater_Edit",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}

View File

@@ -2,7 +2,7 @@
<Place Parts_PublishLater_Metadata="-"/>
<Place Parts_PublishLater_Metadata_Summary="-"/>
<Place Parts_PublishLater_Metadata_SummaryAdmin="-"/>
<Place Parts_PublishLater_Editor="Secondary:1"/>
<Place Parts_PublishLater_Edit="Secondary:1"/>
<Match DisplayType="Detail">
<Place Parts_PublishLater_Metadata="Meta:1"/>
</Match>

View File

@@ -6,7 +6,7 @@ using System.Xml.Linq;
using Orchard.Blogs.Models;
using Orchard.Blogs.Routing;
using Orchard.Blogs.Services;
using Orchard.Blogs.ViewModels;
using Orchard.ContentManagement;
using Orchard.DisplayManagement;
using Orchard.Logging;
using Orchard.Themes;
@@ -53,25 +53,27 @@ namespace Orchard.Blogs.Controllers {
if (correctedSlug == null)
return HttpNotFound();
BlogPart blog = _blogService.Get(correctedSlug);
if (blog == null)
var blogPart = _blogService.Get(correctedSlug);
if (blogPart == null)
return HttpNotFound();
var blogPosts = _blogPostService.Get(blog, (page - 1)*pageSize, pageSize).Select(b => _services.ContentManager.BuildDisplay(b, "Summary"));
var blogPosts = _blogPostService.Get(blogPart, (page - 1) * pageSize, pageSize)
.Select(b => _services.ContentManager.BuildDisplay(b, "Summary"));
blogPart.As<BlogPagerPart>().Page = page;
blogPart.As<BlogPagerPart>().PageSize = pageSize;
blogPart.As<BlogPagerPart>().BlogSlug = correctedSlug;
blogPart.As<BlogPagerPart>().ThereIsANextPage = _blogPostService.Get(blogPart, (page) * pageSize, pageSize).Any();
var blog = _services.ContentManager.BuildDisplay(blogPart);
var list = Shape.List();
list.AddRange(blogPosts);
var blogShape = _services.ContentManager.BuildDisplay(blog);
var model = new DisplayBlogViewModel {
Blog = blogShape,
BlogPostList = list,
Page = page,
PageSize = pageSize
};
return View(model);
blog.ContentItem = blogPart;
blog.Content.Add(Shape.Parts_Blogs_BlogPost_List(ContentItems: list), "5");
return View("Display", blog);
}
public ActionResult LiveWriterManifest(string blogSlug) {

View File

@@ -1,6 +1,5 @@
using Orchard.Blogs.Models;
using Orchard.Blogs.Services;
using Orchard.Blogs.ViewModels;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.Core.ContentsLocation.Models;
@@ -16,16 +15,17 @@ namespace Orchard.Blogs.Drivers {
}
protected override DriverResult Display(BlogArchivesPart part, string displayType, dynamic shapeHelper) {
BlogPart blog = null;
if (!string.IsNullOrWhiteSpace(part.ForBlog))
blog = _blogService.Get(part.ForBlog);
return ContentShape("Parts_Blogs_BlogArchives",
() => {
BlogPart blog = null;
if (!string.IsNullOrWhiteSpace(part.ForBlog))
blog = _blogService.Get(part.ForBlog);
if ( blog != null ) {
var model = new BlogPostArchiveViewModel {BlogPart = blog, Archives = _blogPostService.GetArchives(blog)};
return ContentPartTemplate(model, "Parts/Blogs.BlogArchives");
}
if (blog == null)
return null;
return null;
return shapeHelper.Parts_Blogs_BlogArchives(ContentItem: part, Blog: blog, Archives: _blogPostService.GetArchives(blog));
}).Location("Content");
}
protected override DriverResult Editor(BlogArchivesPart part, dynamic shapeHelper) {

View File

@@ -0,0 +1,11 @@
using Orchard.Blogs.Models;
using Orchard.ContentManagement.Drivers;
namespace Orchard.Blogs.Drivers {
public class BlogPagerPartDriver : ContentPartDriver<BlogPagerPart> {
protected override DriverResult Display(BlogPagerPart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_Blogs_Blog_Pager",
() => shapeHelper.Parts_Blogs_Blog_Pager(ContentPart: part, Page: part.Page, PageSize: part.PageSize, BlogSlug: part.BlogSlug, ThereIsANextPage: part.ThereIsANextPage));
}
}
}

View File

@@ -38,13 +38,15 @@ namespace Orchard.Blogs.Drivers {
() => shapeHelper.Parts_Blogs_Blog_Manage(ContentPart: part)),
ContentShape("Parts_Blogs_Blog_Description",
() => shapeHelper.Parts_Blogs_Blog_Description(ContentPart: part, Description: part.Description)),
// todo: (heskew) implement a paging solution that doesn't require blog posts to be tied to the blog within the controller
ContentShape("Parts_Blogs_BlogPost_List",
() => {
_feedManager.Register(part);
var list = shapeHelper.List();
list.AddRange(_blogPostService.Get(part)
.Select(bp => _contentManager.BuildDisplay(bp, "Summary")));
return shapeHelper.Parts_Blogs_BlogPost_List(ContentPart: part, ContentItems: list);
return null;
// var list = shapeHelper.List();
// list.AddRange(_blogPostService.Get(part)
// .Select(bp => _contentManager.BuildDisplay(bp, "Summary")));
// return shapeHelper.Parts_Blogs_BlogPost_List(ContentPart: part, ContentItems: list);
}),
ContentShape("Parts_Blogs_BlogPost_List_Admin",
() => {

View File

@@ -18,7 +18,7 @@ namespace Orchard.Blogs.Drivers {
}
protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) {
IEnumerable<BlogPostPart> blogPosts = null;
IEnumerable<BlogPostPart> blogPosts;
BlogPart blog = null;
if (!string.IsNullOrWhiteSpace(part.ForBlog))
@@ -32,7 +32,6 @@ namespace Orchard.Blogs.Drivers {
.Select(ci => ci.As<BlogPostPart>());
}
else {
var blogs = _blogService.Get().ToList();
blogPosts = _contentManager.Query(VersionOptions.Published, "BlogPost")
.Join<CommonPartRecord>()
.OrderByDescending(cr => cr.CreatedUtc)
@@ -41,12 +40,11 @@ namespace Orchard.Blogs.Drivers {
}
var list = shapeHelper.List();
list.AddRange(blogPosts.Select(bp => _contentManager.BuildDisplay(bp, "Summary.BlogPost")));
list.AddRange(blogPosts.Select(bp => _contentManager.BuildDisplay(bp, "Summary")));
var blogPostList = shapeHelper.Parts_Blogs_BlogPost_List(ContentPart: part, BlogPosts: list);
blogPostList.Metadata.Type = "Parts_Blogs_BlogPost.List";
var blogPostList = shapeHelper.Parts_Blogs_BlogPost_List(ContentPart: part, ContentItems: list);
return ContentShape(blogPostList).Location("Primary");
return ContentShape(shapeHelper.Parts_Blogs_RecentBlogPosts(ContentItem: part, ContentItems: blogPostList));
}
protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) {

View File

@@ -89,5 +89,11 @@ namespace Orchard.Blogs {
return 5;
}
public int UpdateFrom5() {
ContentDefinitionManager.AlterTypeDefinition("Blog",
cfg => cfg.WithPart("BlogPagerPart"));
return 6;
}
}
}

View File

@@ -0,0 +1,10 @@
using Orchard.ContentManagement;
namespace Orchard.Blogs.Models {
public class BlogPagerPart : ContentPart {
public int Page { get; set; }
public int PageSize { get; set; }
public string BlogSlug { get; set; }
public bool ThereIsANextPage { get; set; }
}
}

View File

@@ -68,11 +68,13 @@
<ItemGroup>
<Compile Include="AdminMenu.cs" />
<Compile Include="Drivers\BlogArchivesPartDriver.cs" />
<Compile Include="Drivers\BlogPagerPartDriver.cs" />
<Compile Include="Drivers\RecentBlogPostsPartDriver.cs" />
<Compile Include="Handlers\BlogArchivesPartHandler.cs" />
<Compile Include="Handlers\RecentBlogPostsPartHandler.cs" />
<Compile Include="Models\BlogArchivesPart.cs" />
<Compile Include="Models\BlogArchivesPartRecord.cs" />
<Compile Include="Models\BlogPagerPart.cs" />
<Compile Include="Models\RecentBlogPostsPart.cs" />
<Compile Include="Models\RecentBlogPostsPartRecord.cs" />
<Compile Include="ResourceManifest.cs" />
@@ -107,8 +109,7 @@
<Compile Include="Services\IBlogService.cs" />
<Compile Include="Services\XmlRpcHandler.cs" />
<Compile Include="RemoteBlogPublishingShapes.cs" />
<Compile Include="ViewModels\BlogPostArchiveViewModel.cs" />
<Compile Include="ViewModels\DisplayBlogViewModel.cs" />
<Compile Include="Shapes.cs" />
</ItemGroup>
<ItemGroup>
<Content Include="Content\Admin\images\draft.gif" />
@@ -161,7 +162,7 @@
<SubType>Designer</SubType>
</None>
<Content Include="Views\RemoteBlogPublishing.cshtml" />
<None Include="Views\DisplayTemplates\Parts\Blogs.BlogArchives.cshtml" />
<None Include="Views\Parts\Blogs.BlogArchives.cshtml" />
<None Include="Views\EditorTemplates\Parts\Blogs.RecentBlogPosts.cshtml" />
<None Include="Views\EditorTemplates\Parts\Blogs.BlogArchives.cshtml" />
<None Include="Views\Items\Blog.DetailAdmin.cshtml" />
@@ -169,6 +170,8 @@
<None Include="Views\Items\BlogPost.Editor.cshtml" />
<None Include="Views\Items\BlogPost.SummaryAdmin.cshtml" />
<None Include="Views\Parts\Blogs.BlogPost.List.cshtml" />
<None Include="Views\Parts\Blogs.Blog.Pager.cshtml" />
<None Include="Views\Parts\Blogs.RecentBlogPosts.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View File

@@ -1,13 +1,23 @@
<Placement>
<Place Parts_Blogs_Blog_Manage="-"/>
<Place Parts_Blogs_Blog_Description="-"/>
<Place Parts_Blogs_BlogPost_List="-"/>
<Place Parts_Blogs_BlogPost_List_Admin="-"/>
<!-- available display shapes -->
<!--
Parts_Blogs_Blog_Manage
Parts_Blogs_Blog_Description
Parts_Blogs_Blog_Pager
Parts_Blogs_BlogPost_List -> when in the blog detail display the blog post list is currently hard-coded to Content:5 to enable the current state of blog paging
Parts_Blogs_BlogPost_List_Admin
-->
<!-- widget and edit shapes just get default placement -->
<!-- edit "shapes" -->
<Place Parts_Blogs_Blog_Fields="Primary:2"/>
<!-- widgets -->
<Place Parts_Blogs_BlogArchives="Content"/>
<Place Parts_Blogs_RecentBlogPosts="Content"/>
<Match ContentType="Blog">
<Match DisplayType="Detail">
<!-- current paging solution makes this redundant
<Place Parts_Blogs_BlogPost_List="Content:5" /> -->
<!-- blog posts currently added to the blog within the controller into Content:5 <Place Parts_Blogs_BlogPost_List="Content:5" />-->
<Place Parts_Blogs_Blog_Pager="Content:after"
Parts_Blogs_Blog_Description="Content:before" />
</Match>
<Match DisplayType="DetailAdmin">
<Place Parts_Blogs_BlogPost_List_Admin="Content:5"

View File

@@ -5,7 +5,7 @@ namespace Orchard.Blogs {
[OrchardFeature("Remote Blog Publishing")]
public class RemoteBlogPublishingShapes : IShapeTableProvider {
public void Discover(ShapeTableBuilder builder) {
builder.Describe("Items_Content__Blog")
builder.Describe("Content__Blog")
.OnDisplaying(displaying => {
if (displaying.ShapeMetadata.DisplayType == "Detail") {
displaying.ShapeMetadata.Wrappers.Add("RemoteBlogPublishing");

View File

@@ -0,0 +1,22 @@
//using Orchard.ContentManagement;
//using Orchard.DisplayManagement.Descriptors;
//namespace Orchard.Blogs {
// public class Shapes : IShapeTableProvider {
// public void Discover(ShapeTableBuilder builder) {
// builder.Describe("Items_Content__Blog")
// .OnCreated(created => {
// var blog = created.Shape;
// blog.Content.Add(created.New.Parts_Blogs_BlogPost_List(ContentPart: blog.ContentItem, ContentItems: blog.));
// })
// .OnDisplaying(displaying => {
// ContentItem contentItem = displaying.Shape.ContentItem;
// if (contentItem != null) {
// var zoneName = contentItem.As<WidgetPart>().Zone;
// displaying.ShapeMetadata.Alternates.Add("Items_Widget__" + contentItem.ContentType);
// displaying.ShapeMetadata.Alternates.Add("Items_Widget__" + zoneName);
// }
// });
// }
// }
//}

View File

@@ -1,9 +0,0 @@
using System.Collections.Generic;
using Orchard.Blogs.Models;
namespace Orchard.Blogs.ViewModels {
public class BlogPostArchiveViewModel {
public BlogPart BlogPart { get; set; }
public IEnumerable<KeyValuePair<ArchiveData, int>> Archives { get; set; }
}
}

View File

@@ -1,8 +0,0 @@
namespace Orchard.Blogs.ViewModels {
public class DisplayBlogViewModel {
public dynamic Blog { get; set; }
public dynamic BlogPostList { get; set; }
public int Page { get; set; }
public int PageSize { get; set; }
}
}

View File

@@ -1,26 +1,2 @@
@model Orchard.Blogs.ViewModels.DisplayBlogViewModel
@using Orchard.Blogs.Extensions;
@{
Style.Include("pagination.css");
}
@Display(Model.Blog)
@if (Model.BlogPostList.Items.Count > 0) {
@Display(Model.BlogPostList)
<ul class="pagination">
@if(Model.BlogPostList.Items.Count == Model.PageSize) {
<li class="older">
@Html.ActionLink(T("Older Posts").Text, "Item", new { Area = "Orchard.Blogs", blogSlug = Model.Blog.Slug, page = Model.Page + 1 })
</li>
}
@if(Model.Page > 1) {
<li class="newer">
@Html.ActionLink(T("Newer Posts").Text, "Item", new { Area = "Orchard.Blogs", blogSlug = Model.Blog.Slug, page = Model.Page - 1 })
</li>
}
</ul>
}
else {
<p>@T("There are no posts for this blog.")</p>
}
@Display(Model.Meta)
@Display(Model.Content)

View File

@@ -3,6 +3,6 @@
<div>
@Html.LabelFor(m => m.ForBlog)
@Html.TextBoxFor(m => m.ForBlog)
<span class="hint">@T("The blog's slug to display the archives for.")</span>
<span class="hint">@T("Show the archives for which blog? Note: specify the blog's slug.")</span>
</div>
</fieldset>

View File

@@ -1,9 +1,11 @@
<h1>@Html.TitleForPage((string)Model.Title)</h1>
@if (Model.Meta != null) {
<div class="metadata">
@Display(Model.Meta)
</div>
}
<div class="content">
<article>
<header>
@Display(Model.Header)
<p class="metadata">
@Display(Model.Meta)
</p>
</header>
<section>
@Display(Model.Content)
</div>
</section>
</article>

View File

@@ -0,0 +1,18 @@
@using Orchard.Blogs.Extensions;
@{
Style.Include("pagination.css");
}
@if (Model.ThereIsANextPage || Model.Page > 1) {
<ul class="blog-pagination">
@if(Model.ThereIsANextPage) {
<li class="older">
@Html.ActionLink(T("Older Posts").Text, "Item", new { Area = "Orchard.Blogs", blogSlug = Model.BlogSlug, page = Model.Page + 1 })
</li>
}
@if(Model.Page > 1) {
<li class="newer">
@Html.ActionLink(T("Newer Posts").Text, "Item", new { Area = "Orchard.Blogs", blogSlug = Model.BlogSlug, page = Model.Page - 1 })
</li>
}
</ul>
}

View File

@@ -1,23 +1,20 @@
@model Orchard.Blogs.ViewModels.BlogPostArchiveViewModel
@using Orchard.Blogs.Extensions;
@using Orchard.Blogs.Extensions;
@using Orchard.Blogs.Models;
@{
Style.Require("BlogsArchives");
Script.Require("BlogsArchives");
IEnumerable<KeyValuePair<ArchiveData, int>> archives = Model.Archives;
}
<div class="archives">
<h3>@T("Archives")</h3>
@if (Model.Archives.Count() > 20) {
@if (archives.Count() > 20) {
<ul class="years">
@{
int lastYear = Model.Archives.First().Key.Year;
int firstYear = Model.Archives.Last().Key.Year;
int lastYear = archives.First().Key.Year;
int firstYear = archives.Last().Key.Year;
}
@for (int year = lastYear; year >= firstYear; year--) {
var yearMonths = Model.Archives.Where(m => m.Key.Year == year);
var yearMonths = archives.Where(m => m.Key.Year == year);
if (year == lastYear) {
<li>
@@ -28,15 +25,14 @@
if (year != lastYear) {
<li class="previous">
<h4>@year <span>(@yearMonths.Sum(ym => ym.Value))</span></h4>
@Html.UnorderedList(yearMonths, (t, i) => Html.Link(string.Format("{0:MMMM} ({1})", t.Key.ToDateTime(), t.Value), Url.BlogArchiveMonth(Model.BlogPart.Slug, t.Key.Year, t.Key.Month)), "archiveMonthList")
@Html.UnorderedList(yearMonths, (t, i) => Html.Link(string.Format("{0:MMMM} ({1})", t.Key.ToDateTime(), t.Value), Url.BlogArchiveMonth((string)Model.BlogPart.Slug, t.Key.Year, t.Key.Month)), "archiveMonthList")
</li>
}
}
</ul>
}
else if (Model.Archives.Count() > 0) {
@Html.UnorderedList(Model.Archives, (t, i) => Html.Link(string.Format("{0:MMMM yyyy} ({1})", t.Key.ToDateTime(), t.Value), Url.BlogArchiveMonth(Model.BlogPart.Slug, t.Key.Year, t.Key.Month)), "archiveMonthList")
else if (archives.Count() > 0) {
@Html.UnorderedList(archives, (t, i) => Html.Link(string.Format("{0:MMMM yyyy} ({1})", t.Key.ToDateTime(), t.Value), Url.BlogArchiveMonth((string)Model.BlogPart.Slug, t.Key.Year, t.Key.Month)), "archiveMonthList")
}
else {
<div class="message info">@T("None found")</div>

View File

@@ -1,9 +1,7 @@
@{
IEnumerable<object> blogPosts = Model.BlogPosts;
IEnumerable<object> blogPosts = Model.ContentItems;
}
@Display(ContentItems)
@Display(Model.ContentItems)
@if (blogPosts == null || blogPosts.Count() < 1) {
<p>@T("There are no posts for this blog.")</p>
}
hi
}

View File

@@ -0,0 +1 @@
@Display(Model.ContentItems)

View File

@@ -2,15 +2,20 @@
@using Orchard.Comments.Models;
<ul class="comments">
@foreach (var comment in Model) {
<li>
<div class="comment">
<span class="who">@Html.LinkOrDefault(comment.Record.UserName, comment.Record.SiteName, new { rel = "nofollow" })</span>
<span>said @Html.Link(Html.DateTimeRelative(comment.Record.CommentDateUtc.GetValueOrDefault(), T).ToString(), "#")</span>
</div>
<div class="text">
<p>@comment.Record.CommentText</p>
</div>
</li>
@foreach (var comment in Model) {
<li>
<article class="comment">
<header>
<h4>
<span class="who">@Html.LinkOrDefault(comment.Record.UserName, comment.Record.SiteName, new { rel = "nofollow" })
</span>
<span class="when">said <time datetime="@comment.Record.CommentDateUtc.GetValueOrDefault()">@Html.Link(Html.DateTimeRelative(comment.Record.CommentDateUtc.GetValueOrDefault(), T).ToString(), "#")</time>
</span>
</h4>
</header>
<p class="text">@comment.Record.CommentText</p>
</article>
</li>
}
</ul>
</ul>

View File

@@ -19,37 +19,44 @@ else if(!Request.IsAuthenticated && !AuthorizedFor(Permissions.AddComment)) {
} else {
using (Html.BeginForm("Create", "Comment", new { area = "Orchard.Comments" }, FormMethod.Post, new { @class = "comment" })) {
@Html.ValidationSummary()
<h2 id="addacomment">@T("Add a Comment")</h2>
if (!Request.IsAuthenticated) {
if (!Request.IsAuthenticated) {
<fieldset class="who">
<div>
<legend id="addacomment">@T("Add a Comment")</legend>
<ol>
<li>
<label for="Name">@T("Name")</label>
<input id="Name" class="text" name="Name" type="text" />
</div>
<div>
</li>
<li>
<label for="Email">@T("Email")</label>
<input id="Email" class="text" name="Email" type="text" />
</div>
<div>
</li>
<li>
<label for="SiteName">@T("Url")</label>
<input id="SiteName" class="text" name="SiteName" type="text" />
</div>
</li>
</ol>
</fieldset>
} else {
@Html.Hidden("Name", WorkContext.CurrentUser.UserName ?? "")
@Html.Hidden("Email", WorkContext.CurrentUser.Email ?? "")
}
<h2 id="commenter">@if (Request.IsAuthenticated) { @T("Hi, {0}!", Html.Encode(WorkContext.CurrentUser.UserName))}</h2>
<fieldset class="what">
<div>
<label for="CommentText">@if (Request.IsAuthenticated) { @T("Hi, {0}!", Html.Encode(WorkContext.CurrentUser.UserName))<br /> } @T("Comment")</label>
<ol>
<li>
<label for="CommentText">@T("Comment")</label>
<textarea id="CommentText" rows="10" cols="30" name="CommentText"></textarea>
</div>
<div>
</li>
<li>
<input type="submit" class="button" value="@T("Submit Comment")" />
@Html.Hidden("CommentedOn", (int)Model.ContentPart.ContentItem.Id)
@Html.Hidden("ReturnUrl", Context.Request.ToUrlString())
@Html.AntiForgeryTokenOrchard()
</div>
</li>
</ol>
</fieldset>
}
}
}

View File

@@ -9,6 +9,8 @@ namespace Orchard.Email.Drivers {
// Thus the encryption/decryption will be done when accessing the part's property
public class SmtpSettingsPartDriver : ContentPartDriver<SmtpSettingsPart> {
private const string TemplateName = "Parts/SmtpSettings";
public SmtpSettingsPartDriver() {
T = NullLocalizer.Instance;
}
@@ -18,12 +20,14 @@ namespace Orchard.Email.Drivers {
protected override string Prefix { get { return "SmtpSettings"; } }
protected override DriverResult Editor(SmtpSettingsPart part, dynamic shapeHelper) {
return ContentPartTemplate(part, "Parts/Smtp.SiteSettings");
return ContentShape("Parts_SmtpSettings_Editor",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: part, Prefix: Prefix));
}
protected override DriverResult Editor(SmtpSettingsPart part, IUpdateModel updater, dynamic shapeHelper) {
updater.TryUpdateModel(part, Prefix, null, null);
return Editor(part, shapeHelper);
return ContentShape("Parts_SmtpSettings_Editor",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: part, Prefix: Prefix));
}
}
}

View File

@@ -82,7 +82,7 @@
<Content Include="Views\Web.config" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\EditorTemplates\Parts\Smtp.SiteSettings.cshtml" />
<Content Include="Views\EditorTemplates\Parts\SmtpSettings.cshtml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\Orchard\Orchard.Framework.csproj">
@@ -98,6 +98,9 @@
<Name>Orchard.Users</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Placement.info" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.

View File

@@ -0,0 +1,3 @@
<Placement>
<Place Parts_SmtpSettings_Editor="Primary:10"/>
</Placement>

View File

@@ -79,7 +79,7 @@ namespace Orchard.Modules.Commands {
[CommandName("feature disable")]
public void Disable(params string[] featureNames) {
Context.Output.WriteLine(T("Disabling features {0}", string.Join(",", featureNames)));
_moduleService.DisableFeatures(featureNames);
_moduleService.DisableFeatures(featureNames, true);
Context.Output.WriteLine(T("Disabled features {0}", string.Join(",", featureNames)));
}
}

View File

@@ -95,9 +95,10 @@ namespace Orchard.Modules.Services {
public void DisableFeatures(IEnumerable<string> features, bool force) {
var shellDescriptor = _shellDescriptorManager.GetShellDescriptor();
var enabledFeatures = shellDescriptor.Features.ToList();
var availableFeatures = GetAvailableFeatures().ToList();
var featuresToDisable =
features.Select(s => DisableFeature(s, GetAvailableFeatures(), force)).SelectMany(
features.Select(s => DisableFeature(s, availableFeatures, force)).SelectMany(
ies => ies.Select(s => s));
if (featuresToDisable.Count() == 0)

View File

@@ -1,10 +1,14 @@
using System.Web.Mvc;
using System.Web.Query.Dynamic;
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.Indexing;
using Orchard.Localization;
using Orchard.Search.Services;
using Orchard.Search.ViewModels;
using Orchard.Settings;
using Orchard.Search.Models;
using Orchard.UI.Notify;
using System.Collections.Generic;
using Orchard.Collections;
using Orchard.Themes;
@@ -15,20 +19,38 @@ namespace Orchard.Search.Controllers {
private readonly ISearchService _searchService;
private readonly IContentManager _contentManager;
public SearchController(ISearchService searchService, IContentManager contentManager) {
public SearchController(
IOrchardServices services,
ISearchService searchService,
IContentManager contentManager) {
Services = services;
_searchService = searchService;
_contentManager = contentManager;
T = NullLocalizer.Instance;
}
private IOrchardServices Services { get; set; }
public Localizer T { get; set; }
protected virtual ISite CurrentSite { get; [UsedImplicitly] private set; }
public ActionResult Index(string q, int page = 1, int pageSize = 10) {
var searchFields = CurrentSite.As<SearchSettingsPart>().SearchedFields;
var searchHits = _searchService.Query(q, page, pageSize,
CurrentSite.As<SearchSettingsPart>().Record.FilterCulture,
searchFields,
searchHit => searchHit);
IPageOfItems<ISearchHit> searchHits;
if (q.Trim().StartsWith("?") || q.Trim().StartsWith("*")) {
searchHits = new PageOfItems<ISearchHit>(new ISearchHit[] { });
Services.Notifier.Error(T("'*' or '?' not allowed as first character in WildcardQuery"));
}
else {
searchHits = _searchService.Query(q, page, pageSize,
CurrentSite.As<SearchSettingsPart>().Record.FilterCulture,
searchFields,
searchHit => searchHit);
}
var searchResultViewModels = new List<SearchResultViewModel>();

View File

@@ -7,7 +7,13 @@ namespace Orchard.Search.Drivers {
protected override DriverResult Display(SearchFormPart part, string displayType, dynamic shapeHelper) {
var model = new SearchViewModel();
return ContentPartTemplate(model, "Parts/Search.SearchForm");
return ContentShape("Parts_Search_SearchForm", "Content:1",
() => {
var shape = shapeHelper.Parts_Search_SearchForm();
shape.ContentPart = part;
shape.ViewModel = model;
return shape;
});
}
}
}

View File

@@ -101,11 +101,10 @@
</ItemGroup>
<ItemGroup>
<Content Include="Views\EditorTemplates\Parts\Search.SiteSettings.cshtml" />
<Content Include="Views\EditorTemplates\Parts\Search.SearchForm.cshtml" />
<Content Include="Views\Search\Index.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Views\DisplayTemplates\Parts\Search.SearchForm.cshtml" />
<Content Include="Views\Parts\Search.SearchForm.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View File

@@ -1,8 +1,8 @@
@model Orchard.Search.ViewModels.SearchViewModel
@using Orchard.Search.ViewModels;
@using(Html.BeginForm("index", "search", new { area = "Orchard.Search" }, FormMethod.Get, new { @class = "search" })) {
<fieldset>
@Html.TextBox("q", Model.Query)
@Html.TextBox("q", (SearchViewModel)Model.ViewModel.Query)
<button type="submit">@T("Search")</button>
</fieldset>
}
}

View File

@@ -2,7 +2,6 @@
using JetBrains.Annotations;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.Core.ContentsLocation.Models;
using Orchard.Security;
using Orchard.Tags.Helpers;
using Orchard.Tags.Models;
@@ -12,6 +11,7 @@ using Orchard.Tags.ViewModels;
namespace Orchard.Tags.Drivers {
[UsedImplicitly]
public class TagsPartDriver : ContentPartDriver<TagsPart> {
private const string TemplateName = "Parts/Tags";
private readonly ITagService _tagService;
private readonly IAuthorizationService _authorizationService;
@@ -23,6 +23,10 @@ namespace Orchard.Tags.Drivers {
public virtual IUser CurrentUser { get; set; }
protected override string Prefix {
get { return "Tags"; }
}
protected override DriverResult Display(TagsPart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_Tags_ShowTags",
() => shapeHelper.Parts_Tags_ShowTags(ContentPart: part, Tags: part.CurrentTags));
@@ -32,10 +36,8 @@ namespace Orchard.Tags.Drivers {
if (!_authorizationService.TryCheckAccess(Permissions.ApplyTag, CurrentUser, part))
return null;
var model = new EditTagsViewModel {
Tags = string.Join(", ", part.CurrentTags.Select((t, i) => t.TagName).ToArray())
};
return ContentPartTemplate(model, "Parts/Tags.EditTags").Location(part.GetLocation("Editor"));
return ContentShape("Parts_Tags_Editor",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: BuildEditorViewModel(part), Prefix: Prefix));
}
protected override DriverResult Editor(TagsPart part, IUpdateModel updater, dynamic shapeHelper) {
@@ -50,7 +52,14 @@ namespace Orchard.Tags.Drivers {
_tagService.UpdateTagsForContentItem(part.ContentItem.Id, tagNames);
}
return ContentPartTemplate(model, "Parts/Tags.EditTags").Location(part.GetLocation("Editor"));
return ContentShape("Parts_Tags_Editor",
() => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));
}
private static EditTagsViewModel BuildEditorViewModel(TagsPart part) {
return new EditTagsViewModel {
Tags = string.Join(", ", part.CurrentTags.Select((t, i) => t.TagName).ToArray())
};
}
}
}

View File

@@ -98,7 +98,7 @@
<Content Include="Views\Admin\Index.cshtml" />
<Content Include="Views\Admin\Search.cshtml" />
<Content Include="Views\Parts\Tags.ShowTags.cshtml" />
<Content Include="Views\EditorTemplates\Parts\Tags.EditTags.cshtml" />
<Content Include="Views\EditorTemplates\Parts\Tags.cshtml" />
<Content Include="Views\Home\Index.cshtml" />
<Content Include="Views\Home\Search.cshtml" />
</ItemGroup>
@@ -113,7 +113,9 @@
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="Placement.info" />
<Content Include="Placement.info">
<SubType>Designer</SubType>
</Content>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View File

@@ -1,3 +1,4 @@
<Placement>
<Place Parts_Tags_ShowTags="Header:after.7"/>
<Place Parts_Tags_Editor="Primary:7"/>
</Placement>

View File

@@ -5,21 +5,23 @@
@Html.ValidationSummary(T("Login was unsuccessful. Please correct the errors and try again.").ToString())
@using (Html.BeginFormAntiForgeryPost(Url.Action("LogOn", new {ReturnUrl = Request.QueryString["ReturnUrl"]}))) {
<fieldset class="login-form">
<fieldset class="login-form group">
<legend>@T("Account Information")</legend>
<div class="group">
<ol>
<li>
<label for="userNameOrEmail">@T("Username:")</label>
@Html.TextBox("userNameOrEmail", "", new { autofocus = "autofocus" })
@Html.ValidationMessage("userNameOrEmail")
</div>
<div class="group">
</li>
<li>
<label for="password">@T("Password:")</label>
@Html.Password("password")
@Html.ValidationMessage("password")
</div>
<div class="group">
</li>
<li>
@Html.CheckBox("rememberMe")<label class="forcheckbox" for="rememberMe">@T("Remember me?")</label>
</div>
</li>
<input type="submit" value="@T("Log On")" />
</ol>
</fieldset>
}

View File

@@ -51,7 +51,7 @@ namespace Orchard.Widgets.Controllers {
return RedirectToAction("Index");
}
currentLayerWidgets = _widgetsService.GetWidgets().Where(widgetPart => widgetPart.LayerPart.Id == currentLayer.Id);
currentLayerWidgets = _widgetsService.GetWidgets(currentLayer.Id);
}
else {
currentLayer = null;

View File

@@ -116,12 +116,12 @@
<SubType>Designer</SubType>
</None>
<None Include="Views\Admin\Index.cshtml" />
<Content Include="Views\Items_Widget.Editor.cshtml" />
<None Include="Views\Items\Widget.Edit.cshtml" />
<None Include="Views\Items\Widget.cshtml" />
<None Include="Views\Widget.ControlWrapper.cshtml" />
<None Include="Views\EditorTemplates\Parts\Widgets.WidgetPart.cshtml" />
<None Include="Views\EditorTemplates\Parts\Widgets.LayerPart.cshtml" />
<None Include="Views\EditorTemplates\Parts\Widgets.WidgetBagPart.cshtml" />
<Content Include="Views\Items_Widget.cshtml" />
<Content Include="Views\Items\Content-WidgetPage.cshtml" />
<None Include="Views\Widget.Wrapper.cshtml" />
</ItemGroup>

View File

@@ -5,7 +5,7 @@ using Orchard.Widgets.Models;
namespace Orchard.Widgets {
public class Shapes : IShapeTableProvider {
public void Discover(ShapeTableBuilder builder) {
builder.Describe("Items_Widget")
builder.Describe("Widget")
.Configure(descriptor => {
// todo: have "alternates" for chrome
//todo: (heskew) something...this still doesn't feel right
@@ -20,8 +20,8 @@ namespace Orchard.Widgets {
ContentItem contentItem = displaying.Shape.ContentItem;
if (contentItem != null) {
var zoneName = contentItem.As<WidgetPart>().Zone;
displaying.ShapeMetadata.Alternates.Add("Items_Widget__" + contentItem.ContentType);
displaying.ShapeMetadata.Alternates.Add("Items_Widget__" + zoneName);
displaying.ShapeMetadata.Alternates.Add("Widget__" + contentItem.ContentType);
displaying.ShapeMetadata.Alternates.Add("Widget__" + zoneName);
}
});
}

View File

@@ -8,4 +8,4 @@
<input class="button primaryAction" type="submit" name="submit.Save" value="@T("Save")"/>
</fieldset>
</div>
</div>
</div>

View File

@@ -1,2 +1,2 @@
@Display(Model.Header)
@Display(Model.Content)
@Display(Model.Content)

View File

@@ -125,9 +125,29 @@
<Content Include="Default.aspx" />
<Content Include="Global.asax" />
<Content Include="Refresh.html" />
<None Include="Themes\Classic\Placement.info">
<SubType>Designer</SubType>
</None>
<Content Include="Themes\Contoso\Styles\search.css" />
<Content Include="Themes\Contoso\Zones\Footer.html" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Parts\Blogs.BlogPost.Metadata.ascx" />
<Content Include="Themes\Green\Views\Orchard.Search\Search\Index.ascx" />
<Content Include="Themes\TheAdmin\Scripts\admin.js" />
<Content Include="Themes\TheAdmin\Styles\ie.css" />
<Content Include="Themes\TheAdmin\Styles\images\menuClosed.gif" />
<Content Include="Themes\TheAdmin\Styles\images\menuClosedHover.gif" />
<Content Include="Themes\TheAdmin\Styles\images\menuOpen.gif" />
<Content Include="Themes\TheAdmin\Styles\images\menuOpenHover.gif" />
<Content Include="Themes\TheThemeMachine\draft.html" />
<Content Include="Themes\TheThemeMachine\Styles\Site.css" />
<Content Include="Themes\TheThemeMachine\Theme.png" />
<Content Include="Themes\TheThemeMachine\Theme.txt" />
<None Include="Themes\Classic\App_Data\Localization\fr-FR\orchard.theme.po" />
<Content Include="Themes\TheThemeMachine\Views\Items\Widget-HtmlWidget.cshtml" />
<Content Include="Web.config">
<SubType>Designer</SubType>
</Content>
<Content Include="Themes\TheThemeMachine\Views\User.cshtml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Orchard\Orchard.Framework.csproj">
@@ -147,12 +167,163 @@
<Content Include="Config\Diagnostics.config">
<SubType>Designer</SubType>
</Content>
<Content Include="Themes\TheAdmin\Styles\images\icons.png" />
<Content Include="Themes\TheAdmin\Styles\images\tableHeaderBackgroundRed.gif" />
<Content Include="Themes\TheAdmin\Styles\site.css" />
<Content Include="Themes\TheAdmin\Theme.txt" />
<Content Include="Themes\SafeMode\Views\Document.cshtml" />
<Content Include="Themes\TheAdmin\Views\Layout.cshtml" />
</ItemGroup>
<ItemGroup>
<Content Include="Config\Sample.Host.config" />
<Content Include="Themes\ClassicDark\Views\Footer.cshtml" />
<Content Include="Themes\ClassicDark\Views\Layout.cshtml" />
<None Include="Themes\TheAdmin\Styles\images\icons.psd" />
<Content Include="Themes\ClassicDark\Content\Images\bodyBackgroundgrey.gif" />
<Content Include="Themes\ClassicDark\Content\Images\sidebarBackground.gif" />
<Content Include="Themes\ClassicDark\Styles\blog.css" />
<Content Include="Themes\ClassicDark\Styles\site.css" />
<Content Include="Themes\ClassicDark\Theme.png" />
<Content Include="Themes\ClassicDark\Theme.txt" />
<Content Include="Themes\ClassicDark\Zones\Sidebar.html" />
<Content Include="Themes\Classic\Content\Images\sidebarBackground.gif" />
<Content Include="Themes\Classic\Zones\Sidebar.html" />
<Content Include="Themes\Classic\Styles\blog.css" />
<Content Include="Themes\Classic\Styles\site.css" />
<Content Include="Themes\Classic\Theme.png" />
<Content Include="Themes\Classic\Theme.txt" />
<Content Include="Themes\Classic\Views\Footer.cshtml" />
<Content Include="Themes\Classic\Views\Layout.cshtml" />
<Content Include="Themes\Contoso\Content\Images\bkg.jpg" />
<Content Include="Themes\Contoso\Content\Images\comment-arrow.png" />
<Content Include="Themes\Contoso\Content\Images\content-bkg.png" />
<Content Include="Themes\Contoso\Content\Images\content-bottom.png" />
<Content Include="Themes\Contoso\Content\Images\content-top.png" />
<Content Include="Themes\Contoso\Content\Images\feature-bkg-bottom.png" />
<Content Include="Themes\Contoso\Content\Images\feature-bkg-top.png" />
<Content Include="Themes\Contoso\Content\Images\Gallery\feature01.jpg" />
<Content Include="Themes\Contoso\Content\Images\Gallery\feature02.jpg" />
<Content Include="Themes\Contoso\Content\Images\Gallery\feature03.jpg" />
<Content Include="Themes\Contoso\Content\Images\icon-location.png" />
<Content Include="Themes\Contoso\Content\Images\menu-divider.png" />
<Content Include="Themes\Contoso\Content\Images\menu-hover-left.png" />
<Content Include="Themes\Contoso\Content\Images\menu-hover.png" />
<Content Include="Themes\Contoso\Content\Images\menu-left.png" />
<Content Include="Themes\Contoso\Content\Images\menu-right.png" />
<Content Include="Themes\Contoso\Content\Images\nav-arrow-left.png" />
<Content Include="Themes\Contoso\Content\Images\nav-arrow-right.png" />
<Content Include="Themes\Contoso\Content\Images\sub-header.png" />
<Content Include="Themes\Contoso\Zones\Sidebar-w2.html" />
<Content Include="Themes\Contoso\Zones\Sidebar-w3.html" />
<Content Include="Themes\Contoso\Zones\Highlights.html" />
<Content Include="Themes\Contoso\Zones\Home-Headline.html" />
<Content Include="Themes\Contoso\Zones\Home-Hero-Gallery.html" />
<Content Include="Themes\Contoso\Zones\Home-Hero.html" />
<Content Include="Themes\Contoso\Zones\Sidebar-w1.html" />
<Content Include="Themes\Contoso\Scripts\easySlider.js" />
<Content Include="Themes\Contoso\Styles\site.css" />
<Content Include="Themes\Contoso\Theme.png" />
<Content Include="Themes\Contoso\Theme.txt" />
<Content Include="Themes\Corporate\Content\Images\bkg.jpg" />
<Content Include="Themes\Corporate\Content\Images\consult-bkg.png" />
<Content Include="Themes\Corporate\Content\Images\content-bkg.png" />
<Content Include="Themes\Corporate\Content\Images\content-bottom.png" />
<Content Include="Themes\Corporate\Content\Images\content-top.png" />
<Content Include="Themes\Corporate\Content\Images\footer-bkg.jpg" />
<Content Include="Themes\Corporate\Content\Images\footer-bkg.png" />
<Content Include="Themes\Corporate\Content\Images\hm-divider.png" />
<Content Include="Themes\Corporate\Content\Images\hm-header.png" />
<Content Include="Themes\Corporate\Content\Images\icons\icon-5.png" />
<Content Include="Themes\Corporate\Content\Images\icons\icon-4.png" />
<Content Include="Themes\Corporate\Content\Images\icons\icon-3.png" />
<Content Include="Themes\Corporate\Content\Images\icons\icon-2.png" />
<Content Include="Themes\Corporate\Content\Images\icons\icon-1.png" />
<Content Include="Themes\Corporate\Content\Images\jumping-people.jpg" />
<Content Include="Themes\Corporate\Content\Images\logo.png" />
<Content Include="Themes\Corporate\Content\Images\menu-left-over.png" />
<Content Include="Themes\Corporate\Content\Images\menu-left.png" />
<Content Include="Themes\Corporate\Content\Images\menu-right-over.png" />
<Content Include="Themes\Corporate\Content\Images\menu-right.png" />
<Content Include="Themes\Corporate\Content\Images\menu_bkg.jpg" />
<Content Include="Themes\Corporate\Content\Images\notepad.png" />
<Content Include="Themes\Corporate\Scripts\easySlider.js" />
<Content Include="Themes\Corporate\Styles\site.css" />
<Content Include="Themes\Corporate\Theme.png" />
<Content Include="Themes\Corporate\Theme.txt" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Items\Blogs.Blog.ascx" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Items\Blogs.BlogPost.ascx" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Items\Blogs.BlogPost.ListByArchive.ascx" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Items\Contents.Item.ascx" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Parts\Comments.Comments.ascx" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Parts\Common.Metadata.ascx" />
<Content Include="Themes\Corporate\Views\DisplayTemplates\Parts\Tags.ShowTags.ascx" />
<Content Include="Themes\Corporate\Views\Footer.ascx" />
<Content Include="Themes\Corporate\Views\Header.ascx" />
<Content Include="Themes\Corporate\Views\Layout.ascx" />
<Content Include="Themes\Corporate\Views\Layout.HomePage.ascx" />
<Content Include="Themes\Corporate\Views\ListOfComments.ascx" />
<Content Include="Themes\Corporate\Views\LogOn.ascx" />
<Content Include="Themes\Corporate\Views\User.ascx" />
<Content Include="Themes\Corporate\Zones\Home-Headline.html" />
<Content Include="Themes\Corporate\Zones\Home-Hero.html" />
<Content Include="Themes\Corporate\Zones\Sidebar-w1.html" />
<Content Include="Themes\Corporate\Zones\Sidebar-w2.html" />
<Content Include="Themes\Corporate\Zones\Sidebar-w3.html" />
<Content Include="Themes\Green\Content\Images\bodyBackground.gif" />
<Content Include="Themes\Green\Content\Images\bodyBackground.png" />
<Content Include="Themes\Green\Content\Images\commentpointer.gif" />
<Content Include="Themes\Green\Content\Images\logo.gif" />
<Content Include="Themes\Green\Content\Images\logo.png" />
<Content Include="Themes\Green\Content\Images\tabLeftOff.gif" />
<Content Include="Themes\Green\Content\Images\tabLeftOn.gif" />
<Content Include="Themes\Green\Content\Images\tabRightOff.gif" />
<Content Include="Themes\Green\Content\Images\tabRightOn.gif" />
<Content Include="Themes\Green\Views\Archives.ascx" />
<Content Include="Themes\Green\Views\DisplayTemplates\Items\Blogs.BlogPost.ascx" />
<Content Include="Themes\Green\Views\DisplayTemplates\Parts\Blogs.BlogPost.Metadata.ascx" />
<Content Include="Themes\Green\Zones\sideBarZone1.html" />
<Content Include="Themes\Green\Zones\sideBarZone2.html" />
<Content Include="Themes\Green\Zones\User2.html" />
<Content Include="Themes\Green\Zones\User3.html" />
<Content Include="Themes\Green\Zones\User1.html" />
<Content Include="Themes\Green\Styles\blog.css" />
<Content Include="Themes\Green\Styles\site.css" />
<Content Include="Themes\Green\Styles\yui.css" />
<Content Include="Themes\Green\Theme.png" />
<Content Include="Themes\Green\Theme.txt" />
<Content Include="Themes\Green\Views\DisplayTemplates\Parts\Common.Metadata.ascx" />
<Content Include="Themes\Green\Views\Layout.HomePage.ascx" />
<Content Include="Themes\Green\Views\DisplayTemplates\Items\Blogs.Blog.ascx" />
<Content Include="Themes\Green\Views\DisplayTemplates\Items\Blogs.Blog.Summary.ascx" />
<Content Include="Themes\Green\Views\DisplayTemplates\Items\Blogs.BlogPost.Summary.ascx" />
<Content Include="Themes\Green\Views\Footer.ascx" />
<Content Include="Themes\Green\Views\Layout.ascx" />
<Content Include="Themes\Green\Views\ListOfComments.ascx" />
<Content Include="Themes\SafeMode\Content\orchard.ico" />
<Content Include="Themes\SafeMode\Styles\ie6.css" />
<Content Include="Themes\SafeMode\Styles\images\backgroundHeader.gif" />
<Content Include="Themes\SafeMode\Styles\images\backgroundVines.gif" />
<Content Include="Themes\SafeMode\Styles\images\orchardLogo.gif" />
<Content Include="Themes\SafeMode\Styles\site.css" />
<Content Include="Themes\SafeMode\Theme.png" />
<Content Include="Themes\SafeMode\Theme.txt" />
<Content Include="Themes\SafeMode\Views\Layout.cshtml" />
<Content Include="Themes\TheAdmin\Styles\ie6.css" />
<Content Include="Themes\TheAdmin\Styles\images\backgroundGradient.gif" />
<Content Include="Themes\TheAdmin\Styles\images\backgroundHeader.gif" />
<Content Include="Themes\TheAdmin\Styles\images\orchardLogo.gif" />
<Content Include="Themes\TheAdmin\Theme.png" />
<Content Include="Themes\TheAdmin\Views\User.cshtml" />
<Content Include="Themes\TheAdmin\Views\Header.cshtml" />
<Content Include="Themes\TheThemeMachine\Web.config" />
<Content Include="Themes\TheThemeMachine\Views\Items\Content.Blog.cshtml" />
<Content Include="Themes\TheThemeMachine\Views\Items\Widget-Content.cshtml" />
<None Include="Themes\TheThemeMachine\Views\Layout.cshtml" />
</ItemGroup>
<ItemGroup>
<Folder Include="App_Data\" />
<Folder Include="Themes\ClassicDark\DesignerNotes\" />
<Folder Include="Themes\SafeMode\Content\Images\" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View File

@@ -190,7 +190,7 @@ pre,code,tt { font: 1em 'andale mono', 'lucida console', monospace; line-height:
#layout-main
{
border-top: 1px solid #dbdbdb;
border-top: 1px solid #fff;
}
#layout-after-main
@@ -303,7 +303,6 @@ label.forcheckbox { margin:0 0 0 .4em; display:inline; }
fieldset { padding:0em; margin: 0 0 0em 0; border: 0px solid #dbdbdb; }
legend { font-weight: 600; font-size:1.2em; }
input[type="text"], #CommentText, #password, #confirmPassword {
border:1px solid #999;
display: block;
@@ -320,7 +319,9 @@ form.search {
width:17em;
}
fieldset div {margin:1.6em 0 0 0}
fieldset ol {list-style-type:none;}
fieldset ol li {margin:1.6em 0 0 0}
legend {
font-size: 1.4em;
@@ -400,35 +401,38 @@ button:focus, .button:focus {
/* For testing purposes */
#comments {
#comments, #commenter {
font-size:1.6em;
font-weight:600;
margin:1.2em 0 1.8em 1.2em;
}
#commenter {
margin:1.2em 0 0 1em;
}
ul.comments, form.comment {
margin:1.2em 0 1.2em 1.8em;
list-style: none;
}
div.comment {
font-size:1.3em;
font-style:italic;
color:#484848;
article.comment h4 {
font-size:1.4em;
}
div.comment a {
article.comment a {
color:#484848;
text-decoration:none;
}
div.comment span.who {
article.comment span.who {
font-weight:600;
font-style:normal;
text-transform:capitalize;
color:#333;
}
ul.comments li div.text {
article.comment p.text {
margin:.6em 0 2.4em 0;
}

View File

@@ -1,4 +1,12 @@
@{
@functions {
string CalcuClassify(string[] zoneNames, string classNamePrefix)
{
var zoneCounter = 0;
var zoneNumsFilled = string.Join("", zoneNames.Select(zoneName => { ++zoneCounter; return Model[zoneName] != null ? zoneCounter.ToString() : "";}).ToArray());
return HasText(zoneNumsFilled) ? classNamePrefix + zoneNumsFilled : "";
}
}
@{
Style.Include("http://fonts.googleapis.com/css?family=Lobster&subset=latin");
Style.Include("site.css");
@@ -28,22 +36,20 @@
// {WorkContext.Layout.FooterQuadThird.Add("3 This is some test text to see if zones are working. This is some test text to see if zones are working.");}
//Add classes to the wrapper div to toggle quad widget zones on and off
var tripelClass = CalcuClassify(new [] {"TripelFirst", "TripelSecond", "TripelThird"}, "tripel-");
if (HasText(tripelClass)) {
Model.Classes.Add(tripelClass);
}
if (Model.FooterQuadFirst == null && Model.FooterQuadSecond != null && Model.FooterQuadThird != null && Model.FooterQuadFourth != null) {
Model.Classes.Add("split-234");
//Add classes to the wrapper div to toggle quad widget zones on and off
var footerQuadClass = CalcuClassify(new [] {"FooterQuadFirst", "FooterQuadSecond", "FooterQuadThird", "FooterQuadFourth"}, "split-");
if (HasText(footerQuadClass)) {
Model.Classes.Add(footerQuadClass);
}
else if (Model.FooterQuadFirst != null && Model.FooterQuadSecond == null && Model.FooterQuadThird != null && Model.FooterQuadFourth != null) {
Model.Classes.Add("split-134");
}
else if (Model.FooterQuadFirst != null && Model.FooterQuadSecond != null && Model.FooterQuadThird == null && Model.FooterQuadFourth != null) {
Model.Classes.Add("split-124");
}
else if (Model.FooterQuadFirst != null && Model.FooterQuadSecond != null && Model.FooterQuadThird != null && Model.FooterQuadFourth == null) {
Model.Classes.Add("split-123");
}
else {
}
@*<span>debug: </span>*@
@*<span>tripelClass:@tripelClass</span>*@
@*<span>footerQuadClass:@footerQuadClass</span>*@
Model.Id = "layout-wrapper";
var tag = Tag (Model, "div");

View File

@@ -44,6 +44,9 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Tests", "Tools\Orchard.Tests\Orchard.Tests.csproj", "{0DFA2E10-96C8-4E05-BC10-B710B97ECCDE}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Notes", "_Notes", "{8A49DB66-40B2-4B6A-BFF0-D4839A240D00}"
ProjectSection(SolutionItems) = preProject
Shapes.txt = Shapes.txt
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Orchard.Modules", "Orchard.Web\Modules\Orchard.Modules\Orchard.Modules.csproj", "{17F86780-9A1F-4AA1-86F1-875EEC2730C7}"
EndProject

View File

@@ -61,7 +61,7 @@ namespace Orchard.ContentManagement {
if (!contentTypeDefinition.Settings.TryGetValue("Stereotype", out stereotype))
stereotype = "Content";
var actualShapeType = "Items_" + stereotype;
var actualShapeType = stereotype;
var actualDisplayType = string.IsNullOrWhiteSpace(displayType) ? "Detail" : displayType;
dynamic itemShape = CreateItemShape(actualShapeType);
@@ -81,7 +81,7 @@ namespace Orchard.ContentManagement {
if (!contentTypeDefinition.Settings.TryGetValue("Stereotype", out stereotype))
stereotype = "Content";
var actualShapeType = "Items_" + stereotype + "_Editor";
var actualShapeType = stereotype + "_Edit";
dynamic itemShape = CreateItemShape(actualShapeType);
itemShape.ContentItem = content.ContentItem;
@@ -99,7 +99,7 @@ namespace Orchard.ContentManagement {
if (!contentTypeDefinition.Settings.TryGetValue("Stereotype", out stereotype))
stereotype = "Content";
var actualShapeType = "Items_" + stereotype + "_Editor";
var actualShapeType = stereotype + "_Edit";
dynamic itemShape = CreateItemShape(actualShapeType);
itemShape.ContentItem = content.ContentItem;

View File

@@ -15,11 +15,6 @@ namespace Orchard.DisplayManagement.Descriptors.ShapeTemplateStrategy {
}
public class BasicShapeTemplateHarvester : IShapeTemplateHarvester {
private readonly IEnumerable<IShapeTemplateViewEngine> _shapeTemplateViewEngines;
public BasicShapeTemplateHarvester(IEnumerable<IShapeTemplateViewEngine> shapeTemplateViewEngines) {
_shapeTemplateViewEngines = shapeTemplateViewEngines;
}
public IEnumerable<string> SubPaths() {
return new[] { "Views", "Views/Items", "Views/Parts", "Views/Fields" };
@@ -43,14 +38,10 @@ namespace Orchard.DisplayManagement.Descriptors.ShapeTemplateStrategy {
static string Adjust(string subPath, string fileName, string displayType) {
var leader = "";
if (subPath.StartsWith("Views/")) {
if (subPath.StartsWith("Views/") && subPath != "Views/Items") {
leader = subPath.Substring("Views/".Length) + "_";
}
if (leader == "Items_" && !fileName.StartsWith("Content")) {
leader = "Items_Content__";
}
// canonical shape type names must not have - or . to be compatible
// with display and shape api calls)))
var shapeType = leader + fileName.Replace("--", "__").Replace("-", "__").Replace('.', '_');

View File

@@ -36,6 +36,21 @@ namespace Orchard.Mvc.Html {
return id.Replace('[', '_').Replace(']', '_');
}
public static IHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, LocalizedString labelText) {
return LabelFor(html, expression, labelText.ToString());
}
public static IHtmlString LabelFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string labelText) {
if (String.IsNullOrEmpty(labelText)) {
return MvcHtmlString.Empty;
}
var htmlFieldName = ExpressionHelper.GetExpressionText(expression);
var tag = new TagBuilder("label");
tag.Attributes.Add("for", html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName));
tag.SetInnerText(labelText);
return MvcHtmlString.Create(tag.ToString(TagRenderMode.Normal));
}
public static MvcHtmlString SelectOption<T>(this HtmlHelper html, T currentValue, T optionValue, string text) {
return SelectOption(html, optionValue, object.Equals(optionValue, currentValue), text);
}