私はこのニュースレターのページを持っています。このページには、実際のニュースレターがその年の各月の下にネストされています。
親ページを最新の公開ページにリダイレクトできるようにしたいと考えています。それを行う最善の方法は何ですか?
私は本当にこれをどこから始めるべきか全くわかりません...サブレイアウトのユーザーコントロールを作成し、プログラムでリダイレクトする必要がありますか? それとももっとエレガントな方法がありますか...よろしくお願いします!
私はこのニュースレターのページを持っています。このページには、実際のニュースレターがその年の各月の下にネストされています。
親ページを最新の公開ページにリダイレクトできるようにしたいと考えています。それを行う最善の方法は何ですか?
私は本当にこれをどこから始めるべきか全くわかりません...サブレイアウトのユーザーコントロールを作成し、プログラムでリダイレクトする必要がありますか? それとももっとエレガントな方法がありますか...よろしくお願いします!
これを行う「Sitecore」の方法があるかどうかはわかりませんが、次のいずれかを試してみます。
リダイレクトの代わりに、特定のテンプレートの最初の子ノードを親ページに表示するだけです。
あなたが提案したように、ユーザーをニュースレターにリダイレクトするサブレイアウトを作成します。
これはあなたのために働くはずのコードです。上記のいずれかのソリューションで使用できる最新の発行済みニュースレターを取得します。
Item[] childs = currentItem.Axes.GetDescendants();
var itm = childs.AsQueryable().Where(c => c.TemplateName.ToLower().
Contains("newsletter")).OrderByDescending(c => c.Publishing.PublishDate).Take(1);
メイン ページ (つまり、リダイレクト元のページ) のレイアウトを 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 で説明されているように公開日を取得するほど単純ではない可能性があります。そうかもしれませんが、古いニュースレターを修正して再発行すると、そのコードは失敗する可能性があります (と思いますか?)。よろしければ問題ありません。ズーキングは正しいです。それ以外の場合は、実際に各ニュースレターに特定の日付フィールドを指定することをお勧めします。その場合は、ハンドラーでこのコードを使用してください。
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; } }
}
}