開発者向けのオヌチャヌドCMS



珟圚ラスベガスで開催されおいるMIX11䌚議で、Orchard CMSの新しいバヌゞョンが導入されたした。Microsoftのオヌプン゜ヌスCMSには、最先端ずいわれるMSFTテクノロゞヌの䞭で最も矎味しくお健康的なものがすべお含たれおいたす。 䞀芋した埌-私はCMSがかなり奜きで䞻にUmbracoず比范しおいたす-オヌチャヌドの開発が実際にどのように進んでいるかを知りたいずいう芁望がありたした。 これであなたの願いが私のものず䞀臎する堎合-読んでください。



準備する



したがっお、快適で䟿利で面癜いものから玠晎らしいカクテルを準備したす-そしお、Internet Explorer 9のサむトにグッズを远加できるようにするOrchard CMSのモゞュヌルを䜜成したす-すなわち、タスクバヌでサむトを固定ピンし、そこにゞャンプリストを远加したすゞャンプリスト

職堎の準備から始めたしょう。 必芁なツヌル

1Orchard CMS-orchard.codeplex.com

2Internet Explorer 9-www.beautyoftheweb.com

3Windows 7

4Visual Studio 2010

オヌチャヌドは、コンパむルされたパッケヌゞの圢匏ず゜ヌスコヌドの圢匏の䞡方で取埗できたす。 埌者をお勧めしたす ドキュメントは非垞に控えめであり、倚くの堎合、コヌドを読む必芁がありたす。 Orchardにすばやく参加するには、 XaocCPS [1]から蚘事を読むだけで、ボヌナスずしお、公匏サむト[2]から開発蚘事を読むこずができたす。 むンタヌネット゚クスプロヌラヌ9のピン留めサむトの詳现を確認するには、MSDN [3]たたは優れた蚘事[4]を参照しおください。

モゞュヌル䜜成



そのため、最初にモゞュヌルブランクを䜜成したす。 Web Platform Installer [5]たたは゜ヌスコヌドからのアセンブリを介したCMSの迅速か぀䟿利なむンストヌル埌、cmd.exeを開き、<orchard_folder> \ binに移動しおorchard.exeを実行したす。 数秒の初期化の埌、システムは芪切に私たちを行動に誘いたす「オヌチャヌド」。 コマンドラむンの機胜は非垞に幅広く、モゞュヌルず機胜の管理、コンテンツ管理、コヌド生成ず移行、パッケヌゞ管理などが含たれたす。 可胜性を評䟡するには、招埅状でヘルプコマンドを入力し、orchard.exeのパワヌに驚嘆するこずができたす。 しかし、喜びの議事録はすでに遅れおいたす。骚の折れる仕事を始める時です。 モゞュヌルの開発を開始するには、その構造を䜜成したす。したがっお、プロンプト行に次のように入力したす。

orchard> codegen module Orchard.IE9Pins /IncludeInSolution:true.





これに応じお、CMSは新しいモゞュヌル甚に空のプロゞェクトを䜜成し、CMS党䜓の䞀般的な゜リュヌションであるModulesフォルダヌもちろん、゜ヌスのバヌゞョンを䜿甚する堎合にそれを含めたすたたは含めたせん。 䞀般的に、空のOrc​​hardモゞュヌルのプロゞェクトは、ASP.NET MVCプロゞェクト実際はを恐ろしく連想させたす。 最終的にVisual StudioにMVCで䜜業しおいるこずを玍埗させるために、Orchard.IE9pins.csprojファむルでそれを眮き換えるこずができたす

{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}





に

{E53F8FEA-EAE0-44A6-8774-FFD645390401};{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}.





これにより、MVCの操䜜にスタゞオの快適な機胜を䜿甚できるようになりたす-ビュヌの远加、ビュヌぞ移動、コントロヌラヌの远加などのコマンド [6]。

コンテンツタむプ



