153 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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
 | |
|  */
 | |
| 
 | |
| defined('_JEXEC') or die('Restricted access');
 | |
| 
 | |
| use Joomla\CMS\Layout\FileLayout;
 | |
| use Joomla\Registry\Registry;
 | |
| use Joomla\CMS\Language\Text;
 | |
| 
 | |
| require_once dirname(__DIR__) . '/helpers/field.php';
 | |
| 
 | |
| class JFormFieldNRInlineFileUpload extends NRFormField
 | |
| {
 | |
| 	/**
 | |
| 	 * Method to get the field input markup.
 | |
| 	 *
 | |
| 	 * @return  string  The field input markup.
 | |
| 	 */
 | |
| 	protected function getInput()
 | |
| 	{
 | |
| 		$layout = new FileLayout('inlinefileupload', JPATH_PLUGINS . '/system/nrframework/layouts');
 | |
| 
 | |
| 		$data = [
 | |
| 			'value' => $this->value,
 | |
| 			'name' => $this->name,
 | |
| 			'accept' => $this->get('accept'),
 | |
| 			'upload_folder' => base64_encode($this->get('upload_folder'))
 | |
| 		];
 | |
| 
 | |
| 		return $layout->render($data);
 | |
| 	}
 | |
| 
 | |
|     /**
 | |
|      * Handles the AJAX request
 | |
|      *
 | |
|      * @param   array    $options
 | |
|      *
 | |
|      * @return  array
 | |
|      */
 | |
|     public function onAjax($options)
 | |
|     {
 | |
| 		$options = new Registry($options);
 | |
| 
 | |
| 		if ($options->get('action') == 'remove')
 | |
| 		{
 | |
| 			$this->onRemove($options);
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$this->onUpload();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * On file upload.
 | |
| 	 * 
 | |
| 	 * @return  string
 | |
| 	 */
 | |
| 	private function onUpload()
 | |
| 	{
 | |
| 		// Make sure we have a valid file passed
 | |
|         if (!$file = $this->app->input->files->get('file', null, 'cmd'))
 | |
|         {
 | |
|             echo json_encode([
 | |
| 				'error' => true,
 | |
| 				'response' => Text::_('NR_UPLOAD_ERROR_INVALID_FILE')
 | |
| 			]);
 | |
| 			jexit();
 | |
| 		}
 | |
| 
 | |
| 		// ensure an upload folder was given
 | |
| 		if (!$upload_folder = $this->app->input->get('upload_folder', null, 'cmd'))
 | |
| 		{
 | |
|             echo json_encode([
 | |
| 				'error' => true,
 | |
| 				'response' => Text::_('NR_UPLOAD_FOLDER_MISSING')
 | |
| 			]);
 | |
| 			jexit();
 | |
| 		}
 | |
| 
 | |
| 		// ensure we can decode its value
 | |
| 		if (!$upload_folder = base64_decode($upload_folder))
 | |
| 		{
 | |
|             echo json_encode([
 | |
| 				'error' => true,
 | |
| 				'response' => Text::_('NR_UPLOAD_FOLDER_INVALID')
 | |
| 			]);
 | |
| 			jexit();
 | |
| 		}
 | |
| 
 | |
| 		$uploaded_file = null;
 | |
| 		$file_size = 0;
 | |
| 		$file_name = null;
 | |
| 
 | |
| 		// try to upload the file.
 | |
| 		try {
 | |
| 			$uploaded_file = \NRFramework\File::upload($file, JPATH_ROOT . DIRECTORY_SEPARATOR . $upload_folder, ['text/plain', 'text/csv'], false, true);
 | |
| 			$filePathInfo = NRFramework\File::pathinfo($uploaded_file);
 | |
| 			$file_name = $filePathInfo['basename'];
 | |
|             $file_size = file_exists($uploaded_file) ? filesize($uploaded_file) : 0;
 | |
| 			$file_size = $file_size ? number_format($file_size / 1024, 2) . ' KB' : $file_size;
 | |
| 		} catch (\Throwable $th)
 | |
| 		{
 | |
|             echo json_encode([
 | |
| 				'error' => true,
 | |
| 				'response' => $th->getMessage()
 | |
| 			]);
 | |
| 			jexit();
 | |
| 		}
 | |
| 		
 | |
| 		echo json_encode([
 | |
| 			'error' => false,
 | |
| 			'response' => Text::_('NR_FILE_UPLOADED_SUCCESSFULLY'),
 | |
| 			'file_name' => base64_encode($file_name),
 | |
| 			'file' => base64_encode($uploaded_file),
 | |
| 			'file_size' => $file_size
 | |
| 		]);
 | |
| 		jexit();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * On file removal.
 | |
| 	 * 
 | |
| 	 * @return  string
 | |
| 	 */
 | |
| 	private function onRemove($options)
 | |
| 	{
 | |
| 		if (!$file = $options->get('remove_file'))
 | |
| 		{
 | |
|             echo json_encode([
 | |
| 				'error' => true,
 | |
| 				'response' => Text::_('NR_UPLOAD_ERROR_INVALID_FILE')
 | |
| 			]);
 | |
| 			jexit();
 | |
| 		}
 | |
| 
 | |
| 		// If file exists, remove it
 | |
| 		if (file_exists($file))
 | |
| 		{
 | |
| 			unlink($file);
 | |
| 		}
 | |
| 
 | |
| 		echo json_encode([
 | |
| 			'error' => false,
 | |
| 			'response' => Text::_('NR_FILE_DELETED')
 | |
| 		]);
 | |
| 		jexit();
 | |
| 	}
 | |
| } |