10月のCMS甚のカスタムプラグむンの䜜成

10月のCMSずその機胜のレビュヌを続けおいたす。私たちLOVATAはこのシステムを6幎間䜿甚しおおり、この間、その人気の高たりは絶察に倀するものであるず確信しおいたす。



今日、私たちは別の蚘事の翻蚳を準備したした。今回はAndriyHaydashによるものです。この蚘事は、プラグむンを介しおカスタム機胜を䜜成するこずに぀いおです。10月のCMSずWordPressの比范に関する前回の蚘事はここにありたす。




オブゞェクト指向で読みやすいコヌドを曞くのが奜きなら、この蚘事はあなたのためです。独自のプラグむンを䜜成する方法ず、10月が次のプロゞェクトに適しおいる理由を孊びたす。



昚幎、私は新しいPHPベヌスのCMSに぀いお少し調査を行い、優れたWordPressの代替手段を探したした。理想的には、最新のコヌドベヌスを備えたオヌプン゜ヌス゜リュヌションである必芁がありたす。



それから私は10月のCMSに興味を持っおいたした。私はそれを詊したした、そしお私はそれをほずんどすぐに奜きでした。 10月は優れたコヌド構造を持ち、独自のプラグむンを簡単に䜜成できたす。



この蚘事の目的は、プラットフォヌムを䜿甚する前に、プラットフォヌムずは䜕か、プラットフォヌムから䜕を期埅できるかを理解するのに圹立぀こずです。



CMSプラットフォヌムずしお10月を遞ぶ理由は䜕ですか



プロゞェクトに10月を䜿甚するこずにした䞻な理由はいく぀かありたす。



Laravelフレヌムワヌクに曞かれおいたす



10月CMSは、最新のWebアプリケヌションを構築するための最も匷力なPHPフレヌムワヌクであるLaravelの䞊に構築されおいたす。圌は最高だず断蚀できたす。フレヌムワヌクは非垞に䜿いやすく、非垞に理解しやすいです。さらに、ルヌティングルヌティング、オブゞェクトリレヌショナルマッピングORM、承認、キャッシングなど、最新のフレヌムワヌクに必芁なすべおの機胜を備えおおり、Model-View-Controllerの抂念に埓っおわかりやすい構造を提䟛したす。10月のCMSはLaravelフレヌムワヌクで蚘述されおいるため、これらすべおの機胜を「兄貎」から継承したした。



クリヌンなコヌドずドキュメント



他の倚くのCMSずは異なり、Octoberには、オブゞェクト指向のパラダむムを䜿甚しお蚘述された、非垞にクリヌンで十分に文曞化されたコヌドベヌスがありたす。



叀き良きPHPの代わりに、Octoberはテンプレヌト蚀語ずしおTwigを䜿甚し、開発者の仕事を容易にしたす。技術文曞もよく曞かれおおり、ほずんどの質問にすばやく答えるこずができたす。



玠晎らしいコミュニティ



10月のコミュニティはただ小さいですが、その人々は芪切で芪切です。参加できるSlackチャネルがあり、開発者はコミュニティがDiscordに移行する際の問題の解決を喜んでお手䌝いしたす。



倧芏暡な垂堎



WordPressや他のCMSず同様に、10月にはテヌマずプラグむンのマヌケットプレむスがありたす。良いテヌマの遞択肢はそれほど倚くありたせんが、700以䞊のプラグむンがありたす2020幎6月の時点で、900以䞊のプラグむンが公開され、玄200のテヌマがありたす-箄Transl。、したがっお、1぀を怜玢しおむンストヌルするだけで機胜を拡匵できる可胜性がありたすそのうちの。プラグむンの特城は、管理領域にプロゞェクトIDを远加するだけで、すべおのプロゞェクト間で簡単に同期できるこずです。



プラグむンずコンポヌネント



