Jump to content
adrian

Custom Upload Names

Recommended Posts

I just committed an update that brings full support for repeater fields (images and images embedded into RTE fields inside repeaters).

I also fixed a bug with the new core cropping functionality if you set a filename format that is not available on file upload, such as $file->description.

There were some significant changes to hooks and logic to get the repeaters working, so please test and let me know if you come across any problems.

  • Like 5

Share this post


Link to post
Share on other sites

Adrian thanks for this module.

I'm having some problems with images inside repeater. It acts very strange. It gives errors when i try to add o remove images from the repeater field, and then save the page. And if i try to add a new repeater item, the image field in it is already populated with an image i thought i had deleted. 

I attach some screenshots with various errors i'm receiving.

Let me know how can i help to make this more clear.

post-2122-0-77584400-1427737342_thumb.pn

post-2122-0-29706400-1427737355_thumb.pn

post-2122-0-17649700-1427737362_thumb.pn

Share this post


Link to post
Share on other sites

Sorry about the errors you are seeing. Repeater support is very new, but I am not seeing any issues at my end. Can you please let me know the filename format you defined. Also what other field types do you have on the page and also in the repeater. Do you have more than one repeater field on the page. What version of PW are you using.

Also, would you mind trying a little debugging for me - try logging the value of $this->pages and also $field just before line 312.

Share this post


Link to post
Share on other sites

Sure, Adrian.

This is the filename format: {$page->title}-##

These are the fields on that template:

- the field slideshow_repeater, that gives those problems has an image_field (that has maximum files allowed = 1) and a url field. 

- an image field with maximum files allowed = 1 (i had no problems with this field)

- an image field with maximum files allowed = 0 (i had no problems with this field)

- 2 files field

- a lot of text and textarea fields

- all the seo fields from the Seo Module

There are no other repeaters on that template (i'm attaching a screenshot).

I'm also using the image extra module on InputfieldImage and InputfieldFile

I'm using PW 2.5.23 dev

I'm sorry, i'm not so sure how to log the errors you asked, i'm not a php developer, so i tried with error_log() and i just get "Pages" for $this->pages and i get "1.jpg" or "2.jpg" etc for $this->pages->get($pageid)->$field

Thanks a lot!

post-2122-0-95213100-1427740880_thumb.pn

Share this post


Link to post
Share on other sites

Thanks for all that info - I tried to replicate your image fields setup but still can't get the error.

Sorry I didn't ask for quite the correct things for the log output.

Can you please try replacing:

//filename format can support $page, $template, $field, and $file variables in the format as defined in the module config settings
//if repeater page, need to use parent page for determining name
$page = $repeaterPage !== null ? $repeaterPage->getForpage() : $this->pages->get($pageid);
$field = $this->fields->get($fieldid);
$template = $page->template;
$file = $this->pages->get($pageid)->$field->get("name={$path_parts['basename']}");

with:

//filename format can support $page, $template, $field, and $file variables in the format as defined in the module config settings
//if repeater page, need to use parent page for determining name
error_log('pageid: ' . $pageid);
$page = $repeaterPage !== null ? $repeaterPage->getForpage() : $this->pages->get($pageid);
error_log('page->id: ' . $page->id);  
error_log('page->name: ' . $page->name);                
$field = $this->fields->get($fieldid);
error_log('fieldid: ' . $fieldid);  
error_log('field->name: ' . $field->name);         
$template = $page->template;
error_log('template->name: ' . $template->name);
$file = $this->pages->get($pageid)->$field->get("name={$path_parts['basename']}");

and send me all the logged output.

Hopefully that will help me figure out where the issue might be.

Share this post


Link to post
Share on other sites

These are the logged errors in a page with two repeater items, one image per each:

pageid: 1372
page->id: 1053
page->name: digital-compositing-nuke
fieldid: 98
field->name: single_image
template->name: corso
pageid: 1373
page->id: 1053
page->name: digital-compositing-nuke
fieldid: 98
field->name: single_image
template->name: corso
pageid: 1373
page->id: 1373
page->name: 1427738337-12-1
fieldid: 120
field->name: cover_image
template->name: repeater_slideshow

I'm not sure, but maybe there is something strange with this: "page->name: 1427738337-12-1" (that's not the page name), and this "field->name: cover_image" because cover_image is not a field inside the repeater, it's outside. 

If it can help you I can give you access to the admin page, or to the project directories.

Thanks!

Share this post


Link to post
Share on other sites

Thanks for debug report - I was able to reproduce the problem here and I have committed a fix.

