Last active
October 22, 2020 21:56
-
-
Save maxime-rainville/26785a996331af41298c71eaee7e52b4 to your computer and use it in GitHub Desktop.
Creating lots of relations to file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
use SilverStripe\Dev\BuildTask; | |
use Faker\Factory; | |
use SilverStripe\Control\HTTPRequest; | |
use Symfony\Component\Filesystem\Filesystem; | |
use Symfony\Component\Finder\Finder; | |
use SilverStripe\Core\Manifest\ModuleLoader; | |
use Symfony\Component\Filesystem\Exception\IOException; | |
class PageMaker extends BuildTask | |
{ | |
/** | |
* @var \Faker\Factory | |
*/ | |
protected $faker; | |
/** | |
* @var Filesystem | |
*/ | |
protected $fs; | |
/** | |
* @var Finder | |
*/ | |
protected $finder; | |
/** | |
* FTPageTypeCreatorTask constructor. | |
*/ | |
public function __construct() | |
{ | |
parent::__construct(); | |
$this->fs = new Filesystem(); | |
$this->faker = Factory::create(); | |
$this->finder = new Finder(); | |
} | |
/** | |
* @param HTTPRequest $request | |
*/ | |
public function run($request) | |
{ | |
$count = $request->getVar('count') ?: 20; | |
$testPageDir = BASE_PATH . '/app/src/test-pages'; | |
if ($this->fs->exists($testPageDir)) { | |
$this->fs->remove($testPageDir); | |
} | |
$this->fs->mkdir($testPageDir); | |
$pageTypes = $this->getExistingClassNames($testPageDir); | |
$created = 0; | |
while ($created < $count) { | |
$className = null; | |
while ( | |
!$className || | |
in_array($className, $pageTypes) || | |
class_exists(basename($className, 'php')) | |
) { | |
$className = $this->generateClassName(); | |
} | |
$pageTypes[] = $className; | |
$code = $this->generateClassCode($className); | |
$filePath = sprintf('%s/%s.php', $testPageDir, $className); | |
try { | |
$this->fs->dumpFile($filePath, $code); | |
$created++; | |
} catch (IOException $e) { | |
echo "Could not write to file $filePath. Got error: {$e->getMessage()}\n"; | |
die(); | |
} | |
echo "Created page type $className\n"; | |
} | |
$configFile = BASE_PATH . '/app/_config/pages.yml'; | |
if ($this->fs->exists($configFile)) { | |
$this->fs->remove($configFile); | |
} | |
$this->fs->dumpFile($configFile, $this->generateMatchingYml($pageTypes)); | |
} | |
private function getExistingClassNames($dir) | |
{ | |
$files = $this->finder | |
->in($dir) | |
->files() | |
->name('*Page.php'); | |
return array_map(function ($file) { | |
/* @var SplFileInfo $file */ | |
return $file->getBasename(); | |
}, iterator_to_array($files)); | |
} | |
private function generateClassName() | |
{ | |
return ucfirst($this->faker->word . 'Page'); | |
} | |
private function generateClassCode($className) | |
{ | |
$self = __CLASS__; | |
$code = <<<PHP | |
<?php | |
use SilverStripe\Assets\Image; | |
use SilverStripe\Assets\File; | |
use DNADesign\Elemental\Extensions\ElementalPageExtension; | |
use SilverStripe\ORM\DataObject; | |
/** | |
* Generated by $self | |
*/ | |
class $className extends Page | |
{ | |
private static \$extensions = [ElementalPageExtension::class]; | |
private static \$has_one = [ | |
'MyImage' => Image::class, | |
'MyFile' => File::class, | |
'PolyToMe' => DataObject::class, | |
]; | |
private static \$belongs_to = ['PolyToImage' => Image::class . ".PolyTo{$className}OnImage"]; | |
private static \$has_many = ['MyImages' => Image::class, 'MyFiles' => File::class]; | |
private static \$many_many = [ | |
'MyManyImages' => Image::class, | |
'MyManyFiles' => File::class, | |
'ManyManyThrough' => [ | |
'through' => {$className}Through::class, | |
'from' => 'Page', | |
'to' => 'File', | |
] | |
]; | |
} | |
class {$className}Through extends DataObject | |
{ | |
private static \$db = [ | |
'Ranking' => 'Int', | |
]; | |
private static \$has_one = [ | |
'Page' => $className::class, | |
'File' => File::class, | |
'ThirdLink' => Image::class, | |
]; | |
} | |
PHP; | |
return $code; | |
} | |
private function generateMatchingYml(array $pages) | |
{ | |
$pages = array_map(function($page) { | |
return str_replace('.php', '', $page); | |
}, $pages); | |
$yml = "SilverStripe\Assets\File:\n has_one:\n"; | |
foreach ($pages as $page) { | |
$yml .= " $page: $page\n"; | |
} | |
$yml .= " Self: SilverStripe\Assets\File\n"; | |
$yml .= " belongs_to:\n"; | |
foreach ($pages as $page) { | |
$yml .= " PolyTo{$page}: $page.PolyToMe\n"; | |
} | |
$yml .= " belongs_many_many:\n"; | |
foreach ($pages as $page) { | |
$yml .= " {$page}s: $page\n"; | |
$yml .= " {$page}sThrough: $page.ManyManyThrough\n"; | |
} | |
$yml .= "SilverStripe\Assets\Image:\n has_one:\n"; | |
foreach ($pages as $page) { | |
$yml .= " {$page}Image: $page\n"; | |
$yml .= " PolyTo{$page}OnImage: SilverStripe\ORM\DataObject\n"; | |
} | |
$yml .= " belongs_many_many:\n"; | |
foreach ($pages as $page) { | |
$yml .= " {$page}sImage: $page\n"; | |
} | |
$yml .= "CreateRelated:\n pageTypes:\n"; | |
foreach ($pages as $page) { | |
$yml .= " - {$page}\n"; | |
} | |
return $yml; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment