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