2009-10-06 2 views
1

У меня есть эта страница с информационными бюллетенями, в которой есть фактические информационные бюллетени, расположенные под ней за каждый месяц года.Как перенаправить родительскую страницу на дочернюю страницу в Sitecore 6?

Я хочу, чтобы родительская страница перенаправлялась на последнюю опубликованную страницу. Какой был бы лучший способ сделать это?

На самом деле я не знаю, с чего начать с этого ... Должен ли я сделать контроль над макетом и программным перенаправлением? Или есть более элегантный способ сделать это ... Спасибо заранее!

ответ

4

Я не знаю, если есть «Sitecore» -way делать это, однако я хотел бы попробовать одно из следующих действий:

  1. Вместо того, чтобы редирект, я бы просто показать первый ребенок узел определенного шаблона на родительской странице.

  2. Как вы предлагали, сделайте пересылку, которая перенаправляет пользователя в Информационный бюллетень.

Вот код, который должен сработать для вас. Он получает последний опубликованный информационный бюллетень, который вы можете использовать в любом из вышеперечисленных решений.

Item[] childs = currentItem.Axes.GetDescendants(); 

var itm = childs.AsQueryable().Where(c => c.TemplateName.ToLower(). 
Contains("newsletter")).OrderByDescending(c => c.Publishing.PublishDate).Take(1); 
+0

Спасибо за предложение Zooking. Где именно я должен помещать этот код? В кодовом отставании суб-макета вместо перенаправления? Благодарю. –

+0

В любом случае вы должны поместить код в код нижнего уровня, который используется в «первой» -странице. Затем вы можете выбрать либо перенаправить пользователя на элемент, возвращаемый кодом, либо просто показать элемент непосредственно в sublayout. Я не являюсь гуру поисковой системы, но я думаю, что вы получите лучшее ранжирование в поисковых системах, если вы сделаете переадресацию, поэтому конкретный бюллетень содержит только один URL. – Zooking

3

Установите макет главной страницы (то есть тот, который вы хотите перенаправить с) быть ASHX общий обработчик. Это означало бы, что код UI не задействован каким-либо образом.

Вы можете сделать это с гораздо меньшим количеством коды, пока следующие предположения верны: 1. Всех дочерних элементов являются информационными бюллетенями 2. Последним находится в верхней части (например, элементы сортируются по дате выпуска)

namespace YourSite 
{ 
    public class NewsletterHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      Item item = Sitecore.Context.Item.Children[0]; 
      string url = Sitecore.Links.LinkManager.GetItemUrl(item); 
      context.Response.Redirect(url); 
     } 

     public bool IsReusable { get { return false; } } 
    } 
} 

Если вышеприведенные допущения ошибочны, поиск последних публикаций может быть не таким простым, как получение даты публикации, как описано Zooking. Возможно, но если вы исправите более старый информационный бюллетень и заново опубликуете, этот код может выйти из строя (я думаю?). Если все в порядке, не проблема, Zooking правильная, в противном случае вы можете захотеть дать каждому информационному бюллетеню определенное поле даты. В этом случае используйте код здесь, в вашем обработчике.

namespace YourSite 
{ 
    public class NewsletterHandler : IHttpHandler 
    { 
     public void ProcessRequest(HttpContext context) 
     { 
      Item[] children = Sitecore.Context.Item.Axes.GetDescendants(); 
      Item item = children.AsQueryable() 
       .Where(c => c.TemplateName.ToLower() 
       .Contains("newsletter")) 
       .OrderByDescending(c => DateTime.Parse(c["PublishDate"])).FirstOrDefault(); 
      string url = Sitecore.Links.LinkManager.GetItemUrl(item); 
      context.Response.Redirect(url); 
     } 

     public bool IsReusable { get { return false; } } 
    } 
} 
Смежные вопросы