プラグむンは、10月のCMSに新機胜を远加するための基瀎です。プラグむンは、カスタムコンポヌネント、モデルの登録、デヌタベヌス構造の曎新、たたは翻蚳の远加を担圓する耇数のファむルずディレクトリで構成できたす。プラグむンは通垞、plugins /ディレクトリのプロゞェクトで䜜成されたす。倚くのプラグむンは他の人が䜿甚できるようにマヌケットプレむスに远加されるため、各プラグむンには独自の名前名が必芁です。名前は通垞、プラグむンを䜜成した䌚瀟たたは開発者の名前で始たりたす。したがっお、たずえば、名前がAcmeで、Blogずいう優れたプラグむンを䜜成した堎合、プラグむンはAcme \ Blogずいう名前になりたす。



プラグむンディレクトリ構造がどのように芋えるかを瀺したしょう。



画像



ご芧のずおり、10月のCMSにプラグむンずそのすべおのコンポヌネントを登録するためのplugin.phpずいうファむルがありたす。



プラグむンを実行するために、䞊蚘のすべおのディレクトリが必芁なわけではないこずに泚意しおください。プラグむンは次の構造を持ち、それでもうたく



画像



機胜したす。倚くの堎合、1぀のプラグむンは1぀の機胜しか远加したせん。たずえば、Translateプラグむンは、サむトのコンテンツをさたざたな蚀語に翻蚳し、倚蚀語のナヌザヌサポヌトを提䟛できるように蚭蚈されおいたす。



10月CMSには、必芁なものすべおを芋぀けるこずができる倧きな垂堎がありたす。



画像



Wordpressやその他の䞀般的なCMSずは異なり、Octoberプラグむンにはコンポヌネントを含めるこずができたす。 10月のドキュメントによるず、コンポヌネントは「任意のペヌゞ、郚分、たたはレむアりトに添付できるカスタムモゞュヌル」です。たずえば、フィヌドバックフォヌム、ナビゲヌション、FAQよくある質問ずその回答のリスト。実際、耇数のペヌゞで再利甚できる1぀のモゞュヌルに組み合わせるのが論理的であるすべおのもの。



コンポヌネントはプラグむンの䞀郚ずしお䜜成され、components /サブディレクトリにありたす。



画像



各コンポヌネントには、コンポヌネントを定矩するcomponentName.phpなどのPHPファむルず、オプションのサブディレクトリがありたす。パヌシャル甚。コンポヌネントのpartialsフォルダヌには、コンポヌネント自䜓ず同じ小文字の名前を付ける必芁がありたす。



コンポヌネントがどのように機胜するかを理解するために、コンポヌネントがブログ投皿の衚瀺を担圓しおいるず仮定したしょう。



namespace Acme\Blog\Components;
 
class BlogPosts extends \Cms\Classes\ComponentBase
{
    public function componentDetails()
    {
        return [
            'name' => 'Blog Posts',
            'description' => 'Displays a collection of blog posts.'
        ];
    }
 
    // This array becomes available on the page as {{ component.posts }}
    public function posts()
    {
        return ['First Post', 'Second Post', 'Third Post'];
    }
} 


ご芧のずおり、コンポヌネントには2぀の䞻芁な機胜がありたす。最初のcomponentDetailsは、Webペヌゞにコンポヌネントを远加しお䜿甚する管理者にコンポヌネントに関する情報を提䟛したす。2番目の関数postsは空の投皿を返し、次のようにコンポヌネントパヌツblogposts / default.htmファむル内で䜿甚できたす。



url = "/blog"
 
[blogPosts]
==
{% for post in blogPosts.posts %}
    {{ post }}
{% endfor %}


10月のCMSにコンポヌネントが存圚するこずを知らせるには、registerComponents関数内のメむンプラグむンファむルを䜿甚しおコンポヌネントを登録する必芁がありたす。



public function registerComponents()
{
    return [
        'October\Demo\Components\Todo' => 'demoTodo'
    ];
}<


お問い合わせフォヌムプラグむンの䜜成方法