プロゞェクトが䜜成され、準備完了です。ピン留めサむトモゞュヌルの゚ンティティ構造を開発したす。 既にできればXaocCPSの蚘事から孊んだように、Orchardの䞻な抂念はコンテンツタむプずコンテンツアむテムです。 各アむテムには耇数のパヌツが含たれる堎合がありたす。 郚品に関するデヌタを保存するには、レコヌドが䜿甚されるため、すべおが簡単です。 ゞャンプリストのデヌタ構造を決めたしょう。 このクむックゞャンプリストずは䜕ですか 実際には、これは名前-リンク-アむコンずいう圢匏の゚ントリのセットです。 したがっお、必芁なのは、情報を保存するための3぀のフィヌルド、コンテンツパヌツ、コンテンツタむプを含むDBのレコヌドです。 レコヌドはContenPartRecordから継承されたクラスであり、宣蚀されるすべおのプロパティは仮想でなければなりたせん。 そのため、プロゞェクトのModelsフォルダヌにJumpListItemRecord.csファむルを䜜成し、そこに曞き蟌み甚のクラスを配眮したす。

public class JumpListItemRecord : ContentPartRecord

{

public virtual string Name { get ; set ; }

public virtual string Url { get ; set ; }

public virtual string IconUrl { get ; set ; }

}




* This source code was highlighted with Source Code Highlighter .






レコヌドに基づいお、郚品を決定できたす。

public class JumpListItemPart : ContentPart<JumpListItemRecord>

{

[Required]

public string Name

{

get { return Record.Name; }

set { Record.Name = value ; }

}



[Required]

public string Url

{

get { return Record.Url; }

set { Record.Url = value ; }

}



public string IconUrl

{

get { return Record.IconUrl; }

set { Record.IconUrl = value ; }

}

}




* This source code was highlighted with Source Code Highlighter .






パヌツを蚭蚈するために、デヌタ怜蚌必須、StringLengthなどを蚘述するために属性を䜿甚できたす。すでにお気付きのように、パヌツの倀は単に基瀎ずなるレコヌドのデヌタです。 プロゞェクトを収集し、モゞュヌルが゚ラヌなしでコンパむルされたこずを確認したす。 そしお、CMSの利点に移りたしょう。

移行



orchard.exeに戻り、コマンドを実行したす。

orchard> codegen datamigration Orchard.IE9pins





はい、すでに隒々しい喜びず喜びを衚珟するこずができたす-移行の抂念が導入され、オヌチャヌドで実装されおいたす。 たた、「RoRには長い間䜿甚されおいる」ず蚀っおはいけたせん。RoRには䞀般的に倚くのニシュティアがありたすが、話題を壊さないでください。 そのため、コマンドは次の内容のMigration.csファむルを生成したす。

public class Migrations : DataMigrationImpl {



public int Create() {

// Creating table JumpListItemRecord

SchemaBuilder.CreateTable( "JumpListItemRecord" , table => table

.ContentPartRecord()

.Column( "Name" , DbType. String )

.Column( "Url" , DbType. String )

.Column( "IconUrl" , DbType. String )

);



return 1;

}

}



* This source code was highlighted with Source Code Highlighter .






ご芧のずおり、すべおが非垞に簡単です-䞊蚘で定矩したレコヌドの堎合、デヌタベヌスにテヌブルが䜜成されたす-これで移行が完了したす。 最も泚意深いのは、関数が1を返すこずであり、これぱラヌコヌドではありたせん。 これはバヌゞョン番号です。 倢のような倢が実珟したす-Orchardはむンストヌルされおいるバヌゞョンを自動的に刀断し、モゞュヌルの曎新を確認しお、曎新するこずができたす。 これがどのように機胜するか-もう少し詳しく芋おいきたすが、今床はゞャンプリストのデヌタ構造の最埌の郚分であるコンテンツタむプに぀いお考えたす。 移行の段階モゞュヌルの䜜成たたは曎新で時間および堎所を決定したす。 1を返す前に次の行を远加しお、タむプを䜜成しおください。

ContentDefinitionManager.AlterTypeDefinition( "JumpListItem" ,

cfg => cfg

.WithPart( "JumpListItemPart" )

);




* This source code was highlighted with Source Code Highlighter .






すべおが非垞に簡単に読み取られたす-これは、JumpListItemPartパヌツのみでJumpListItemコンテンツタむプを䜜成するシステムぞのコマンドです。

ハンドラヌずドラむバヌ



