日本語版
最新ニュース
企業

SaaS CMSのページへのルーティング

SaaS CMSインスタンスを使用したより早い調査結果。 Visitor PageViewsとEditorのプレビューの両方で機能するグラフクエリのセットアップ。 これらのクエリは、コンテンツタイプパッケージでテストされています 前のブログ投稿のCLIツール。 Optimizelyのドキュメント以外では、これらのリソースは周りを見るのに非常に役立ちます。 パラメーターは、パス +フルパスの最初の部分からロケールを解析するか、 loc、 key または ver 編集モードによって送信されたクエリストリングパラメーター。 フルパスに基づいた場合のBlazor Static SSRの例。 @page "/{*pageRoute:nonfile}" .. [Parameter] public string? PageRoute { get; set; } .. if (path == "https://krompaco.nu/") { path = "/en/"; }…

SaaS CMSのページへのルーティング

1744824977
2025-04-14 17:30:00

SaaS CMSインスタンスを使用したより早い調査結果。 Visitor PageViewsとEditorのプレビューの両方で機能するグラフクエリのセットアップ。

これらのクエリは、コンテンツタイプパッケージでテストされています 前のブログ投稿のCLIツール

Optimizelyのドキュメント以外では、これらのリソースは周りを見るのに非常に役立ちます。

パラメーターは、パス +フルパスの最初の部分からロケールを解析するか、 lockey または ver 編集モードによって送信されたクエリストリングパラメーター。

フルパスに基づいた場合のBlazor Static SSRの例。

@page "/{*pageRoute:nonfile}"
..
[Parameter] public string? PageRoute { get; set; }
..

if (path == "https://krompaco.nu/")
{
    path = "/en/";
}

この例では、セット en ロケールパラメーターの値としても。

query ContentByPath($path: String!, $locale: [Locales]!) {
    _Content(
      where: {
        _or: [
          { _metadata: { url: { default: { eq: $path } } } }
          { _metadata: { url: { hierarchical: { eq: $path } } } }
        ]
      }
      locale: $locale
    ) {
      item {
        _metadata {
            key
            locale
            types
            displayName
            version
            url {
                default
                hierarchical
            }
        }
        _type: __typename
      }
    }
}

編集モードの使用が検出された場合、代わりに編集モードで送信されたpreview_tokenをグラフhttpclientリクエストメッセージのHTTPヘッダーとして追加します。

public class GraphClientDelegatingHandler(IHttpContextAccessor httpContextAccessor) : DelegatingHandler
{
    protected override TaskHttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        
        request.Headers.Add("cg-stored-query", "template");

        var uriBuilder = new UriBuilder(request.RequestUri!);
        uriBuilder.Query += "&stored=true";
        request.RequestUri = uriBuilder.Uri;

        
        var httpContext = httpContextAccessor.HttpContext;

        if (httpContext != null)
        {
            if (httpContext.Request.Query.TryGetValue("preview_token", out var previewToken))
            {
                request.Headers.Add("Authorization", $"Bearer {previewToken}");
            }
        }

        return base.SendAsync(request, cancellationToken);
    }
}

次に、ContentBypathと同一の結果構造を持つこのクエリを使用しますが、トークンとともに未発表のバージョンからデータを取得できます。

query ContentByKeyAndVersion($key: String!, $version: String!, $locale: [Locales]!) {
    _Content(
            locale: $locale,
            where: { _metadata: { key: { eq: $key}, version: { eq: $version }  } }
        ) {
        item {
            _metadata {
                key
                locale
                types
                displayName
                version
                url {
                    default
                    hierarchical
                }
            }
            _type: __typename
        }
    }
}

空の結果が得られた場合、404ページを表示し、すべてのフラグメントで大きなクエリを送信することを避けることができます。

その結果、最初のアイテム types プロパティは、使用するコンポーネントを選択するのに最も適しています。

それが私たちであることがわかったら StandardExperience タイプ両方のケースで同じクエリを使用できるようになりました。訪問者のページビューでは、バージョンパラメーターを省略します。

fragment heading1Element on Heading1 {
  Heading
}

fragment heading2Element on Heading2 {
  Heading
}

fragment heading3Element on Heading3 {
  Heading
}

fragment proseElement on Prose {
  Body {
    html
  }
}

fragment singleParagraphElement on SingleParagraph {
  Text
  Highlight
}

fragment preambleElement on Preamble {
  Text
}

fragment singleImageElement on SingleImage {
  ImageReference
  {
    url
    {
      default
    }
  }
  AlternativeText
}

fragment callToActionLinksElement on CallToActionLinks {
  Links {
    text
    url {
      default
    }
  }
}

fragment personElement on Person {
  FullName
  Title
  Telephone
  ImageReference
  {
    url
    {
      default
    }
  }
}

fragment compositionStructureNode on CompositionStructureNode {
  displaySettings { key, value }
  displayTemplateKey
  key
  displayName
  nodeType
  type
}

fragment compositionComponentNode on CompositionComponentNode {
  displaySettings { key, value }
  displayTemplateKey
  key
  displayName
  nodeType
  type
  component {
    ...heading1Element
    ...heading2Element
    ...heading3Element
    ...proseElement
    ...singleParagraphElement
    ...preambleElement
    ...singleImageElement
    ...callToActionLinksElement
    ...personElement
  }
}

query StandardExperienceByKeyAndVersion($key: String!, $version: String, $locale: [Locales]!) {
  StandardExperience(
    locale: $locale
    where: { _metadata: { key: { eq: $key}, version: { eq: $version }  } }
  ) {
    item {
      composition {
        ...compositionStructureNode
        grids: nodes {
          ...compositionComponentNode
          ...compositionStructureNode
          ... on CompositionStructureNode {
            rows: nodes {
              ...compositionStructureNode
              ... on CompositionStructureNode {
                ...compositionStructureNode
                columns: nodes {
                  ...compositionStructureNode
                  ... on CompositionStructureNode {
                    ...compositionStructureNode
                    elements: nodes {
                      ...compositionComponentNode
                    }
                  }
                }
              }
            }
          }
        }
      }
      PageTitle
      _metadata {
        published
        url {
          default
        }
      }
    }
  }
}

これで、グリッドセクションまたはセクションレベルの共有ブロックのレンダリングを開始するために必要なものがあります(CLIリポジトリには Person それをテストするためのコンテンツタイプ)。

フローはクラシックページタイプでも機能しますが、私が指摘したように 私の最初のSaaS CMSブログ投稿 新しいセットアップの必要性はめったにありません。

これはまだ探索段階にあるが、JSがわずかに遅れていることに注意してください contentSaved イベントコードは、ヘッドアプリをローカルに使用して環境に展開するときの両方で、正しいバージョンの表示を取得する際に安定しています。

script src="@(this.CmsUrl)/util/javascript/communicationinjector.js">script>

script>
    window.addEventListener('optimizely:cms:contentSaved', (event) => {
        const message = event.detail;
        setTimeout(function () {
            document.location.href = message.previewUrl;
        }, 600);
    });
script>

#SaaS #CMSのページへのルーティング

執筆者について: nipponese

Nipponese News編集部は、国内外のニュースを日本語で分かりやすくお届けします。