フィヌドバックフォヌムを䜜成するためのプラグむンを䜜成したす。これがどのように機胜するかです



  • フォヌムには、名、姓、電子メヌルアドレス、メッセヌゞのフィヌルドが含たれたす。
  • デヌタはAjaxを䜿甚しおサヌバヌに送信されたす。
  • デヌタを送信するず、管理者はナヌザヌが送信したメッセヌゞが蚘茉された電子メヌルを受信したす。この蚘事では、 10月のCMSのクリヌンむンストヌルを䜿甚したす。


画像



プラグむン構造を生成 するタヌミナルでコマンドを実行しお、プラグむンの構築を始めたしょう。



php artisan create:plugin progmatiq.contactform 


画像



progmatiq.contactform匕数には、䜜成者の名前progmatiqずプラグむンの名前contactformが含たれおいたす。



画像



次に、plugin.phpファむルを開き、次の方法でプラグむン情報を倉曎する必芁がありたす。



public function pluginDetails()
   {
        return [
            'name'        => 'Contact Form',
            'description' => 'A simple contact form plug-in',
            'author'      => 'progmatiq',
            'icon'        => 'icon-leaf'
        ];
    }


確認する䟡倀のある他のいく぀かの方法を次に瀺したす。



  • registerComponents

    ここで、プラグむンが提䟛するコンポヌネントの配列を定矩できたす。
  • registerPermissions

    カスタム暩限を登録しお、アプリケヌションの他の領域で䜿甚できたす。
  • registerNavigationカスタムURLメニュヌ項目を管理メニュヌに

    远加できたす。


ContactFormコンポヌネントを䜜成したしょう



  • プラグむンのルヌトディレクトリに新しいコンポヌネント/フォルダを䜜成したす。
  • components /ディレクトリにcontactForm.phpファむルを䜜成したす。


画像



  • 次のコヌドを貌り付けお、コンポヌネントが䜕をしおいるかを10月に䌝えたす。これを行うには、コンポヌネント内にcomponentDetailsメ゜ッドを䜜成したす。


<?php

namespace Progmatiq\Contactform\Components;

use Cms\Classes\ComponentBase;

class ContactForm extends ComponentBase
{
    public function componentDetails()
    {
        return [
            'name' => 'Contact Form',
            'description' => 'A simple contact form'
        ];
    }
}


次に、プラグむン内にコンポヌネントを登録する必芁がありたす。これを行うには、registerComponentsメ゜ッドを倉曎したす。



public function registerComponents()
    {
        return [
            'Progmatiq\Contactform\Components\ContactForm' => 'contactForm',
        ];
    }


この関数は、プラグむンが提䟛するコンポヌネントの配列を返したす。コンポヌネントクラスの完党修食名がこのメ゜ッドのキヌであり、倀はTwigテンプレヌトでコンポヌネントを参照するために䜿甚する゚むリアスです。



コンポヌネントを登録したら、新しい連絡先ペヌゞを䜜成しおコンポヌネントを远加できたすステップ番号はスクリヌンショットの図ず同じです。



  1. 管理パネルで、CMS1>ペヌゞ2に移動し、+远加3をクリックしたす。
  2. ペヌゞに名前ずURLを付けたす4。
  3. ファむルに名前を付け5、デフォルトのレむアりトを遞択したす6。


画像



新しいコンポヌネントをペヌゞに远加したしょう。



  1. 巊偎のメニュヌ1で[コンポヌネント]をクリックし、お問い合わせフォヌムコンポヌネントを遞択したす。それ2をクリックするず、ペヌゞに远加されたす。
  2. ペヌゞにタむトルを远加するコヌドを配眮し、Twigディレクティブ{component'contactForm '}を䜿甚しおコンポヌネントをレンダリングする必芁がありたす。


<div class="container">
    <h1> Contact </h1>
    {% component 'contactForm' %}
</dіv>


画像



ここで連絡先ペヌゞを開くず、「連絡先」ずいうヘッダヌ以倖は䜕も衚瀺されたせん。



画像



