1 <?php
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
39 class MigrateTranslatableTask extends BuildTask {
40 protected $title = "Migrate Translatable Task";
41
42 protected $description = "Migrates site translations from SilverStripe 2.1/2.2 to new database structure.";
43
44 function init() {
45 parent::init();
46
47 $canAccess = (Director::isDev() || Director::is_cli() || Permission::check("ADMIN"));
48 if(!$canAccess) return Security::permissionFailure($this);
49 }
50
51 function run($request) {
52 $ids = array();
53
54 echo "#################################\n";
55 echo "# Adding translation groups to existing records" . "\n";
56 echo "#################################\n";
57
58 $allSiteTreeIDs = DB::query('SELECT "ID" FROM "SiteTree"')->column();
59 if($allSiteTreeIDs) foreach($allSiteTreeIDs as $id) {
60 $original = DataObject::get_by_id('SiteTree', $id);
61 $existingGroupID = $original->getTranslationGroup();
62 if(!$existingGroupID) $original->addTranslationGroup($original->ID);
63 $original->destroy();
64 unset($original);
65 }
66
67 DataObject::flush_and_destroy_cache();
68
69 echo sprintf("Created translation groups for %d records\n", count($allSiteTreeIDs));
70
71 foreach(array('Stage', 'Live') as $stage) {
72 echo "\n\n#################################\n";
73 echo "# Migrating stage $stage" . "\n";
74 echo "#################################\n";
75
76 $suffix = ($stage == 'Live') ? '_Live' : '';
77
78
79
80 $trans = DB::query(sprintf('SELECT * FROM "_obsolete_SiteTree_lang%s"', $suffix));
81
82
83 foreach($trans as $oldtrans) {
84 $newLocale = i18n::get_locale_from_lang($oldtrans['Lang']);
85
86 echo sprintf(
87 "Migrating from %s to %s translation of '%s' (#%d)\n",
88 $oldtrans['Lang'],
89 $newLocale,
90 Convert::raw2xml($oldtrans['Title']),
91 $oldtrans['OriginalLangID']
92 );
93
94
95
96 $original = Versioned::get_one_by_stage(
97 $oldtrans['ClassName'],
98 $stage,
99 '"SiteTree"."ID" = ' . $oldtrans['OriginalLangID']
100 );
101
102 if(!$original) {
103 echo sprintf("Couldn't find original for #%d", $oldtrans['OriginalLangID']);
104 continue;
105 }
106
107
108 $original->Locale = i18n::get_locale_from_lang(Translatable::default_lang());
109 $original->writeToStage($stage);
110
111
112 $existingTrans = $original->getTranslation($newLocale, $stage);
113
114 if($existingTrans) {
115 echo sprintf("Found existing new-style translation for #%d. Already merged? Skipping.\n", $oldtrans['OriginalLangID']);
116 continue;
117 }
118
119
120
121
122 $newtrans = $original->duplicate(false);
123 $newtrans->OriginalID = $original->ID;
124
125 $newtrans->Locale = $newLocale;
126 if($stage == 'Live' && array_key_exists($original->ID, $ids)) {
127 $newtrans->ID = $ids[$original->ID];
128 }
129
130
131 foreach(ClassInfo::ancestry($oldtrans['ClassName']) as $classname) {
132 $oldtransitem = false;
133
134
135 if($classname == 'SiteTree') {
136 $oldtransitem = $oldtrans;
137 } elseif(in_array(strtolower($classname) . '_lang', DB::tableList())) {
138 $oldtransitem = DB::query(sprintf(
139 'SELECT * FROM "_obsolete_%s_lang%s" WHERE "OriginalLangID" = %d AND "Lang" = \'%s\'',
140 $classname,
141 $suffix,
142 $original->ID,
143 $oldtrans['Lang']
144 ))->first();
145 }
146
147
148 if($oldtransitem) foreach($oldtransitem as $key => $value) {
149 if(!in_array($key, array('ID', 'OriginalLangID'))) {
150 $newtrans->$key = $value;
151 }
152 }
153
154 }
155
156
157 $sitelang = Translatable::get_current_locale();
158 Translatable::set_current_locale($newtrans->Locale);
159 $newtrans->writeToStage($stage);
160 Translatable::set_current_locale($sitelang);
161
162 $newtrans->addTranslationGroup($original->getTranslationGroup(), true);
163
164
165 if($stage == 'Stage') {
166 $ids[$original->ID] = $newtrans->ID;
167 }
168 }
169 }
170
171 echo "\n\n#################################\n";
172 echo "Done!\n";
173 }
174 }
175
176 ?>
[Raise a SilverStripe Framework issue/bug](https://github.com/silverstripe/silverstripe-framework/issues/new)
- [Raise a SilverStripe CMS issue/bug](https://github.com/silverstripe/silverstripe-cms/issues/new)
- Please use the
Silverstripe Forums to ask development related questions.
-