# アドオンの管理プロセス

## アドオンのリストを作成する

アドオンのリストは、CS-Cartの管理パネルの`アドオン`→`アドオン管理`で利用できます。\
以下はこのアドオンのリストの作成手順です。

1. アドオンの予備リストが作成されます。この時点では、\_app/addons\_のサブフォルダーはアドオンとみなされます。
2. すべてのフォルダーから \_app/addons/\[アドオンID]/addon.xml\_をロードしようと試みます。\
   `addon.xml`をロードまたは解析できなかった場合、アドオンは無視されます。`addon.xml`のXML解析エラーはエラー通知に表示されます。
3. アドオンの名称が取得されます。`addon.xml`のスキームversion3.0を使用している場合、アドオンの名前は\_var/langs/ \[言語コード]/addons/\[アドオンID].po\_から取得されます。
4. インストール済みのアドオンのデータは、データベースから取得されリストに追加されます。そのため、アドオンが既にインストールされている場合は、その名前と説明は変更されません。

## アドオンのインストール時

1. データベースの`?:addons`テーブルは、アドオンの登録が無いことを確認するためにチェックされてます。
2. アドオンのスキーマーは`addon.xml`からロードされます。
3. アドオンが`unmanaged`としてマークされている場合、管理パネルのアドオンリストには表示されません。コンソール経由でのみインストールすることが出来ます。
4. アドオンのクラスの自動読み込みを有効にするには、アドオンのフォルダーを`Tygh::$app['class_loader']`に追加します。
5. アドオンの互換性がチェックされます。

{% hint style="info" %}
HINT

アドオンがサーバー環境またはCS-Cartのバージョンと互換性がない場合、エラーが表示され、インストールが中止されます。
{% endhint %}

6. 他のアドオンへの依存関係がチェックされます。

{% hint style="info" %}
HINT

この時点では、競合するアドオンはチェックされず、アドオンの有効化の際にチェックが行われます。
{% endhint %}

7. `addon.xml`の`<functions>`セクションの関数`for="before_install`が実行されます。

{% hint style="info" %}
HINT

関数の実行の結果、データベースエラーが発生した場合、アドオンのインストールは中止され、アドオンはアンインストールされます。
{% endhint %}

8. `Registry::set('addons.' . $addon)`にエントリが作成されます。`disabled`ステータスとアドオンの優先順位は、そこに記録されています。
9. `addon.xml`の`<queries>`セクションの`for="install`からクエリが実行されます。

{% hint style="info" %}
HINT

データベースエラーが発生した場合、アドオンのインストールは中止され、アドオンはアンインストールされます。
{% endhint %}

10. `addon.xml`の`<settings>`セクションで指定されたアドオンの設定がデータベースに作成されます。

{% hint style="info" %}
HINT

データベースエラーが発生した場合、アドオンのインストールは中止され、アドオンはアンインストールされます。
{% endhint %}

11. `?:addons`および`?:addon_descriptions`テーブルにエントリが作成されます。この時点ではアドオンのステータスは無効の状態です。
12. POファイルから言語変数がインストールされます。
13. テンプレートファイルが *var/themes\_repository* から *design/themes* にコピーされます。
14. アドオンの設定値は`Registry::set('addons.' . $addon)`と`Registry::set('settings.' . $addon, $settings)`に記録されます。
15. 英語の言語変数は`?:original_values`テーブルに保存されます。
16. 商品タブは`[theme名] /templates/addons/[アドオンID]/blocks/product_tabs`からインストールされます。
17. `addon.xml`の`<functions>`セクションの`for="install`に記述された関数が実行されます。

{% hint style="info" %}
HINT

データベースエラーが発生した場合、アドオンのインストールは中止され、アドオンはアンインストールされます。
{% endhint %}

18. `addon.xml`の`<status>`セクションが`active`である場合、アドオンは直ちに有効化されます。

{% hint style="info" %}
HINT

アドオンのアクティベーションが中止されても、インストールは続行されます。ただし、その場合、アドオンはデフォルトで無効のままになります。
{% endhint %}

19. `app/addons/[アドオンID]/layouts.xml`からレイアウトがインポートされます。
20. キャッシュが削除されます。
21. デモデータがインストールされます。アドオンがCS-Cartのインストールと同時にインストールされ、\[デモデータをインストール]のチェックボックスがオンになっている場合にのみ実行されます。

{% hint style="info" %}
HINT

デモデータのインストールは、アドオンのインストールとは別のプロセスです。デモデータのインストールが失敗した場合、アドオンのインストールは中止されません。
{% endhint %}

## アドオンのアンインストール時

1. アドオンが`unmanaged`としてマークされている場合、管理パネルのアドオンリストには表示されません。コンソール経由でのみアンインストールが可能です。
2. アンインストールするアドオンの動作に必要な他のアドオンを見つけるためのチェックが実行されます。該当するアドオンが見つかった場合、アンインストール手順は中止され、メッセージが表示されます。

{% hint style="warning" %}
警告

次のアドオンがインストールされてないため、このアドオンをアンインストールできません：\[対象のアドオン名]。
{% endhint %}

3. `addon.xml`の`<functions>`セクションに書かれている`for="uninstall"`の関数が実行されます。
4. `?:addons`テーブルと`?:addon_descriptions`テーブルからアドオンのエントリー削除されます。
5. アドオンの設定が削除されます。
6. アドオンの言語変数が削除されます。
7. `addon.xml`の`<queries>`セクションの`for="uninstall"`に書かれているクエリが実行されます。
8. アドオンの製品タブが削除されます。
9. アドオンのテンプレートが `design/themes` から削除されます。
10. アドオンのレイアウトが元に戻ります。
11. `Registry::get('addons.' . $addon_name)` は削除されます。
12. アドオンが使用していたHookが`Registry::get('hooks')`（登録済みのHookリスト）から削除されます。
13. キャッシュが削除されます。

## アドオンの有効化時

1. アドオンのスキーマーは`addon.xml`からロードされます。
2. アドオンが`unmanaged`としてマークされている場合、管理パネルのアドオンリストには表示されません。コンソール経由でのみう有効化できます。
3. 次のフックポイントの関数が実行されます。

```php
<?php
fn_set_hook('update_addon_status_pre', $addon, $status, $show_notification, $on_install, $allow_unmanaged, $old_status, $scheme);
```

4. すべての有効化されているアドオンがチェックされ、アドオンがそれらのいずれかの競合として定義されているかどうかが確認されます。

{% hint style="info" %}
HINT

競合するアドオンが見つかった場合、警告が表示され、アクティベーションは中止されます。
{% endhint %}

5. 以下の関数が存在するか確認されます。

```php
<?php
fn_settings_actions_addons_[アドオンID](){}
```

関数が存在する場合、次の引数で呼び出されます。\
`($new_status, $old_status, $on_install)`

6. このアドオンの競合として定義されているアドオンが、すべて無効になっているかどうか確認されます。

{% hint style="info" %}
HINT

競合するアドオンが有効化されている場合、警告が表示され、アクティベーションは中止されます。
{% endhint %}

7. `?:addons`テーブルの当アドオンの`status`フィールドの値がAに変更されます。
8. 以下の関数が存在するかどうかを確認するためにチェックが実行されます。

```php
<?php
fn_settings_actions_addons_post_[アドオンID](){}
```

関数が存在する場合、次の引数でこの関数が呼び出されます：`($new_status)`

9. 商品タブのステータスが更新されます：アドオンの`product_tabs`は有効のまま。
10. このアドオンのステータス`A`は`Registry::set('addons.[アドオンID].status')`に記録されます。

## アドオンの無効時

1. アドオンのスキーマーは`addon.xml`からロードされます。
2. アドオンが`unmanaged`としてマークされている場合、管理パネルのアドオンリストには表示されません。コンソール経由でのみ無効化できます。
3. 次のフックポイントの関数が実行されます。

```php
<?php
fn_set_hook('update_addon_status_pre', $addon, $status, $show_notification, $on_install, $allow_unmanaged, $old_status, $scheme);
```

4. 以下の関数が存在するかどうかを確認するためにチェックが実行されます。

```php
<?php
fn_settings_actions_addons_[アドオンID](){}
```

関数が存在する場合、次の引数で関数が呼び出されます。\
`($new_status, $old_status, $on_install)`

5. `?:addons`テーブル内の当アドオンの`status`フィールドの値が`D`に変更されます。
6. 以下の関数が存在するかどうかを確認するためにチェックが実行されます。

```php
<?php
  fn_settings_actions_addons_post_[アドオンID](){}
```

関数が存在する場合、次の引数で呼び出されます。`($new_status)`

7. 商品タブのステータスが更新されます。アドオンの`product_tabs`が無効になります。
8. `Registry::set('addons.[アドオンID].status')`にステータス`D`がセットされます。