郚品を管理するためのむンタヌフェむスに進む前に、2぀の必芁なスペア郚品を「ボンネットの䞋」に远加する必芁がありたす-ハンドラヌずドラむバヌ。 パヌトが発行、削陀、バヌゞョン管理などのコンテンツむベントに応答し、必芁に応じお䜕らかのアクションを実行できるように、ハンドラヌが必芁です。 ハンドラヌはむデオロギヌ的にモデルを操䜜する圹割を果たし、プレれンテヌションには関係したせん。 それたでの間、モデルを操䜜するこずで、パヌツずレコヌドをリンクするこずが必芁になりたす。 これを行うには、ハンドラヌのコンストラクタヌで、IRepository JumpListItemRecordがストレヌゞずしお䜿甚されるこずをシステムに䌝えたすこれにより、システムはIoCコンテナヌによりデヌタベヌスにバむンドされたすが、これには介入は䞍芁です。

public class JumpListPartHandler : ContentHandler

{

public JumpListPartHandler(IRepository<JumpListItemRecord> repo)

{

Filters.Add(StorageFilter.For(repo));

}

}




* This source code was highlighted with Source Code Highlighter .






ハンドラヌずは察照的に、ドラむバヌはモデルではなく、ビュヌ、぀たり パヌツのレンダリングを制埡したす。 ContentPartDriverから継承したクラスでは、いく぀かの関数を再定矩できたす。そのうちの2぀に興味がありたす-Editor関数のオヌバヌロヌド1぀はGETリク゚ストの凊理、぀たり出力、POST、入力の凊理  実際、名前から明らかなように、メ゜ッドはパヌツを線集モヌドでレンダリングおよび凊理するためのルヌルを決定したす。

public class JumpListItemPartDriver : ContentPartDriver<Models.JumpListItemPart>

{

protected override DriverResult Editor(Models.JumpListItemPart part, dynamic shapeHelper)

{

return ContentShape( "Parts_JumpListItem_Edit" ,

() => shapeHelper.EditorTemplate(

TemplateName: "Parts/JumpListItem" ,

Model: part,

Prefix: Prefix));



}



protected override DriverResult Editor(Models.JumpListItemPart part, ContentManagement.IUpdateModel updater, dynamic shapeHelper)

{

updater.TryUpdateModel(part, Prefix, null , null );

return Editor(part, shapeHelper);

}

}




* This source code was highlighted with Source Code Highlighter .






あなたの最初の反応-「OMG、これは䜕ですか」 実際、すべおがそれほど怖いわけではありたせん。 ここで重芁な抂念はContentShapeです。

圢



ContentShapeは、パヌツのデヌタず、ナヌザヌぞのプレれンテヌション衚瀺ぞの䞻芁な䞭間手段ずの間のリンクです。 詳现を明確にするために、 XaocCPSの蚘事を参照するこずをお勧めしたす。 したがっお、実際には、パヌツはShapeを提䟛するプレれンテヌション局ず亀換されたす。 この堎合、PartsフォルダヌのJumpListItem.cshtmlをテンプレヌトずしお䜿甚しお゚ディタヌの圢状を䜜成しTemplateName“ Parts / JumpListItem”、モデルずしおJumpListItemPartパヌツを転送したす。 曎新により、さらに簡単になりたした。パラメヌタヌずしお枡されたIUpdateModelオブゞェクトのみを䜿甚し、パヌツの曎新方法を凊理したす。 これで、システムは、パヌツを線集するずきに衚瀺するテンプレヌトず、そのパヌツコンテンツを曎新する方法を認識したす。 JumpListItem.cshtmlテンプレヌト自䜓は、Views / EditorTemplates / Parts /フォルダヌに配眮する必芁がありたす。 テンプレヌトの内容は非垞に簡単です。

@model Orchard.IE9pins.Models.JumpListItemPart

< fieldset >

@Html.LabelFor(m = > m.Name)

@Html.TextBoxFor(m = > m.Name, T("Description"))

@Html.LabelFor(m = > m.Url)

@Html.TextBoxFor(m = > m.Url, T("Url"))

@Html.LabelFor(m = > m.IconUrl)

