Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Page Object media exception on filesystem image change #3846

Open
daniel-mannheimer opened this issue Aug 22, 2024 · 11 comments
Open

Page Object media exception on filesystem image change #3846

daniel-mannheimer opened this issue Aug 22, 2024 · 11 comments

Comments

@daniel-mannheimer
Copy link

With all caches disabled I still get an exception when changing images on the filesystem

An exception has been thrown during the rendering of a template ("exif_imagetype(/html/grav/user/pages/02.products/01.systems/01.default/111-002-1.png): Failed to open stream: No such file or directory").

What I did was deleting 111-002-1.png and adding newimage.png via ftp.
After that my macro crashes

(...)
    {% for p in page.children.visible %}
(...)
        <a class="product__image" href="{{ p.url }}">
            {{ p.media.images|first.cropZoom(200,200).html|raw }}
        </a>
(...)
    {% endfor %}
(...)

Seems the page object still holds 111-002-1.png somewhere, even with all Caches disabled.

Any hints on ths?

--> Grav 1.7.46 with PHP 8.1

@rhukster
Copy link
Member

Try deleting the contents of the cache/ folder and see if that helps.

@daniel-mannheimer
Copy link
Author

Sure this helps, as clearing the cache in the backend does ;)

But our approach is to use filesystem only for content editors, setting their ftp homedir to /grav/user/pages/ and not giving them backend access.

@rhukster
Copy link
Member

Looks like it might be an issue with a check when "auto metadata exif" is enabled. Are you relying on this? perhaps try to disabling until I can get a fix.

@daniel-mannheimer
Copy link
Author

daniel-mannheimer commented Aug 22, 2024

Disabling "Auto metadata from Exif" did the trick for deleting/adding images, but the exception remains for renaming images.

  1. upload immage.png
  2. correct yout typo via ftp renaming to image.png
  3. exception

@rhukster
Copy link
Member

What is the exception now? I cant' recreate this with that EXIF setting disabled.

@daniel-mannheimer
Copy link
Author

daniel-mannheimer commented Aug 22, 2024

It's still the same exception, I'll try to track it down myself
File was renamed from 111-002-1 copy 2.png to 111-002-1 copy.png

image

@daniel-mannheimer
Copy link
Author

daniel-mannheimer commented Aug 22, 2024

"Fix orientation automatically" enabled was the setting to blame. fixOrientation() calls the exif_imagetype()

uh, now renaming ends in a fallback image (/images/f/a/l/l/b/fallback.jpg)

@rhukster
Copy link
Member

This should fix that exif_imagetype() exception: 8c1b444

Regarding the fallback image, something is still holding on to the cached reference. I'm still not able to reproduce this. What are you doing with the image?

@daniel-mannheimer
Copy link
Author

daniel-mannheimer commented Aug 22, 2024

Yeah, the exception is gone, thanks a lot for that.

What I am doing in the code:

{% macro content_loop(page, initial, level) %}
    {% import _self as macros %}
    {% for p in page.children.visible %}
        {% if p.route is not same as ('/') %}
            {% if not initial %}
                {% if level < 3 %}
                    {% set active_page = (p.active or p.activeChild) ? 'active' : '' %}
                    {% if level == 0 %}
                        {{ macros.content_loop(p, false, level+1) }}
                    {% endif %}
                    {% if level == 1 %}
                        <h2 class="collection-header">{{ p.menu }}</h2>
                        <div class="collection">
                            {{ macros.content_loop(p, false, level+1) }}
                        </div>
                    {% endif %}
                    {% if level == 2 %}
                        <div class="product">
                            <div class="product__card" href="{{ p.url }}">
                            <a class="product__image" href="{{ p.url }}">
{# this crashes on file rename#}
                                {{ p.media.images|first.cropZoom(200,200).html|raw }}
{# this crashes on file rename#}
                            </a>
                            <div class="product__name">
                                    <a href="{{ p.url }}">{{ p.menu }}</a>
                            </div>
                            </div>
                        </div>
                    {% endif %}
                {% endif %}
            {% endif %}
        {% endif %}
    {% endfor %}
{% endmacro %}

What I am doing on the filesystem:
https://github.com/user-attachments/assets/0a51d5a5-bae4-4cf9-bce6-59c6a60e2b91
--> rename the file

The results:

  • renaming file renders error fallback image for {{ p.media.images|first.cropZoom(200,200).html|raw }}
  • renaming file gives a 404 for {{ p.media.images|first.html|raw }} (cropzoom removed) trying to access the old image name prior to renaming

@rhukster
Copy link
Member

the problem is that the cache doesn't know to check for changed media files by default. First, you can change try a couple of options in for the cache check in system.yaml:

cache:
  check:
    method: hash

You can also try folder, but hash should check the md5 hash of all the files. This should ensure that the cache is cleared when you rename an image.

Also you can change the Twig a little to make it safer. So instead of a stright: {{ p.media.images|first.cropZoom(200,200).html|raw }} do:

{% set thumb = media.images|first %}
{% set thumb_url = thumb.exists ? thumb.cropZoom(200,200)  : 'path/to/blank.png' %}
<img src="{{ url(thumb_url) }}" />

This way it only runs cropZoom if the thumb exist, and it can fall back to blank image in the worst case scenario rather than the error image.

@daniel-mannheimer
Copy link
Author

daniel-mannheimer commented Aug 22, 2024

just a quick reply for the cache, this is my (not working) setting

cache:
  enabled: false
  check:
    method: hash

to verify, this setting gives the same (not working) result

cache:
  enabled: true
  check:
    method: hash

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants