Jump to content
adrian

Custom Upload Names

Recommended Posts

Just now, PWaddict said:

It seems that only if the value is empty the cleanBasename will properly work in Windows.

@matjazp - can you confirm this on your setup?

If this is reproducible it sounds like we need to file an issue as it's not related to this module.

Share this post


Link to post
Share on other sites

I was suspecting locale problems from the very beginning, that's why I asked to dump basename() and pathinfo() calls since they are both locale aware. Just to test again, could you @PWaddict try this:

d(basename("ä"));

with and without translated "C" in LanguageSupportModule? Though I'm getting the correct results regardless of "C" value.

That's why we have a check that is performed on every login (and some changes are introduced recently to better clarify the issue here)! Do you get a warning message when you log in, something like "Note: your current server locale setting isn’t working as expected with the UTF-8 charset and may cause minor issues. Your current locale setting is “en_US.UTF-8”. Please translate the “C” locale setting for each language to the compatible locale in  ... " ? if not, then why you translated the "C" in the first place and also translated to the nonexisting locale? There is no need to translate "C" string on windows (from my experience). Windows don't have "en_US.UTF-8" locale, that's why PW suggest "en-US". The list of supported locales on windows: https://msdn.microsoft.com/library/cc233982.aspx , see the language tag column.

As for getting mixed results: the locale information is maintained per process, not per thread. If you are running PHP on a multithreaded server API like IIS, HHVM or Apache on Windows, you may experience sudden changes in locale settings while a script is running, though the script itself never called setlocale(). This happens due to other scripts running in different threads of the same process at the same time, changing the process-wide locale using setlocale().

Glad you solved the problem 🙂 

  • Like 2

Share this post


Link to post
Share on other sites

Wow @matjazp - thanks for a brilliantly detailed answer - much appreciated. i must admin I am not very au fait with this locale stuff.

I guess I am a little curious why PW's cleanBasename() has issues with this and yet $sanitizer->filename() and $sanitizer->pagName() with Sanitizer::translate do not. I guess I feel like they should all handle these translations the same way and so should all be subject to the same "issue".

 

Share this post


Link to post
Share on other sites
2 minutes ago, adrian said:

I guess I am a little curious why PW's cleanBasename() has issues with this and yet $sanitizer->filename() and $sanitizer->pagName() with Sanitizer::translate do not. I guess I feel like they should all handle these translations the same way and so should all be subject to the same "issue".

Yep. But it's hard to work on things that are working and you are trying to make them not working just do debug them 🙂 

Share this post


Link to post
Share on other sites
24 minutes ago, matjazp said:

Just to test again, could you @PWaddict try this:

d(basename("ä"));

with and without translated "C" in LanguageSupportModule? Though I'm getting the correct results regardless of "C" value.

I'm getting "ä" (2) on both.

I translated the "C" string for the languages long time ago for 2 reasons: 

- Displaying on frontend the months in date format for each locale.
- Adding months on page names via ProcessSetupPageName module.

For the main language actually I had "en_US.utf8, English_United States" and for the alternate languages "es_ES.utf8, Spanish_Spain.1252" & "de_DE.utf8, German_Germany.1252". On each locale the first string is for Linux and the 2nd for Windows. I left both there as the "C" notes saying: Specify CSV string of locales to try multiple locales in order. That way I don't need to switch locales when for example I migrate the database from the live server on localhost for developing, testing etc.

It seems that I don't need the "en_US.utf8, English_United States" for the main language so I left it empty but what if the main language wasn't English? How could I do the above if translating the "C" string on main language is causing problems on cleanBasename?

Share this post


Link to post
Share on other sites

I cant't help any more since I'm going to a vacation for a few days. It would be helpful if you find the reason for all this. Will it help if you use just "en-US" for the windows locale? Or try this script: https://www.zen-cart.com/attachment.php?s=ecb022422821941d39f3bff5511c3ecb&attachmentid=16404&d=1465221878

  • Like 1

Share this post


Link to post
Share on other sites
5 hours ago, matjazp said:

