Source of file DatabaseClassNameUpdateTask.php
Size: 4,018 Bytes - Last Modified: 2021-12-24T06:45:47+00:00
/var/www/docs.ssmods.com/process/src/src/Tasks/DatabaseClassNameUpdateTask.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | <?php namespace Dynamic\ClassNameUpdate\BuildTasks; use Dynamic\ClassNameUpdate\MappingObject; use SilverStripe\CMS\Model\SiteTree; use SilverStripe\Core\ClassInfo; use SilverStripe\Dev\BuildTask; use SilverStripe\ORM\DataObject; use SilverStripe\Versioned\Versioned; /** * Class DatabaseClassNameUpdateTask * @package Dynamic\ClassNameUpdate\BuildTasks */ class DatabaseClassNameUpdateTask extends BuildTask { /** * @var */ private $mapping_object; /** * @var */ private $mapping; /** * @var string */ private static $upgrade_file_path; /** * @var string */ private static $segment = 'database-classname-update-task'; /** * @var string */ protected $title = 'Database ClassName Update Task'; /** * @var string */ protected $description = "Update ClassName data for a SilverStripe 3 to SilverStripe 4 migration. Be sure to set the absolute path to the .upgrade.yml file for this task before running it or nothing will happen."; /** * @param \SilverStripe\Control\HTTPRequest $request */ public function run($request, $mapping = []) { if (empty($mapping)) { if (!$this->config()->get('upgrade_file_path') || !file_exists($this->config()->get('upgrade_file_path'))) { $class = static::class; echo "You must specify the configuration variable: 'upgrade_file_path' for '{$class}'\n"; return; } $mapping = $this->getMappingObject(); } $this->updateClassNameColumns($mapping); echo "Database ClassName data has been updated\n"; } /** * @param $mapping */ protected function updateClassNameColumns($mapping) { $mapping = ($mapping === (array)$mapping) ? $mapping : $this->getMapping(); foreach ($mapping as $key => $val) { $ancestry = ClassInfo::ancestry($val); $ancestry = array_merge(array_values($ancestry), array_values($ancestry)); if (in_array(DataObject::class, $ancestry)) { $queryClass = $ancestry[array_search(DataObject::class, $ancestry) + 1]; foreach ($this->yieldRecords($queryClass, $key) as $record) { $this->updateRecord($record, $val); } } } } /** * @param $record * @param $updatedClassName */ protected function updateRecord($record, $updatedClassName) { if ($record instanceof SiteTree || $record->hasExtension(Versioned::class)) { $published = $record->isPublished(); } $record->ClassName = $updatedClassName; $record->write(); if (isset($published) && $published) { $record->publishSingle(); } } /** * @return $this */ public function setMappingObject() { $mapping = MappingObject::singleton(); $mapping->setMappingPath($this->config()->get('upgrade_file_path')); $this->mapping_object = $mapping; return $this; } /** * @return mixed */ protected function getMappingObject() { if (!$this->mapping instanceof MappingObject) { $this->setMappingObject(); } return $this->mapping_object; } /** * @return $this */ protected function setMapping() { $this->mapping = $this->getMappingObject()->getUpgradeMapping(); return $this; } /** * @return mixed */ protected function getMapping() { if (!$this->mapping) { $this->setMapping(); } return $this->mapping; } /** * @param $singleton * @param $legacyName * @return \Generator */ public function yieldRecords($class, $legacyName) { foreach ($class::get()->filter('ClassName', $legacyName) as $object) { yield $object; } } } |