1<?php 2 3namespace ElggPlugin\Profile; 4 5use Elgg\Upgrade\AsynchronousUpgrade; 6use Elgg\Upgrade\Result; 7 8/** 9 * Copy all profile field metadata to annotations, with each name prefixed with "profile:" 10 */ 11class AnnotationMigration implements AsynchronousUpgrade { 12 13 /** 14 * {@inheritdoc} 15 */ 16 public function getVersion() { 17 return 2017040700; 18 } 19 20 /** 21 * {@inheritdoc} 22 */ 23 public function shouldBeSkipped() { 24 return false; 25 } 26 27 /** 28 * {@inheritdoc} 29 */ 30 public function needsIncrementOffset() { 31 return true; 32 } 33 34 /** 35 * {@inheritdoc} 36 */ 37 public function countItems() { 38 return count($this->getFieldNames()); 39 } 40 41 /** 42 * {@inheritdoc} 43 */ 44 public function run(Result $result, $offset) { 45 $name = $this->getFieldNames()[$offset]; 46 47 $db = elgg()->db; 48 $sql = " 49 INSERT INTO {$db->prefix}annotations 50 (entity_guid, `name`, `value`, value_type, owner_guid, access_id, time_created, enabled) 51 SELECT entity_guid, :new_name, `value`, value_type, owner_guid, access_id, time_created, enabled 52 FROM {$db->prefix}metadata 53 WHERE `name` = :old_name 54 AND entity_guid IN ( 55 SELECT guid FROM {$db->prefix}entities WHERE type = 'user' 56 ) 57 "; 58 59 try { 60 $db->updateData($sql, false, [ 61 ':old_name' => $name, 62 ':new_name' => "profile:$name", 63 ]); 64 $result->addSuccesses(1); 65 } catch (\DatabaseException $e) { 66 $result->addError("Profile field '$name' could not be migrated: " . $e->getMessage()); 67 $result->addFailures(1); 68 } 69 } 70 71 /** 72 * Get the profile field names 73 * 74 * @return string[] 75 */ 76 private function getFieldNames() { 77 return array_keys(elgg_get_config('profile_fields')); 78 } 79} 80