1

Sitecore EXM電子メールコンポーネントにリンクを表示する方法を理解するのが難しいです。コンポーネントMVCのSitecoreのリンクリストをレンダリングする

私はSitecore MVCコントローラレンダリングを使用しています。私は基本的にSitecore EXMプラットフォームでデフォルトとして提供されるメインセクションコンポーネントを複製しようとしています。

using Sitecore.Links; 
using Sitecore.Mvc.Presentation; 
using Sitecore.Web.UI.WebControls; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using TestSitecore.Models; 
using TestSitecore.Models.MVCEmailModels; 
using Sitecore.Data.Items; 
using Sitecore.Collections; 

namespace TestSitecore.Repositories 
{ 
    public class MainSectionMVCRepository 
    { 
     public MainSectionMVC GetMainSectionMVC() 
     { 
      var mainSectionMVC = new MainSectionMVC(); 
      var rendering = RenderingContext.Current.Rendering; 
      var dataSource = rendering.Item; 

      mainSectionMVC.Title = new HtmlString(FieldRenderer.Render(dataSource, Constants.FIELD_TITLE)); 
      mainSectionMVC.Text = new HtmlString(FieldRenderer.Render(dataSource, Constants.FIELD_TEXT)); 
      mainSectionMVC.Image = new HtmlString(FieldRenderer.Render(dataSource, Constants.FIELD_IMAGE)); 

      mainSectionMVC.Links = GetLinks(dataSource); 

      return mainSectionMVC; 
     } 

     private List<Item> GetLinks(Item dataSource) 
     {    
      List<Item> links = new List<Item>(); 

      // I need to get access the the Links that are attached to the datasource item ???? How to do this 

      return links; 
     } 

     public MainSectionMVCViewModel GetMainSectionMVCViewModel(MainSectionMVC mainSectionMVC) 
     { 
      var viewModel = new MainSectionMVCViewModel(); 
      var rendering = RenderingContext.Current.Rendering; 
      //viewModel.Background = rendering.Parameters["Background"]; 
      viewModel.ContextItem = PageContext.Current.Item; 
      viewModel.MainSectionMVC = mainSectionMVC; 

      return viewModel; 
     } 
    } 
} 

とモデルMainSectionMVC.cs:

using Sitecore.Data.Items; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace TestSitecore.Models.MVCEmailModels 
{ 
    public class MainSectionMVC 
    { 
     public HtmlString Title { get; set; } 
     public HtmlString Image { get; set; } 
     public HtmlString Text { get; set; } 

     public List<Item> Links { get; set; } 

    } 
} 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using TestSitecore.Repositories; 

namespace TestSitecore.Controllers 
{ 
    public class MainSectionMVCController : Controller 
    { 
     // GET: MainSectionMVC 
     public ActionResult Index() 
     { 
      var repository = new MainSectionMVCRepository(); 
      var mainSectionMVC = repository.GetMainSectionMVC(); 

      var mainSectionMVCViewModel = repository.GetMainSectionMVCViewModel(mainSectionMVC); 

      return View(mainSectionMVCViewModel); 
     } 
    } 
} 

私はリポジトリMainSectionMVCRepository.csを持っている:私は、コントローラMainSectionMVCController.csを持っているとそう

を開始します

私はViewModel MainSectionMVCViewModel.csを持っています:

using Sitecore.Data.Items; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 

namespace TestSitecore.Models.MVCEmailModels 
{ 
    public class MainSectionMVCViewModel 
    { 
     public MainSectionMVC MainSectionMVC { get; set; } 
     public string Background { get; set; } 
     public Item ContextItem { get; set; } 

    } 
} 

、最終的に私は、コントローラのindexアクションにリンクされてIndex.cshtmlあります

@using Sitecore.Mvc 
@using Sitecore.Data.Items 
@using Sitecore.Web.UI.WebControls; 
@using TestSitecore.Models 
@using TestSitecore.Models.MVCEmailModels 

@model MainSectionMVCViewModel 

<div class="highlight"> 
    <div class="row"> 
     <div class="col-md-2 col-lg-2"></div> 
     <div class="col-md-5 col-lg-5"> 
      <h2>@Model.MainSectionMVC.Title</h2> 
     </div> 
     <div class="col-md-3 col-lg-3" style="align-content: center"> 
      @Model.MainSectionMVC.Image 
     </div> 
     <div class="col-md-2 col-lg-2"></div> 
    </div> 
    <div class="row"> 
     <div class="col-md-8 col-lg-8"> 
      <h2>@Model.MainSectionMVC.Text</h2> 
     </div> 
     <div class="col-md-4 col-lg-4"></div> 
    </div> 
    <div class="row"> 
     <!--DISPLAY THE LINKS HERE--> 
    </div> 
</div> 

私の問題は私のリポジトリ内のリンクのリストを移入して、レンダリングする方法であります私のコンポーネントの出力。

Sitecoreのリンクアイテムからテンプレートを見ると、データ定義にテキストと宛先の2つのフィールドが含まれていることがわかります。

したがって、テキストフィールドはリンクの表示テキストとして使用され、宛先は実際にはItemPath/ItemIDです。

私は試してみましたvar children = dataSource.GetChildren();これは私に親アイテム(メインセクション)のすべての子を取得します。現時点では、リンクのみがメインセクションアイテムの子アイテムになることができますが、コンポーネントテンプレートが変更されている場合は変更される可能性があります。

子供のアイテムがリンクかどうかをテストするのに適した方法を見つけるのに苦労しました。したがって、アイテムタイプをテストする上でのヒントも理解できます。

すべてのアイデア?

答えて

0

私は最終的に解決策を見つけることができたので、多くの間違ったターンと悲しみの後。 Sitecore HTMLヘルパークラスの重要な理解が不足していたと思います。

ここで、同様の問題を抱えている方は、この問題をどのように解決したのですか。私MainSectionMVCRepositoryクラス内

私は(にgetLinksを完了)ので、のような方法:

private List<Item> GetLinks(Item item) 
{ 
    ChildList children = item.GetChildren(); 
    List<Item> links = new List<Item>(children.Count); 

    foreach (Item link in children) 
    { 
     links.Add(link); 
    } 

    return links; 
} 

そして、私のIndex.cshtmlファイル内に、私は次のコードでリンクをレンダリング:

@{ if (Model.MainSectionMVC.Links.Count > 0) 
    { 
     <ul> 
      @foreach (Item link in @Model.Links) 
      { 
       <li> 
        @Html.Sitecore().BeginField("Destination", link, new { haschildren = true }) 
        @Html.Sitecore().Field("Text", link) 
        @Html.Sitecore().EndField() 
       </li> 
      } 
     </ul> 
    } 
} 

I結果にかなり満足しています。リンクは、このようにレンダリングされると、ページエディタで表示および編集できます。D

Displaying Links

ホープこれは、誰もが他の同様の問題を持つことができます

関連する問題