問題は、フォヌムに衚瀺するHTMLがないずいうこずです。



components /フォルダヌにcontactform / default.htmファむルを䜜成する必芁がありたす。



画像



たた、次のHTMLをファむルに远加する必芁がありたす。



<form method="POST" 
    data-request="onSend"
    data-request-validate
    data-request-success="this.reset(); alert('Thank you for submitting your inquiry')"
>
    <div>
        
        <label for="first_name">First Name</label>
        <input type="text" name="first_name" class="form-control">
        <p data-validate-for="first_name" class="text-danger"></p> 
    </div>
 
    <div>
        <label for="last_name">Last Name</label>
        <input type="text" name="last_name" class="form-control">
 
        <p data-validate-for="last_name" class="text-danger"></p> 
    </div>
 
    <div>
        <label for="email">Email</label>
        <input type="text" name="email" class="form-control">
        <p data-validate-for="email" class="text-danger"></p> 
    </div>
 
    <div>
        <label for="content">Content</label>
        <textarea rows="6" cols="20" name="content" class="form-control"></textarea>
        <p data-validate-for="content"  class="text-danger"></p> 
    </div>
 
    <div>
        <button type="submit" class="btn btn-primary" data-attach-loading>Send</button>
    </div>
</form>


ほずんどのコヌドは非垞に単玔です。ただし、10月に䜿甚できる特別なデヌタ-*属性がありたす



。タグには3぀の特別な属性がありたす。



data-request="onSend"


この属性は、フォヌムがAjaxを䜿甚しお送信されたずきに、コンポヌネント次に䜜成するのonSend関数を呌び出す必芁があるこずを10月に通知したす。



data-request-validate


フォヌムが無効な堎合にサヌバヌから送信される゚ラヌを䜿甚しお、Ajaxを介したフォヌム怜蚌を有効にしたす。



data-request-success="this.reset(); alert('Thank you for submitting your inquiry')"


フォヌムをクリアし、リク゚ストが成功し、怜蚌たたはサヌバヌ゚ラヌがなかった堎合は、メッセヌゞを発行したす。



各入力には次のブロックがあり、特定の入力に察しおサヌバヌから返された怜蚌゚ラヌを衚瀺したす。



<p data-validate-for="content"  class="text-danger"></p>


送信ボタンにはdata-attach-loading属性があり、サヌバヌが芁求を凊理しおいる間、スピナヌを远加しおボタンを無効にしたす。これは、前のリク゚ストが凊理されるたで、ナヌザヌがフォヌムを再床送信できないようにするためです。



これが私たちのペヌゞの珟圚の倖芳です



画像



。contactForm.phpコンポヌネントに戻り、フォヌムの送信を担圓するonSendおよびvalidateヘルパヌメ゜ッドを䜜成したしょう。



public function onSend()
    {
        // Get request data
        $data = \Input::only([
            'first_name',
            'last_name',
            'email',
            'content'
        ]);
 
        // Validate request
        $this->validate($data);
 
        // Send email
        $receiver = 'admin@gmail.com';
 
        \Mail::send('progmatiq.contact::contact', $data, function ($message) use ($receiver) {
            $message->to($receiver);
        });
    }
 
    protected function validate(array $data) 
    {
        // Validate request
        $rules = [
            'first_name' => 'required|min:3|max:255',
            'last_name' => 'required|min:3|max:255',
            'email' => 'required|email',
            'content' => 'required',
        ];
 
        $validator = \Validator::make($data, $rules);
 
        if ($validator->fails()) {
            throw new ValidationException($validator);
        }
    }


最初に行うこずは、リク゚ストからデヌタを取埗し、validateヘルパヌメ゜ッドを䜿甚しお怜蚌するこずです。䜿甚できるすべおの利甚可胜な怜蚌ルヌルは、ドキュメントに蚘茉されおいたす。怜蚌が倱敗した堎合、validateメ゜ッドはValidationExceptionをスロヌしたす-コヌドの実行は停止し、サヌバヌは406ステヌタスコヌドず怜蚌倱敗メッセヌゞを発行したす。



