2016-03-31 12 views
1

Şu senaryoda: Son güncellenen içerik ve medyanın bir listesini görüntüleyen Sitecore 7'de (Güncelleme-4) bir sayfam var. Medya öğeleri için, yakın zamanda güncellenen medya öğesini kullanan içerik öğesi yollarının bir listesini görüntülemem gerekiyor. Bunu yapmanın en iyi yolu nedir?Sitecore güncel olarak güncellenen bir medya öğesini kullanarak içerik öğeleri listesi alırsınız

Aşağıdaki kodum Sitecore hızlı sorgusunu kullanır çünkü orijinal olarak bu, her öğeden birkaç alanın listelendiği basit bir sayfa olmalıdır. Arama dizinlerimizi tam olarak uygulamamıştık (ya da tercih ederseniz indeksler) ancak bunu gerçekleştirmek için hesaplanmış bir alana sahip özel bir arama indeksi eklemem gerekirse o zaman! Ayrıca bir ORM uygulamamıştık (bu nedenle süre ayarı öğesini id olarak almamız gerekmiştir). Ayrıca, bu projeyi Sitecore'u bilmeyen başka bir kişiden miras aldığımı aklımda tutarak, bazı yerlerde işin yapılması için "sanal koli bandı" uygulamak zorunda kaldım.

<div id="content"> 
    <h1>Recently Updated Content</h1> 
    <asp:Repeater id="rptRecentlyUpdatedContent" runat="server"> 
    <HeaderTemplate> 
     <Table class="gridtable"> 
     <tr> 
      <th>Name</th> 
      <th>Section</th> 
      <th>Type</th> 
      <th>Last Updated</th> 
     </tr> 
    </HeaderTemplate> 

    <ItemTemplate> 
     <tr> 
     <td><%# DataBinder.Eval(Container.DataItem, "Name") %></td> 
     <td><%# DataBinder.Eval(Container.DataItem, "Paths.ContentPath") %></td> 
     <td>Content</td> 
     <td><%# Sitecore.DateUtil.IsoDateToDateTime(DataBinder.Eval(Container.DataItem, "Fields[\"__Updated\"]").ToString()) %></td> 
     </tr> 
    </ItemTemplate> 
    </asp:Repeater> 

    <asp:Repeater id="rptRecentlyUpdatedFiles" runat="server"> 
    <ItemTemplate> 
     <tr> 
     <td><%# DataBinder.Eval(Container.DataItem, "Name") %></td> 
     <td></td> 
     <td><%# DataBinder.Eval(Container.DataItem, "TemplateName") %></td> 
     <td><%# Sitecore.DateUtil.IsoDateToDateTime(DataBinder.Eval(Container.DataItem, "Fields[\"__Updated\"]").ToString()) %></td> 
     </tr> 
    </ItemTemplate> 

    <FooterTemplate> 
     </Table> 
    </FooterTemplate> 
    </asp:Repeater> 
</div> 

Codebehind:

using Sitecore.Data.Items; 
using Sitecore.Diagnostics; 
using System; 
using System.Collections.Generic; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace RJ.Sitecore.Web.layouts.controls 
{ 
    public partial class RecentUpdates : BaseControl 
    {  

     protected void Page_Load(object sender, EventArgs e) 
     { 
      int duration = GetRecentlyUpdatedDuration(); 
      GetRecentlyUpdatedItems(duration); 
     } 

     protected void GetRecentlyUpdatedItems(int duration) 
     { 
      try 
      { 
       DateTime dtEndDate = DateTime.Now.AddDays(1); 
       DateTime dtStartDate = dtEndDate.AddDays(-duration); 
       string endDate = dtEndDate.ToString("yyyyMMdd"); 
       string startDate = dtStartDate.ToString("yyyyMMdd"); 
       string sitecoreContentQuery = string.Format("fast:/sitecore/content/Home//*[@__Updated >= '{0}T000000' and @__Updated < '{1}T000000']", startDate, endDate); 
       string sitecoreMediaQuery = string.Format("fast:/sitecore/media library//*[@__Updated >= '{0}T000000' and @__Updated < '{1}T000000']", startDate, endDate); 

       global::Sitecore.Data.Items.Item[] contentItems = global::Sitecore.Context.Database.SelectItems(sitecoreContentQuery); 
       var orderedContentItems = contentItems.OrderByDescending(x => x[global::Sitecore.FieldIDs.Updated]); 

       global::Sitecore.Data.Items.Item[] mediaItems = global::Sitecore.Context.Database.SelectItems(sitecoreMediaQuery); 
       var orderedMediaItems = mediaItems.OrderByDescending(x => x[global::Sitecore.FieldIDs.Updated]); 

       rptRecentlyUpdatedContent.DataSource = orderedContentItems; 
       rptRecentlyUpdatedContent.DataBind(); 
       rptRecentlyUpdatedFiles.DataSource = orderedMediaItems; 
       rptRecentlyUpdatedFiles.DataBind(); 
      } 
      catch (Exception ex) 
      { 
       global::Sitecore.Diagnostics.Log.Error("ERROR: ", ex); 
      } 
     } 

     protected int GetRecentlyUpdatedDuration() 
     { 
      Item durationItem = global::Sitecore.Context.Database.GetItem("{05A9B5E8-C9D3-4532-B3E1-301546BB17BC}"); 
      if (durationItem == null) 
      { 
       return 0; 
      } 

      global::Sitecore.Data.Fields.TextField duration = durationItem.Fields["duration"]; 
      if (duration == null) 
      { 
       return 0; 
      } 

      return Convert.ToInt32(duration.Value);   
     } 
    } 
} 
+0

[Sitecore Powershell Uzantıları] (https://marketplace.sitecore.net/tr/Modules/Sitecore_PowerShell_console.aspx) modülünü kullanıyor musunuz veya kullanmayı düşünmüyor musunuz? Yakın zamanda güncellenen medya alacak bir rapor var, bunu da içeriğe genişletmek zor olmayacak. – jammykam

cevap

1

Bu "? Bunu yapan en iyi yaklaşımdır" geniş bir konudur, bu yüzden gerçekten basit bir cevabı yok. Bu yüzden kısa ve işlevsel bir cevabın yeterli olacağını umuyoruz.

Hesaplanmış bir alana ihtiyacınız olacağını düşünmüyorum. Arama için kullanılan temel SearchResultItem sınıfı, son güncellenen tarihi ve öğenin yolunu temsil eden özelliklere sahiptir. Yani gerçekten temel arama bu gibi görünebilir:

using (var context = ContentSearchManager.GetIndex("your_index_name").CreateSearchContext()) 
{ 
    var results = context.GetQueryable<SearchResultItem>(). 
          Where(item => item.Updated > startDate && 
             item.Updated < endDate && 
             item.Path.StartsWith(mediaLibraryRootPath)). 
          .GetResults(); 
} 

Orada sonuçlarını işlemek için farklı yolları vardır, ancak kolaylık olması adına ben sadece nasıl

çalışabilirsiniz öğe kimlikleri listesini almak göstereceğiz
results.Hits.Select(hit => hit.Document.ItemId); 
İlgili konular