MultiBlogImport
in package
uses
ImportTrait
基準ブログを起点に、複数 bin の yaml をマージして一括投入する。
「基準 bin (root) は既存の baseBlogId に投入、それ以外は baseBlogId 配下に 新規子 blog を作って投入」というユースケース専用。 単一 bin → 単一 blog のシンプルなインポートは Import を使う。
利用フロー
$multi = new MultiBlogImport(); $multi->run( bins: [ // 配列の最初のエントリが基準 bin。baseBlogId にそのまま投入される 'site' => ['yaml' => $rootYaml], // 2 番目以降は baseBlogId 配下に子 blog を新規作成して投入 'blog@site' => ['yaml' => $childYaml, 'blogCode' => 'blog', 'blogName' => 'ブログ'], 'news@site' => ['yaml' => $newsYaml, 'blogCode' => 'news', 'blogName' => 'ニュース'], ], baseBlogId: 1, userId: $adminUserId, blogDomain: 'example.com', );
動作の要点
- マージ段階で「同じ ID = 1 行」原則を保証:
全 bin yaml を 1 本にマージする際、
<table>_id重複は 先勝ちで除去。<table>_blog_idは各 bin の確定 blog_id に書き換える。 - 基準ブログのみ dropData を実行: 基準ブログは既存データを破壊リプレース。子ブログは新規作成するため drop 不要。
Table of Contents
Constants
- COMPOUND_PRIMARY_KEYS = ['tag' => ['tag_entry_id', 'tag_sort'], 'media_tag' => ['media_tag_media_id', 'media_tag_sort']]
- 自前 `<table>_id` を持たないが、複合カラムで PRIMARY KEY を構成するテーブル。
Properties
- $blogId : int
- $blogIdMap : array<int, int>
- $blogOwnOldId : array<int, int>
- $errors : array<string|int, mixed>
- $ids : array<string|int, mixed>
- $mediaFieldFix : array<string|int, mixed>
- $userId : int
- $yaml : array<string|int, mixed>
- $blogRepository : BlogRepository
- $categoryIdConfigKeys : array<string|int, string>
- カテゴリーIDを値として保持する config キー。 管理画面のカテゴリー選択カスタム要素(acms-category-select)に紐づくキーが対象。
- $importedTables : array<string|int, string>
- executeImport が投入対象とするテーブル一覧。
- $mediaIdConfigKeys : array<string|int, string>
- メディアIDを値として保持する config キー。
- $selfReferencingBlogIdTables : array<string|int, string>
- `_bid` カラムが「自ブログ自身」を指す多態関連カラムであるテーブル。
Methods
- __construct() : mixed
- run() : MultiBlogImportResult
- 基準ブログを起点に複数 bin を一括投入する。
- dropData() : void
- 投入先 blog の既存データを削除する (破壊リプレース用)。
- executeImport() : array<string|int, mixed>
- yaml を実際に投入する。
- prepareIds() : void
- マージ済 yaml に含まれる全 ID を一括採番する。
- rewriteBlogIdInYaml() : string
- yaml 内の各テーブルの `<table>_blog_id` を指定 blog_id で書き換える。
- buildCompoundKey() : string|null
- COMPOUND_PRIMARY_KEYS 対象テーブルのレコードから一意キー文字列を作る。 PK カラムが揃っていなければ null を返す。
- categoryFix() : mixed
- clearTable() : void
- columnFix() : mixed
- configFix() : mixed
- convertBlockEditorAuthoringHtml() : string
- 本文中の入稿用タグ(`<acms-block-editor-html-block>` / `<acms-block-editor-embed-block>`)を機能タグへ変換する
- createBlog() : int
- blog テーブルに新規レコードを INSERT し、`blog_id` を返す。
- entry_sub_categoryFix() : mixed
- This method is called dynamically via call_user_func_array().
- entryFix() : mixed
- existsYaml() : bool
- fallbackBlogCode() : string
- fallbackBlogName() : string
- fieldFix() : mixed
- fix() : mixed
- 旧IDを新IDに解決する共通の fix。フィールド名のサフィックスを見て、対応するテーブルの ID マップを引く。
- fixBlockEditorMedia() : string
- fulltextFix() : mixed
- generateFulltext() : void
- geoFix() : mixed
- This method is called dynamically via call_user_func_array().
- getNewID() : int|string
- 旧IDを新IDに解決する。マッピングが存在しない場合は元の値をそのまま返す。 unit_delimiter で区切られた複数IDのケースにも対応。
- insertData() : void
- isValidBlogId() : bool
- `_bid` カラムの値が有効なブログIDか(= そのレコードがブログスコープである)を判定する。 null / 空文字 / 0 / "0" は「ブログには属さない(entry/category/user 等スコープ)」を意味する。
- layout_gridFix() : mixed
- mergeBlogYaml() : string
- 複数 bin の yaml を 1 本の yaml 文字列にマージする。
- moduleFix() : mixed
- recordExists() : bool
- yaml レコードが持つ旧 <table>_id を新 ID にマッピングし、 同じ新 ID のレコードが既に DB に存在するか確認する。
- registerCategoryNewId() : void
- カテゴリーIDの新規マッピング。同名コードが既存ブログに存在する場合は再利用、 無い場合のみ nextval で新規採番する (旧 setup/lib/import.php と同じセマンティクス)。
- registerNewIDsForTable() : void
- resolveModuleBid() : mixed
- module_bid (module_bid_axis が self 以外なら他ブログを指しうる自由記述カラム) を解決する。
- rewriteArchivesPrefix() : string
- yaml 内の `DDD/...` 形式 (media / storage の blog_id プレフィックス) を新 blog_id で書き換え。 (例: 旧 blog_id=001 で配置されていたパスを、新 blog_id={blogIdPrefix} に置換)
- ruleFix() : mixed
- selfReferencingBlogIdColumn() : string|null
- `<table>_blog_id` と同様に「自ブログ自身」を指す多態関連カラム名を返す (対象外テーブルは null)。
- updateBlogConfigSet() : void
- yaml の各 blog レコードに含まれる config_set / theme_set / editor_set 系 ID を、 対応する blog テーブルレコードに UPDATE で反映する。
- updateOneBlogConfigSet() : void
Constants
COMPOUND_PRIMARY_KEYS
自前 `<table>_id` を持たないが、複合カラムで PRIMARY KEY を構成するテーブル。
private
mixed
COMPOUND_PRIMARY_KEYS
= ['tag' => ['tag_entry_id', 'tag_sort'], 'media_tag' => ['media_tag_media_id', 'media_tag_sort']]
これらは mergeBlogYaml 時に「PK カラムの組」で先勝ち重複除去する。 例: site bin と blog@site bin が同じ (media_id=12, sort=1) の media_tag を持つ場合、 先勝ちで site bin のレコードを採用し、blog@site bin の同 PK レコードは捨てる。
Properties
$blogId
protected
int
$blogId
$blogIdMap
protected
array<int, int>
$blogIdMap
= []
$blogOwnOldId
protected
array<int, int>
$blogOwnOldId
= []
$errors
protected
array<string|int, mixed>
$errors
$ids
protected
array<string|int, mixed>
$ids
$mediaFieldFix
protected
array<string|int, mixed>
$mediaFieldFix
= []
$userId
protected
int
$userId
$yaml
protected
array<string|int, mixed>
$yaml
$blogRepository read-only
private
BlogRepository
$blogRepository
= new BlogRepository()
$categoryIdConfigKeys
カテゴリーIDを値として保持する config キー。 管理画面のカテゴリー選択カスタム要素(acms-category-select)に紐づくキーが対象。
private
static array<string|int, string>
$categoryIdConfigKeys
= ['entry_edit_category_default', 'entry_edit_category_filter', 'entry_edit_sub_category_filter', 'static_page_cid', 'static_archive_cid']
(PHP 8.1 互換維持のため trait const ではなく static プロパティで保持する)
$importedTables
executeImport が投入対象とするテーブル一覧。
private
static array<string|int, string>
$importedTables
= ['category', 'form', 'entry', 'tag', 'entry_sub_category', 'module', 'layout_grid', 'rule', 'config', 'column', 'config_set', 'dashboard', 'field', 'media', 'media_tag', 'geo']
$mediaIdConfigKeys
メディアIDを値として保持する config キー。
private
static array<string|int, string>
$mediaIdConfigKeys
= ['media_banner_mid', 'navigation_media']
$selfReferencingBlogIdTables
`_bid` カラムが「自ブログ自身」を指す多態関連カラムであるテーブル。
private
static array<string|int, string>
$selfReferencingBlogIdTables
= ['field', 'geo']
field_bid / geo_bid は FieldFacade::save() / saveGeometry()(ACMS/POST/Blog/Insert.php /
Update.php 経由)から常に自ブログ自身の ID として書き込まれるため、投入先 blog_id へ単純に
書き換えてよい。一方 module_bid(axis が self 以外なら他ブログを指せる)や rule_bid(比較条件の値で
エンティティ参照ではない)は対象外(CMS-7830)。
Methods
__construct()
public
__construct([BlogRepository $blogRepository = new BlogRepository() ]) : mixed
Parameters
- $blogRepository : BlogRepository = new BlogRepository()
run()
基準ブログを起点に複数 bin を一括投入する。
public
run(array<string, array{yaml: string, blogCode?: string|null, blogName?: string|null}> $bins, int $baseBlogId, int $userId[, string|null $blogDomain = null ]) : MultiBlogImportResult
Parameters
- $bins : array<string, array{yaml: string, blogCode?: string|null, blogName?: string|null}>
-
binName => bin 情報。配列の最初のエントリが基準 bin (baseBlogId に投入)。 2 番目以降は baseBlogId 配下に新規子 blog を作って投入。 子 bin は
blogCode/blogNameで blog レコードのフィールドを指定 (省略時は binName ベース)。 - $baseBlogId : int
-
基準ブログ ID (既に DB に存在している前提)
- $userId : int
-
実行者 user_id (entry_last_update_user_id 等で使用)
- $blogDomain : string|null = null
-
子 blog 作成時の blog_domain (省略時は空文字)
Return values
MultiBlogImportResult —エラーと bin → blog_id 対応
dropData()
投入先 blog の既存データを削除する (破壊リプレース用)。
protected
dropData() : void
呼び出し前に $this->blogId を投入先 blog_id にセットしておく必要がある。
executeImport()
yaml を実際に投入する。
protected
executeImport(string $yaml, int $blogId, int $userId) : array<string|int, mixed>
前提:
- yaml 内の