-
-
Save Qubadi/48174b21a5a28e93da7737835e31cccf to your computer and use it in GitHub Desktop.
UPDATED : | |
A new functionality for generating unique filenames for each cropped image | |
1. I've developed a new custom code for JetFormBuilder, designed to allow users to crop images. | |
I'm excited to share it with the group, making it accessible to most members here. | |
2. To begin, you'll need to create four fields: two media fields and two hidden fields. It's convenient to use the same | |
field names across these, so there's no need to modify the custom code. | |
3. An important aspect I didn’t cover in the video is setting the media field as the post thumbnail and configuring | |
the gallery field as a Meta field. This is done in the 'Post Submit Actions' under 'Insert/Update Post' in the FIELDS MAP section. | |
4. I have included CSS custom code in the provided link to help you style and customize the media field | |
5. Lastly, it’s crucial to enable CSRF protection for enhanced security. | |
If you want to see the video, visit the Crocoblock community group in Facebook. | |
CSS code: | |
/* Style and customize the media field */ | |
.jet-form-builder__field-wrap.jet-form-builder-file-upload { | |
border-radius: 10px !important; | |
border-style: dashed !important; | |
border-width: 2px !important; | |
border-color: #69727d !important; | |
padding: 10px !important; | |
} | |
Custom code ( PHP snippet, all in one ) | |
function enqueue_cropperjs_scripts() { | |
wp_enqueue_script('jquery'); | |
wp_enqueue_script('cropperjs', 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.9/cropper.min.js', array('jquery'), '1.5.9', true); | |
wp_enqueue_style('cropperjs-css', 'https://cdnjs.cloudflare.com/ajax/libs/cropperjs/1.5.9/cropper.min.css', array(), '1.5.9', 'all'); | |
} | |
add_action('wp_enqueue_scripts', 'enqueue_cropperjs_scripts'); | |
function add_custom_cropperjs_javascript() { | |
?> | |
<script type="text/javascript"> | |
jQuery(document).ready(function($) { | |
var croppers = {}; | |
var galleryCroppers = []; | |
var maxGalleryFiles = 2; // Maximum files allowed for gallery_field | |
var maxMediaFiles = 1; // Maximum files allowed for media_field_upload | |
function generateUniqueFilename(prefix) { | |
var timestamp = new Date().getTime(); | |
var randomNum = Math.floor(Math.random() * 1000); | |
return prefix + '_' + timestamp + '_' + randomNum + '.jpg'; | |
} | |
function setupCropper(fieldId, previewIdBase, buttonName) { | |
$('#' + fieldId).change(function(event) { | |
var files = event.target.files; | |
var fileCount = (fieldId === 'gallery_field') ? galleryCroppers.length : (croppers[fieldId] ? 1 : 0); | |
if ((fieldId === 'gallery_field' && fileCount + files.length > maxGalleryFiles) || | |
(fieldId === 'media_field_upload' && fileCount + files.length > maxMediaFiles)) { | |
alert('You can only upload a maximum of ' + (fieldId === 'gallery_field' ? maxGalleryFiles : maxMediaFiles) + ' image(s).'); | |
this.value = ''; // Clear the selected files | |
return; // Stop further execution | |
} | |
var imageContainer = $('#' + fieldId).siblings('.image-container'); | |
if (imageContainer.length === 0) { | |
imageContainer = $('<div class="image-container"></div>'); // Create a container for all images | |
$('#' + fieldId).after(imageContainer); // Append the container after the input field | |
} | |
$.each(files, function(index, file) { | |
if (!file.type.match('image.*')) { | |
alert('Invalid file type. Please select an image.'); | |
return true; | |
} | |
var fileReader = new FileReader(); | |
var previewId = previewIdBase + fileCount + index; | |
fileReader.onload = function(e) { | |
var imagePreview = $('<img id="' + previewId + '" class="gallery-image">'); | |
imagePreview.attr('src', e.target.result); | |
var imagePreviewContainer = $('<div class="gallery-image-container"></div>'); | |
imagePreviewContainer.append(imagePreview); | |
imageContainer.append(imagePreviewContainer); | |
imagePreview.show(); | |
if (fieldId === 'gallery_field') { | |
galleryCroppers.push(new Cropper(imagePreview[0], { | |
aspectRatio: 600 / 400, | |
viewMode: 1 | |
})); | |
} else if (fieldId === 'media_field_upload') { | |
if (croppers[fieldId]) { | |
croppers[fieldId].destroy(); | |
} | |
croppers[fieldId] = new Cropper(imagePreview[0], { | |
aspectRatio: 1, | |
viewMode: 1 | |
}); | |
} | |
}; | |
fileReader.readAsDataURL(file); | |
}); | |
$('input[name="' + buttonName + '"]').attr('type', 'button').val('Crop Images').show(); | |
}); | |
} | |
setupCropper('media_field_upload', 'mediaImagePreview', 'crop_button'); | |
setupCropper('gallery_field', 'galleryImagePreview', 'crop_button_gallery'); | |
$(document).on('click', 'input[name="crop_button"]', function() { | |
if (croppers['media_field_upload']) { | |
croppers['media_field_upload'].getCroppedCanvas({ | |
width: 300, | |
height: 300 | |
}).toBlob(function(blob) { | |
var uniqueFilename = generateUniqueFilename('croppedImage'); | |
var newFile = new File([blob], uniqueFilename, {type: 'image/jpeg'}); | |
var dataTransfer = new DataTransfer(); | |
dataTransfer.items.add(newFile); | |
$('#media_field_upload')[0].files = dataTransfer.files; | |
}, 'image/jpeg'); | |
} | |
$(this).hide(); | |
}); | |
$(document).on('click', 'input[name="crop_button_gallery"]', function() { | |
var dataTransfer = new DataTransfer(); | |
$.each(galleryCroppers, function(index, cropper) { | |
if (cropper) { | |
cropper.getCroppedCanvas({ | |
width: 600, | |
height: 400 | |
}).toBlob(function(blob) { | |
var uniqueFilename = generateUniqueFilename('croppedGalleryImage_' + index); | |
var newFile = new File([blob], uniqueFilename, {type: 'image/jpeg'}); | |
dataTransfer.items.add(newFile); | |
if (index === galleryCroppers.length - 1) { | |
$('#gallery_field')[0].files = dataTransfer.files; | |
} | |
}, 'image/jpeg'); | |
} | |
}); | |
$(this).hide(); | |
}); | |
}); | |
</script> | |
<?php | |
} | |
add_action('wp_footer', 'add_custom_cropperjs_javascript'); |
Hi, can you please list the name of the 4 fields. I can not figure out the name for those 2 hidden fields by the script.
Thanks in advance.
Edit:
If someone else needs to know:
Those hidden fields are for the crop button names.
crop_button
crop_button_gallery
Below the image upload for the button to show up after an image is selected.
This script does a force crop where the script below does an optional crop. I need the force crop. As the author states below, the other script is better, I will play around with it, but for now this script is working for me.
Thanks for the movie, but I can not watch it without a Facebook account...
Thanks for the script, as I have been looking for this for a while!
Hi, can you please list the name of the 4 fields. I can not figure out the name for those 2 hidden fields by the script. Thanks in advance.
Hello
High recommend u to use the new one, with new update and functionality: https://gist.github.com/Qubadi/b918070aaf15f1e48b0b2ad9baeeb117
U can watch the short video here too: https://www.facebook.com/groups/CrocoblockCommunity/permalink/8671587339599277/?mibextid=rS40aB7S9Ucbxw6v
Hi Qubadi!
Very useful code! I really need that feature.
But I find it needs two more critical adjustments:
1- It's important that the Cropper will one the new photos being added and NOT also the preset photos. It destroy already cropped images.
2-In order to re-crop an image, it will be good to have icon on the preview image (like the remove icon) that will trigger cropper ONLY on that image.
For 2, I started with this:
// Add edit icon to already added files $('.jet-form-builder-file-upload__file').each(function(index, element) { var fileName = $(this).find('.jet-form-builder-file-upload__value').val().split('/').pop(); var editIcon = $('<div class="edit-icon" data-file-name="' + fileName + '"><i class="fa fa-pencil"></i></div>'); $(this).append(editIcon); });
But i got no idea how to make the edit icon to trigger the cropper only on the relevant image.
Hope you can help with this.