Skip to content

Instantly share code, notes, and snippets.

@wernerkrauss
Last active February 25, 2020 06:46
Show Gist options
  • Save wernerkrauss/7baceb185315b6bc8105569b79f41b6f to your computer and use it in GitHub Desktop.
Save wernerkrauss/7baceb185315b6bc8105569b79f41b6f to your computer and use it in GitHub Desktop.
Migration from firesphere's news module (SilverStripe 3) to Silverstripe 4 and Blog module
<?php
namespace Netwerkstatt\NewsToBlogMigration\Extension;
use SilverStripe\ORM\DataExtension;
/**
* Class BlogNews
* @package Netwerkstatt\NewsToBlogMigration\Extension
*
* Legacy extension for migrating from firesphere's News module to Blog
*/
class BlogNews extends DataExtension
{
private static $db = [
// 'Synopsis' => 'Text',
'Type' => 'Enum("news,external,download","news")',
'External' => 'Varchar(255)',
];
public function setAuthor()
{
//handle Authors
}
}
SilverStripe\Blog\Model\BlogPost:
extensions:
- Netwerkstatt\NewsToBlogMigration\Extension\BlogNews
- Netwerkstatt\NewsToBlogMigration\Extension\ImageGallery
<?php
namespace Netwerkstatt\NewsToBlogMigration\Extension;
use Colymba\BulkManager\BulkManager;
use Colymba\BulkUpload\BulkUploader;
use Netwerkstatt\NewsToBlogMigration\Model\ImageGalleryItem;
use SilverStripe\Assets\Image;
use SilverStripe\Forms\GridField\GridField;
use SilverStripe\Forms\GridField\GridFieldAddNewButton;
use SilverStripe\Forms\GridField\GridFieldConfig_RecordEditor;
use SilverStripe\ORM\DataExtension;
use UndefinedOffset\SortableGridField\Forms\GridFieldSortableRows;
class ImageGallery extends DataExtension
{
private static $has_many = [
'ImageGalleryItems' => ImageGalleryItem::class . '.Album',
];
private static $owns = [
'ImageGalleryItems'
];
public function updateCMSFields($fieldList)
{
$gridConf = GridFieldConfig_RecordEditor::create();
$gridConf->addComponents(
new GridFieldSortableRows('SortOrder'),
new BulkUploader('Image'),
new BulkManager()
);
$gridConf->removeComponentsByType(GridFieldAddNewButton::class); // We only use bulk upload button
if ($this->owner->RootFolder()) {
$folderName = $this->owner->RootFolder()->FileName;
$folderName = str_replace('assets/', '', $folderName);
$gridConf->getComponentByType(BulkUploader::class)->setUfSetup('setFolderName', $folderName);
}
$fieldList->addFieldsToTab('Root.Galerie', [
GridField::create('ImageGalleryItems', '', $this->owner->ImageGalleryItems(),
$gridConf)
]);
}
}
namespace Netwerkstatt\NewsToBlogMigration\Model;
use ImageGalleryUI;
use Netwerkstatt\NewsToBlogMigration\Page\ImageGalleryPage;
use SilverStripe\AssetAdmin\Forms\UploadField;
use SilverStripe\Assets\Image;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\NumericField;
use SilverStripe\Forms\TabSet;
use SilverStripe\Forms\TextField;
use SilverStripe\ORM\DataObject;
use SilverStripe\Security\Permission;
class ImageGalleryItem extends DataObject
{
private static $delete_permission = "CMS_ACCESS_CMSMain";
private static $db = [
'Caption' => 'Varchar(255)',
'SortOrder' => 'Int',
];
private static $has_one = [
'Image' => Image::class,
'ImageGalleryPage' => ImageGalleryPage::class, //@todo: remove and migrate to Album
'ImageGalleryAlbum' => ImageGalleryAlbum::class, //@todo: remove
'Album' => DataObject::class,
];
private static $owns = [
'Image'
];
private static $table_name = 'ImageGalleryItem';
private static $default_sort = "SortOrder";
private static $summary_fields = [
'Image.StripThumbnail' => 'Image',
'Caption.Summary' => 'Caption'
];
protected $ui;
public function getCMSFields()
{
$parentClassName = get_parent_class($this);
$parentClass = new $parentClassName;
$fields = ($parentClass->hasMethod('getGeneratedCMSFields'))
? $parentClass->getGeneratedCMSFields()
: FieldList::create(TabSet::create("Root"));
$fields->addFieldToTab("Root.Main", TextField::create('Caption', _t('ImageGalleryItem.CAPTION', 'Caption')));
$fields->addFieldToTab("Root.Main",
NumericField::create('SortOrder', _t('ImageGalleryItem.SORTORDER', 'Sort Order')));
$fields->addFieldToTab("Root.Main",
$image = UploadField::create('Image', _t('ImageGalleryItem.IMAGE', 'Image')));
$image->getValidator()->setAllowedExtensions(['jpg', 'jpeg', 'png', 'gif']);
$fields->removeByName("SortOrder");
return $fields;
}
public function canCreate($member = null, $context = [])
{
return true;
}
public function canView($member = null)
{
return true;
}
public function canEdit($member = null)
{
return true;
}
public function canDelete($member = null)
{
return Permission::check(self::$delete_permission);
}
public function getTitle()
{
return $this->Caption;
}
}
<?php
namespace Netwerkstatt\NewsToBlogMigration\Tasks;
use Netwerkstatt\NewsToBlogMigration\Model\ImageGalleryItem;
use SilverStripe\Blog\Model\Blog;
use SilverStripe\Blog\Model\BlogPost;
use SilverStripe\Control\HTTPRequest;
use SilverStripe\Dev\BuildTask;
use SilverStripe\ORM\Queries\SQLSelect;
use SilverStripe\Security\Member;
class NewsMigrationTask extends BuildTask
{
private $blog;
/**
* Implement this method in the task subclass to
* execute via the TaskRunner
*
* @param HTTPRequest $request
* @return
*/
public function run($request)
{
//delete all existing BlogPosts
$allBlogPosts = BlogPost::get()->removeAll();
//get news from DB
$allNews = SQLSelect::create()
->setFrom('News')
->setOrderBy('ID');
foreach ($allNews->execute() as $news) {
unset($news['ClassName']);
$this->createBlogPost($news);
}
}
public function createBlogPost($news)
{
//create Blog Post
//we assume all news go into one Blog holder page
$newsID = $news['ID'];
unset($news['ID']);
$news['FeaturedImageID'] = $news['ImpressionID'];
$news['Summary'] = $news['Synopsis'];
$news['PublishDate'] = $news['PublishFrom'];
$blogPost = BlogPost::create($news); //todo: check if URL exists
$blogPost->ParentID = $this->getBlogID();
$blogPost->write();
$blogPost->Authors()->add($this->getDefaultAuthor()); //hack for the current project
//migrate SlideShow Images
foreach ($this->getSlideshowForNews($newsID) as $slideshowImage) {
unset($slideshowImage['ClassName']);
unset($slideshowImage['ID']);
$slideshowImage['Caption'] = $slideshowImage['Title'];
$item = ImageGalleryItem::create($slideshowImage);
$blogPost->ImageGalleryItems()->add($item);
}
//publish blog post
$blogPost->publishRecursive();
}
/**
* @return int
*/
public function getBlogID()
{
if (!$this->blog) {
$this->blog = Blog::get()->first();
}
return $this->blog->ID;
}
public function getDefaultAuthor()
{
return Member::get()->byID(3);
}
/**
* @param $news
* @return \SilverStripe\ORM\Connect\Query
*/
public function getSlideshowForNews($newsID)
{
$images = SQLSelect::create()
->setFrom('SlideshowImage')
->setWhere([
'NewsID' => $newsID
]);
return $images->execute();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment