statamic/cms

[4.x] URL is not regenerated when working with presets and focal point changes

pakogn opened this issue · 2 comments

Bug description

While working with glide:generate and presets I noticed that when the focal point is changed the URL stays the same.

domain.com/img/asset/dXBsb2Fkcy9wb3J0YWRhLWd1aWxsZXJtby0oMykuanBn/portada-guillermo-%283%29.jpg?p=thumbnail_condensed&s=e4112fd8e82a25bf0fcaffb0a3df9981

The expected behavior would be to change so Editors can watch the updated image with the new focal point.
Because the URL doesn't change the browser cache it and doesn't allow to watch the updated one.

I saw that the url uses a signature based on the path so maybe to considerate the focal point in the signature could be a solution.

How to reproduce

  • configure a preset in config/assets.php:
'featured' => ['w' => 850, 'h' => 480, 'q' => 90, 'fit' => 'crop_focal'],
  • with a "featured_image" asset field in an entry show the entry image in a view like this:
@foreach (Statamic::tag('glide:generate')->src($post->featured_image)->filename($post->featured_image->basename)->preset('featured') as $image)
    <img loading="lazy" src="{{ url($image['url']) }}" height="300" width="100%" alt="{{ $post->featured_image->alt }}" title="{{ $post->portada_titulo }}" />
@endforeach

Logs

No response

Environment

Statamic v4.58.2, even have tested this in v5.30.0

Laravel Version: 9.52.16
PHP Version: 8.2.24
Composer Version: 2.5.3

Installation

Fresh statamic/statamic site via CLI

Additional details

No response

A workaround is to add fit="crop_focal" to the glide tag. Then the focal point will be part of the URL and will change appropriately.

This will be handled properly as part of #10204. Presets will be expanded on the URLs rather than having p=featured in the URL.

Great! thanks, @jasonvarga

When doing this, the images still cached?

I opted for something like this:

@foreach (Statamic::tag('glide:generate')->src($post->featured_image)->filename($post->featured_image->basename)->preset('featured') as $image)
    <img loading="lazy" src="{{ url($image['url']) }}&{{ urlencode(base64_encode("{$image['focus']}")) }}" height="300" width="100%" alt="{{ $post->featured_image->alt }}" title="{{ $post->featured_image_titulo }}" />
@endforeach

Appending the focus to the url doesn't break the signature and keep serving the generated image that lives in storage/statamic/glide/containers/etc...