webkernel/platform-infolists

04-image-entry

Sur cette page

title: Image entry


Introduction

Infolists can render images, based on the path in the state of the entry:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('header_image')

In this case, the header_image state could contain posts/header-images/4281246003439.jpg, which is relative to the root directory of the storage disk. The storage disk is defined in the configuration file, local by default. You can also set the FILESYSTEM_DISK environment variable to change this.

Alternatively, the state could contain an absolute URL to an image, such as https://example.com/images/header.jpg.

<AutoScreenshot name="infolists/entries/image/simple" alt="Image entry" />

Setting the alt text

You should set descriptive alt text on your images so that screen reader users understand what each image shows. Use the alt() method:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('header_image')
    ->alt('Article header image')

<UtilityInjection set="infolistEntries" extras="Related record;;Webkernel\ORM\Model;;$relatedRecord;;The current related Eloquent record for the rendered item.">As well as allowing a static value, the alt() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters, including the $state of the current image, which is useful when the entry renders multiple images.</UtilityInjection>

If you do not set any alt text, the image is rendered with an empty alt attribute, which marks it as decorative for assistive technology.

<Aside variant="warning"> When an image links to a URL, its alt text becomes the accessible name of the link. Always set meaningful alt() text on linked images, otherwise screen reader users will encounter a link with no name. </Aside>

Managing the image disk

The default storage disk is defined in the configuration file, local by default. You can also set the FILESYSTEM_DISK environment variable to change this. If you want to deviate from the default disk, you may pass a custom disk name to the disk() method:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('header_image')
    ->disk('s3')

<UtilityInjection set="infolistEntries" extras="Related record;;Webkernel\ORM\Model;;$relatedRecord;;The current related Eloquent record for the rendered item.">As well as allowing a static value, the disk() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Public images

By default, Platform will generate temporary URLs to images in the filesystem, unless the disk is set to public. If your images are stored in a public disk, you can set the visibility() to public:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('header_image')
    ->visibility('public')

<UtilityInjection set="infolistEntries" extras="Related record;;Webkernel\ORM\Model;;$relatedRecord;;The current related Eloquent record for the rendered item.">As well as allowing a static value, the visibility() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Customizing the size

You may customize the image size by passing a imageWidth() and imageHeight(), or both with imageSize():

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('header_image')
    ->imageWidth(200)

ImageEntry::make('header_image')
    ->imageHeight(50)

ImageEntry::make('author.avatar')
    ->imageSize(40)

<UtilityInjection set="infolistEntries">As well as allowing a static values, the imageWidth(), imageHeight() and imageSize() methods also accept functions to dynamically calculate them. You can inject various utilities into the function as parameters.</UtilityInjection>

<AutoScreenshot name="infolists/entries/image/size" alt="Image entry with custom size" />

Square images

You may display the image using a 1:1 aspect ratio:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('author.avatar')
    ->imageHeight(40)
    ->square()

<AutoScreenshot name="infolists/entries/image/square" alt="Square image entry" />

Optionally, you may pass a boolean value to control if the image should be square or not:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('author.avatar')
    ->imageHeight(40)
    ->square(FeatureFlag::active())

<UtilityInjection set="infolistEntries">As well as allowing a static value, the square() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Circular images

You may make the image fully rounded, which is useful for rendering avatars:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('author.avatar')
    ->imageHeight(40)
    ->circular()

<AutoScreenshot name="infolists/entries/image/circular" alt="Circular image entry" />

Optionally, you may pass a boolean value to control if the image should be circular or not:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('author.avatar')
    ->imageHeight(40)
    ->circular(FeatureFlag::active())

<UtilityInjection set="infolistEntries">As well as allowing a static value, the circular() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Adding a default image URL

You can display a placeholder image if one doesn't exist yet, by passing a URL to the defaultImageUrl() method:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('header_image')
    ->defaultImageUrl(url('storage/posts/header-images/default.jpg'))

