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
- $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 キー。 管理画面のカテゴリー選択UI(js-admin-category-select)に紐づくキーが対象。
- $mediaIdConfigKeys : array<string|int, string>
- メディアIDを値として保持する config キー。
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
- 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
- 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
- rewriteArchivesPrefix() : string
- yaml 内の `DDD/...` 形式 (media / storage の blog_id プレフィックス) を新 blog_id で書き換え。 (例: 旧 blog_id=001 で配置されていたパスを、新 blog_id={blogIdPrefix} に置換)
- ruleFix() : mixed
- 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
$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 キー。 管理画面のカテゴリー選択UI(js-admin-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 プロパティで保持する)
$mediaIdConfigKeys
メディアIDを値として保持する config キー。
private
static array<string|int, string>
$mediaIdConfigKeys
= ['media_banner_mid', 'navigation_media']
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 内の