a-blog cms PHP API Reference

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

$mediaFieldFix

protected array<string|int, mixed> $mediaFieldFix = []

$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

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 内の _blog_id は呼び出し側が事前に正しい値に書き換え済み
  • 投入先 blog の既存データを破壊リプレースする場合、呼び出し側が事前に dropData() を呼ぶ
  • Parameters
    $yaml : string

    投入する yaml 文字列 (<table>_blog_id は確定済)

    $blogId : int

    投入対象 blog_id (generateFulltext / updateBlogConfigSet で利用)

    $userId : int

    entry_last_update_user_id 等で使う実行者 user_id

    Return values
    array<string|int, mixed>

    エラーメッセージの一覧 (空なら成功)

    prepareIds()

    マージ済 yaml に含まれる全 ID を一括採番する。

    protected prepareIds() : void

    rewriteBlogIdInYaml()

    yaml 内の各テーブルの `<table>_blog_id` を指定 blog_id で書き換える。

    protected rewriteBlogIdInYaml(string $yaml, int $blogId) : string

    呼び出し側 (Import::run) が executeImport に渡す前の正規化に使う。 MultiBlogImport は別途 mergeBlogYaml で同等の処理を行うため、これは呼ばない。

    Parameters
    $yaml : string
    $blogId : int
    Return values
    string

    buildCompoundKey()

    COMPOUND_PRIMARY_KEYS 対象テーブルのレコードから一意キー文字列を作る。 PK カラムが揃っていなければ null を返す。

    private buildCompoundKey(string $table, array<string, mixed> $record) : string|null
    Parameters
    $table : string
    $record : array<string, mixed>
    Return values
    string|null

    categoryFix()

    private categoryFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    clearTable()

    private clearTable(string $table) : void
    Parameters
    $table : string

    columnFix()

    private columnFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    configFix()

    private configFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    createBlog()

    blog テーブルに新規レコードを INSERT し、`blog_id` を返す。

    private createBlog(int $parentBlogId, string $blogCode, string $blogName[, string $blogDomain = '' ]) : int

    nested-set の予約と INSERT は BlogRepository のプリミティブ(findLastChildInParent / findBoundary / shiftLeftRightAfter / nextBlogId / insert)を合成して行う(管理画面 ACMS_POST_Blog_Insert と同じ作法。生 SQL は BlogRepository に集約済み)。

    Parameters
    $parentBlogId : int
    $blogCode : string

    先頭 '@' より前を blog_code として使う

    $blogName : string
    $blogDomain : string = ''
    Return values
    int

    entry_sub_categoryFix()

    This method is called dynamically via call_user_func_array().

    private entry_sub_categoryFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>
    Tags
    phpstan-ignore-next-line

    entryFix()

    private entryFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    existsYaml()

    private existsYaml(string $table) : bool
    Parameters
    $table : string
    Return values
    bool

    fallbackBlogCode()

    private fallbackBlogCode(string $binName) : string
    Parameters
    $binName : string
    Return values
    string

    fallbackBlogName()

    private fallbackBlogName(string $binName) : string
    Parameters
    $binName : string
    Return values
    string

    fieldFix()

    private fieldFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    fix()

    旧IDを新IDに解決する共通の fix。フィールド名のサフィックスを見て、対応するテーブルの ID マップを引く。

    private fix(string $table, string $field, mixed $value) : mixed
    Parameters
    $table : string
    $field : string
    $value : mixed

    fixBlockEditorMedia()

    private fixBlockEditorMedia(string $value) : string
    Parameters
    $value : string
    Return values
    string

    fulltextFix()

    private fulltextFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    generateFulltext()

    private generateFulltext() : void

    geoFix()

    This method is called dynamically via call_user_func_array().

    private geoFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>
    Tags
    phpstan-ignore-next-line

    getNewID()

    旧IDを新IDに解決する。マッピングが存在しない場合は元の値をそのまま返す。 unit_delimiter で区切られた複数IDのケースにも対応。

    private getNewID(string $table, int|string $id) : int|string

    該当しない値 (テンプレート変数 %{RCID} のようなプレースホルダー文字列等) は 解決対象外として元の値をそのまま返す。

    Parameters
    $table : string
    $id : int|string
    Return values
    int|string

    insertData()

    private insertData(string $table) : void
    Parameters
    $table : string

    layout_gridFix()

    private layout_gridFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    mergeBlogYaml()

    複数 bin の yaml を 1 本の yaml 文字列にマージする。

    private mergeBlogYaml(array<string, array{blogId: int, yaml: string}> $bins) : string
    _id 重複は先勝ちで除去 (= 同じ ID のレコードは DB に 1 行のみ存在する原則)
  • _blog_id を、その bin に割り当てられた確定 blog_id に書き換え
  • _id を持たないテーブル (tag / media_tag / field / geo / layout_grid 等) は 各 bin のレコードがそのままマージ後 yaml に並ぶ (旧フローの挙動と同じ)
    Parameters
    $bins : array<string, array{blogId: int, yaml: string}>
    Return values
    string

    moduleFix()

    private moduleFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    recordExists()

    yaml レコードが持つ旧 <table>_id を新 ID にマッピングし、 同じ新 ID のレコードが既に DB に存在するか確認する。

    private recordExists(string $table, array<string|int, mixed> $record) : bool

    自前 ID を持たないテーブル (tag, media_tag, field, geo 等) は対象外で、 常に false を返す (= INSERT を試行する)。

    Parameters
    $table : string
    $record : array<string|int, mixed>
    Return values
    bool

    registerCategoryNewId()

    カテゴリーIDの新規マッピング。同名コードが既存ブログに存在する場合は再利用、 無い場合のみ nextval で新規採番する (旧 setup/lib/import.php と同じセマンティクス)。

    private registerCategoryNewId() : void

    MultiBlogImport では複数 blog のカテゴリが yaml に混在するため、bid 毎ではなく category_blog_id を引数として既存検索する点が単発 Import との差異。

    既存検索の対象は 基準ブログ + その子孫ブログ に限定する。無関係なブログツリーに たまたま同じ category_code のカテゴリーがあっても再利用候補にしない (意味的にも、 性能的にも)。

    registerNewIDsForTable()

    private registerNewIDsForTable(string $table) : void
    Parameters
    $table : string

    rewriteArchivesPrefix()

    yaml 内の `DDD/...` 形式 (media / storage の blog_id プレフィックス) を新 blog_id で書き換え。 (例: 旧 blog_id=001 で配置されていたパスを、新 blog_id={blogIdPrefix} に置換)

    private rewriteArchivesPrefix(string $yaml, int $blogId) : string

    ACMS_POST_Backup_BlogImport::fixYaml と同じ正規表現。

    Parameters
    $yaml : string
    $blogId : int
    Return values
    string

    ruleFix()

    private ruleFix(string $field, mixed $value, array<string, mixed> $record) : mixed
    Parameters
    $field : string
    $value : mixed
    $record : array<string, mixed>

    updateBlogConfigSet()

    yaml の各 blog レコードに含まれる config_set / theme_set / editor_set 系 ID を、 対応する blog テーブルレコードに UPDATE で反映する。

    private updateBlogConfigSet() : void

    単発 Import: yaml の blog レコードは 1 つで $this->blogId に対応する。 MultiBlogImport: yaml に複数 blog (基準 + 子) があり、それぞれの blog_id は mergeBlogYaml で確定 blog_id に書き換え済み。各 blog レコードを個別に UPDATE する。

    updateOneBlogConfigSet()

    private updateOneBlogConfigSet(array<string, mixed> $blog) : void
    Parameters
    $blog : array<string, mixed>

    yaml の 1 つの blog レコード (blog_id は確定済)

    
            
    On this page

    Search results