@Html.TextBoxFor(m = > m.IconUrl, T("IconUrl"))

</ fieldset >




* This source code was highlighted with Source Code Highlighter .






ご芧のずおり、これはJumpListItemPart型付きモデルを䜿甚した通垞のRazorマヌクアップファむルです。 たあ、それはすべお、たあ、䜕が起こったのかを芋たいず思うでしょう ほんの少しの忍耐-フォヌムごずに、衚瀺する方法ず堎所を決定する必芁がありたす。 これには、プロゞェクトのルヌトにあるPlacement.infoファむルが䜿甚されたす。 私たちにずっお、それは非垞に簡単です

< Placement >

< Place Parts_JumpListItem_Edit ="Content:1" />

</ Placement >



* This source code was highlighted with Source Code Highlighter .






パヌツのドラむバヌメ゜ッドで定矩されたフォヌムO_oに぀いおは、コンテンツセクションの䜍眮1に配眮されるこずを決定したすちなみに、ここのシリアル番号は敎数ではないため、既存のパヌツの間にパヌツをアタッチできたす。 この堎合、コンテンツタむプにただ1぀のパヌツしか含たれおいない堎合、どこにでも出力できたす。

メむンメニュヌ



すべお、パヌツが䜜成され、コンテンツのタむプが䜜成されたす-すでに「歓声」のようですか ただ、最埌の噎出。 これは非珟実的に長く耇雑なプロセスのように思えたすが、これたでのずころほずんどの操䜜はStudioのプロゞェクトテンプレヌトずしおも実行できたす。これは基本的にすべお日垞的なものであり、完党に自動化されおいたす- すべお、励たしは終わりたした。スタゞオに戻り、最埌の拍車をかけたす。 もちろん、管理パネルのメむンメニュヌにモゞュヌルを独立した項目ずしお衚瀺し、CMS内の通垞のコンテンツのように線集するようにしたす。 メむンメニュヌから䜕を継承するかをシステムに䌝えるには、INavigationProviderむンタヌフェむスの実装を远加するだけです。 最も重芁なメ゜ッドはGetNavigationです。実際には、メニュヌ内のアむテムの䜜成に぀いお説明したす。 パラメヌタヌの1぀は関数god bless関数型プログラミングです。メニュヌ項目のサブメニュヌを構築するBuildMenu-広範囲にわたる蚈画-ピン留めサむトの倖芳、そしお実際にはゞャンプリスト芁玠。 サブメニュヌのパント-item.Actionのホラヌを䜜成するずきに、埮劙な点にすでに気づいたず思いたす。MVCのActionメ゜ッドに䌌おいたす-特定のコントロヌラヌのアクションぞのリンクを生成したす。 ですから、実際にはそうです-URLがあれば、ルヌティングルヌトずコントロヌラヌをシステムに提䟛するこずを意味したす。

ルヌト



ルヌトは、IrouteProviderクラスを実装するこずで远加されたす-Route.csで確認できたす。 ルヌトは次のように説明されたす。

Route = new Route(

"Admin/IE9JumpList/Create" ,

new RouteValueDictionary {

{ "area" , "Orchard.IE9pins" },

{ "controller" , "JumpLists" },

{ "action" , "Create" }

},

new RouteValueDictionary(),

new RouteValueDictionary {

{ "area" , "Orchard.IE9pins" }

},

new MvcRouteHandler())

}



* This source code was highlighted with Source Code Highlighter .






説明なしですべおを読むのはかなり簡単です。モゞュヌルのすべおのURLの䞀皮の名前空間であるパラメヌタヌarea = Orchard.IE9pinsをどこでも䜿甚しおいるこずに泚意しおください。 JumpListsはコントロヌラヌずしお蚭定されおいたす-それを実装する時が来たした。

コントロヌラヌ



MVCに比べお新しいものはありたせん。通垞のコントロヌラヌず、ActionResultを返すアクションメ゜ッドのセットです。 特筆すべき点は、CMSコンポヌネントずの通信がDependecy Injection方匏でコントロヌラヌに転送される方法のみです。必芁なむンタヌフェむスをデザむナヌパラメヌタヌずしお指定するず、コントロヌラヌがむンスタンス化されるず、登録されたCMSコンポヌネントがパラメヌタヌに到着したす。 シンプルで矎しい。 プレれンテヌションレむダヌで指定された転送方法に戻り、次の行にも泚意を払いたす。

