| | 190 | sub convert_rf2cf { |
| | 191 | my $app = shift; |
| | 192 | |
| | 193 | # Look for RF field definitions. |
| | 194 | my $def_iter = MT->model('plugindata')->load_iter({ plugin => 'rightfields' }); |
| | 195 | |
| | 196 | my (@tags, @fields); |
| | 197 | DEF: while (my $def = $def_iter->()) { |
| | 198 | # Don't care about default settings, only the ones actually in use on blogs. |
| | 199 | next DEF if $def->key !~ m{ \A blog_ }xms; |
| | 200 | push @tags, $def->clone if $def->key =~ m{ _tags \z }xms; |
| | 201 | push @fields, $def->clone if $def->key =~ m{ _extra \z }xms; |
| | 202 | } |
| | 203 | |
| | 204 | my %tags_for_fields; |
| | 205 | TAG: for my $tag_def (@tags) { |
| | 206 | MT->log('OH HAI from tag ' . $tag_def->key); |
| | 207 | $tag_def->key =~ m{ \A blog_(\d+) }xms or next TAG; |
| | 208 | my $blog_id = $1; |
| | 209 | |
| | 210 | # We don't know from the tag data what fields are entries, so record all of them. |
| | 211 | my $tags_data = $tag_def->data; |
| | 212 | for my $tag_data (@$tags_data) { |
| | 213 | my ($field, $tag_name) = @{$tag_data}{qw( field tag )}; |
| | 214 | |
| | 215 | # Each CF can have only one tag, and we'll need to pull them out by field. |
| | 216 | $tags_for_fields{$blog_id}->{$field} = $tag_name; |
| | 217 | } |
| | 218 | } |
| | 219 | |
| | 220 | my (%fields_for_blog, %fields_by_id, %datasource_for_blog); |
| | 221 | FIELDS: for my $fields_def (@fields) { |
| | 222 | MT->log('OH HAI from fieldset ' . $fields_def->key); |
| | 223 | $fields_def->key =~ m{ \A blog_(\d+) }xms or next FIELDS; |
| | 224 | my $blog_id = $1; |
| | 225 | |
| | 226 | |
| | 227 | if $fields_def->data |
| | 228 | |
| | 229 | my $fields_data = $fields_def->data; |
| | 230 | $datasource_for_blog{$blog_id} = $fields_data->{datasource}; |
| | 231 | my $fields = $fields_data->{cols}; |
| | 232 | FIELD: while (my ($field_id, $field_data) = each %$fields) { |
| | 233 | # Entry fields only. |
| | 234 | next FIELD if !$field_data->{type} |
| | 235 | || $field_data->{type} ne 'entry'; |
| | 236 | |
| | 237 | my %field; |
| | 238 | $field{$_} = $field_data->{$_} for qw( label weblog category_ids ); |
| | 239 | $field{blog_id} = $blog_id; |
| | 240 | $field{tag} = $tags_for_fields{$blog_id}->{$field_id}; |
| | 241 | |
| | 242 | $fields_for_blog{$blog_id} ->{$field_id} = \%field; |
| | 243 | $fields_by_id {$field_id}->{$blog_id} = \%field; |
| | 244 | } |
| | 245 | } |
| | 246 | |
| | 247 | # Upgrade duplicates to global fields. |
| | 248 | FIELD_BY_ID: while (my ($field_id, $fields) = each %fields_by_id) { |
| | 249 | # Leave fields that are only in one blog alone. |
| | 250 | next FIELD_BY_ID if 1 == scalar keys %$fields; |
| | 251 | |
| | 252 | my ($first_field, @fields) = values %$fields; |
| | 253 | for my $datum (qw( label weblog category_ids tag )) { |
| | 254 | my $first_value = $first_field->{$datum}; |
| | 255 | for my $next_field (@fields) { |
| | 256 | my $next_value = $next_field->{$datum}; |
| | 257 | next FIELD_BY_ID if defined $first_value && !defined $next_value; |
| | 258 | next FIELD_BY_ID if !defined $first_value && defined $next_value; |
| | 259 | next FIELD_BY_ID if defined $first_value |
| | 260 | && $first_value ne $next_value; |
| | 261 | } |
| | 262 | } |
| | 263 | |
| | 264 | # Huh, everything matched. Make this a global field. |
| | 265 | # TODO: Delete the value from each of their %fields_by_blog groups, using blog_id member. |
| | 266 | # TODO: Assign first_field to blog_id=0 group. Or have a separate set of global fields? |
| | 267 | } |
| | 268 | |
| | 269 | # Make corresponding custom fields. |
| | 270 | while (my ($blog_id, $fields) = each %fields_for_blog) { |
| | 271 | while (my ($field_id, $field_data) = each %$fields) { |
| | 272 | # Make or update the corresponding custom field. |
| | 273 | my $cf = MT->model('field')->load({ |
| | 274 | blog_id => $blog_id, |
| | 275 | basename => $field_id, |
| | 276 | }); |
| | 277 | $cf ||= MT->model('field')->new; |
| | 278 | |
| | 279 | my $options = $field_data->{weblog}; |
| | 280 | $options = join q{,}, $field_data->{category_ids} |
| | 281 | if $field_data->{category_ids}; |
| | 282 | |
| | 283 | $cf->set_values({ |
| | 284 | name => $field_data->{label}, |
| | 285 | obj_type => 'entry', |
| | 286 | type => 'entry', |
| | 287 | options => $options, |
| | 288 | basename => $field_id, |
| | 289 | }); |
| | 290 | $cf->blog_id($blog_id) if $blog_id; # TODO: 0 = global? |
| | 291 | |
| | 292 | my $tag = $field_data->{tag}; |
| | 293 | $tag ||= lc join q{}, $cf->obj_type, 'data', $cf->name; |
| | 294 | # TODO: ensure the tag is unique, since CF makes us. |
| | 295 | $cf->tag($tag); |
| | 296 | |
| | 297 | $cf->save or die $cf->errstr; |
| | 298 | |
| | 299 | # Copy the data for that field. |
| | 300 | my $datasource = $datasource_for_blog{$blog_id}; |
| | 301 | if ($datasource eq '_pseudo') { |
| | 302 | # omg pseudo objects aiee |
| | 303 | } |
| | 304 | else { |
| | 305 | my $sql = MT::ObjectDriver::SQL->new; |
| | 306 | $sql-> |
| | 307 | } |
| | 308 | } |
| | 309 | } |
| | 310 | |
| | 311 | # Start copying data. |
| | 312 | |
| | 313 | |
| | 314 | return $app->return_to_dashboard( redirect => 1 ); |
| | 315 | } |
| | 316 | |