Adding Multiple Images with Portable Text
21 replies
Last updated: Apr 26, 2021
A
Hello, folks. I have some image/portable text issue I’m trying to resolve.
helps me add an image in my portable text, but this is just a single image. As in 1 by 1 (first image). Is there a way to do 2 by 1 (second image)? Or is this something I do when I render inside my code and not with the editor?
{
name: 'content',
title: 'Post content',
type: 'array',
of: [{ type: 'block' }, { type: 'image' }],
description: 'Content of this post',
}Apr 26, 2021, 9:14 AM
J
Make a new schema for this called gallery, or imageList or something like that
Apr 26, 2021, 10:04 AM
A
user E
Done. What about the content? What type? object?
Apr 26, 2021, 10:05 AM
J
object makes the most sense, unless you want to query all your image galleries somewhere in one place
Apr 26, 2021, 10:06 AM
A
{
name: '2by1imageList',
title: '2 by 1 Image List',
type: 'object',
fields: [
{
name: 'columns',
title: 'Columns',
type: 'array',
of: [{ type: 'image' }],
},
],
},Apr 26, 2021, 10:07 AM
A
Like that?
Apr 26, 2021, 10:07 AM
J
the beauty of the array is that it can contain 1 or 100's of images
Apr 26, 2021, 10:08 AM
J
what I like to do is make one image list schema, and then make a new field where you can select how the list should be displayed
Apr 26, 2021, 10:09 AM
A
Essentially a “list of images”
Apr 26, 2021, 10:09 AM
J
export default {
name: 'gallery',
type: 'object',
title: 'Gallery',
fields: [
{
name: 'images',
type: 'array',
title: 'Images',
of: [
{
name: 'image',
type: 'image',
title: 'Image',
options: {
hotspot: true,
},
fields: [
{
name: 'alt',
type: 'string',
title: 'Alternative text',
},
],
},
],
options: {
layout: 'grid',
},
},
{
name: 'display',
type: 'string',
title: 'Display as',
description: 'How should we display these images?',
options: {
list: [
{ title: 'Stacked on top of eachother', value: 'stacked' },
{ title: 'In-line', value: 'inline' },
{ title: 'Carousel', value: 'carousel' },
],
layout: 'radio', // <-- defaults to 'dropdown'
},
},
],
preview: {
select: {
images: 'images',
image: 'images.0',
},
prepare(selection) {
const { images, image } = selection;
return {
title: `Gallery block of ${Object.keys(images).length} images`,
subtitle: `Alt text: ${image.alt}`,
media: image,
};
},
},
};Apr 26, 2021, 10:10 AM
J
That should get you started 😉
Apr 26, 2021, 10:10 AM
J
the preview part is a bit hacky, didn’t get around to making it better yet
Apr 26, 2021, 10:11 AM
J
the beauty of this approach is that you can change display of your images without having to re-upload or re-select or change schema types…
Apr 26, 2021, 10:11 AM
A
😂 The future is bright. Thank you so much. Let me work with this
Apr 26, 2021, 10:13 AM
J
you’re welcome
Apr 26, 2021, 10:14 AM
A
I’d just use the display key to toggle the display. This is so so helpful!
Apr 26, 2021, 10:15 AM
J
I should post this on the snippets & schemas site 🙂
Apr 26, 2021, 10:16 AM
A
You should. It’s really helpful. I realise I could also specify image size and display it that way instead of messing with the dimension
Apr 26, 2021, 10:17 AM
J
Oh yes, you can add a field “shape” and set it to landscape/square/portrait, or even use numeric values if you’re brave enough
Apr 26, 2021, 10:18 AM
A
Exactly!
Apr 26, 2021, 10:24 AM
A
Finally got it to work. 😄
Apr 26, 2021, 11:28 AM
J
Very nice!
Apr 26, 2021, 11:44 AM
Sanity – Build the way you think, not the way your CMS thinks
Sanity is the developer-first content operating system that gives you complete control. Schema-as-code, GROQ queries, and real-time APIs mean no more workarounds or waiting for deployments. Free to start, scale as you grow.