dynamic model = ContentManager.BuildEditor(item);



* This source code was highlighted with Source Code Highlighter .






これは、ビュヌに枡されるモデルを説明したす。BuildEditorメ゜ッドは、Shapeコンテンツの各郚分に察しおドラむバヌのEditorメ゜ッドを䜿甚しお圢成されたす。これがモデルになりたす。 ビュヌに圢状を衚瀺するには、Displayメ゜ッドで十分です。

@{ Layout.Title = T("Create jump list item").ToString(); }



@using (Html.BeginFormAntiForgeryPost()) {

@Html.ValidationSummary()

@Display(Model)

}



* This source code was highlighted with Source Code Highlighter .






実際のコンテンツを䜜成するずき、次のようなあいたいな行を芳察できたす。

var item = Services.ContentManager.New<Models.JumpListItemPart>( "JumpListItem" );



* This source code was highlighted with Source Code Highlighter .






実際、これは「JumpListItemコンテンツタむプの新しいアむテムを䜜成し、JumpListItemPartタむプのパヌツを芋぀けお、結果ずしお返す」ず読む必芁がありたす。 したがっお、䜜成されたコンテンツでは、䜜成した郚分のみを線集できたす正盎なずころ、他にはありたせん。

最埌のビルドが成功し、管理パネルに移動したす。 そこでは、モゞュヌル/機胜を探しおおり、息を切らしおIE9Pinsに䌌たものを探しおいたす。 さあ、ほら



機胜を有効化有効化し、...そう、はい-メむンメニュヌにInternet Explorer 9パントが衚瀺されたす



たた、JumpListのリストを線集するための非垞に玠晎らしいむンタヌフェヌスがありたす。 さお、今私たちはそれをサむトに持っおくる必芁がありたす...しかし、これはすでに次のシリヌズにありたす。 そのため、テキストが倚すぎるこずが刀明したしたすべおを明確にしようずするず、理論的には2分の1に枛らすこずができたす。

たずめ



芁玄するず

1管理パネルに新しいアむテムが远加され、クむックゞャンプリストに必芁なアむテムのリストが管理されたす。

2必芁なすべおのデヌタ構造ずコンテンツタむプが自動的に生成されたす。



少し時間がかかりたしたが、コヌドを芋るだけでなく、CMS内でどのように機胜するかを理解するために、すべおをできるだけ詳现に説明しようずしたした。 次の郚分より小さくなりたすでは、レむアりト、りィゞェットの動䜜、サむトペヌゞでのコンテンツの衚瀺方法、移行の実際の動䜜に぀いお説明したす。

完党な゜ヌスコヌドもちろん2番目の蚘事のコヌドを含むは、 BitBucketにありたす。 それはあたりきれいではありたせん、それは私の投げず怜玢の倚くを反映しおいたす、そしお私はただリファクタリングに気を取られおいたせん-なぜなら 勉匷するためにすべおをしたした。



PS「それはなんお耇雑なのか」ず結論付ける必芁はありたせん。プロゞェクト構造の䜜成は単玔に十分に自動化されおいたせんが、将来はこれらすべおを迅速か぀簡単に行えるこずを願っおいたすが、内郚を知るこずは䟝然ずしお有甚です

参照資料



[1] Articles Architecture Orchard CMS。 セキュリティず開発の抂念 、 Orchard CMSアヌキテクチャ。 レむアりトの抂念 、 オヌチャヌドCMSアヌキテクチャ。 基本的な抂念

[2] 公匏りェブサむトの果暹園セクションの拡匵

[3] MSDNのピン留めサむト

[4] kichikの 蚘事の ピン留めサむト

[5] Orchard CMSを䜿甚しおれロからサむトを䜜成する方法。 パヌト1.オヌチャヌドCMSの抂芁

[6] MVC 3「远加| 衚瀺...”オヌチャヌドコヌド生成モゞュヌルプロゞェクトぞ



All Articles