使用Twitter Bootstrap和Orchard CMS图像旋转木马



我正在使用果园CMS和Bootstrap主题。我一直在尝试使用Bootstrap内置的旋转木马来工作,如以下博客文章所示:http://www.stevetaylor.me.uk/image-carousel-carousel-image-carousel-usis-using-twitter-bootstrap-bootstrap-and-orchard-cms-cms-projections。我遵循了教程,但是我无法将新的布局文件显示在网格和HTML列表下的查询中。我相信我已经复制了Word的代码,但仍然可以使它起作用。任何人都请为此提供帮助,因为认为这将是一个很棒的功能。如果我可以工作,我会要求它添加到Bootstrap主题:http://orchardbootstrap.codeplex.com/

请参阅下面的代码:

carousellayoutform.cs

using System;
using Orchard.DisplayManagement;
using Orchard.Forms.Services;
using Orchard.Localization;
namespace Orchard.Projections.Providers.Layouts {
public class CarouselLayoutForms : IFormProvider {
    protected dynamic Shape { get; set; }
    public Localizer T { get; set; }
    public CarouselLayoutForms(
        IShapeFactory shapeFactory) {
        Shape = shapeFactory;
        T = NullLocalizer.Instance;
    }
    public void Describe(DescribeContext context) {
        Func<IShapeFactory, object> form =
            shape => {
                var f = Shape.Form(
                    Id: "CarouselLayout",                        
                    _HtmlProperties: Shape.Fieldset(
                        Title: T("Html properties"), 
                        _ListId: Shape.TextBox(
                            Id: "outer-grid-id", Name: "OuterDivId",
                            Title: T("Outer div id"),
                            Description: T("The id to provide on the div element."),
                            Classes: new[] { "textMedium", "tokenized" }
                            ),
                        _ListClass: Shape.TextBox(
                            Id: "outer-div-class", Name: "OuterDivClass",
                            Title: T("Outer div class"),
                            Description: T("The class to provide on the div element."),
                            Classes: new[] { "textMedium", "tokenized" }
                            ),
                        _InnerClass: Shape.TextBox(
                            Id: "inner-div-class", Name: "InnerDivClass",
                            Title: T("Inner div class"),
                            Description: T("The class to provide on the inner div element."),
                            Classes: new[] { "textMedium", "tokenized" }
                            ),
                         _FirstItemClass: Shape.TextBox(
                            Id: "first-item-class", Name: "FirstItemClass",
                            Title: T("First item class"),
                            Description: T("The class to provide on the first item element."),
                            Classes: new[] { "textMedium", "tokenized" }
                            ),
                        _ItemClass: Shape.TextBox(
                            Id: "item-class", Name: "ItemClass",
                            Title: T("Item class"),
                            Description: T("The class to provide on the item element."),
                            Classes: new[] { "textMedium", "tokenized" }
                            )
                        )
                    );
                return f;
            };
        context.Form("CarouselLayout", form);
    }
}
   /*
public class CarouselLayoutFormsValitator : FormHandler {
    public Localizer T { get; set; }
    public override void Validating(ValidatingContext context) {
        if (context.FormName == "CarouselLayout") {
            if (context.ValueProvider.GetValue("Alignment") == null) {
                context.ModelState.AddModelError("Alignment", T("The field Alignment is required.").Text);
            }
            if (context.ValueProvider.GetValue("Columns") == null) {
                context.ModelState.AddModelError("Columns", T("The field Columns/Lines is required.").Text);
            }
            else {
                int value;
                if (!Int32.TryParse(context.ValueProvider.GetValue("Columns").AttemptedValue, out value)) {
                    context.ModelState.AddModelError("Columns", T("The field Columns/Lines must be a valid number.").Text);
                }
            }
        }
    }
}
*/
}

carousellayout.cs

using System;
using System.Collections.Generic;
using System.Linq;
using Orchard.ContentManagement;
using Orchard.DisplayManagement;
using Orchard.Localization;
using Orchard.Projections.Descriptors.Layout;
using Orchard.Projections.Models;
using Orchard.Projections.Services;
namespace Orchard.Projections.Providers.Layouts {
public class CarouselLayout : ILayoutProvider {
    private readonly IContentManager _contentManager;
    protected dynamic Shape { get; set; }
    public CarouselLayout(IShapeFactory shapeFactory, IContentManager contentManager) {
        _contentManager = contentManager;
        Shape = shapeFactory;
        T = NullLocalizer.Instance;
    }
    public Localizer T { get; set; }
    public void Describe(DescribeLayoutContext describe) {
        describe.For("Html", T("Html"),T("Html Layouts"))
            .Element("Carousel", T("Carousel"), T("Organizes content items in a carousel."),
                DisplayLayout,
                RenderLayout,
                "CarouselLayout"
            );
    }
    public dynamic RenderLayout(LayoutContext context, IEnumerable<LayoutComponentResult> layoutComponentResults) {
        string outerDivClass = context.state.outerDivClass;
        string OuterDivId = context.state.OuterDivID;
        string innerDivClass = context.state.InnerDicClass;
        string firstItemClass = context.state.FirstItemClass;
        string itemClass = context.state.ItemClass;
        IEnumerable<dynamic> shapes =
           context.LayoutRecord.Display == (int)LayoutRecord.Displays.Content
               ? layoutComponentResults.Select(x => _contentManager.BuildDisplay(x.ContentItem, context.LayoutRecord.DisplayType))
               : layoutComponentResults.Select(x => x.Properties);
        return Shape.Carousel(Id: outerDivId, Items: shapes, OuterClasses: new[] { outerDivClass }, 
                InnerClasses: new[] {innerDivClass}, FirstItemClasses: new[] {firstItemClass}, ItemClasses: new[] {itemClass});
    }
}
}

