2012-05-04 11 views
0

現在、主な「コンテンツ」セクションの外にページ階層を作成して、他のセクションと分けて保存し、他のすべてのクロスサイトデータ。私は、レイアウト、サブレイアウトを割り当てることができ、私が望むような方法でコンテンツを取得することができます。SitecoreのページのレンダリングされたHTML /ランタイムHTMLを

しかし、私はiTextSharp & Html Tidyまたはそれに相当するものを通してそれをプッシュするためにXHTML(現在のところ非常に単純なXHTML)としてコンテンツを必要としています。パイプラインやイベントがあり、私がフックできるようになっているので、ページのほとんどまたはすべてを得ることができますか?

私は、Sitecore.Layouts名前空間がConverterDesignTimeHtml、およびRuntimeHtmlを含んでHTMLDocumentの周りを通過するようだconvertToRuntimeHtmlパイプラインを、参照そのうち後者に気づきました。これらは、WYSIWYGエディタに関連するパイプラインのようです。

何も存在しない場合、ページのすべてのコントロールを見つけて、それらをレンダリングして、Sitecoreがレンダリングするものに近づけますか?

答えて

1

私はあなたが最終的にあるSystem.Web.UI.ControlのレンダリングされたHTML出力をアクセスするために、サイトコアのパイプライン内必要な低レベルのアクセスを持っているでしょうかわかりませんサブレイアウトが沸騰するもの。そして、私がほぼ肯定的なのは、レンダリングされたページ全体を持つSitecoreパイプラインがないことです。

Reflectorをすばやく見ているうちに、RenderLayout Sitecoreパイプラインでは、サブラインアイテムがユーザーコントロールの相手とリンクしているため、プロセスを変更できます。 RenderingReferenceは、Sitecore.Context.PageContextに追加されます。 Sitecore.Web.UI.WebControls.Placeholderは、RenderingReferencesをすべて取得し、System.Web.UI.Control.RenderControl()メソッドを呼び出すことを担当します。

Sitecoreはすべてのサブレイアウトで呼び出しており、レンダリングされたHTMLをパイプライン経由でプッシュせずに基本的に出力をブラウザに投げているので、Sitecore以外のソリューションを見ることができます。

ユーザーコントロールのRender(HtmlTextWriter writer)メソッドをすべてオーバーライドすることはできますが、1つのベースコントロールを使用している場合を除き、多くの重複したコーディングがあります。最善の策は、ページ全体が生成されてクライアントに行くのを待ってから、ASP.NET HttpModuleを使用して書式設定を行うことです。ここに一つの例があります - http://madskristensen.net/post/A-whitespace-removal-HTTP-module-for-ASPNET-20.aspx

+0

深刻な.Net Web開発にまだ1年しかないので、提案は素晴らしいです!私はこれについてもっと研究します。ありがとう! – al3xnull

3

おそらくrenderLayoutパイプラインにカスタムプロセッサを追加できます。実際には、さまざまなパイプライン用のプロセッサを作成し、アクセスできるものを確認することをお勧めします。これを行う簡単な方法は、Sitecore.kernel.dllをコンパイルし、各パイプラインのパイプラインargsオブジェクトをkernel\Sitecore.Pipelines.{the pipeline name here}\{the pipeline name here}Args.csに見てください。各パイプラインのargsオブジェクトを調べたら、どのオブジェクトがC#で必要なものにアクセスできるかを知るのに役立ちます。そこから、そのパイプライン内の実装をテストできます。

+0

大きなアドバイスマーク。私が前に向かったのは何だったのですか?私は何ができるのか見ていきます。 – al3xnull

1

私はこれを最近行っており、<convertToRuntimeHtml>パイプラインが私にとってうまくいきませんでした。代わりに、少なくともsc:fld関数(したがってまた<sc:text>タグ)で動作する<renderField>パイプラインにプロセッサを追加しました。

これは私のプロセッサ用のコードです:

public class ContentVariablesProcessor 
{ 
    public void Process(Sitecore.Pipelines.RenderField.RenderFieldArgs args) 
    { 
     if (args != null) 
     { 
      // Manipulate output 
      args.Result.FirstPart = "my output"; 
     } 
    } 
} 
+0

ルード、私は何かを明らかにしていない場合は謝罪し、フィールドにフックしていることを理解していますが、各コントロール/フィールドを渡すと、HTMLドキュメントやフラグメントを回していますか?また、実際にレスポンスhtmlを取得していないため、個々のフィールドで作業しなければならないと言っていますか? – al3xnull

+0

RenderFieldパイプラインは、フィールドのレンダリング時に呼び出されるため、完全なHTMLドキュメントではありません。 Markは、ドキュメント全体のレンダリングに使用されるパイプラインを指摘していると思います。 –

関連する問題