<UtilityInjection set="infolistEntries">As well as allowing a static value, the defaultImageUrl() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Stacking images

You may display multiple images as a stack of overlapping images by using stacked():

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked()

<AutoScreenshot name="infolists/entries/image/stacked" alt="Stacked image entry" />

Optionally, you may pass a boolean value to control if the images should be stacked or not:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked(FeatureFlag::active())

<UtilityInjection set="infolistEntries">As well as allowing a static value, the stacked() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Customizing the stacked ring width

No ring is displayed by default, but you may add one with a width from 0 to 8:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked()
    ->ring(5)

<AutoScreenshot name="infolists/entries/image/stacked-ring" alt="Image entry with stacked ring width" />

<UtilityInjection set="infolistEntries">As well as allowing a static value, the ring() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Customizing the stacked overlap

The default overlap is 4, but you may customize it to be from 0 to 8:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked()
    ->overlap(2)

<AutoScreenshot name="infolists/entries/image/stacked-overlap" alt="Image entry with stacked overlap" />

<UtilityInjection set="infolistEntries">As well as allowing a static value, the overlap() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Setting a limit

You may limit the maximum number of images you want to display by passing limit():

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked()
    ->limit(3)

<UtilityInjection set="infolistEntries">As well as allowing a static value, the limit() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

<AutoScreenshot name="infolists/entries/image/limited" alt="Limited image entry" />

Showing the remaining images count

When you set a limit you may also display the count of remaining images by passing limitedRemainingText().

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked()
    ->limit(3)
    ->limitedRemainingText()

<AutoScreenshot name="infolists/entries/image/limited-remaining-text" alt="Limited image entry with remaining text" />

Optionally, you may pass a boolean value to control if the remaining text should be displayed or not:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked()
    ->limit(3)
    ->limitedRemainingText(FeatureFlag::active())

<UtilityInjection set="infolistEntries">As well as allowing a static value, the limitedRemainingText() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Customizing the limited remaining text size

By default, the size of the remaining text is TextSize::Small. You can customize this to be TextSize::ExtraSmall, TextSize::Medium or TextSize::Large using the size parameter:

use Webkernel\Platform\Infolists\Components\ImageEntry;
use Webkernel\Platform\Support\Enums\TextSize;

ImageEntry::make('colleagues.avatar')
    ->imageHeight(40)
    ->circular()
    ->stacked()
    ->limit(3)
    ->limitedRemainingText(size: TextSize::Large)

<UtilityInjection set="infolistEntries">As well as allowing a static value, the limitedRemainingText() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Prevent file existence checks

When the schema is loaded, it will automatically detect whether the images exist to prevent errors for missing files. This is all done on the backend. When using remote storage with many images, this can be time-consuming. You can use the checkFileExistence(false) method to disable this feature:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('attachment')
    ->checkFileExistence(false)

<UtilityInjection set="infolistEntries" extras="Related record;;Webkernel\ORM\Model;;$relatedRecord;;The current related Eloquent record for the rendered item.">As well as allowing a static value, the checkFileExistence() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

Adding extra HTML attributes to the image

You can pass extra HTML attributes to the <img> element via the extraImgAttributes() method. The attributes should be represented by an array, where the key is the attribute name and the value is the attribute value:

use Webkernel\Platform\Infolists\Components\ImageEntry;

ImageEntry::make('logo')
    ->extraImgAttributes([
        'alt' => 'Logo',
        'loading' => 'lazy',
    ])

<UtilityInjection set="infolistEntries" extras="Related record;;Webkernel\ORM\Model;;$relatedRecord;;The current related Eloquent record for the rendered item.">As well as allowing a static value, the extraImgAttributes() method also accepts a function to dynamically calculate it. You can inject various utilities into the function as parameters.</UtilityInjection>

By default, calling extraImgAttributes() multiple times will overwrite the previous attributes. If you wish to merge the attributes instead, you can pass merge: true to the method.