
対象読者 :アーキテクチャソリューションに影響を与えないシンプルなCMSを必要とするシステム。 (CMS、コンテンツリポジトリとして、フォームを生成しないなど)
この記事の目的は 、メインアプリケーションがグローバルに依存しないデータソースとしてUmbraco CMSを使用する方法を2語で説明することです(結局、ソースはいつでも他のものに置き換えることができます)、つまり、 CMSを別のプロジェクトに転送する方法。
少し前に、私はUmbraco CMSについて知りました。それはすぐに私の注意を引きました。 私にとっての主な利点の1つは、その無料のオープンソースであり、そのすべてが暗示しています。 かなりシンプルで効果的なデザイン、シンプルな背景、大規模なコミュニティ、幅広い無料の拡張機能。 長所と短所の完全なリストはオンラインで入手できます。 私は2点だけ怒っていました:
- CMSは、メインアプリケーション、ルーティングなどの構造とプラットフォームに一定の主張をします。 C#プログラミングは、ユーザーコントロールを記述することになります。
- 最初の段落に基づいて、現時点では、最新バージョン(4.10)はASP.NET MVCで使用できません。 (「混合型」プロジェクトのオプションをネット上で見ました-ASP.NET + ASP.NET MVCが好きではありませんでした)
コンテンツ管理モジュールとしてのみCMSを使用したかったのですが、そのデータは、いくつかのライブラリを他のプロジェクトに接続するだけで取得できました。 そして、私が理解しているように、Umbracoはそのようなデフォルトの機会を提供していません。 また、C#でのデータバインディングのロジックであるページレイアウトを自分で記述し、レイアウトを定義し、xsltを使用せずに、ui-engine umbracoを構築します。 少し時間をかけて適切なものが見つからなかった後、私はこの問題を自分で解決しなければなりませんでした。
その結果、メインアプリケーションが統合されていないという事実により、一部のCMS機能が利用できなくなると言っても過言ではありません。 例:ページの作成と編集、テーマ、スクリプト、マクロの管理。 とにかく、デフォルトでは。 したがって、クライアントがこれらすべてのアクションを実行できる完全に機能するCMSが必要な場合、このオプションはあまり適していません。
概略的には、次のようになります。

そのため、最初に次のことを行う必要があります。
- CMSを使用してプロジェクトを作成し、その機能を構成して拡張します。
- 必要なアセンブリをWebプロジェクトに追加し、数行のコードを構成して記述します。
- CMSプロジェクトの作成
- umbracoはASP.NETで記述されているため、VisualStudioで適切なタイプの空のプロジェクトを作成します(そこからすべてのファイルとフォルダーを削除します)
- NuGetから「Umbraco Cms」をこのプロジェクトにインストールします。
- プロジェクトを開始します-Umbraco構成の開始ページが開き、そこでデータベースにバインドします。
- Umbraco拡張機能
背景:
別のプロジェクトでcmsを使用する場合、いくつかの追加のジェスチャを必要とする1つの重要なニュアンスがあります。 そのコンテキストは決してcmsにアタッチされていません。どういうわけか必要なノードを取得する必要があります。
Umbraco.APIを使用すると、ノードのいくつかのパラメーターに従ってこれを行うことができますが、まったく同じノードを取得するか、まったく取得しないことを完全に保証するものはありません。
IDでノードを取得するのが理想的なソリューションのようです-必要なIDをハードコーディングしてuQuery.GetNode(int nodeId)を静かに実行できますが、umbracoはノードのエンドツーエンドの番号付けを実装します。同じノード。 したがって、将来適切なノードを見つけることに関連する作業を最小限に抑えるために、次のメカニズムが実装されています。
この図は、Umbracoのカスタムコントロールの実装を示しています。 このコントロールは、cmsノードとWebアプリケーションのカスタム列挙との関連付けを設定します(DropDownは列挙にマップし、ノードはContentPickerを介して選択されます)。 これは、コンセプトの最も単純な実装です。 列挙型の代わりに、ノード名のリストは任意の構造を持つことができ、列挙型だけでなく保存できます。 たとえば、10個のノードではなく、アプリケーション内の約100個のノードを知る必要がある場合、もっと複雑なものを思い付くことができます。 ちなみに、このように、異なる文化の関連セットを追加することで、Webサイトのローカライズを実現できます(矢印Ru-Ru)。 ContentPickerからデータを保存する前に、実際のノードIDを取得します。
また、本当に必要な場合は、ここで、Webアプリケーションで予期されるumbracoのノードが消えたかどうかを確認したり、警告を表示したり、電子メールを書き込んだりして、NotFoundエラーの発生を予測できます。
関連付けデータは、たとえばUmbracoデータベースに保存されます。 最も単純な場合、テーブルの構造は次のとおりです。
- Webプロジェクトのセットアップ
さて、メインの消費者プロジェクトです。 Umbraco APIを介してcms経由で保存されたデータを取得するには、以下を実行する必要があります。
- config \ umbracoSettings.configをcmsルートからWebプロジェクトルートにコピーします
- この構成の「 XmlContentCheckForDiskChanges 」 プロパティの値をtrueに設定します(この項目はオプションですが、cmsの変更を即座に「キャッチ」する機会を与えます)
- web.config cmsからweb.configプロジェクトにキーをコピーします。
- 「 UmbracoDbDSN 」 -cmsデータベースへのパス
- 「 UmbracoContentXML 」は、cmsがデータをキャッシュするxmlファイルへのパスです。 より正確には、このファイルはデフォルトで「 \ App_Data \ umbraco.config」にあります。 ニュアンスがあります。 cmsが物理的に別のサーバーにある場合、問題を解決するには追加の手順が必要です。 私はumbracoキャッシングメカニズムに深く入り込んではいませんが、必要に応じて、ファイルへのキャッシングを完全に放棄できると思います。
- 次のアセンブリへの参照を追加します。
- businesslogic.dll
- cms.dll
- controls.dll
- interfaces.dll
- umbraco.dll
- umbraco.DataLayer.dll
4.データへのアクセス
何も見逃していない場合、これはapi umbracoを正常に機能させるのに十分です。 目的のノードを取得するには、そのIDを知る必要があります。 必要なのは、enum要素とカルチャ(存在する場合)の名前によって、関連付けのテーブルItemsIdMapから目的のIDを取得することだけです。 例:
ItemsIdMap itemAssociation = context.ItemsIdMaps.SingleOrDefault(p => p.ItemCID == CmsItemCID.News.ToString() && p.Lang == "Ru"); Node node = uQuery.GetNode(itemAssociation.ItemId); string content = node.GetProperty(propertyName).Value;
それは基本的にそれです。 この例は概念的なものであり、プロセスでさまざまなニュアンスが発生しますが、これは別の話です-すべては受信時に決定されます。 また、私自身がこのソリューションをすべての可能性またはパフォーマンスについてテストしたことはありません。 ところで、この場合、Umbracoソースをダウンロードし、アセンブリの代わりに一時的に接続し、理解できない問題がある場合はデビューするのが便利です。 cmsの適用は一般的ではありません。 いずれにせよ、私はこのソリューションが好きですが、自分の手で管理者パネルを書くよりもずっと好きです。
ご清聴ありがとうございました!