1

ピラニア CMS で新しいリージョン拡張を作成しようとしています。

長期的にはより複雑になりますが、最初はそれを機能させるために、タブコンテナーを使用してタブコンテナーにデータを入力できるように、タブコンテナーを HTML 領域のリストにしたいと考えています。これは私の TabContainer クラスとビューです

TabContainer.cs

[Export(typeof(IExtension))]
[ExportMetadata("InternalId", "TabContainer")]
[ExportMetadata("Name", "Tab Region")]
[ExportMetadata("Type", ExtensionType.Region)]
[Serializable]
public class TabContainer : IExtension
{
    public IList<HtmlRegion> Items { get; set; }

    public TabContainer()
    {
        Items = new List<HtmlRegion>();
    }

    public virtual void Ensure(DataContext db) { }
    public virtual void Init(object model) { }
    public virtual void OnManagerSave(object model) { }
    public virtual void OnManagerDelete(object model) { }

    public void Ensure(object model) {}

    public virtual void InitManager(object model)
    {
    }

    public virtual object GetContent(object model)
    {
        return this;
    }

TabContainer.cshtml

@model MatchtechGroup.PiranhaExtensions.Regions.TabContainer

<ul class="form">

</ul>
@Html.EditorFor(m => m.Items)

マネージャーは新しいリージョンを認識し、それをスタート ページに追加できました。マネージャーを初期化する方法がわからないため、リスト内の HTMLRegions を追加および削除し、DB からそれらを取得する方法を確認できます。すでに保存されている場合。

マネージャー インターフェイスを介してアイテムを追加できるように、追加ボタン (添付ファイル タブに似ています) を含めるにはどうすればよいですか?

コンポーネントが組み込まれたリストベースのページを作成するためのより良いアプローチがあれば、提案を受け付けていますが、少し行き詰まっています。

ありがとう

4

2 に答える 2

1

並べ替え可能な添付ファイルのリストなど、複数の値を持つ領域を管理するためのコア フレームワークには適切なサポートがありません。私はさまざまなプロジェクトでいくつかの簡単な実装を行いましたが、それらはすべて新しい領域を作成するために多くのクライアント側の JavaScript に依存しており、ロジックの複製が必要になるため、かなり貧弱なソリューションです。

ただし、これは私が実装を試みた機能であり、今後のバージョンで望まれる機能です。興味があれば、コラボレーション用の GitHub リポジトリをいつでもセットアップできます。コアに含まれるまで、これをアドオン モジュールとして実装できます。これに興味がありますか?

よろしく

ホーカン

于 2014-07-22T09:19:05.277 に答える
0

ホーカンが言ったように

並べ替え可能な添付ファイルのリストなど、複数の値を持つ領域を管理するためのコア フレームワークには適切なサポートがありません。

したがって、これはベスト プラクティスではありませんが、うまくいきます。

TabRegion.cs:

using System;
using System.ComponentModel.Composition;
using System.ComponentModel.DataAnnotations;
using System.Web;

namespace Piranha.Extend.Regions
{
    /// <summary>
    /// Simple Tab region.
    /// </summary>
    [Export(typeof(IExtension))]
    [ExportMetadata("InternalId", "TabRegion")]
    [ExportMetadata("Name", "TabRegionName")]
    [ExportMetadata("ResourceType", typeof(Resources.Extensions))]
    [ExportMetadata("Type", ExtensionType.Region)]
    [Serializable]
    public class TabRegion :  Extension
    {
        #region Properties
        /// <summary>
        /// Gets/sets the Tab title.
        /// </summary>
        [Display(ResourceType = typeof(Piranha.Resources.Extensions), Name = "TabRegionTitle")]
        public string Title { get; set; }

        /// <summary>
        /// Gets/sets the Tab body.
        /// </summary>
        [Display(ResourceType = typeof(Piranha.Resources.Extensions), Name = "TabRegionBody")]
        public string Body { get; set; }
        #endregion
    }
}

TabRegion.cshtml

@model Piranha.Extend.Regions.TabRegion
@{
}
<ul class="form">
    <li>@Html.LabelFor(m => m.Title)
        <div class="input">@Html.TextBoxFor(m => m.Title)</div>
        @Html.ValidationMessageFor(m => m.Title)</li>
    <li>@Html.LabelFor(m => m.Body)
        <div class="input">@Html.TextAreaFor(m => m.Body, new { @class = "editor", @rows = 10 })</div>
        @Html.ValidationMessageFor(m => m.Body)</li>
</ul>

最後に、これをビュー (index.cshtml) に追加します。

<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
<link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
<script>
    $(function () {
        $("#tabs").tabs();
    });
</script>

<div id="tabs">
    <ul>
        @foreach (KeyValuePair<string, object> regions in Model.Regions)
        {
            if (regions.Value.ToString() == "Piranha.Extend.Regions.TabRegion")
            {
                dynamic tab = regions.Value;
                if (tab.Title !=null)
                {
                    <li> <a href="#tabs-@regions.Key">@tab.Title</a></li>
                }
            }
        }
    </ul>
    @foreach (KeyValuePair<string, object> regions in Model.Regions)
    {
        if (regions.Value.ToString() == "Piranha.Extend.Regions.TabRegion")
        {
            dynamic tab = regions.Value;
            if (tab.Title != null)
            {
                <div id="tabs-@regions.Key">
                    @Html.Raw(@tab.Body)
                </div>}
        }
    }
</div>
于 2015-02-07T11:04:04.743 に答える