仕事で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経由で使っていれば問題がないので(顕在化しない)ブログに公開する程度にする。