__assets/basercms4.sql
より対象のテーブルの create 文と、 insert 文を探し、phpMyAdmin 等で、スキーマを作成し、データを投入します。
その際、ファイルの下の方に、Primary Key の作成と、auto increment の設定文があるのでそちらも忘れないように実行します。
ALTER TABLE `blog_categories`
ADD PRIMARY KEY (`id`);
ALTER TABLE `blog_posts`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
データベースのデータを元にマイグレーションファイルを作成します。
bin/cake bake migration_diff CreateTableName --plugin PluginName
bin/cake bake seed --data TableName --plugin PluginName
※ TableName、PluginName は任意の名称にします。
上記コマンド例の「CreateTableName」の部分は、作成するマイグレーションファイルの名称となりますが、
マイグレーションファイルは、1テーブル1つ作成するようにしてください。
なお、マイグレーションファイルの命名規則は次のとおりです。
【命名規則】
参考: データベースにおける注意点
対象データ用の Entityを作成します。
baserCMS4の Model は、Table へと移行します。とりあえずエラーが出なくなるようにするところまで調整していきます。
参考: モデルにおける注意点
/Model/Table/_NotYetMigratedに対象クラスがないか確認します。あれば Table直下に移動します。
バリデーションは、validationDefault
メソッドにて再定義します。
なお、独自バリデーションが存在する場合は、バリデーションクラスとして実装します。
次のようなファイル名として配置してください。テストも書きます。
/Model/Talbe/Validation/EntityNameValidation.php
validationDefault
メソッドにて次のコードを定義することで利用できます。
$validator->setProvider('entityName', 'BaserCore\Model\Validation\EntityNameValidation');
メソッドが対象テーブルのみについての処理でない場合、Serviceクラスへの移行を検討します。
移行する場合は、フォルダ内検索などで、メソッドの利用箇所の確認を行い、そちらのコードの変更も行います。
/TestCase/Model/Table/_NotYetMigrated
に対象クラスがないか確認します。あれば、Table直下に移動します。
Fixtureは、/Fixture/Default
内のものをFixtureフォルダ直下に配置して移行します。
クラス名は単数形から複数形に変更してください。
また、import プロパティを定義します。
public $import = ['table' => 'sites'];
Serviceクラスでは、まず、基本的なメソッドとテストを作成します。
参考: アーキテクチャー設計方針
先に Interface を作成します。
初期値データ取得、単一データ取得、一覧データ取得、リストデータ取得、登録、更新、削除などの基本的なDB操作を実装する場合は、CrudBaseServiceInterface
を継承します。
CrudBaseInterface
を継承したインターフェイスを利用する場合、定義された次の基本的なメソッドとテストを作成します。その上で必要に応じて他のユースケースとなるメソッドをを追加します。
\BaserCore\ServiceProvider\BcServiceProvider
にて利用するサービスの定義を追加します。
プラグインの場合は、{PluginName}\ServiceProvider\{PluginName}ServiceProvider
に定義し、
{PluginName}\Plugin
にてサービスプロバイダの追加を行います。
public function services(ContainerInterface $container): void
{
$container->addServiceProvider(new BcSearchIndexServiceProvider());
}
Web API として基本的なメソッドとテストを作成します。
DIコンテナで Service クラスを注入して作成します。
DIコンテナで Service クラスを注入し実装し、テストを作成します。
必要があれば処理を Serviceに移行し、ビューが正常に表示できるようにします。
参考: コントローラーにおける注意点
postリクエストの判定を $this->request->is('post')
に変更します。
$this->setTitle()
/ $this->setHelp()
/ $this->setSearch()
を テンプレートファイルに移行します。
BcAdminHelper経由でテンプレートファイルの冒頭に配置します。
$this->BcAdmin->setTitle();
$this->BcAdmin->setHelp();
$this->BcAdmin->setSearch();
参考: ビューにおける注意点
参考: ヘルパーにおける注意点
管理画面の共通のヘルパは BcAdminAppView
に定義することになりました。
新しいプラグインの場合は、{PluginName}AdminAppView
として新たに View クラスを作成します。
新しい View クラスを読み込むには、{PluginName}AdminAppController
を作成し、beforeRender
にて、setClassName()
で指定します。
// 例
public function beforeRender(EventInterface $event): void
{
parent::beforeRender($event);
if (isset($this->RequestHandler) && $this->RequestHandler->prefers('json')) return;
if ($this->getName() === 'Preview') return;
$this->viewBuilder()->setClassName('BcBlog.BlogAdminApp');
}
一覧でのAjax呼び出しは廃止になりました。次のような Javascript は削除します。
$this->BcBaser->js([
'admin/libs/jquery.baser_ajax_data_list',
'admin/libs/jquery.baser_ajax_batch',
'admin/libs/baser_ajax_data_list_config',
'admin/libs/baser_ajax_batch_config'
]);
<script type="text/javascript">
$(function () {
$.baserAjaxDataList.init();
$.baserAjaxBatch.init({url: $("#AjaxBatchUrl").html()});
});
</script>
エディタの正規表現付きの置換機能で置き換えます。
例)
`/\$site\['.+?'\]\['(.+?)'\]/` → `\$site->$1`
エレメントの読み込みパスについてモデル名をアッパーキャメルケースに変更します。
sites/index → Sites/index
ブラウザバリデーションを無効にするため、BcAdminForm::create() の 第2引数に ['novalidate' => true]
を追加します。
$this->BcAdminForm->control($entity, ['novalidate' => true]);
フォームコントロールにおいてクラス名は不要となりました。フィールド名だけに変更します。
$this->BcAdminForm->control('field_name');
テンプレート内の処理において、プログラムの処理はできるだけ冒頭にまとめ、可能であれば、ヘルパー化します。
ヘルパーは、 BcAdmin{EntityName}Helper
として作成し、適宜、必要があれば BcContainerTrait
を利用してサービスクラスを利用します。
メソッドを作成する際、サービスクラスのメソッドの完全なるラッパーメソッドで、シグネチャが全く同じ場合は、テストは書きません。
フォームコントロールのID属性が、キャメルケースからハイフン区切りになっているので、それに伴いJavascript側のコードの変更を行います。
参考: BcAdminThirdの開発
/plugins/baser-core/config/setting.php
の BcApp.adminNavigation
を編集してメニューを表示します。