0

現在、メインの「コンテンツ」セクションの外側にページ階層を作成して、他のセクションから分離し、他のすべてのクロスサイト データと一緒に保持することを検討しています。レイアウト、サブレイアウトを割り当て、コンテンツを思い通りに戻すことができます。

ただし、コンテンツを XHTML (現在は非常に単純な XHTML) として iTextSharp & Html Tidy または同等のものにプッシュする必要があります。ページのほとんどまたはすべての応答を取得できるようにフックできるパイプラインまたはイベントはありますか?

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

そのようなものが存在しない場合、ページ上のすべてのコントロールを見つけてレンダリングすると、Sitecore がレンダリングするものに近くなりますか?

4

3 に答える 3

3

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

于 2012-05-04T13:07:19.227 に答える
2

のレンダリングされた HTML 出力にアクセスするために、Sitecore パイプライン内で必要な低レベルのアクセス権を持っているSystem.Web.UI.Controlかどうかはわかりません。そして、レンダリングされたページ全体を持つ Sitecore パイプラインは存在しないとほぼ確信しています。

Reflector をざっと見たときにわかったことによると、RenderLayoutSitecore パイプラインを使用すると、サブレイアウト アイテムが対応するユーザー コントロールとリンクされているため、プロセスを変更できます。次に、RenderingReferenceが に追加されSitecore.Context.PageContextます。次にSitecore.Web.UI.WebControls.Placeholder、すべての取得RenderingReferencesと System.Web.UI.Control.RenderControl()` メソッドの呼び出しを担当します。

Sitecore はSystem.Web.UI.Control.RenderControl()すべてのサブレイアウトを呼び出し、レンダリングされた HTML をパイプライン経由でプッシュすることなく、基本的にブラウザーに出力をスローするため、Sitecore 以外のソリューションを検討することをお勧めします。

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

于 2012-05-04T14:10:47.197 に答える
1

最近これを行ったところ、<convertToRuntimeHtml>パイプラインが機能しないことがわかりました。<renderField>代わりに、少なくともsc:fld関数 (および<sc:text>タグ)に対して機能するパイプラインにプロセッサを追加しました。

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

public class ContentVariablesProcessor
{
    public void Process(Sitecore.Pipelines.RenderField.RenderFieldArgs args)
    {
        if (args != null)
        {
            // Manipulate output
            args.Result.FirstPart = "my output";
        }
    }
}
于 2012-05-04T13:20:48.187 に答える