オープンソースのCRM EspoCRM用の新しいモジュールを作成する

画像 この記事では、このシステム用の新しいモジュールを作成する例を使用して、非常に興味深いオープンソース(GPL3)EspoCRMプロジェクトのアーキテクチャを読者に紹介したいと思います。

CRMシステム(顧客関係管理)とは、多くの人が長い間知っていると思います。 このCRMシステムの特徴は、単一ページアプリケーションとして記述されているため、非常に「機敏」であることです。

シンプルなデザインと最新のプログラミング技術は多くの人にアピールし、このCRMシステムのパフォーマンスはあなたを驚かせるでしょう。 デモ版はサイトで入手できます。

ローカルストレージ内のスクリプトとテンプレートのキャッシュは、高速化に役立ちました。 すべてのビューとその子は、1つの大きなHTMLにまとめられ、ユーザーが画面に表示します。

システムにはJSONを使用する強力なAPIがあり、Webインターフェースは基本的にAPIクライアントです。

システムには機能が過剰に搭載されていませんが、必要なものはすべて揃っており、適切に構成されています。





新しいモジュールを作成する



まず、新しいモジュールの作業ディレクトリを作成し(これがモジュールパッケージになります)、 application/Espo/Modules



配置する必要がありapplication/Espo/Modules





 application/Espo/Modules/PM
      
      





モジュールのディレクトリ構造は次のようになります。

 application/Espo/Modules/PM/Controllers/ application/Espo/Modules/PM/Entities/ application/Espo/Modules/PM/Resources/
      
      







メタデータの説明



PMを開発する場合、ProjectとProjectTaskの2つのエンティティを記述する必要があります。 これを行うには、次の内容の2つのJSONファイルを作成します。



アプリケーション/ Espo /モジュール/ PM /リソース/メタデータ/スコープ/ Project.json
 { "entity": true, "layouts": true, "tab": true, "acl": true, "module": "PM", "customizable": true, "stream": true, "importable": true }
      
      









アプリケーション/ Espo /モジュール/ PM /リソース/メタデータ/スコープ/ ProjectTask.json
 { "entity": true, "layouts": true, "tab": false, "acl": true, "module": "PM", "customizable": true, "stream": true, "importable": true }
      
      









その後、 entityDefs



のメタデータでエンティティのフィールドと関係を記述する必要があります。



アプリケーション/ Espo /モジュール/ PM /リソース/メタデータ/ entityDefs / Project.json
 { "fields": { "name": { "type": "varchar", "required": true }, "status": { "type": "enum", "options": [ "Draft", "Active", "Completed", "On Hold", "Dropped" ], "default": "Active" }, "description": { "type": "text" }, "account": { "type": "link" }, "createdAt": { "type": "datetime", "readOnly": true }, "modifiedAt": { "type": "datetime", "readOnly": true }, "createdBy": { "type": "link", "readOnly": true }, "modifiedBy": { "type": "link", "readOnly": true }, "assignedUser": { "type": "link", "required": true }, "teams": { "type": "linkMultiple" } }, "links": { "createdBy": { "type": "belongsTo", "entity": "User" }, "modifiedBy": { "type": "belongsTo", "entity": "User" }, "assignedUser": { "type": "belongsTo", "entity": "User" }, "teams": { "type": "hasMany", "entity": "Team", "relationName": "EntityTeam" }, "account": { "type": "belongsTo", "entity": "Account", "foreign": "projects" }, "projectTasks": { "type": "hasMany", "entity": "ProjectTask", "foreign": "project" } }, "collection": { "sortBy": "createdAt", "asc": false, "boolFilters": [ "onlyMy" ] } }
      
      









