Gestione immagini come allegati

Gestione delle immagini degli Articoli come allegati.
This commit is contained in:
Thomas Zilio 2018-07-03 21:22:29 +02:00
parent c7beacf5ea
commit addf0c8a43
7 changed files with 234 additions and 134 deletions

View File

@ -40,16 +40,16 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
else {
// UPLOAD
if (filter('op') == 'link_file' && !empty($_FILES) && !empty($_FILES['blob']['name'])) {
$upload = Uploads::upload($_FILES['blob']['tmp_name'], $_FILES['blob']['name'], $upload_dir, [
$upload = Uploads::upload($_FILES['blob'], [
'name' => filter('nome_allegato'),
'category' => filter('categoria'),
'id_module' => $id_module,
'id_record' => $id_record,
'id_plugin' => $id_plugin,
'id_record' => $id_record,
]);
// Creazione file fisico
if ($upload) {
if (!empty($upload)) {
$_SESSION['infos'][] = tr('File caricato correttamente!');
} else {
$_SESSION['errors'][] = tr('Errore durante il caricamento del file!');
@ -58,22 +58,18 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
// DELETE
elseif (filter('op') == 'unlink_file' && filter('filename') !== null) {
$filename = filter('filename');
$name = Uploads::delete(filter('filename'), [
'id_module' => $id_module,
'id_plugin' => $id_plugin,
'id_record' => $id_record,
]);
$rs = $dbo->fetchArray('SELECT * FROM zz_files WHERE id_module='.prepare($id_module).' AND id='.prepare(filter('id')).' AND filename='.prepare($filename));
if (delete($upload_dir.'/'.$filename)) {
$query = 'DELETE FROM zz_files WHERE id_module='.prepare($id_module).' AND id='.prepare(filter('id')).' AND filename='.prepare($filename);
if ($dbo->query($query)) {
$_SESSION['infos'][] = tr('File _FILE_ eliminato!', [
'_FILE_' => '"'.$rs[0]['nome'].'"',
]);
}
} else {
$_SESSION['errors'][] = tr("Errore durante l'eliminazione del file _FILE_ in _DIR_!", [
'_FILE_' => '"'.$rs[0]['nome'].'"',
'_DIR_' => '"files/'.$module_dir.'/"',
if (!empty($name)) {
$_SESSION['infos'][] = tr('File _FILE_ eliminato!', [
'_FILE_' => '"'.$name.'"',
]);
} else {
$_SESSION['errors'][] = tr("Errore durante l'eliminazione del file!");
}
}

View File

@ -30,17 +30,13 @@ if (post('action') == 'init') {
// Logo stampe
if (!empty($_FILES) && !empty($_FILES['blob']['name'])) {
$file_id = Uploads::upload($_FILES['blob']['tmp_name'], $_FILES['blob']['name'], DOCROOT.'/files/anagrafiche', [
$file = Uploads::upload($_FILES['blob'], [
'name' => 'Logo stampe',
'id_module' => $id_module,
'id_record' => $id_record,
]);
$file = $dbo->selectOne('zz_files', ['filename'], [
'id' => $file_id,
]);
Settings::set('Logo stampe', $file['filename']);
Settings::set('Logo stampe', $file);
}
}

View File

@ -3,72 +3,65 @@
include_once __DIR__.'/../../core.php';
switch (post('op')) {
case 'update':
// Aggiunta articolo
case 'add':
$codice = post('codice');
$descrizione = post('descrizione');
$um = post('um');
$categoria = post('categoria');
$subcategoria = post('subcategoria');
// Inserisco l'articolo solo se non esiste un altro articolo con stesso codice
if ($dbo->fetchNum('SELECT * FROM mg_articoli WHERE codice='.prepare($codice)) == 0) {
$dbo->insert('mg_articoli', [
'codice' => $codice,
'descrizione' => post('descrizione'),
'id_categoria' => post('categoria'),
'id_sottocategoria' => post('subcategoria'),
'attivo' => 1,
]);
$id_record = $dbo->lastInsertedID();
$_SESSION['infos'][] = tr('Aggiunto un nuovo articolo!');
} else {
$_SESSION['errors'][] = tr('Esiste già un articolo con questo codice!');
}
break;
// Modifica articolo
case 'update':
$componente = post('componente_filename');
$qta = post('qta');
$threshold_qta = post('threshold_qta');
$abilita_serial = post('abilita_serial');
$prezzo_vendita = post('prezzo_vendita');
$prezzo_acquisto = post('prezzo_acquisto');
$idiva_vendita = post('idiva_vendita');
$gg_garanzia = post('gg_garanzia');
$servizio = post('servizio');
$componente_filename = post('componente_filename');
$volume = post('volume');
$peso_lordo = post('peso_lordo');
$attivo = post('attivo');
$note = post('note');
$query = 'UPDATE mg_articoli SET '.
' codice='.prepare($codice).','.
' descrizione='.prepare($descrizione).','.
' um='.prepare($um).','.
' id_categoria='.prepare($categoria).','.
' id_sottocategoria='.prepare($subcategoria).','.
' abilita_serial='.prepare($abilita_serial).','.
' threshold_qta='.prepare($threshold_qta).','.
' prezzo_vendita='.prepare($prezzo_vendita).','.
' prezzo_acquisto='.prepare($prezzo_acquisto).','.
' idiva_vendita='.prepare($idiva_vendita).','.
' gg_garanzia='.prepare($gg_garanzia).','.
' servizio='.prepare($servizio).','.
' volume='.prepare($volume).','.
' peso_lordo='.prepare($peso_lordo).','.
' componente_filename='.prepare($componente_filename).','.
' attivo='.prepare($attivo).', '.
' note='.prepare($note).
' WHERE id='.prepare($id_record);
$dbo->query($query);
$dbo->update('mg_articoli', [
'codice' => post('codice'),
'descrizione' => post('descrizione'),
'um' => post('um'),
'id_categoria' => post('categoria'),
'id_sottocategoria' => post('subcategoria'),
'abilita_serial' => post('abilita_serial'),
'threshold_qta' => post('threshold_qta'),
'prezzo_vendita' => post('prezzo_vendita'),
'prezzo_acquisto' => post('prezzo_acquisto'),
'idiva_vendita' => post('idiva_vendita'),
'gg_garanzia' => post('gg_garanzia'),
'servizio' => post('servizio'),
'volume' => post('volume'),
'peso_lordo' => post('peso_lordo'),
'componente_filename' => $componente,
'attivo' => post('attivo'),
'note' => post('note'),
], ['id' => $id_record]);
// Leggo la quantità attuale per capire se l'ho modificata
$rs = $dbo->fetchArray('SELECT qta FROM mg_articoli WHERE id='.prepare($id_record));
$old_qta = $rs[0]['qta'];
$old_qta = $records[0]['qta'];
$movimento = $qta - $old_qta;
if ($movimento != 0) {
$descrizione_movimento = post('descrizione_movimento');
$data_movimento = post('data_movimento');
if ($descrizione_movimento != '' && $data_movimento != '') {
add_movimento_magazzino($id_record, $movimento, [], $descrizione_movimento, $data_movimento);
} else {
add_movimento_magazzino($id_record, $movimento);
}
add_movimento_magazzino($id_record, $movimento, [], $descrizione_movimento, $data_movimento);
}
/*
Salvataggio info componente (campo `contenuto`)
*/
$componente = post('componente_filename');
// Salvataggio info componente (campo `contenuto`)
if (!empty($componente)) {
$contenuto = \Util\Ini::write(file_get_contents($docroot.'/files/my_impianti/'.$componente), $post);
@ -77,12 +70,15 @@ switch (post('op')) {
// Upload file
if (!empty($_FILES) && !empty($_FILES['immagine01']['name'])) {
$tmp = $_FILES['immagine01']['tmp_name'];
$filename = Uploads::upload($_FILES['immagine01'], [
'name' => 'Immagine',
'id_module' => $id_module,
'id_record' => $id_record,
], [
'thumbnails' => true,
]);
$filename = basename($_FILES['immagine01']['name']);
$filename = unique_filename($filename, $upload_dir);
if (create_thumbnails($tmp, $filename, $upload_dir)) {
if (!empty($filename)) {
$dbo->query('UPDATE mg_articoli SET immagine01='.prepare($filename).' WHERE id='.prepare($id_record));
} else {
$_SESSION['warnings'][] = tr('Errore durante il caricamento del file in _DIR_!', [
@ -93,38 +89,16 @@ switch (post('op')) {
// Eliminazione file
if (post('delete_immagine01') !== null) {
$filename = post('immagine01');
$f = pathinfo($filename);
delete($upload_dir.'/'.$f['filename'].'.'.$f['extension']);
delete($upload_dir.'/'.$f['filename'].'_thumb100.'.$f['extension']);
delete($upload_dir.'/'.$f['filename'].'_thumb250.'.$f['extension']);
Uploads::delete($records[0]['immagine01'], [
'id_module' => $id_module,
'id_record' => $id_record,
]);
$dbo->query("UPDATE mg_articoli SET immagine01 = '' WHERE id=".prepare($id_record));
}
$_SESSION['infos'][] = tr('Informazioni salvate correttamente!');
break;
// Aggiunta articolo
case 'add':
$codice = post('codice');
$descrizione = post('descrizione');
$categoria = post('categoria');
$subcategoria = post('subcategoria');
// Inserisco l'articolo solo se non esiste un altro articolo con stesso codice
if ($dbo->fetchNum('SELECT * FROM mg_articoli WHERE codice='.prepare($codice)) == 0) {
$query = 'INSERT INTO mg_articoli(codice, descrizione, id_categoria, id_sottocategoria, attivo) VALUES ('.prepare($codice).', '.prepare($descrizione).', '.prepare($categoria).', '.prepare($subcategoria).', 1)';
$dbo->query($query);
$_SESSION['infos'][] = tr('Aggiunto un nuovo articolo!');
$query = 'SELECT * FROM mg_articoli WHERE codice='.prepare($codice);
$rs = $dbo->fetchArray($query);
$id_record = $rs[0]['id'];
} else {
$_SESSION['errors'][] = tr('Esiste già un articolo con questo codice!');
}
break;
// Aggiunta prodotto
@ -249,14 +223,14 @@ switch (post('op')) {
case 'delmovimento':
$idmovimento = post('idmovimento');
// Lettura qtà movimento
$rs = $dbo->fetchArray( 'SELECT idarticolo, qta FROM mg_movimenti WHERE id='.prepare($idmovimento) );
$rs = $dbo->fetchArray('SELECT idarticolo, qta FROM mg_movimenti WHERE id='.prepare($idmovimento));
$qta = $rs[0]['qta'];
$idarticolo = $rs[0]['idarticolo'];
// Aggiorno la quantità dell'articolo
$dbo->query( 'UPDATE mg_articoli SET qta=qta-'.$qta.' WHERE id='.prepare($idarticolo) );
$dbo->query('UPDATE mg_articoli SET qta=qta-'.$qta.' WHERE id='.prepare($idarticolo));
$query = 'DELETE FROM mg_movimenti WHERE id='.prepare($idmovimento);
if ($dbo->query($query)) {
@ -276,3 +250,8 @@ switch (post('op')) {
$_SESSION['infos'][] = tr('Articolo eliminato!');
break;
}
// Operazioni aggiuntive per l'immagine
if (filter('op') == 'unlink_file' && $name == 'Immagine') {
$dbo->query("UPDATE mg_articoli SET immagine01 = '' WHERE id=".prepare($id_record));
}

View File

@ -7,6 +7,10 @@ include_once Modules::filepath('MyImpianti', 'modutil.php');
$_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
$fileinfo = Uploads::fileInfo($records[0]['immagine01']);
$img = !empty($records[0]['immagine01']) ? ROOTDIR.'/'.Uploads::getUploadDirectory($id_module).'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension'] : '';
?><form action="" method="post" id="edit-form" enctype="multipart/form-data">
<input type="hidden" name="backto" value="record-edit">
<input type="hidden" name="op" value="update">
@ -20,7 +24,7 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
<div class="panel-body">
<div class="row">
<div class="col-md-3">
{[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine01", "class": "img-thumbnail", "value": "<?php echo !empty($records[0]['immagine01']) ? $rootdir.'/files/articoli/'.$records[0]['immagine01'] : ''; ?>" ]}
{[ "type": "image", "label": "<?php echo tr('Immagine'); ?>", "name": "immagine01", "class": "img-thumbnail", "value": "<?php echo $img; ?>" ]}
</div>
<div class="col-md-4">

View File

@ -477,14 +477,8 @@ class Database extends Util\Singleton
$update[] = $this->quote($key).' = '.$this->prepareValue($key, $value);
}
// Condizioni di aggiornamento
$where = [];
foreach ($conditions as $key => $value) {
$where[] = $this->quote($key).' = '.$this->prepareValue($key, $value);
}
// Costruzione della query
$query = 'UPDATE '.$this->quote($table).' SET '.implode($update, ', ').' WHERE '.implode($where, ' AND ');
$query = 'UPDATE '.$this->quote($table).' SET '.implode($update, ', ').' WHERE '.$this->whereStatement($conditions);
if (!empty($return)) {
return $query;
@ -581,13 +575,40 @@ class Database extends Util\Singleton
$result = $this->select($table, $array, $conditions, $order, $limit, $return);
if (isset($result[0])) {
if (!is_string($result) && isset($result[0])) {
return $result[0];
}
return $result;
}
/**
* Costruisce la query per l'DELETE definito dagli argomenti.
*
* @since 2.4.1
*
* @param string $table
* @param array $conditions
* @param bool $return
*
* @return string|array
*/
public function delete($table, $conditions, $return = false)
{
if (!is_string($table) || !is_array($conditions)) {
throw new UnexpectedValueException();
}
// Costruzione della query
$query = 'DELETE FROM '.$this->quote($table).' WHERE '.$this->whereStatement($conditions);
if (!empty($return)) {
return $query;
} else {
return $this->query($query);
}
}
/**
* Sincronizza i valori indicati associati alle condizioni, rimuovendo le combinazioni aggiuntive e inserendo quelle non ancora presenti.
*
@ -677,7 +698,7 @@ class Database extends Util\Singleton
if (!empty($field) && !empty($sync)) {
$conditions[$field] = $sync;
$this->query('DELETE FROM '.$this->quote($table).' WHERE '.$this->whereStatement($conditions));
$this->delete($table, $conditions);
}
}
@ -749,7 +770,13 @@ class Database extends Util\Singleton
}
// Condizione di uguaglianza
else {
$result[] = $this->quote($key).' = '.$this->prepareValue($key, $value);
$prepared = $this->prepareValue($key, $value);
if ($prepared == 'NULL') {
$result[] = $this->quote($key).' IS '.$prepared;
} else {
$result[] = $this->quote($key).' = '.$prepared;
}
}
}
}

View File

@ -120,29 +120,50 @@ class Uploads
'wpd' => 'application/wordperfect',
];
public static function getUploadDirectory($id_module, $id_plugin = null)
{
if (empty($id_plugin)) {
$directory = Modules::get($id_module)['directory'];
} else {
$info = Plugins::get($id_plugin);
if (!empty($info['script'])) {
$directory = self::fileInfo($info['script'])['name'];
} else {
$directory = $info['directory'];
}
}
return 'files/'.$directory;
}
/**
* Effettua l'upload di un file nella cartella indicata.
*
* @param string $src
* @param string $original
* @param string $upload_dir
* @param array $source
* @param string $directory
* @param array $data
* @param array $options
*
* @return int|bool
* @return string
*/
public static function upload($src, $original, $upload_dir, $data = [])
public static function upload($source, $data, $options = [])
{
$extension = pathinfo($original)['extension'];
$src = $source['tmp_name'];
$original = $source['name'];
$extension = strtolower(pathinfo($original)['extension']);
$ok = self::isSupportedType($extension);
$directory = DOCROOT.'/'.self::getUploadDirectory($data['id_module'], $data['id_plugin']);
do {
$filename = random_string().'.'.$extension;
} while (file_exists($upload_dir.'/'.$filename));
} while (file_exists($directory.'/'.$filename));
// Creazione file fisico
if (!directory($upload_dir) || !move_uploaded_file($src, $upload_dir.'/'.$filename)) {
return false;
if (!directory($directory) || !move_uploaded_file($src, $directory.'/'.$filename)) {
return null;
}
$database = Database::getConnection();
@ -154,11 +175,15 @@ class Uploads
'original' => $original,
'category' => !empty($data['category']) ? $data['category'] : null,
'id_module' => !empty($data['id_module']) ? $data['id_module'] : null,
'id_record' => !empty($data['id_record']) ? $data['id_record'] : null,
'id_plugin' => !empty($data['id_plugin']) ? $data['id_plugin'] : null,
'id_record' => $data['id_record'],
]);
return $database->lastInsertedID();
if (!empty($options['thumbnails'])) {
self::thumbnails($directory.'/'.$filename, $directory);
}
return $filename;
}
/**
@ -172,4 +197,73 @@ class Uploads
{
return in_array($extension, array_keys(self::$allowed_types));
}
protected static function thumbnails($filepath, $directory = null)
{
$fileinfo = self::fileInfo($filepath);
$directory = empty($directory) ? dirname($filepath) : $directory;
$driver = extension_loaded('gd') ? 'gd' : 'imagick';
Intervention\Image\ImageManagerStatic::configure(['driver' => $driver]);
$img = Intervention\Image\ImageManagerStatic::make($filepath);
$img->resize(600, null, function ($constraint) {
$constraint->aspectRatio();
});
$img->save(slashes($directory.'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension']));
$img->resize(250, null, function ($constraint) {
$constraint->aspectRatio();
});
$img->save(slashes($directory.'/'.$fileinfo['filename'].'_thumb250.'.$fileinfo['extension']));
$img->resize(100, null, function ($constraint) {
$constraint->aspectRatio();
});
$img->save(slashes($directory.'/'.$fileinfo['filename'].'_thumb100.'.$fileinfo['extension']));
}
public static function delete($filename, $data)
{
$database = Database::getConnection();
$name = $database->selectOne('zz_files', ['nome'], [
'filename' => $filename,
'id_module' => !empty($data['id_module']) ? $data['id_module'] : null,
'id_plugin' => !empty($data['id_plugin']) ? $data['id_plugin'] : null,
'id_record' => $data['id_record'],
])['nome'];
$fileinfo = self::fileInfo($filename);
$directory = DOCROOT.'/'.self::getUploadDirectory($data['id_module'], $data['id_plugin']);
$files = [
$directory.'/'.$fileinfo['basename'],
$directory.'/'.$fileinfo['filename'].'_thumb600.'.$fileinfo['extension'],
$directory.'/'.$fileinfo['filename'].'_thumb100.'.$fileinfo['extension'],
$directory.'/'.$fileinfo['filename'].'_thumb250.'.$fileinfo['extension'],
];
if (delete($files)) {
$database->delete('zz_files', [
'filename' => $fileinfo['basename'],
'id_module' => !empty($data['id_module']) ? $data['id_module'] : null,
'id_plugin' => !empty($data['id_plugin']) ? $data['id_plugin'] : null,
'id_record' => $data['id_record'],
]);
return $name;
}
return null;
}
public static function fileInfo($filepath)
{
$infos = pathinfo($filepath);
$infos['extension'] = strtolower($infos['extension']);
return $infos;
}
}

View File

@ -374,3 +374,7 @@ INSERT INTO `zz_views` (`id_module`, `name`, `query`, `order`, `search`, `slow`,
-- Aggiunto supporto a Note di accredito e addebito
ALTER TABLE `co_documenti` ADD `ref_documento` int(11) AFTER `idagente`, ADD FOREIGN KEY (`ref_documento`) REFERENCES `co_documenti`(`id`) ON DELETE CASCADE;
ALTER TABLE `co_righe_documenti` ADD `qta_evasa` int(11) NOT NULL AFTER `qta`;
-- Fix id_sottocategoria in mg_articoli
ALTER TABLE `mg_articoli` CHANGE `id_sottocategoria` `id_sottocategoria` int(11);
INSERT INTO `zz_files` (`id_module`, `id_record`, `nome`, `filename`, `original`) SELECT (SELECT `id` FROM `zz_modules` WHERE `name` = 'Articoli'), `id`, 'Immagine', `immagine01`, `immagine01` FROM `mg_articoli`;