仕事でMTをごにょごにょいじってる。バッチ処理中にMT::Blogのclone()を使ってガンガン作成しようとするとエラーが出た。
DBD::mysql::st execute failed: Column 'templatemap_template_id' cannot be null at /path/to/MT/extlib/Data/ObjectDriver/Driver/DBI.pm line 348, <> line 4.
管理画面のブログ一覧から「ブログの複製」を実行すると特に警告もなく終了する。もちろんログに何も出ていない。
いろいろ調査していくとMT::Blog::clone()で、え?と思う実装が。(以下ソースは 4.23 のもの)
require MT::Template;
$iter = MT::Template->load_iter(
{ blog_id => $old_blog_id, type => { not => 'widgetset' } }
);
my $tmpl_processor = sub {
my ( $new_blog_id, $counter, $tmpl, $tmpl_map ) = @_;
$callback->($state . " " . MT->translate("[_1] records processed...", $$counter), 'tmpls')
if $counter && ($$counter % 100 == 0);
my $tmpl_id = $tmpl->id;
$$counter++;
delete $tmpl->{column_values}->{id};
delete $tmpl->{changed_cols}->{id};
# linked_file won't be cloned for now because
# new blog does not have site_path - breaks relative path
delete $tmpl->{column_values}->{linked_file};
delete $tmpl->{column_values}->{linked_file_mtime};
delete $tmpl->{column_values}->{linked_file_size};
$tmpl->blog_id($new_blog_id);
$tmpl->save or die $tmpl->errstr;
$tmpl_map->{$tmpl_id} = $tmpl->id;
};
$counter = 0;
while (my $tmpl = $iter->()) {
$tmpl_processor->($new_blog_id, \$counter, $tmpl, \%tmpl_map);
}
パッチでも送りつけようかと思ったけど、とりあえず普通にCGI経由で使っていれば問題がないので(顕在化しない)ブログに公開する程度にする。