アプリケーション/ Espo /モジュール/ PM /リソース/メタデータ/ entityDefs / ProjectTask.json
 { "fields": { "name": { "type": "varchar", "required": true }, "status": { "type": "enum", "options": [ "Not Started", "Started", "Completed", "Canceled" ], "default": "Not Started" }, "dateStart": { "type": "date" }, "dateEnd": { "type": "date" }, "estimatedEffort": { "type": "float" }, "actualDuration": { "type": "float" }, "description": { "type": "text" }, "project": { "type": "link" }, "createdAt": { "type": "datetime", "readOnly": true }, "modifiedAt": { "type": "datetime", "readOnly": true }, "createdBy": { "type": "link", "readOnly": true }, "modifiedBy": { "type": "link", "readOnly": true }, "assignedUser": { "type": "link", "required": true }, "teams": { "type": "linkMultiple" } }, "links": { "createdBy": { "type": "belongsTo", "entity": "User" }, "modifiedBy": { "type": "belongsTo", "entity": "User" }, "assignedUser": { "type": "belongsTo", "entity": "User" }, "teams": { "type": "hasMany", "entity": "Team", "relationName": "EntityTeam" }, "project": { "type": "belongsTo", "entity": "Project", "foreign": "projectTasks" } }, "collection": { "sortBy": "createdAt", "asc": false, "boolFilters": [ "onlyMy" ] } }
      
      









CRUDにコントローラーを使用することを示します。 ファイルはclientDefs



ディレクトリに配置されます。

アプリケーション/ Espo /モジュール/ PM /リソース/メタデータ/ clientDefs / Project.json
 { "controller": "Controllers.Record" }
      
      









アプリケーション/ Espo /モジュール/ PM /リソース/メタデータ/ clientDefs / ProjectTask.json
 { "controller": "Controllers.Record" }
      
      









クラスコントローラー



エンティティが機能するためには、そのコントローラを記述する必要があります。



アプリケーション/ Espo /モジュール/ PM /コントローラー/ Project.php
 <?php namespace Espo\Modules\PM\Controllers; class Project extends \Espo\Core\Controllers\Record { }
      
      









アプリケーション/ Espo /モジュール/ PM /コントローラー/ ProjectTask.php
 <?php namespace Espo\Modules\PM\Controllers; class ProjectTask extends \Espo\Core\Controllers\Record { }
      
      









エンティティクラス



コントローラーの定義に加えて、エンティティーのクラスも定義する必要があります。



アプリケーション/ Espo /モジュール/ PM /エンティティ/ Project.php
 <?php namespace Espo\Modules\PM\Entities; class Project extends \Espo\Core\ORM\Entity { }
      
      









アプリケーション/ Espo /モジュール/ PM /エンティティ/ ProjectTask.php
 <?php namespace Espo\Modules\PM\Entities; class ProjectTask extends \Espo\Core\ORM\Entity { }
      
      









ローカリゼーション(I18n)



グローバルローカリゼーションファイルGlobal.json



エンティティの名前を追加します。



アプリケーション/ Espo /モジュール/ PM /リソース/ i18n / en_US / Global.json
 { "scopeNames": { "Project": "Project", "ProjectTask": "Project Task" }, "scopeNamesPlural": { "Project": "Projects", "ProjectTask": "Project Tasks" } }
      
      









フィールド、ドロップダウンリスト、リンクなどを翻訳するには エンティティでは、個別のローカライズファイルを作成する必要があります。



アプリケーション/ Espo /モジュール/ PM /リソース/ i18n / en_US / Project.json
 { "labels": { "Create Project": "Create Project" }, "fields": { "name": "Name", "status": "Status", "account": "Account" }, "links": { "projectTasks": "Project Tasks" } }
      
      









アプリケーション/ Espo /モジュール/ PM /リソース/ i18n / en_US / ProjectTask.json
 { "labels": { "Create ProjectTask": "Create Project Task" }, "fields": { "name": "Name", "status": "Status", "project": "Project", "dateStart": "Date Start", "dateEnd": "Date End", "estimatedEffort": "Estimated Effort (hrs)", "actualDuration": "Actual Duration (hrs)" } }
      
      









最後のタッチ



上記のすべての手順が完了したら、管理者パネルに移動してシステム回復を実行し(メニュー->管理->再構築)、ページを更新します。

これで、プロジェクトモジュールはデフォルトで非表示になりました。 表示するには、管理者パネル(管理->ユーザーインターフェイス)に移動して表示します。 Field ManagerとLayout Managerを使用すると、新しいフィールドを簡単に追加し、データ表示の外観をカスタマイズできます。



私は本質的にプロジェクトとは何の関係もありません、私は満足しているユーザーです。 モジュールの作成プロセスは開発者によって記述され、彼らの同意を得て公開されます。 開発者と私は、あなたのすべての質問に答える準備ができています。



All Articles