layoutshapes.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web.Mvc;
using System.Web.Mvc.Html;
using Orchard.ContentManagement;
using Orchard.DisplayManagement;
using Orchard.Localization;
using Orchard.Mvc.Html;
using Orchard.Utility.Extensions;
namespace Orchard.Projections.Providers.Layouts {
public class LayoutShapes : IDependency {
    public LayoutShapes() {
        T = NullLocalizer.Instance;
    }
    public Localizer T { get; set; }
    [Shape]
    public void Carousel(dynamic Display, TextWriter Output, HtmlHelper Html, string Id, IEnumerable<dynamic> Items, 
                        IEnumerable<string> OuterClasses, IDictionary<string, string> OuterAttributes,
                        IEnumerable<string> InnerClasses, IDictionary<string, string> InnerAttributes, 
                        IEnumerable<string> FirstItemClasses, IDictionary<string, string> FirstItemAttributes, IEnumerable<string> ItemClasses,  IDictionary<string, string> ItemAttributes ) 
    {            
        if (Items == null) return;
        var items = Items.ToList();
        var itemsCount = items.Count;
        if (itemsCount < 1) return;
        var outerDivTag = GetTagBuilder("div", Id, OuterClasses, OuterAttributes);
        var innerDivTag = GetTagBuilder("div", string.Empty, InnerClasses, InnerAttributes);
        var firstItemTag = GetTagBuilder("div", string.Empty, FirstItemClasses, FirstItemAttributes);
        var itemTag = GetTagBuilder("div", string.Empty, ItemClasses, ItemAttributes);
        Output.Write(outerDivTag.ToString(TagRenderMode.StartTag));
        Output.Write(innerDivTag.ToString(TagRenderMode.StartTag));
        int i = 0;
        foreach (var item in items)
        {
            if (i== 0)
               Output.Write(firstItemTag.ToString(TagRenderMode.StartTag)); 
            else
               Output.Write(itemTag.ToString(TagRenderMode.StartTag)); 
            Output.Write(Display(item));
            Output.Write(itemTag.ToString(TagRenderMode.EndTag));
            i++;
        }
        Output.Write(innerDivTag.ToString(TagRenderMode.EndTag));
        Output.Write("<a href="#{0}" class="carousel-control left" data-slide="prev">&lsaquo;</a>",id);
        Output.Write("<a href="#{0}" class="carousel-control right" data-slide="next">&lsaquo;</a>",id);
        Output.Write(outerDivTag.ToString(TagRenderMode.EndTag));
        Output.Write("<script>$(function () {$('"+ Id +"').carousel();}); </script>");
    }
    static TagBuilder GetTagBuilder(string tagName, string id, IEnumerable<string> classes, IDictionary<string, string> attributes) {
        var tagBuilder = new TagBuilder(tagName);
        tagBuilder.MergeAttributes(attributes, false);
        foreach (var cssClass in classes ?? Enumerable.Empty<string>())
            tagBuilder.AddCssClass(cssClass);
        if (!string.IsNullOrWhiteSpace(id))
            tagBuilder.GenerateId(id);
        return tagBuilder;
    }
}
}

您是否将代码添加到模块果园。您需要在Visual Studio中添加文件,并保存项目以供它们包含在.csproj中(除非动态编译不会将文件收集到帐户中),否则您可以构建模块。

您在carousellayou.cs文件中缺少displaylayout()的定义:

    public LocalizedString DisplayLayout(LayoutContext context)
    {
        string columns = context.State.Columns;
        bool horizontal = Convert.ToString(context.State.Alignment) != "vertical";
        return horizontal
                   ? T("{0} columns grid", columns)
                   : T("{0} lines grid", columns);
    }

另外,layourshapes.c中的变量'id'应该是'id',声明中还有其他错误的套管:

string outerDivClass = context.state.outerDivClass;
string OuterDivId = context.state.OuterDivID;
string innerDivClass = context.state.InnerDicClass;
string firstItemClass = context.state.FirstItemClass;
string itemClass = context.state.ItemClass;

应该是:

string outerDivClass = context.State.OuterDivClass;
string outerDivId = context.State.OuterDivID;
string innerDivClass = context.State.InnerDicClass;
string firstItemClass = context.State.FirstItemClass;
string itemClass = context.State.ItemClass;

最新更新