I cant't help any more since I'm going to a vacation for a few days. It would be helpful if you find the reason for all this. Will it help if you use just "en-US" for the windows locale? Or try this script: https://www.zen-cart.com/attachment.php?s=ecb022422821941d39f3bff5511c3ecb&attachmentid=16404&d=1465221878

It doesn't matter if I enter a valid or a non-valid locale on "C" string. The cleanBasename will always be broken if "C" isn't empty. I tried this on the fresh PW installation and the same problem happens so I will post an issue on GitHub.

Thanks for the help @adrian & @matjazp and wish you Merry Christmas!

  • Like 1

Share this post


Link to post
Share on other sites

Having a dot on the text field it doesn't process the filename properly after that dot. It happens on both Windows & Linux.

Text Field value: T. Test ä
Filename: t._test____1545258287.jpg

Text Field value: Test ä T.
Filename: test_a_t._1545258287.jpg

Note: That issue doesn't happen on 1.2.2.

  • Like 1

Share this post


Link to post
Share on other sites
4 hours ago, PWaddict said:

Having a dot on the text field it doesn't process the filename properly after that dot. It happens on both Windows & Linux.

Thanks @PWaddict - it should be fixed in 1.2.5

  • Thanks 1

Share this post


Link to post
Share on other sites
On 12/21/2018 at 4:27 PM, PWaddict said:

It doesn't matter if I enter a valid or a non-valid locale on "C" string. The cleanBasename will always be broken if "C" isn't empty. I tried this on the fresh PW installation and the same problem happens so I will post an issue on GitHub

I'm still not satisfied as I can't replicate this. I would like to perform some more tests, but don't want to pollute this thread, so if you are interested in narrowing down this issue, please PM me, @PWaddict 

  • Like 1

Share this post


Link to post
Share on other sites

@PWaddict could you please modify $basename = strtolower($basename); to $basename = mb_strtolower($basename); in cleanBasename method in /wire/core/Pagefiles.php (line 568).

  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
2 hours ago, matjazp said:

@PWaddict could you please modify $basename = strtolower($basename); to $basename = mb_strtolower($basename); in cleanBasename method in /wire/core/Pagefiles.php (line 568).

It's working PERFECT. Thank you. Please post the solution on the GitHub issue.

  • Like 1

Share this post


Link to post
Share on other sites

Thanks for the feedback. I posted suggested solution on the github. 

On 12/21/2018 at 6:26 AM, adrian said:

I guess I am a little curious why PW's cleanBasename() has issues with this and yet $sanitizer->filename() and $sanitizer->pagName() with Sanitizer::translate do not.

That's because $sanitizer->(file)name() checks for multibyte support and uses mb_strtolower().

  • Like 1

Share this post


Link to post
Share on other sites
2 hours ago, matjazp said:

@PWaddict could you please modify $basename = strtolower($basename); to $basename = mb_strtolower($basename); in cleanBasename method in /wire/core/Pagefiles.php (line 568).

Nice catch!

It's interesting because many of the $sanitizer methods make use of the internal nameFilter() method which uses mb_strtolower.

If you actually follow the cleanBasename method it goes through $sanitizer filename(), which uses name(), which uses nameFilter() which leads me to believe that it might actually be possible to just remove that that: $basename = strtolower($basename); line from the cleanBasename() method completely. I just tested this and it's actually pretty close - there are a couple of problems - one is the regex on #578 needs A-Z added to it. The other is that beautify doesn't get passed through to nameFilter() which is a condition for mb_strtolower() being called.

Anyway, that was just an interesting excursion into what is actually going on and where 🙂

  • Like 1

Share this post


Link to post
Share on other sites

Hi @PWaddict

Could you please make the thread readable by putting your long trace of logs into "spoilers"? This one and the another one:

On 12/20/2018 at 10:32 PM, PWaddict said:

Here are the results:

 

 

  • Like 1

Share this post


Link to post
Share on other sites

@adrian I found a small bug. Using slashes for example on the title field the image doesn't rename properly. For example on title field I have: Poster/Flyer and the image renamed to flyer.jpg where it should be poster_flyer.jpg.

  • Like 1