I hope I haven't broken anything else - it's a little complicated dealing with repeaters sometimes :)

Please let me know if it works for you and if you find any other issues.

BTW, I am assuming you have "Rename on Save" checked - that seemed to be when the issue showed up for me, although not always.

I also improved the behavior for checking existing numbered suffixes on the same main page, so now you won't end up with two images of the same filename, one inside a repeater and one on the main page, which was possible before.

  • Like 1

Share this post


Link to post
Share on other sites

Great thanks!

It seems to work properly now.

Yes i have "Rename on save" checked, i forgot to tell.

Really thanks!

  • Like 1

Share this post


Link to post
Share on other sites

Hi Adrian,

I'm wondering if it's possible to use this with Form Builder - which I've set to automatically create pages from submissions. When I set up a rule to only look at the page template (of the page being created) and two image fields my FB form starts to give me server 500 errors. If I remove the rule my FB form starts working again.

Cheers

Marty

Share this post


Link to post
Share on other sites

Hey Marty,

I am not a Formbuilder user so I don't know all the ins and outs, but I just set up a form and tested with CustomUploadNames and the page was created and the filename was changed as it should have been.

I have a feeling because CUN and FB both have so many config options, it might be just the combination you have that is causing problems.

Perhaps you could export the form for me to test and also take a screenshot of your CUN rule so I can duplicate.

I am sure we can get it sorted out for you.

Share this post


Link to post
Share on other sites

Hi Adrian,

I've got a problem when using fields in the filename format that are populated at the same time as the upload field (PDF in my case). The format looks like this:

customer-{$page->customer_id}

When a new page is created, the user fills in a value into the customer_id field and then uploads a PDF, which should get renamed. However, the value inside customer_id is not respected, as the PDF gets renamed right after upload and before hitting Save. A click on Save also doesn't rename it again.

I remember this worked a couple of versions ago, but not anymore. Did you change something in that area?

Using "Rename on Save" isn't an option as I need the filename to stay the same and not add a -1 suffix every second save.

Share this post


Link to post
Share on other sites

Sorry about that @charger. I had to change on of the hooks when I added support for repeaters which resulted in the issue you saw.

It should be fixed now and actually the new method is better and more reliable in other situations too.

Please grab the latest version and let me know.

On another note, I am curious about your comment regarding the -1 suffix on every second save - that actually shouldn't happen with this module, so if you are seeing that, please let me know and I'll investigate further. That said, I avoid the "Rename on Save" option whenever possible, so not suggesting you should use it, but I do want to make sure that using it doesn't result in the numbered suffix.

Thanks for reporting this.

Share this post


Link to post
Share on other sites

Thanks for the quick update, it again works as expected!

The -1 suffix still happens though with the "Rename on Save" option enabled. So whenever I hit Save, the filename alternates between having the suffix and not.

Let me know if you need other specific info.

Share this post


Link to post
Share on other sites

Glad to hear that it's working again for you!

I am still baffled about the -1 suffix with "Rename on Save" though. Could you maybe post screenshots of your settings for this module as well as letting me know the settings for your PDF field, eg:

  • Max Files Allowed
  • Overwrite existing files

I have tried lots of different combinations and it keeps the filename without the numbered suffix for me. Any chance you are on a Windows server - just wondering if maybe there is a directory separator issue.

Is there only one files field on the page? If it allows more than one file to be uploaded, are you actually still only uploading one or are there several?

Is there anything else you can think of that might contribute to this?

Thanks!

EDIT: One other thing to check - it there any chance that there is an extra file in the page's assets/files/1234 directory. Perhaps when it wasn't being renamed correctly I duplicate was left over - this would cause the behavior you are seeing, so please empty the files folder and try again. And/or try on a new page where you know the files folder is empty / without duplicates.

Share this post


Link to post
Share on other sites

I've attached the screenshot of my settings.

The PDF allows max one file and does overwrite existing files.

There's also just this file field on the page.

I created multiple new pages to make sure there are no leftover duplicates in the assets/files folder.

The website is not hosted on a Windows server.

Hmm.. I don't have any clue what else could cause it.

post-2284-0-23987200-1432129258_thumb.pn

Share this post


Link to post
Share on other sites

I noticed that the module also renames the files of a language pack during upload (if no fields are listed under Enabled Fields). Maybe this should be prevented by default.

Share this post


Link to post
Share on other sites

I noticed that the module also renames the files of a language pack during upload (if no fields are listed under Enabled Fields). Maybe this should be prevented by default.

Thanks for reporting. I have fixed this. I was thinking about disabling the module from affecting any pages under the admin, but thought some users may store some settings type pages, so for the moment I have just excluded pages with the "language" template.

Please let me know if you have any problems.

Share this post


Link to post
Share on other sites

Good day, Adrian!

I am adding images to an ImageField with CustomUploadNames hook enabled via API like this:

$images->add($file_path);

"Maximum files allowed" = 1. If "Formatted value" is set to automatic I get this error:

Error: Call to a member function getVariations() on a non-object (line 245 of /var/www/***/site/modules/ProcessCustomUploadNames/ProcessCustomUploadNames.module)

If "Formatted value" is set to Array of items, there is no error. Am I doing something wrong or is it a bug?

  • Like 1

Share this post


Link to post
Share on other sites

Hi Ivan,

Thanks for reporting that - it should be fixed in the version I just committed.

Please let me know how it goes.

  • Like 2

Share this post


Link to post
Share on other sites

This issue turned out to be related to this module. In short: As long as Custom Upload Names is installed, I get a fatal error when I try to view an entry within the Entries tab within a FormBuilder form.

  • Like 3

Share this post


Link to post
Share on other sites

Sorry everyone for the delay on fixing this - I was on vacation. It was related to a recent change to prevent it affecting language file uploads. 

Please let me know if anyone still has any issues.

Share this post


Link to post
Share on other sites

Dear Adrian,

I have strange issue with pages which have numbers and hyphens in $page->name (ex. foret-17).

Each save one of pictures becomes empty with error "file cannot be displayed". That mean, if I save page 10 times it lost 10 images.

After changing page name everything working fine.

  • Like 1

Share this post


Link to post
Share on other sites

Hi Alexander,

I just tried to replicate here and can't seem to. Could you maybe post some screenshots of your CUN settings and also the tree of pages. Or better yet can you set up an example on lightning.pw so I can see the issue in action?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By teppo
      Needed a really simple solution to embed audio files within page content and couldn't find a module for that, so here we go. Textformatter Audio Embed works a bit like Textformatter Video Embed, converting this:
      <p>https://www.domain.tld/path/to/file.mp3</p> Into this:
      <audio controls class="TextformatterAudioEmbed"> <source src="https://www.domain.tld/path/to/file.mp3" type="audio/mpeg"> </audio> The audio element has pretty good browser support, so quite often this should be enough to get things rolling 🙂
      GitHub repository: https://github.com/teppokoivula/TextformatterAudioEmbed Modules directory: https://modules.processwire.com/modules/textformatter-audio-embed/
    • By Richard Jedlička
      Tense    
      Tense (Test ENvironment Setup & Execution) is a command-line tool to easily run tests agains multiple versions of ProcessWire CMF.
      Are you building a module, or a template and you need to make sure it works in all supported ProcessWire versions? Then Tense is exactly what you need. Write the tests in any testing framework, tell Tense which ProcessWire versions you are interested in and it will do the rest for you.

      See example or see usage in a real project.
      How to use?
      1. Install it: 
      composer global require uiii/tense 2. Create tense.yml config:
      tense init 3. Run it:
      tense run  
      For detailed instructions see Github page: https://github.com/uiii/tense
       
      This is made possible thanks to the great wireshell tool by @justb3a, @marcus and others.
       
      What do you think about it? Do you find it useful? Do you have some idea? Did you find some bug? Tell me you opinion. Write it here or in the issue tracker.
    • By Chris Bennett
      Hi all, I am going round and round in circles and would greatly appreciate if anyone can point me in the right direction.
      I am sure I am doing something dumb, or missing something I should know, but don't. Story of my life 😉

      Playing round with a module and my basic problem is I want to upload an image and also use InputfieldMarkup and other Inputfields.
      Going back and forth between trying an api generated page defining Fieldgroup, Template, Fields, Page and the InputfieldWrapper method.

      InputfieldWrapper method works great for all the markup stuff, but I just can't wrap my head around what I need to do to save the image to the database.
      Can generate a Field for it (thanks to the api investigations) but not sure what I need to do to link the Inputfield to that. Tried a lot of stuff from various threads, of varying dates without luck.
      Undoubtedly not helped by me not knowing enough.

      Defining Fieldgroup etc through the api seems nice and clean and works great for the images but I can't wrap my head around how/if I can add/append/hook the InputfieldWrapper/InputfieldMarkup stuff I'd like to include on that template as well. Not even sure if it should be where it is on ___install with the Fieldtype stuff or later on . Not getting Tracy errors, just nothing seems to happen.
      If anyone has any ideas or can point me in the right direction, that would be great because at the moment I am stumbling round in the dark.
       
      public function ___install() { parent::___install(); $page = $this->pages->get('name='.self::PAGE_NAME); if (!$page->id) { // Create fieldgroup, template, fields and page // Create new fieldgroup $fmFieldgroup = new Fieldgroup(); $fmFieldgroup->name = MODULE_NAME.'-fieldgroup'; $fmFieldgroup->add($this->fields->get('title')); // needed title field $fmFieldgroup->save(); // Create new template using the fieldgroup $fmTemplate = new Template(); $fmTemplate->name = MODULE_NAME; $fmTemplate->fieldgroup = $fmFieldgroup; $fmTemplate->noSettings = 1; $fmTemplate->noChildren = 1; $fmTemplate->allowNewPages = 0; $fmTemplate->tabContent = MODULE_NAME; $fmTemplate->noChangeTemplate = 1; $fmTemplate->setIcon(ICON); $fmTemplate->save(); // Favicon source $fmField = new Field(); $fmField->type = $this->modules->get("FieldtypeImage"); $fmField->name = 'fmFavicon'; $fmField->label = 'Favicon'; $fmField->focusMode = 'off'; $fmField->gridMode = 'grid'; $fmField->extensions = 'svg png'; $fmField->columnWidth = 50; $fmField->collapsed = Inputfield::collapsedNever; $fmField->setIcon(ICON); $fmField->addTag(MODULE_NAME); $fmField->save(); $fmFieldgroup->add($fmField); // Favicon Silhouette source $fmField = new Field(); $fmField->type = $this->modules->get("FieldtypeImage"); $fmField->name = 'fmFaviconSilhouette'; $fmField->label = 'SVG Silhouette'; $fmField->notes = 'When creating a silhouette/mask svg version for Safari Pinned Tabs and Windows Tiles, we recommend setting your viewbox for 0 0 16 16, as this is what Apple requires. In many cases, the easiest way to do this in something like illustrator is a sacrificial rectangle with no fill, and no stroke at 16 x 16. This forces the desired viewbox and can then be discarded easily using something as simple as notepad. Easy is good, especially when you get the result you want without a lot of hassle.'; $fmField->focusMode = 'off'; $fmField->extensions = 'svg'; $fmField->columnWidth = 50; $fmField->collapsed = Inputfield::collapsedNever; $fmField->setIcon(ICON); $fmField->addTag(MODULE_NAME); $fmField->save(); $fmFieldgroup->add($fmField); // Create: Open Settings Tab $tabOpener = new Field(); $tabOpener->type = new FieldtypeFieldsetTabOpen(); $tabOpener->name = 'fmTab1'; $tabOpener->label = "Favicon Settings"; $tabOpener->collapsed = Inputfield::collapsedNever; $tabOpener->addTag(MODULE_NAME); $tabOpener->save(); // Create: Close Settings Tab $tabCloser = new Field(); $tabCloser->type = new FieldtypeFieldsetClose; $tabCloser->name = 'fmTab1' . FieldtypeFieldsetTabOpen::fieldsetCloseIdentifier; $tabCloser->label = "Close open tab"; $tabCloser->addTag(MODULE_NAME); $tabCloser->save(); // Create: Opens wrapper for Favicon Folder Name $filesOpener = new Field(); $filesOpener->type = new FieldtypeFieldsetOpen(); $filesOpener->name = 'fmOpenFolderName'; $filesOpener->label = 'Wrap Folder Name'; $filesOpener->class = 'inline'; $filesOpener->collapsed = Inputfield::collapsedNever; $filesOpener->addTag(MODULE_NAME); $filesOpener->save(); // Create: Close wrapper for Favicon Folder Name $filesCloser = new Field(); $filesCloser->type = new FieldtypeFieldsetClose(); $filesCloser->name = 'fmOpenFolderName' . FieldtypeFieldsetOpen::fieldsetCloseIdentifier; $filesCloser->label = "Close open fieldset"; $filesCloser->addTag(MODULE_NAME); $filesCloser->save(); // Create Favicon Folder Name $fmField = new Field(); $fmField->type = $this->modules->get("FieldtypeText"); $fmField->name = 'folderName'; $fmField->label = 'Favicon Folder:'; $fmField->description = $this->config->urls->files; $fmField->placeholder = 'Destination Folder for your generated favicons, webmanifest and browserconfig'; $fmField->columnWidth = 100; $fmField->collapsed = Inputfield::collapsedNever; $fmField->setIcon('folder'); $fmField->addTag(MODULE_NAME); $fmField->save(); $fmFieldgroup->add($tabOpener); $fmFieldgroup->add($filesOpener); $fmFieldgroup->add($fmField); $fmFieldgroup->add($filesCloser); $fmFieldgroup->add($tabCloser); $fmFieldgroup->save(); /////////////////////////////////////////////////////////////// // Experimental Markup Tests $wrapperFaviconMagic = new InputfieldWrapper(); $wrapperFaviconMagic->attr('id','faviconMagicWrapper'); $wrapperFaviconMagic->attr('title',$this->_('Favicon Magic')); // field show info what $field = $this->modules->get('InputfieldMarkup'); $field->name = 'use'; $field->label = __('How do I use it?'); $field->collapsed = Inputfield::collapsedNever; $field->icon('info'); $field->attr('value', 'Does this even begin to vaguely work?'); $field->columnWidth = 50; $wrapperFaviconMagic->add($field); $fmTemplate->fields->add($wrapperFaviconMagic); $fmTemplate->fields->save(); ///////////////////////////////////////////////////////////// // Create page $page = $this->wire( new Page() ); $page->template = MODULE_NAME; $page->parent = $this->wire('pages')->get('/'); $page->addStatus(Page::statusHidden); $page->title = 'Favicons'; $page->name = self::PAGE_NAME; $page->process = $this; $page->save(); } }  
    • By Sebi
      Since it's featured in ProcessWire Weekly #310, now is the time to make it official:
      Here is Twack!
      I really like the following introduction from ProcessWire Weekly, so I hope it is ok if I use it here, too. Look at the project's README for more details!
      Twack is a new — or rather newish — third party module for ProcessWire that provides support for reusable components in an Angular-inspired way. Twack is implemented as an installable module, and a collection of helper and base classes. Key concepts introduced by this module are:
      Components, which have separate views and controllers. Views are simple PHP files that handle the output for the component, whereas controllers extend the TwackComponent base class and provide additional data handling capabilities. Services, which are singletons that provide a shared service where components can request data. The README for Twack uses a NewsService, which returns data related to news items, as an example of a service. Twack components are designed for reusability and encapsulating a set of features for easy maintainability, can handle hierarchical or recursive use (child components), and are simple to integrate with an existing site — even when said site wasn't originally developed with Twack.
      A very basic Twack component view could look something like this:
      <?php namespace ProcessWire; ?> <h1>Hello World!</h1> And here's how you could render it via the API:
      <?php namespace Processwire; $twack = $modules->get('Twack'); $hello = $twack->getNewComponent('HelloWorld'); ?> <html> <head> <title>Hello World</title> </head> <body> <?= $hello->render() ?> </body> </html> Now, just to add a bit more context, here's a simple component controller:
      <?php namespace ProcessWire; class HelloWorld extends TwackComponent { public function __construct($args) { parent::__construct($args); $this->title = 'Hello World!'; if(isset($args['title'])) { $this->title = $args['title']; } } } As you can see, there's not a whole lot new stuff to learn here if you'd like to give Twack a try in one of your projects. The Twack README provides a really informative and easy to follow introduction to all the key concepts (as well as some additional examples) so be sure to check that out before getting started. 
      Twack is in development for several years and I use it for every new project I build. Also integrated is an easy to handle workflow to make outputs as JSON, so it can be used to build responses for a REST-api as well. I will work that out in one section in the readme as well. 
      If you want to see the module in an actual project, I have published the code of www.musical-fabrik.de in a repository. It runs completely with Twack and has an app-endpoint with ajax-output as well.
      I really look forward to hear, what you think of Twack🥳!
      Features Installation Usage Quickstart: Creating a component Naming conventions & component variants Component Parameters directory page parameters viewname Asset handling Services Named components Global components Ajax-Output Configuration Versioning License Changelog
    • By Robin S
      Page Reference Default Value
      Most ProcessWire core inputfield types that can be used with a Page Reference field support a "Default value" setting. This module extends support for default values to the following core inputfield types:
      Page List Select Page List Select Multiple Page Autocomplete (single and multiple) Seeing as these inputfield types only support the selection of pages a Page List Select / Page List Select Multiple is used for defining the default value instead of the Text / Textarea field used by the core for other inputfield types. This makes defining a default value a bit more user-friendly.
      Note that as per the core "Default value" setting, the Page Reference field must be set to "required" in order for the default value to be used.
      Screenshot

       
      https://github.com/Toutouwai/PageReferenceDefaultValue
      https://modules.processwire.com/modules/page-reference-default-value/
×
×
  • Create New...