diff --git a/wire/core/Pagefile.php b/wire/core/Pagefile.php
index 22c8f5c1..ba8e6db5 100644
--- a/wire/core/Pagefile.php
+++ b/wire/core/Pagefile.php
@@ -763,7 +763,7 @@ class Pagefile extends WireData {
*
*/
public function __toString() {
- return $this->basename;
+ return (string) $this->basename;
}
/**
diff --git a/wire/core/ProcessWire.php b/wire/core/ProcessWire.php
index 1146ed1a..e273f436 100644
--- a/wire/core/ProcessWire.php
+++ b/wire/core/ProcessWire.php
@@ -45,7 +45,7 @@ class ProcessWire extends Wire {
* Reversion revision number
*
*/
- const versionRevision = 61;
+ const versionRevision = 62;
/**
* Version suffix string (when applicable)
diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js
index 5dbd19d1..7c15c375 100755
--- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js
+++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.js
@@ -112,10 +112,10 @@ $(document).ready(function() {
$("body").addClass("ie-no-drop"); // ??
$(document).on('change', '.InputfieldFileUpload input[type=file]', function() {
-
+
var $t = $(this);
- var $mask = $t.parent(".InputMask");
-
+ var $mask = $t.closest(".InputMask");
+
if($t.val().length > 1) {
$mask.addClass("ui-state-disabled");
} else {
@@ -130,18 +130,22 @@ $(document).ready(function() {
var maxFiles = parseInt($upload.find('.InputfieldFileMaxFiles').val());
var numFiles = $list.children('li').length + $upload.find('input[type=file]').length + 1;
- if(maxFiles > 0 && numFiles >= maxFiles) return;
+ if(maxFiles > 0 && numFiles >= maxFiles) {
+ // no more files allowed
+ } else {
+ $upload.find(".InputMask").not(":last").each(function() {
+ var $m = $(this);
+ if($m.find("input[type=file]").val() < 1) $m.remove();
+ });
- $upload.find(".InputMask").not(":last").each(function() {
- var $m = $(this);
- if($m.find("input[type=file]").val() < 1) $m.remove();
- });
-
- // add another input
- var $i = $mask.clone().removeClass("ui-state-disabled");
- $i.children("input[type=file]").val('');
- $i.insertAfter($mask);
- $i.css('margin-left', '0.5em').removeClass('ui-state-active');
+ // add another input
+ var $mask2 = $mask.clone().removeClass("ui-state-disabled");
+ var $input = $mask2.find('input[type=file]');
+ $input.attr('id', $input.attr('id') + '-');
+ $input.val('');
+ $mask2.insertAfter($mask);
+ $mask2.css('margin-left', '0.5em').removeClass('ui-state-active');
+ }
// update file input to contain file name
var name = $t.val();
diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js
index 9b90e1ab..599b4db6 100644
--- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js
+++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.min.js
@@ -1 +1 @@
-$(document).ready(function(){$(document).on("change",".InputfieldFileDelete input",function(){a($(this))}).on("dblclick",".InputfieldFileDelete",function(){var i=$(this).find("input");var h=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if(i.is(":checked")){h.removeAttr("checked").change()}else{h.attr("checked","checked").change()}return false});function a(j){var h=j.parents(".InputfieldFileInfo");var i=j.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if(j.is(":checked")){h.addClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideUp("fast")}}else{h.removeClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideDown("fast")}}}function c(h){h.each(function(){var j=$(this);var k=j.children("li").length;if(j.closest(".InputfieldRenderValueMode").length){return}var i=j.closest(".Inputfield");if(k<2){if(k==0){i.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle")}else{i.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple")}return}else{j.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}j.sortable({start:function(m,l){l.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(m,l){$(this).children("li").each(function(o){$(this).find(".InputfieldFileSort").val(o)});l.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");i.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){i.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function d(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var k=$(this);var p=k.parent(".InputMask");if(k.val().length>1){p.addClass("ui-state-disabled")}else{p.removeClass("ui-state-disabled")}if(p.next(".InputMask").length>0){return}var h=k.closest(".InputfieldFile");var m=k.closest(".InputfieldFileUpload");var l=h.find(".InputfieldFileList");var o=parseInt(m.find(".InputfieldFileMaxFiles").val());var j=l.children("li").length+m.find("input[type=file]").length+1;if(o>0&&j>=o){return}m.find(".InputMask").not(":last").each(function(){var r=$(this);if(r.find("input[type=file]").val()<1){r.remove()}});var q=p.clone().removeClass("ui-state-disabled");q.children("input[type=file]").val("");q.insertAfter(p);q.css("margin-left","0.5em").removeClass("ui-state-active");var i=k.val();var n=i.lastIndexOf("/");if(n===-1){n=i.lastIndexOf("\\")}i=i.substring(n+1);p.find(".ui-button-text").text(i).prepend("");p.removeClass("ui-state-active")})}function e(i){if(i.length>0){var h=i.find(".InputfieldFileUpload")}else{var h=$(".InputfieldFileUpload")}h.closest(".InputfieldContent").each(function(k){if($(this).hasClass("InputfieldFileInit")){return}j($(this),k);$(this).addClass("InputfieldFileInit")});function j(r,z){var q=r.parents("form");var k=r.closest(".InputfieldRepeaterItem");var n=k.length?k.attr("data-editUrl"):q.attr("action");n+=(n.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var D=q.find("input._post_token");var p=D.attr("name");var u=D.val();var B=r.find(".InputfieldFileUpload");var m=B.data("fieldname");m=m.slice(0,-2);var C=B.data("extensions").toLowerCase();var y=B.data("maxfilesize");var t=r.find("input[type=file]").get(0);var s=r.get(0);var l=r.find(".InputfieldFileList");if(l.size()<1){l=$("
");r.prepend(l);r.parent(".Inputfield").addClass("InputfieldFileEmpty")}var A=l.get(0);var v=parseInt(r.find(".InputfieldFileMaxFiles").val());l.children().addClass("InputfieldFileItemExisting");r.find(".AjaxUploadDropHere").show();var w=null;function o(G){var J=$(''),I=$(''),H=$(''),K,L,N,M;I.append(H);J.append(I);N=new XMLHttpRequest();N.upload.addEventListener("progress",function(O){if(O.lengthComputable){var P=(O.loaded/O.total)*100;H.width(P+"%");if(P>4){H.html(""+parseInt(P)+"%")}$("body").addClass("pw-uploading")}else{}},false);N.addEventListener("load",function(){N.getAllResponseHeaders();var U=$.parseJSON(N.responseText);if(U.error!==undefined){U=[U]}for(var S=0;S0){R.slideUp("fast",function(){R.remove()})}}var Z=r.find("input[type=file]");if(Z.val()){Z.replaceWith(Z.clone(true))}var W=$(P.markup);W.hide();if(P.overwrite){var Y=W.find(".InputfieldFileName").text();var aa=null;l.children(".InputfieldFileItemExisting").each(function(){if(aa===null&&$(this).find(".InputfieldFileName").text()==Y){aa=$(this)}});if(aa!==null){var V=W.find(".InputfieldFileInfo");var O=W.find(".InputfieldFileLink");var Q=aa.find(".InputfieldFileInfo");var X=aa.find(".InputfieldFileLink");Q.html(V.html()+"");X.html(O.html());aa.addClass("InputfieldFileItemExisting");aa.effect("highlight",500)}else{l.append(W);W.slideDown();W.addClass("InputfieldFileItemExisting")}}else{l.append(W);W.slideDown()}}}J.remove();if(w){clearTimeout(w)}w=setTimeout(function(){$("body").removeClass("pw-uploading");if(v!=1&&!l.is(".ui-sortable")){c(l)}l.trigger("AjaxUploadDone")},500)},false);N.open("POST",n,true);N.setRequestHeader("X-FILENAME",encodeURIComponent(G.name));N.setRequestHeader("X-FIELDNAME",m);N.setRequestHeader("Content-Type","application/octet-stream");N.setRequestHeader("X-"+p,u);N.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");N.send(G);M=" "+G.name+' • '+parseInt(G.size/1024,10)+" kb";J.find("p.ui-widget-header").html(M);l.append(J);var E=l.closest(".Inputfield");E.addClass("InputfieldStateChanged");var F=E.find(".InputfieldFileItem").length;if(F==1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else{if(F>1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}}function x(G){function H(J,K){return'"}if(typeof G!=="undefined"){for(var F=0,E=G.length;Fy&&y>2000000){l.append(H(G[F].name,"Filesize "+parseInt(G[F].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(y/1024,10)+" kb"))}else{o(G[F])}}if(v==1){break}}}else{A.innerHTML="No support for the File API in this web browser"}}t.addEventListener("change",function(E){x(this.files);E.preventDefault();E.stopPropagation();this.value=""},false);s.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover");$(this).closest(".Inputfield").removeClass("pw-drag-in-file")},false);s.addEventListener("dragenter",function(){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")},false);s.addEventListener("dragover",function(E){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")}E.preventDefault();E.stopPropagation()},false);s.addEventListener("drop",function(E){x(E.dataTransfer.files);$(this).removeClass("ui-state-hover").closest(".Inputfield").removeClass("pw-drag-in-file");E.preventDefault();E.stopPropagation()},false)}}c($(".InputfieldFileList"));if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){e("")}else{d()}var g=767;var f=false;var b=function(){$(".AjaxUploadDropHere").each(function(){var h=$(this);if(h.parent().width()<=g){h.hide()}else{h.show()}});f=false};$(window).resize(function(){if(f){return}f=true;setTimeout(b,1000)}).resize();$(document).on("reloaded",".InputfieldHasFileList",function(h){c($(this).find(".InputfieldFileList"));e($(this));b()})});
\ No newline at end of file
+$(document).ready(function(){$(document).on("change",".InputfieldFileDelete input",function(){a($(this))}).on("dblclick",".InputfieldFileDelete",function(){var i=$(this).find("input");var h=$(this).parents(".InputfieldFileList").find(".InputfieldFileDelete input");if(i.is(":checked")){h.removeAttr("checked").change()}else{h.attr("checked","checked").change()}return false});function a(j){var h=j.parents(".InputfieldFileInfo");var i=j.closest(".InputfieldFile").hasClass("InputfieldItemListCollapse");if(j.is(":checked")){h.addClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideUp("fast")}}else{h.removeClass("ui-state-error");if(!i){h.siblings(".InputfieldFileData").slideDown("fast")}}}function c(h){h.each(function(){var j=$(this);var k=j.children("li").length;if(j.closest(".InputfieldRenderValueMode").length){return}var i=j.closest(".Inputfield");if(k<2){if(k==0){i.addClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple InputfieldFileSingle")}else{i.addClass("InputfieldFileSingle").removeClass("InputfieldFileEmpty InputfieldFileMultiple")}return}else{j.closest(".Inputfield").removeClass("InputfieldFileSingle InputfieldFileEmpty").addClass("InputfieldFileMultiple")}j.sortable({start:function(m,l){l.item.children(".InputfieldFileInfo").addClass("ui-state-highlight")},stop:function(m,l){$(this).children("li").each(function(o){$(this).find(".InputfieldFileSort").val(o)});l.item.children(".InputfieldFileInfo").removeClass("ui-state-highlight");i.addClass("InputfieldFileJustSorted InputfieldStateChanged");setTimeout(function(){i.removeClass("InputfieldFileJustSorted")},500)}})}).find(".ui-widget-header, .ui-state-default").hover(function(){$(this).addClass("ui-state-hover")},function(){$(this).removeClass("ui-state-hover")})}function d(){$("body").addClass("ie-no-drop");$(document).on("change",".InputfieldFileUpload input[type=file]",function(){var k=$(this);var r=k.closest(".InputMask");if(k.val().length>1){r.addClass("ui-state-disabled")}else{r.removeClass("ui-state-disabled")}if(r.next(".InputMask").length>0){return}var h=k.closest(".InputfieldFile");var m=k.closest(".InputfieldFileUpload");var l=h.find(".InputfieldFileList");var q=parseInt(m.find(".InputfieldFileMaxFiles").val());var j=l.children("li").length+m.find("input[type=file]").length+1;if(q>0&&j>=q){}else{m.find(".InputMask").not(":last").each(function(){var s=$(this);if(s.find("input[type=file]").val()<1){s.remove()}});var p=r.clone().removeClass("ui-state-disabled");var o=p.find("input[type=file]");o.attr("id",o.attr("id")+"-");o.val("");p.insertAfter(r);p.css("margin-left","0.5em").removeClass("ui-state-active")}var i=k.val();var n=i.lastIndexOf("/");if(n===-1){n=i.lastIndexOf("\\")}i=i.substring(n+1);r.find(".ui-button-text").text(i).prepend("");r.removeClass("ui-state-active")})}function e(i){if(i.length>0){var h=i.find(".InputfieldFileUpload")}else{var h=$(".InputfieldFileUpload")}h.closest(".InputfieldContent").each(function(k){if($(this).hasClass("InputfieldFileInit")){return}j($(this),k);$(this).addClass("InputfieldFileInit")});function j(r,z){var q=r.parents("form");var k=r.closest(".InputfieldRepeaterItem");var n=k.length?k.attr("data-editUrl"):q.attr("action");n+=(n.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var D=q.find("input._post_token");var p=D.attr("name");var u=D.val();var B=r.find(".InputfieldFileUpload");var m=B.data("fieldname");m=m.slice(0,-2);var C=B.data("extensions").toLowerCase();var y=B.data("maxfilesize");var t=r.find("input[type=file]").get(0);var s=r.get(0);var l=r.find(".InputfieldFileList");if(l.size()<1){l=$("");r.prepend(l);r.parent(".Inputfield").addClass("InputfieldFileEmpty")}var A=l.get(0);var v=parseInt(r.find(".InputfieldFileMaxFiles").val());l.children().addClass("InputfieldFileItemExisting");r.find(".AjaxUploadDropHere").show();var w=null;function o(G){var J=$(''),I=$(''),H=$(''),K,L,N,M;I.append(H);J.append(I);N=new XMLHttpRequest();N.upload.addEventListener("progress",function(O){if(O.lengthComputable){var P=(O.loaded/O.total)*100;H.width(P+"%");if(P>4){H.html(""+parseInt(P)+"%")}$("body").addClass("pw-uploading")}else{}},false);N.addEventListener("load",function(){N.getAllResponseHeaders();var U=$.parseJSON(N.responseText);if(U.error!==undefined){U=[U]}for(var S=0;S0){R.slideUp("fast",function(){R.remove()})}}var Z=r.find("input[type=file]");if(Z.val()){Z.replaceWith(Z.clone(true))}var W=$(P.markup);W.hide();if(P.overwrite){var Y=W.find(".InputfieldFileName").text();var aa=null;l.children(".InputfieldFileItemExisting").each(function(){if(aa===null&&$(this).find(".InputfieldFileName").text()==Y){aa=$(this)}});if(aa!==null){var V=W.find(".InputfieldFileInfo");var O=W.find(".InputfieldFileLink");var Q=aa.find(".InputfieldFileInfo");var X=aa.find(".InputfieldFileLink");Q.html(V.html()+"");X.html(O.html());aa.addClass("InputfieldFileItemExisting");aa.effect("highlight",500)}else{l.append(W);W.slideDown();W.addClass("InputfieldFileItemExisting")}}else{l.append(W);W.slideDown()}}}J.remove();if(w){clearTimeout(w)}w=setTimeout(function(){$("body").removeClass("pw-uploading");if(v!=1&&!l.is(".ui-sortable")){c(l)}l.trigger("AjaxUploadDone")},500)},false);N.open("POST",n,true);N.setRequestHeader("X-FILENAME",encodeURIComponent(G.name));N.setRequestHeader("X-FIELDNAME",m);N.setRequestHeader("Content-Type","application/octet-stream");N.setRequestHeader("X-"+p,u);N.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");N.send(G);M=" "+G.name+' • '+parseInt(G.size/1024,10)+" kb";J.find("p.ui-widget-header").html(M);l.append(J);var E=l.closest(".Inputfield");E.addClass("InputfieldStateChanged");var F=E.find(".InputfieldFileItem").length;if(F==1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else{if(F>1){E.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}}function x(G){function H(J,K){return'"}if(typeof G!=="undefined"){for(var F=0,E=G.length;Fy&&y>2000000){l.append(H(G[F].name,"Filesize "+parseInt(G[F].size/1024,10)+" kb is too big. Maximum allowed is "+parseInt(y/1024,10)+" kb"))}else{o(G[F])}}if(v==1){break}}}else{A.innerHTML="No support for the File API in this web browser"}}t.addEventListener("change",function(E){x(this.files);E.preventDefault();E.stopPropagation();this.value=""},false);s.addEventListener("dragleave",function(){$(this).removeClass("ui-state-hover");$(this).closest(".Inputfield").removeClass("pw-drag-in-file")},false);s.addEventListener("dragenter",function(){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")},false);s.addEventListener("dragover",function(E){if(!$(this).is("ui-state-hover")){$(this).addClass("ui-state-hover");$(this).closest(".Inputfield").addClass("pw-drag-in-file")}E.preventDefault();E.stopPropagation()},false);s.addEventListener("drop",function(E){x(E.dataTransfer.files);$(this).removeClass("ui-state-hover").closest(".Inputfield").removeClass("pw-drag-in-file");E.preventDefault();E.stopPropagation()},false)}}c($(".InputfieldFileList"));if(window.File&&window.FileList&&window.FileReader&&($("#PageIDIndicator").length>0||$(".InputfieldAllowAjaxUpload").length>0)){e("")}else{d()}var g=767;var f=false;var b=function(){$(".AjaxUploadDropHere").each(function(){var h=$(this);if(h.parent().width()<=g){h.hide()}else{h.show()}});f=false};$(window).resize(function(){if(f){return}f=true;setTimeout(b,1000)}).resize();$(document).on("reloaded",".InputfieldHasFileList",function(h){c($(this).find(".InputfieldFileList"));e($(this));b()})});
\ No newline at end of file
diff --git a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module
index fd64cf36..ae599fa6 100644
--- a/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module
+++ b/wire/modules/Inputfield/InputfieldFile/InputfieldFile.module
@@ -136,17 +136,7 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
|| $this->wire('input')->get('reloadInputfieldAjax')
|| $this->wire('input')->get('renderInputfieldAjax');
- // get the max filesize
- $filesize = trim(ini_get('post_max_size'));
- $last = strtolower(substr($filesize, -1));
- if(ctype_alpha($last)) $filesize = rtrim($filesize, $last);
- $filesize = (int) $filesize;
- if($last == 'g') $this->maxFilesize = (($filesize*1024)*1024)*1024;
- else if($last == 'm') $this->maxFilesize = ($filesize*1024)*1024;
- else if($last == 'k') $this->maxFilesize = $filesize*1024;
- else if((int) $filesize > 0) $this->maxFilesize = (int) $filesize;
- else $this->maxFilesize = (5*1024)*1024;
-
+ $this->setMaxFilesize(trim(ini_get('post_max_size')));
$this->uploadOnlyMode = (int) $this->wire('input')->get('uploadOnlyMode');
$this->addClass('InputfieldItemList', 'wrapClass');
$this->addClass('InputfieldHasFileList', 'wrapClass');
@@ -166,6 +156,41 @@ class InputfieldFile extends Inputfield implements InputfieldItemList, Inputfiel
if($key == 'deleteLabel') return $this->labels['delete'];
return parent::get($key);
}
+
+ public function set($key, $value) {
+ if($key == 'maxFilesize') return $this->setMaxFilesize($value);
+ return parent::set($key, $value);
+ }
+
+ /**
+ * Set the max file size in bytes or use string like "30m", "2g" "500k"
+ *
+ * @param int|string $filesize
+ * @return $this
+ *
+ */
+ public function setMaxFilesize($filesize) {
+ if(ctype_digit("$filesize")) {
+ $this->maxFilesize = (int) $filesize;
+ } else {
+ $filesize = rtrim($filesize, 'bB'); // convert mb=>m, gb=>g, kb=>k
+ $last = strtolower(substr($filesize, -1));
+ if(ctype_alpha($last)) $filesize = rtrim($filesize, $last);
+ $filesize = (int) $filesize;
+ if($last == 'g') {
+ $this->maxFilesize = (($filesize * 1024) * 1024) * 1024;
+ } else if($last == 'm') {
+ $this->maxFilesize = ($filesize * 1024) * 1024;
+ } else if($last == 'k') {
+ $this->maxFilesize = $filesize * 1024;
+ } else if($filesize > 0) {
+ $this->maxFilesize = $filesize;
+ } else {
+ $this->maxFilesize = (5 * 1024) * 1024;
+ }
+ }
+ return $this;
+ }
/**
* Per Inputfield interface, returns true when this field is empty