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 Robin S
      Another little admin helper module...
      Template Field Widths
      Adds a "Field widths" field to Edit Template that allows you to quickly set the widths of inputfields in the template.

      Why?
      When setting up a new template or trying out different field layouts I find it a bit slow and tedious to have to open each field individually in a modal just to set the width. This module speeds up the process.
      Installation
      Install the Template Field Widths module.
      Config options
      You can set the default presentation of the "Field widths" field to collapsed or open. Field widths entered into the Template Field Widths inputfield are only applied if the Edit Template form is submitted with the Template Field Widths inputfield in an opened state. "Collapsed" is the recommended setting if you think you might also use core inputs for setting field widths in a template context. You can choose Name or Label as the primary identifier shown for the field. The unchosen alternative will become the title attribute shown on hover. You can choose to show the original field width next to the template context field width.  
      https://github.com/Toutouwai/TemplateFieldWidths
      https://modules.processwire.com/modules/template-field-widths/
    • By adrian
      Tracy Debugger for ProcessWire
      The ultimate “swiss army knife” debugging and development tool for the ProcessWire CMF/CMS

       
      Integrates and extends Nette's Tracy debugging tool and adds 35+ custom tools designed for effective ProcessWire debugging and lightning fast development
      The most comprehensive set of instructions and examples is available at: https://adrianbj.github.io/TracyDebugger
      Modules Directory: http://modules.processwire.com/modules/tracy-debugger/
      Github: https://github.com/adrianbj/TracyDebugger
      A big thanks to @tpr for introducing me to Tracy and for the idea for this module and for significant feedback, testing, and feature suggestions.
    • By Mike Rockett
      Jumplinks for ProcessWire
      Release: 1.5.56
      Composer: rockett/jumplinks
      Jumplinks is an enhanced version of the original ProcessRedirects by Antti Peisa.
      The Process module manages your permanent and temporary redirects (we'll call these "jumplinks" from now on, unless in reference to redirects from another module), useful for when you're migrating over to ProcessWire from another system/platform. Each jumplink supports wildcards, shortening the time needed to create them.
      Unlike similar modules for other platforms, wildcards in Jumplinks are much easier to work with, as Regular Expressions are not fully exposed. Instead, parameters wrapped in curly braces are used - these are described in the documentation.
      Under Development: 2.0, to be powered by FastRoute
      As of version 1.5.0, Jumplinks requires at least ProcessWire 2.6.1 to run.
      View on GitLab
      Download via the Modules Directory
      Read the docs
      Features
      The most prominent features include:
      Basic jumplinks (from one fixed route to another) Parameter-based wildcards with "Smart" equivalents Mapping Collections (for converting ID-based routes to their named-equivalents without the need to create multiple jumplinks) Destination Selectors (for finding and redirecting to pages containing legacy location information) Timed Activation (activate and/or deactivate jumplinks at specific times) 404-Monitor (for creating jumplinks based on 404 hits) Additionally, the following features may come in handy:
      Stale jumplink management Legacy domain support for slow migrations An importer (from CSV or ProcessRedirects) Feedback & Feature Requests
      I’d love to know what you think of this module. Please provide some feedback on the module as a whole, or even regarding smaller things that make it whole. Also, please feel free to submit feature requests and their use-cases.
      Note: Features requested so far have been added to the to-do list, and will be added to 2.0, and not the current dev/master branches.
      Open Source

      Jumplinks is an open-source project, and is free to use. In fact, Jumplinks will always be open-source, and will always remain free to use. Forever. If you would like to support the development of Jumplinks, please consider making a small donation via PayPal.
      Enjoy! :)
    • By BitPoet
      As threatened in Ryan's announcement for 3.0.139, I built a little module for sliding toggles as a replacement for checkboxes. Styling of the input is CSS3 only (with all the usual caveats about older browsers), no JS necessary, and may still be a bit "rough around the edges", so to speak, since I didn't have much time for testing on different devices or brushing things up enough so I'd feel comfortable pushing it to the module directory. But here's the link to the GitHub repo for now:
      InputfieldSlideToggle
      Fieldtype and Inputfield that implements smartphone-style toggles as replacement for checkbox inputs. The visualization is CSS-only, no additional JS necessary.
      Status
      Still very alpha, use with caution!
      Features / Field Settings
      Size
      You can render the toggles in four different sizes: small, medium, large and extra large.
      Off Color
      Currently, "unchecked" toggles can be displayed either in grey (default) or red.
      On Color
      "Checked" toggles can be rendered in one of these colors: blue (default), black, green, grey, orange or red.
      Screenshots

      Some examples with checkbox label


      View all Size and Color Combinations
      Small toggles Medium toggles Big toggles Extra big toggles  









×
×
  • Create New...