acf
This commit is contained in:
@ -0,0 +1,609 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @author Tassos Marinos <info@tassos.gr>
|
||||
* @link https://www.tassos.gr
|
||||
* @copyright Copyright © 2024 Tassos All Rights Reserved
|
||||
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
|
||||
*/
|
||||
|
||||
namespace NRFramework\Widgets;
|
||||
|
||||
defined('_JEXEC') or die;
|
||||
|
||||
use Joomla\Registry\Registry;
|
||||
use Joomla\CMS\Helper\TagsHelper;
|
||||
use Joomla\CMS\Factory;
|
||||
use Joomla\CMS\Uri\Uri;
|
||||
use NRFramework\Helpers\Widgets\GalleryManager as GalleryManagerHelper;
|
||||
use NRFramework\Image;
|
||||
use Joomla\CMS\Language\Text;
|
||||
use Joomla\Filesystem\File;
|
||||
|
||||
/**
|
||||
* Gallery Manager
|
||||
*/
|
||||
class GalleryManager extends Widget
|
||||
{
|
||||
/**
|
||||
* Widget default options
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $widget_options = [
|
||||
// The input name
|
||||
'name' => '',
|
||||
|
||||
// Context of the field
|
||||
// module, default
|
||||
'context' => 'default',
|
||||
|
||||
// The field ID associated to this Gallery Manager, used to retrieve the field settings on AJAX actions
|
||||
'field_id' => null,
|
||||
|
||||
// The item ID associated to this Gallery Manager, used to retrieve the field settings on AJAX actions
|
||||
'item_id' => null,
|
||||
|
||||
/**
|
||||
* Max file size in MB.
|
||||
*
|
||||
* Defults to 0 (no limit).
|
||||
*/
|
||||
'max_file_size' => 0,
|
||||
|
||||
/**
|
||||
* How many files we can upload.
|
||||
*
|
||||
* Defaults to 0 (no limit).
|
||||
*/
|
||||
'limit_files' => 0,
|
||||
|
||||
// Allowed upload file types
|
||||
'allowed_file_types' => '.jpg, .jpeg, .png, .gif, .webp, image/webp',
|
||||
|
||||
/**
|
||||
* Original Image
|
||||
*/
|
||||
// Original image resize width
|
||||
'original_image_resize_width' => null,
|
||||
|
||||
// Original image resize height
|
||||
'original_image_resize_height' => null,
|
||||
|
||||
/**
|
||||
* Thumbnails
|
||||
*/
|
||||
// Thumbnails width
|
||||
'thumb_width' => null,
|
||||
|
||||
// Thumbnails height
|
||||
'thumb_height' => null,
|
||||
|
||||
// Thumbnails resize method (crop, stretch, fit)
|
||||
'thumb_resize_method' => 'crop',
|
||||
|
||||
// The list of tags already available for this gallery
|
||||
'tags' => [],
|
||||
|
||||
// Open AI API Key
|
||||
'openai_api_key' => '',
|
||||
|
||||
// The widget name
|
||||
'widget' => 'GalleryManager'
|
||||
];
|
||||
|
||||
public function __construct($options = [])
|
||||
{
|
||||
parent::__construct($options);
|
||||
|
||||
$this->prepare();
|
||||
}
|
||||
|
||||
private function prepare()
|
||||
{
|
||||
// Set gallery items
|
||||
$this->options['gallery_items'] = is_array($this->options['value']) ? $this->options['value'] : [];
|
||||
|
||||
// Set css class for readonly state
|
||||
if ($this->options['readonly'])
|
||||
{
|
||||
$this->options['css_class'] .= ' readonly';
|
||||
}
|
||||
|
||||
// Adds a css class when the gallery contains at least one item
|
||||
if (count($this->options['gallery_items']))
|
||||
{
|
||||
$this->options['css_class'] .= ' dz-has-items';
|
||||
}
|
||||
|
||||
// Get the Open AI API key
|
||||
$this->options['openai_api_key'] = \NRFramework\Helpers\Settings::getValue('openai_api_key');
|
||||
|
||||
// Load translation strings
|
||||
Text::script('NR_GALLERY_MANAGER_CONFIRM_REGENERATE_IMAGES');
|
||||
Text::script('NR_GALLERY_MANAGER_CONFIRM_DELETE_ALL_SELECTED');
|
||||
Text::script('NR_GALLERY_MANAGER_CONFIRM_DELETE_ALL');
|
||||
Text::script('NR_GALLERY_MANAGER_CONFIRM_DELETE');
|
||||
Text::script('NR_GALLERY_MANAGER_FILE_MISSING');
|
||||
Text::script('NR_GALLERY_MANAGER_REACHED_FILES_LIMIT');
|
||||
Text::script('NR_GENERATE_IMAGE_DESC_TO_ALL_IMAGES_CONFIRM');
|
||||
|
||||
$this->prepareTags();
|
||||
}
|
||||
|
||||
private function prepareTags()
|
||||
{
|
||||
if (!is_array($this->options['gallery_items']))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
$db = Factory::getDbo();
|
||||
$query = $db->getQuery(true)
|
||||
->select([$db->quoteName('id'), $db->quoteName('title')])
|
||||
->from($db->quoteName('#__tags'))
|
||||
->where($db->quoteName('published') . ' = 1')
|
||||
->where($db->quoteName('level') . ' > 0');
|
||||
|
||||
$db->setQuery($query);
|
||||
$tags = $db->loadAssocList('id', 'title');
|
||||
|
||||
$this->options['tags'] = $tags;
|
||||
}
|
||||
|
||||
private function getSettings($context)
|
||||
{
|
||||
// Make sure we have a valid context
|
||||
if (!$context)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$field_data = [];
|
||||
|
||||
$input = Factory::getApplication()->input;
|
||||
|
||||
if ($context === 'default')
|
||||
{
|
||||
// Make sure we have a valid field id
|
||||
if (!$field_id = $input->getInt('field_id'))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_FIELD_ID_ERROR');
|
||||
}
|
||||
|
||||
if (!$field_data = \NRFramework\Helpers\CustomField::getData($field_id))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_INVALID_FIELD_DATA');
|
||||
}
|
||||
}
|
||||
else if ($context === 'module')
|
||||
{
|
||||
// Make sure we have a valid item id
|
||||
if (!$item_id = $input->getInt('item_id'))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_ITEM_ID_ERROR');
|
||||
}
|
||||
|
||||
if (!$field_data = \NRFramework\Helpers\Module::getData($item_id))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_INVALID_FIELD_DATA');
|
||||
}
|
||||
|
||||
$field_data->set('style', $field_data->get('provider', 'grid'));
|
||||
}
|
||||
|
||||
return $field_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* The upload task called by the AJAX hanler
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function ajax_upload()
|
||||
{
|
||||
$input = Factory::getApplication()->input;
|
||||
|
||||
// Make sure we have a valid context
|
||||
if (!$context = $input->get('context'))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_CONTEXT_ERROR');
|
||||
}
|
||||
|
||||
// Make sure we have a valid file passed
|
||||
if (!$file = $input->files->get('file'))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_ERROR_INVALID_FILE');
|
||||
}
|
||||
|
||||
if (!$field_data = $this->getSettings($context))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_INVALID_FIELD_DATA');
|
||||
}
|
||||
|
||||
// get the media uploader file data, values are passed when we upload a file using the Media Uploader
|
||||
$media_uploader_file_data = [
|
||||
'is_media_uploader_file' => $input->get('media_uploader', false) == '1',
|
||||
'media_uploader_filename' => $input->getString('media_uploader_filename', '')
|
||||
];
|
||||
|
||||
// In case we allow multiple uploads the file parameter is a 2 levels array.
|
||||
$first_property = array_pop($file);
|
||||
if (is_array($first_property))
|
||||
{
|
||||
$file = $first_property;
|
||||
}
|
||||
|
||||
$style = $field_data->get('style', 'grid');
|
||||
|
||||
$uploadSettings = [
|
||||
'allow_unsafe' => false,
|
||||
'allowed_types' => $field_data->get('allowed_file_types', $this->widget_options['allowed_file_types']),
|
||||
'style' => $style
|
||||
];
|
||||
|
||||
// Add watermark
|
||||
if ($field_data->get('watermark.type', 'disabled') !== 'disabled')
|
||||
{
|
||||
$uploadSettings['watermark'] = (array) $field_data->get('watermark', []);
|
||||
$uploadSettings['watermark']['image'] = !empty($uploadSettings['watermark']['image']) ? explode('#', JPATH_SITE . DIRECTORY_SEPARATOR . $uploadSettings['watermark']['image'])[0] : null;
|
||||
$uploadSettings['watermark']['apply_on_thumbnails'] = $field_data->get('watermark.apply_on_thumbnails', false) === '1';
|
||||
}
|
||||
|
||||
$field_data_array = $field_data->toArray();
|
||||
|
||||
$resize_method = $field_data->get('resize_method', 'crop');
|
||||
$thumb_height = $field_data->get('thumb_height', null);
|
||||
|
||||
switch ($style)
|
||||
{
|
||||
case 'slideshow':
|
||||
if (isset($field_data_array['slideshow_thumb_height']))
|
||||
{
|
||||
$thumb_height = $field_data_array['slideshow_thumb_height'];
|
||||
}
|
||||
|
||||
if ($slideshow_resize_method = $field_data->get('slideshow_resize_method'))
|
||||
{
|
||||
$resize_method = $slideshow_resize_method;
|
||||
}
|
||||
break;
|
||||
case 'masonry':
|
||||
$thumb_height = null;
|
||||
break;
|
||||
case 'zjustified':
|
||||
case 'justified':
|
||||
$thumb_height = $field_data->get('justified_item_height', 200);
|
||||
break;
|
||||
}
|
||||
|
||||
// resize image settings
|
||||
$resizeSettings = [
|
||||
'thumb_height' => $thumb_height,
|
||||
'thumb_resize_method' => $resize_method,
|
||||
|
||||
// TODO: Remove this line when ACF is also updated, so we don't rely on this to resize the original image
|
||||
'original_image_resize' => false,
|
||||
|
||||
'original_image_resize_width' => $field_data->get('original_image_resize_width'),
|
||||
'original_image_resize_height' => $field_data->get('original_image_resize_height')
|
||||
];
|
||||
|
||||
/**
|
||||
* For backwards compatibility.
|
||||
*
|
||||
* TODO: Update this code block to not rely on "original_image_resize" to resize original image when removed from ACF.
|
||||
*/
|
||||
$resize_original_image_setting_value = $field_data->get('original_image_resize', null);
|
||||
if ($style === 'slideshow' && ($resizeSettings['original_image_resize_width'] || $resizeSettings['original_image_resize_height']))
|
||||
{
|
||||
$resize_original_image_setting_value = true;
|
||||
}
|
||||
|
||||
if ($resize_original_image_setting_value)
|
||||
{
|
||||
$resizeSettings['original_image_resize_height'] = $style === 'slideshow' ? $resizeSettings['original_image_resize_height'] : null;
|
||||
$resizeSettings['original_image_resize'] = $style === 'slideshow' ? true : $resize_original_image_setting_value;
|
||||
}
|
||||
else if (is_null($resize_original_image_setting_value) && ($resizeSettings['original_image_resize_width'] || $resizeSettings['original_image_resize_height']))
|
||||
{
|
||||
$resizeSettings['original_image_resize'] = true;
|
||||
}
|
||||
if (!$resizeSettings['original_image_resize'])
|
||||
{
|
||||
$resizeSettings['original_image_resize_width'] = null;
|
||||
$resizeSettings['original_image_resize_height'] = null;
|
||||
}
|
||||
|
||||
if (in_array($style, ['grid', 'masonry', 'slideshow']))
|
||||
{
|
||||
$resizeSettings['thumb_width'] = $field_data->get('thumb_width');
|
||||
|
||||
$slideshow_thumb_width = $field_data->get('slideshow_thumb_width');
|
||||
if (!is_null($slideshow_thumb_width) && $style === 'slideshow')
|
||||
{
|
||||
$resizeSettings['thumb_width'] = $slideshow_thumb_width;
|
||||
}
|
||||
}
|
||||
|
||||
// Upload the file and resize the images as required
|
||||
if (!$uploaded_filenames = GalleryManagerHelper::upload($file, $uploadSettings, $media_uploader_file_data, $resizeSettings))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_ERROR_CANNOT_UPLOAD_FILE');
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'source' => $uploaded_filenames['source'],
|
||||
'original' => $uploaded_filenames['original'],
|
||||
'thumbnail' => $uploaded_filenames['thumbnail'],
|
||||
'is_media_uploader_file' => $media_uploader_file_data['is_media_uploader_file']
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* The delete task called by the AJAX hanlder
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function ajax_delete()
|
||||
{
|
||||
$input = Factory::getApplication()->input;
|
||||
|
||||
// Get source image path.
|
||||
$source = $input->getString('source');
|
||||
|
||||
// Make sure we have a valid file passed
|
||||
if (!$original = $input->getString('original'))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_ERROR_INVALID_FILE');
|
||||
}
|
||||
|
||||
// Make sure we have a valid file passed
|
||||
if (!$thumbnail = $input->getString('thumbnail'))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_ERROR_INVALID_FILE');
|
||||
}
|
||||
|
||||
if (!$context = $input->get('context'))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_CONTEXT_ERROR');
|
||||
}
|
||||
|
||||
if (!$field_data = $this->getSettings($context))
|
||||
{
|
||||
$this->exitWithMessage('NR_GALLERY_MANAGER_INVALID_FIELD_DATA');
|
||||
}
|
||||
|
||||
// Delete the source, original, and thumbnail file
|
||||
$deleted = GalleryManagerHelper::deleteFile($source, $original, $thumbnail);
|
||||
|
||||
echo json_encode(['success' => $deleted]);
|
||||
}
|
||||
|
||||
/**
|
||||
* This task allows us to regenerate the images.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function ajax_regenerate_images()
|
||||
{
|
||||
$input = Factory::getApplication()->input;
|
||||
|
||||
// Make sure we have a valid context
|
||||
if (!$context = $input->get('context'))
|
||||
{
|
||||
echo json_encode(['success' => false, 'message' => Text::_('NR_GALLERY_MANAGER_CONTEXT_ERROR')]);
|
||||
die();
|
||||
}
|
||||
|
||||
if (!$field_data = $this->getSettings($context))
|
||||
{
|
||||
echo json_encode(['success' => false, 'message' => Text::_('NR_GALLERY_MANAGER_INVALID_FIELD_DATA')]);
|
||||
die();
|
||||
}
|
||||
|
||||
$field_id = $input->getInt('field_id');
|
||||
$item_id = $input->getInt('item_id');
|
||||
|
||||
$field_data_array = $field_data->toArray();
|
||||
|
||||
$style = $field_data->get('style', 'grid');
|
||||
|
||||
$resize_method = $field_data->get('resize_method', 'crop');
|
||||
$thumb_height = $field_data->get('thumb_height', null);
|
||||
|
||||
switch ($style)
|
||||
{
|
||||
case 'slideshow':
|
||||
if (isset($field_data_array['slideshow_thumb_height']))
|
||||
{
|
||||
$thumb_height = $field_data_array['slideshow_thumb_height'];
|
||||
}
|
||||
|
||||
if ($slideshow_resize_method = $field_data->get('slideshow_resize_method'))
|
||||
{
|
||||
$resize_method = $slideshow_resize_method;
|
||||
}
|
||||
break;
|
||||
case 'masonry':
|
||||
$thumb_height = null;
|
||||
break;
|
||||
case 'zjustified':
|
||||
case 'justified':
|
||||
$thumb_height = $field_data->get('justified_item_height', 200);
|
||||
break;
|
||||
}
|
||||
|
||||
$resizeSettings = [
|
||||
'thumb_height' => $thumb_height,
|
||||
'thumb_resize_method' => $resize_method
|
||||
];
|
||||
|
||||
if (in_array($style, ['grid', 'masonry', 'slideshow']))
|
||||
{
|
||||
$resizeSettings['thumb_width'] = $field_data->get('thumb_width');
|
||||
|
||||
$slideshow_thumb_width = $field_data->get('slideshow_thumb_width');
|
||||
if (!is_null($slideshow_thumb_width) && $style === 'slideshow')
|
||||
{
|
||||
$resizeSettings['thumb_width'] = $slideshow_thumb_width;
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Remove this line when ACF is also updated, so we don't rely on this to resize the original image
|
||||
$original_image_resize = false;
|
||||
|
||||
$original_image_resize_width = $field_data->get('original_image_resize_width');
|
||||
$original_image_resize_height = $field_data->get('original_image_resize_height');
|
||||
|
||||
/**
|
||||
* For backwards compatibility.
|
||||
*
|
||||
* TODO: Update this code block to not rely on "original_image_resize" to resize original image when removed from ACF.
|
||||
*/
|
||||
$resize_original_image_setting_value = $field_data->get('original_image_resize', null);
|
||||
if ($style === 'slideshow' && ($original_image_resize_width || $original_image_resize_height))
|
||||
{
|
||||
$resize_original_image_setting_value = true;
|
||||
}
|
||||
|
||||
if ($resize_original_image_setting_value)
|
||||
{
|
||||
$original_image_resize_height = $style === 'slideshow' ? $original_image_resize_height : null;
|
||||
$original_image_resize = $style === 'slideshow' ? true : $resize_original_image_setting_value;
|
||||
}
|
||||
else if (is_null($resize_original_image_setting_value) && ($original_image_resize_width || $original_image_resize_height))
|
||||
{
|
||||
$original_image_resize = true;
|
||||
}
|
||||
if (!$original_image_resize)
|
||||
{
|
||||
$original_image_resize_width = null;
|
||||
$original_image_resize_height = null;
|
||||
}
|
||||
|
||||
$watermarkSettings = [];
|
||||
// Add watermark
|
||||
if ($field_data->get('watermark.type', 'disabled') !== 'disabled')
|
||||
{
|
||||
$watermarkSettings = (array) $field_data->get('watermark', []);
|
||||
$watermarkSettings['image'] = !empty($watermarkSettings['image']) ? explode('#', JPATH_SITE . DIRECTORY_SEPARATOR . $watermarkSettings['image'])[0] : null;
|
||||
$watermarkSettings['apply_on_thumbnails'] = $field_data->get('watermark.apply_on_thumbnails', false) === '1';
|
||||
}
|
||||
$watermarkEnabled = isset($watermarkSettings['type']) && $watermarkSettings['type'] !== 'disabled';
|
||||
$thumbnailWatermarkEnabled = isset($watermarkSettings['type']) && $watermarkSettings['type'] !== 'disabled' && $watermarkSettings['apply_on_thumbnails'];
|
||||
|
||||
$items = $input->get('items', null, 'ARRAY');
|
||||
$items = json_decode($items[0], true);
|
||||
|
||||
$ds = DIRECTORY_SEPARATOR;
|
||||
|
||||
// Parse all images
|
||||
if (is_array($items) && count($items))
|
||||
{
|
||||
foreach ($items as &$item)
|
||||
{
|
||||
$sourceImage = isset($item['source']) ? $item['source'] : '';
|
||||
$originalImage = isset($item['original']) ? $item['original'] : '';
|
||||
$thumbnailImage = isset($item['thumbnail']) ? $item['thumbnail'] : '';
|
||||
$thumbnailImagePath = implode($ds, [JPATH_ROOT, $thumbnailImage]);
|
||||
|
||||
$sourceImagePath = $sourceImage ? implode($ds, [JPATH_ROOT, $sourceImage]) : false;
|
||||
$sourceImageExists = $sourceImagePath && file_exists($sourceImagePath);
|
||||
$originalImagePath = implode($ds, [JPATH_ROOT, $originalImage]);
|
||||
$originalImageExists = $originalImagePath && file_exists($originalImagePath);
|
||||
|
||||
// If source image does not exist, watermark is enabled, create it by clothing the original image
|
||||
if (!$sourceImageExists && $watermarkEnabled && $originalImage && file_exists($originalImagePath))
|
||||
{
|
||||
// Create source from original image
|
||||
$sourceImagePath = \NRFramework\File::copy($originalImagePath, $originalImagePath, false, true);
|
||||
$sourceImageExists = true;
|
||||
|
||||
// Modify the database entry and add "source" image to item
|
||||
// We just need the relative path to file
|
||||
$_sourceImagePath = str_replace(JPATH_ROOT . DIRECTORY_SEPARATOR, '', $sourceImagePath);
|
||||
$item['source'] = $_sourceImagePath;
|
||||
$_originalImagePath = str_replace(JPATH_ROOT . DIRECTORY_SEPARATOR, '', $originalImagePath);
|
||||
GalleryManagerHelper::setItemFieldSource($item_id, $field_id, $_sourceImagePath, $_originalImagePath);
|
||||
}
|
||||
|
||||
if (!$originalImageExists)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!$sourceImageExists)
|
||||
{
|
||||
$sourceImagePath = $originalImagePath;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle original image.
|
||||
*/
|
||||
// Generate original image by using the source image
|
||||
if ($original_image_resize_width && $original_image_resize_height)
|
||||
{
|
||||
$originalImagePath = Image::resize($sourceImagePath, $original_image_resize_width, $original_image_resize_height, 70, 'crop', $originalImagePath);
|
||||
}
|
||||
else if ($original_image_resize_width)
|
||||
{
|
||||
$originalImagePath = Image::resizeAndKeepAspectRatio($sourceImagePath, $original_image_resize_width, 70, $originalImagePath);
|
||||
}
|
||||
else if ($original_image_resize_height)
|
||||
{
|
||||
$originalImagePath = Image::resizeByHeight($sourceImagePath, $original_image_resize_height, $originalImagePath, 70);
|
||||
}
|
||||
|
||||
$originalImageSourcePath = $originalImagePath;
|
||||
|
||||
if ($watermarkEnabled)
|
||||
{
|
||||
$payload = array_merge($watermarkSettings, ['source' => $sourceImagePath, 'destination' => $originalImagePath]);
|
||||
Image::applyWatermark($payload);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle thumbnail image.
|
||||
*/
|
||||
// Generate thumbnail image by using the source image
|
||||
GalleryManagerHelper::generateThumbnail($sourceImagePath, $thumbnailImagePath, $resizeSettings, null, false);
|
||||
|
||||
// Apply watermark to thumbnail image
|
||||
if ($watermarkEnabled && $thumbnailWatermarkEnabled)
|
||||
{
|
||||
$payload = array_merge($watermarkSettings, ['source' => $thumbnailImagePath]);
|
||||
Image::applyWatermark($payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
echo json_encode(['success' => true, 'message' => Text::_('NR_GALLERY_MANAGER_IMAGES_REGENERATED'), 'items' => $items]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Exits the page with given message.
|
||||
*
|
||||
* @param string $translation_string
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function exitWithMessage($translation_string)
|
||||
{
|
||||
http_response_code('500');
|
||||
die(Text::_($translation_string));
|
||||
}
|
||||
|
||||
public function ajax_generate_caption()
|
||||
{
|
||||
set_time_limit(300); // 5 Minutes
|
||||
ini_set('memory_limit', '-1');
|
||||
|
||||
$fullURL = Uri::root() . Factory::getApplication()->input->getString('image');
|
||||
|
||||
$imageToText = new \NRFramework\AI\TextGeneration\ImageToText();
|
||||
$generated = $imageToText->generate($fullURL);
|
||||
|
||||
echo json_encode($generated);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user