Share this post


Link to post
Share on other sites
8 hours ago, PWaddict said:

@adrian I found a small bug. Using slashes for example on the title field the image doesn't rename properly. For example on title field I have: Poster/Flyer and the image renamed to flyer.jpg where it should be poster_flyer.jpg.

Should be fixed now!

  • Thanks 1

Share this post


Link to post
Share on other sites

Hello @adrian

Today I noticed a very strange behaviour with the module. If I upload an image on the Image or CroppableImage3 field and then add a new repeater item on a repeater field and publish / save the page, the image doesn't display on front-end. The image and its variations are visible on back-end and on the related folder in assets.

If I first add a new repeater item on a repeater field and then upload an image on the Image or CroppableImage3 field then there is NO problem. WTF?

I verified that this is caused by the module cause when I temporarily disable the rule there was NO problem. My rule is: {$page->title}_{$file->mtime} with Rename on Save checked.

I'm using PW 3.0.135.

Share this post


Link to post
Share on other sites

@PWaddict - I feel like I have replicated your described workflow and I am not seeing any problems so I will need more troubleshooting from you. 

Why doesn't the image display on the frontend - is the code trying to display an image with a non-existant path?
What code are you using to display the image?
What are the image settings - anything related to the max files or overwrite settings that are relevant?

Anything you can do to narrow it down further would be very helpful.

Share this post


Link to post
Share on other sites

The structure on my template is in this order:

various fields
Image field
Repeater field
Repeater field
various fields

The image doesn't display on frontend because it seems that it doesn't get saved in database??? I'm checking if the image exists like this: if($page->image) etc. There is nothing wrong in the code on template cause if I save the page AGAIN then this time the image is properly getting saved and displayed on frontend.

Image Maximum files allowed: 1
Formatted value: Automatic

EDIT: It's a multi-language site.

Share this post


Link to post
Share on other sites

I am testing on a multi-language site and just changed to max files 1 and it's still all working as expected. Sorry, I am not sure what else to look at right now. I am curious what Tracy's PageFiles panel reports after the initial saving of the page.

Share this post


Link to post
Share on other sites
1 hour ago, adrian said:

I am curious what Tracy's PageFiles panel reports after the initial saving of the page.

Tracy displays them in orange color as orphans.

Share this post


Link to post
Share on other sites

Hm, after I checked the "Overwrite existing files?" on image field the problem is gone. So, the module to properly work needs that option checked?

Share this post


Link to post
Share on other sites

Does it help if you use $filePage instead of $page for the rule?

What about "name" instead of "title"?

What about if you don't have the $file->mtime component?

 

Share this post


Link to post
Share on other sites

Ok, I think I have narrowed it down - if you don't have "overwrite" checked and you use $file->mtime it doesn't know how to name the file at the correct point it needs to. It's also necessary to have "Rename on Save" checked to have this problem.

Let me see if I can fix.

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By gebeer
      I am happy to present my new fieldtype FieldtypeImageFromPage. It is made up of 2 modules:
      Fieldtype Image Reference From Another Page is a Fieldtype that stores a reference to a single image from another page. The image can be selected with the associated Inputfield.
      Inputfield Select Image From Page is an Inputfield to select a single image from images on a predefined page and it's children.
      And there also is a helper module that takes care of cleanup tasks.
      This module evolved out of a discussion about my other Module FieldtypeImagePicker.  It caters for use cases where a set of images is being reused multiple times across a site. With this fieldtype these images can be administered through a chosen page. All images uploaded to that page will be available in the inputfield.
      When to use ?
      Let editors choose an image from a set of images that is being used site-wide. Ideal for images that are being re-used across the site.
      Suited for images that are used on multiple pages throughout the site (e.g. icons).
      Other than the native ProcessWire images field, the images here are not stored per page. Only references to images on another page are stored. This has several advantages:
      one central place to organize images when images change, you only have to update them in one place. All references will be updated, too. (Provided the name of the image that has changed stays the same) Features
      Images can be manipulated like native ProcessWire images (resizing, cropping etc.) Image names are fully searchable through the API Accidental image deletion is prevented. When you want to delete an image from one of the pages that hold your site-wide images, the module searches all pages that use that image. If any page contains a reference to the image you are trying to delete, deletion will be prevented. You will get an error message to help you edit those pages and remove references there before you can finally delete the image. How to install and setup
      Download and install this module like any other modules in ProcessWire Create a page in the page tree that will hold your images. This page's template must have an images field Upload some images to the page you created in step 2 Create a new field. As type choose 'Image Reference From Another Page'. Save the field. In 'Details' Tab of the field choose the page you created in step 2 Click Save button Choose the images field name for the field that holds your images (on page template from step 2) Click Save button again Choose whether you want to include child pages of page from step 2 to supply images Add the field to any template You are now ready to use the field View of the inputfield on the page edit screen:

      View of the field settings

      The module can be installed from this github repo. Some more info in the README there, too.
      In my tests it was fairly stable. After receiving your valued feedback, I will eventually add it to the modules directory.
      My ideas for further improvement:
      - add ajax loading of thumbnails
      Happy to hear your feedback!
       
    • By gebeer
      Although the PW backend is really intuitive, ever so often my clients need some assistance. Be it they are not so tech savvy or they are not working in the backend often.
      For those cases it is nice to make some help videos available to editors. This is what this module does.
      ProcessHelpVideos Module
      A Process module to display help videos for the ProcessWire CMS. It can be used to make help videos (screencasts) available to content editors.
      This module adds a 'Help Videos" section to the ProcessWire backend. The help videos are accessible through an automatically created page in the Admin page tree. You can add your help videos as pages in the page tree. The module adds a hidden page to the page tree that acts as parent page for the help video pages. All necessary fields and templates will be installed automatically. If there are already a CKEditor field and/or a file field for mp4 files installed in the system, the module will use those. Otherwise it will create the necessary fields. Also the necessary templates for the parent help videos page and it's children are created on module install. The module installs a permission process-helpvideos. Every user role that should have access to the help video section, needs this permission. I use the help video approach on quite a few production sites. It is stable so far and well received by site owners/editors. Up until now I installed required fields, templates and pages manually and then added the module. Now I added all this logic to the install method of the module and it should be ready to share.
      The module and further description on how to use it is available on github: https://github.com/gebeer/ProcessHelpVideos
      If you like to give it a try, I am happy to receive your comments/suggestions here.
    • By Robin S
      A module created in response to the topic here:
      Page List Select Multiple Quickly
      Modifies PageListSelectMultiple to allow you to select multiple pages without the tree closing every time you select a page.
      The screencast says it all:

       
      https://github.com/Toutouwai/PageListSelectMultipleQuickly
      https://modules.processwire.com/modules/page-list-select-multiple-quickly/
    • By gebeer
      Hello all,
      sharing my new module FieldtypeImagePicker. It provides a configurable input field for choosing any type of image from a predefined folder.
      The need for it came up because a client had a custom SVG icon set and I wanted the editors to be able to choose an icon in the page editor.
      It can also be used to offer a choice of images that are used site-wide without having to upload them to individual pages.
      There are no image manipulation methods like with the native PW image field.
      Module and full description can be found on github https://github.com/gebeer/FieldtypeImagePicker
      Kudos to @Martijn Geerts. I used his module FieldTypeSelectFile as a base to build upon.
      Here's how the input field looks like in the page editor:

      Hope it can be of use to someone.
      If you like to give it a try, I'm happy to hear your comments or suggestions for improvement. Eventually this will go in the module directory soon, too.
    • By bernhard
      @Sergio asked about the pdf creation process in the showcase thread about my 360° feedback/survey tool and so I went ahead and set my little pdf helper module to public.
      Description from PW Weekly:
       
      Modules Directory: https://modules.processwire.com/modules/rock-pdf/
      Download & Docs: https://github.com/BernhardBaumrock/RockPDF
       
      You can combine it easily with RockReplacer: 
      See also a little showcase of the RockPdf module in this thread:
       
×
×
  • Create New...