I’m trying to seed RainLab.Blog posts using php artisan theme:seed command, and I’d like to include demo images as well.
Thus, in my data.yaml, I first import the media files, then the RainLab.Blog posts:
-
name: Demo Media Files
class: Media\Models\MediaLibraryItemImport
file: seeds/data/media-files.json
attributes:
file_format: json
-
name: Demo RainLab.Blog Posts
class: RainLab\Blog\Models\PostImport
file: seeds/data/rainlab-blog.json
attributes:
file_format: json
auto_create_categories: true
My media-files.json is as simple as
[
{
"type": "folder",
"path": "newshub/demo",
"source": "seeds/media"
}
]
The problem is that the images cannot be imported. The exported Blog Posts contain a featured_image_urls attribute (which is empty, though), but the importer rejects it because this attribute does not exist on the Post model.
Error: SQLSTATE[HY000]: General error: 1 table rainlab_blog_posts has no column named featured_image_urls
My intended approach was to stay using the featured_image_urls, but - at least for the seeder - with internal storage paths that already exist from the media importer. Example Post:
[
{
"title": "Title",
"categories": ["Articles", "Featured"],
"created_at": "2022-08-13T14:53:24.000000Z",
"updated_at": "2022-08-13T14:53:24.000000Z",
"published_at": "2022-08-13 14:53:14",
"content": "Post Content.",
"content_html": "<p>Post HTML Content</p>",
"excerpt": "",
"slug": "title",
"author_email": "sam@rat.md",
"featured_image_urls": [
"newshub/demo/hero-image-01.jpg"
],
"published": 1
},
]
Then in your PostImport.php on line 67, create File objects like this:
foreach (array_except($data, $except) as $attribute => $value) {
if (in_array($attribute, $post->getDates()) && empty($value)) {
continue;
}
if ($attribute == 'featured_image_urls') {
$value = is_array($value) ? $value : [$value];
$files = [];
foreach ($value AS $image) {
$filePath = storage_path('app/media/' . $image);
if (empty($image) || !file_exists($filePath) || !is_file($filePath)) {
continue;
}
$files[] = (new \System\Models\File)->fromFile(
$filePath,
basename($image)
);
}
if (!empty($files)) {
$post->featured_images = $files;
}
} else {
$post->{$attribute} = isset($value) ? $value : null;
}
}
Or is there a more native or recommended way to import images along with the Blog posts?
Thanks.
~Sam.
I’m trying to seed RainLab.Blog posts using
php artisan theme:seedcommand, and I’d like to include demo images as well.Thus, in my
data.yaml, I first import the media files, then the RainLab.Blog posts:- name: Demo Media Files class: Media\Models\MediaLibraryItemImport file: seeds/data/media-files.json attributes: file_format: json - name: Demo RainLab.Blog Posts class: RainLab\Blog\Models\PostImport file: seeds/data/rainlab-blog.json attributes: file_format: json auto_create_categories: trueMy
media-files.jsonis as simple as[ { "type": "folder", "path": "newshub/demo", "source": "seeds/media" } ]The problem is that the images cannot be imported. The exported Blog Posts contain a
featured_image_urlsattribute (which is empty, though), but the importer rejects it because this attribute does not exist on the Post model.Error: SQLSTATE[HY000]: General error: 1 table rainlab_blog_posts has no column named featured_image_urls
My intended approach was to stay using the
featured_image_urls, but - at least for the seeder - with internal storage paths that already exist from the media importer. Example Post:[ { "title": "Title", "categories": ["Articles", "Featured"], "created_at": "2022-08-13T14:53:24.000000Z", "updated_at": "2022-08-13T14:53:24.000000Z", "published_at": "2022-08-13 14:53:14", "content": "Post Content.", "content_html": "<p>Post HTML Content</p>", "excerpt": "", "slug": "title", "author_email": "sam@rat.md", "featured_image_urls": [ "newshub/demo/hero-image-01.jpg" ], "published": 1 }, ]Then in your
PostImport.phpon line 67, create File objects like this:Or is there a more native or recommended way to import images along with the Blog posts?
Thanks.
~Sam.