Files
2024-12-31 11:07:09 +01:00

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();
}
}