怜蚌が成功するず、管理者にメヌルを送信したす。



泚簡単にするために、リク゚ストの送信先のメヌルはadmin@gmail.comであるず想定したした。必ず自分のメヌルアドレスを䜿甚しおください。



contactForm.phpプラグむンの完党なコヌドは次のずおりです。



<?php
 
namespace Progmatiq\Contactform\Components;
 
use Cms\Classes\ComponentBase;
use October\Rain\Exception\ValidationException;
 
class ContactForm extends ComponentBase
{
    public function componentDetails()
    {
        return [
            'name' => 'Contact Form',
            'description' => 'A simple contact form'
        ];
    }
 
    public function onSend()
    {
        // Get request data
        $data = \Input::only([
            'first_name',
            'last_name',
            'email',
            'content'
        ]);
 
        // Validate request
        $this->validate($data);
 
        // Send email
        $receiver = 'admin@gmail.com';
 
        \Mail::send('progmatiq.contact::contact', $data, function ($message) use ($receiver) {
            $message->to($receiver);
        });
    }
 
    protected function validate(array $data) 
    {
        // Validate request
        $rules = [
            'first_name' => 'required|min:3|max:255',
            'last_name' => 'required|min:3|max:255',
            'email' => 'required|email',
            'content' => 'required',
        ];
 
        $validator = \Validator::make($data, $rules);
 
        if ($validator->fails()) {
            throw new ValidationException($validator);
        }
    }
}


ご芧のずおり、Mail :: send関数が取る最初の匕数は、メッセヌゞの本文に衚瀺される電子メヌルテンプレヌトの名前です。管理パネルで䜜成する必芁がありたす。[蚭定]> [メヌルテンプレヌト]に移動し、[新しいテンプレヌト]ボタンをクリックしたす。次に、䞋の画面に瀺すようにフォヌムに入力したす。



画像



䜿甚するメヌルの本文は次のずおりです。



新しい連絡先の問い合わせを受け取りたした



**名**

{{first_name}}

***

**姓**

{{last_name}}

***

**メヌル**

{{email}}

** *

**メッセヌゞ**

{{content}}

***


次に、メヌルテンプレヌトを保存したす。次に行う必芁があるのは、電子メヌルを送信するSMTPサヌバヌをセットアップするこずです。[蚭定]> [メヌル蚭定]に



移動し、すべおの蚭定を入力したす。 もちろん、蚭定を共有するこずはありたせん。独自の蚭定を䜿甚しおください。 この段階で、フィヌドバックフォヌムコンポヌネントのテストを開始する準備が敎いたした。 たず、[コンテンツ]フィヌルドを空癜のたたにしお、無効な電子メヌルアドレスを入力したずきに、怜蚌が機胜しおいるかどうかをテストしたしょう。怜蚌は 期埅どおりに機胜したす。次に、正しい詳现を入力しお、メヌルが管理者に正垞に送信されるかどうかを確認したしょう。 admin@gmail.comが受信するメヌルは次のずおりです。



画像















画像











画像



フォヌムを正垞に送信するず、察応するメッセヌゞが衚瀺されたす。



画像



出力



この蚘事では、プラグむンずコンポヌネントが䜕であるかを調べ、10月のCMSでそれらを䜿甚する方法を理解したした。



ニヌズに合った既存のプラグむンが芋぀からない堎合は、プロゞェクト甚に独自のプラグむンを䜜成するこずを恐れないでください。それはそれほど難しいこずではなく、い぀でも完党に制埡、曎新、拡匵するこずができたす。今日行ったような単玔な連絡フォヌムのプラグむンを䜜成するこずでさえ、埌でMailchimpやHubSpotなどの他のサヌビスず統合したい堎合に圹立ちたす。



この蚘事がお圹に立おば幞いです。ご䞍明な点がございたしたら、コメント欄でお気軜にお問い合わせください。



All Articles