1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-02-03 17:27:29 +01:00

Bugfix e miglioramenti Eloquent

This commit is contained in:
Thomas Zilio 2018-08-11 15:37:38 +02:00
parent ba186cd5a0
commit eb0d8cf932
18 changed files with 181 additions and 98 deletions

View File

@ -18,14 +18,6 @@ if (empty($element) || empty($element['enabled'])) {
die(tr('Accesso negato'));
}
$php = App::filepath($directory.'|custom|', 'add.php');
$html = App::filepath($directory.'|custom|', 'add.html');
$element['add_file'] = !empty($php) ? $php : $html;
$php = App::filepath($directory.'|custom|', 'edit.php');
$html = App::filepath($directory.'|custom|', 'edit.html');
$element['edit_file'] = !empty($php) ? $php : $html;
$upload_dir = DOCROOT.'/'.Uploads::getDirectory($id_module, $id_plugin);
$database->beginTransaction();
@ -140,9 +132,9 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
// Inclusione di eventuale plugin personalizzato
if (!empty($element['script'])) {
include App::filepath('modules/'.$element['module_dir'].'/plugins|custom|', $element['script']);
include $element->getEditFile();
$dbo->query('COMMIT');
$database->commitTransaction();
return;
}

View File

@ -15,8 +15,7 @@ echo '
<div id="form_'.$id_module.'-'.$id_plugin.'">
';
$file = !empty(get('edit')) ? 'edit' : 'add';
include $element[$file.'_file'];
include !empty(get('edit')) ? $element->getEditFile() : $element->getAddFile();
echo '
</div>';
@ -58,7 +57,7 @@ if (isAjaxRequest()) {
$(document).ready(function(){
data = {};';
foreach ($get as $key => $value) {
foreach (Filter::getGET() as $key => $value) {
echo '
data.'.$key.' = "'.$value.'";';
}

View File

@ -25,7 +25,7 @@ echo '
<i class="'.$element['icon'].'"></i> '.$element['title'];
// Pulsante "Aggiungi" solo se il modulo è di tipo "table" e se esiste il template per la popup
if (!empty($element['add_file']) && $element['permessi'] == 'rw') {
if ($element->hasAddFile() && $element->permission == 'rw') {
echo '
<button type="button" class="btn btn-primary" data-toggle="modal" data-title="'.tr('Aggiungi').'..." data-target="#bs-popup" data-href="add.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'"><i class="fa fa-plus"></i></button>';
}

View File

@ -48,7 +48,7 @@ if (empty($record)) {
<i class="'.$element['icon'].'"></i> '.$element['title'];
// Pulsante "Aggiungi" solo se il modulo è di tipo "table" e se esiste il template per la popup
if (!empty($element['add_file']) && $element['permessi'] == 'rw') {
if ($element->hasAddFile() && $element->permission == 'rw') {
echo '
<button type="button" class="btn btn-primary" data-toggle="modal" data-title="'.tr('Aggiungi').'..." data-target="#bs-popup" data-href="add.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'"><i class="fa fa-plus"></i></button>';
}
@ -160,7 +160,7 @@ if (empty($record)) {
<div id="module-edit">';
include $element['edit_file'];
include $element->getEditFile();
echo '
</div>
@ -292,7 +292,7 @@ echo '
<script>';
// Se l'utente ha i permessi in sola lettura per il modulo, converto tutti i campi di testo in span
$read_only = $element['permessi'] == 'r';
$read_only = $element->permission == 'r';
if ($read_only || !empty($block_edit)) {
$not = $read_only ? '' : '.not(".unblockable")';

View File

@ -75,7 +75,7 @@ if (post('action') == 'init') {
foreach ($settings as $setting) {
$setting = Settings::get($setting);
Settings::setValue($setting['nome'], post($setting['id']));
Settings::setValue($setting['nome'], post('setting')[$setting['id']]);
}
}

View File

@ -13,14 +13,10 @@ if (!empty($id_plugin)) {
$directory = '/modules/'.$element['directory'];
}
$php = App::filepath($directory.'|custom|', 'edit.php');
$html = App::filepath($directory.'|custom|', 'edit.html');
$element['edit_file'] = !empty($php) ? $php : $html;
if (!empty($id_plugin)) {
// Inclusione di eventuale plugin personalizzato
if (!empty($element['script'])) {
include App::filepath('modules/'.$element['module_dir'].'/plugins|custom|', $element['script']);
include $element->getEditFile();
return;
}
@ -30,7 +26,7 @@ if (!empty($id_plugin)) {
<span class="'.(!empty($element['help']) ? ' tip' : '').'"'.(!empty($element['help']) ? ' title="'.prepareToField($element['help']).'" data-position="bottom"' : '').' >
'.$element['title'].(!empty($element['help']) ? ' <i class="fa fa-question-circle-o"></i>' : '').'</span>';
if (!empty(Plugins::filepath($id_plugin, 'add.php'))) {
if ($element->hasAddFile()) {
echo '
<button type="button" class="btn btn-primary" data-toggle="modal" data-title="'.tr('Aggiungi').'..." data-target="#bs-popup" data-href="add.php?id_module='.$id_module.'&id_plugin='.$id_plugin.'&id_parent='.$id_record.'"><i class="fa fa-plus"></i></button>';
}
@ -224,7 +220,7 @@ if (!empty($type) && $type != 'menu' && $type != 'custom') {
* Inclusione modulo personalizzato
*/
elseif ($type == 'custom') {
include $element['edit_file'];
include $element->getEditFile();
}
// Caricamento file aggiuntivo su elenco record

View File

@ -6,7 +6,7 @@ switch (filter('op')) {
case 'update':
$is_all_valid = true;
foreach ($post as $id => $value) {
foreach (post('setting') as $id => $value) {
$is_valid = Settings::setValue($id, $value);
if (!$is_valid) {

View File

@ -17,7 +17,8 @@ $idtipointervento = null;
$idstatointervento = null;
$richiesta = null;
$impianti = [];
//come tecnico posso aprire attività solo a mio nome
// Come tecnico posso aprire attività solo a mio nome
if ($user['gruppo'] == 'Tecnici' && !empty($user['idanagrafica'])) {
$idtecnico = $user['idanagrafica'];
} else {

View File

@ -5,7 +5,6 @@ include_once __DIR__.'/../../core.php';
//unset($_SESSION['superselect']['idanagrafica']);
//unset($_SESSION['superselect']['idsede']);
$source = get('source');
$idanagrafica = null;
@ -30,9 +29,9 @@ if ($source == 'Attività') {
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Cliente'); ?>", "name": "idanagrafica", "required": 1, "values": "query=SELECT an_anagrafiche.idanagrafica AS id, ragione_sociale AS descrizione FROM an_anagrafiche INNER JOIN (an_tipianagrafiche_anagrafiche INNER JOIN an_tipianagrafiche ON an_tipianagrafiche_anagrafiche.idtipoanagrafica=an_tipianagrafiche.idtipoanagrafica) ON an_anagrafiche.idanagrafica=an_tipianagrafiche_anagrafiche.idanagrafica WHERE descrizione='Cliente' AND deleted_at IS NULL ORDER BY ragione_sociale", "value": "<?php echo $idanagrafica; ?>", "ajax-source": "clienti" ]}
</div>
<div class="col-md-4">
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "values": "query=SELECT 0 AS id, 'Sede legale' AS descrizione UNION SELECT id, CONCAT_WS( ' - ', nomesede, citta ) AS descrizione FROM an_sedi WHERE idanagrafica='$idanagrafica$'", "value": "$idsede$", "required": "1", "ajax-source": "sedi" ]}
{[ "type": "select", "label": "<?php echo tr('Sede'); ?>", "name": "idsede", "values": "query=SELECT 0 AS id, 'Sede legale' AS descrizione UNION SELECT id, CONCAT_WS( ' - ', nomesede, citta ) AS descrizione FROM an_sedi WHERE idanagrafica='$idanagrafica$'", "value": "$idsede$", "ajax-source": "sedi", "placeholder": "Sede legale" ]}
</div>
<div class="col-md-4">
@ -53,19 +52,19 @@ if ($source == 'Attività') {
$(document).ready(function(){
$('#idanagrafica').change( function(){
session_set('superselect,idanagrafica', $(this).val(), 0);
var value = !$(this).val() ? true : false;
$("#idsede").prop("disabled", value);
$("#idsede").selectReset();
});
$('#idsede').change( function(){
//session_set('superselect,idsede', $(this).val(), 0);
});
});
</script>
</script>

View File

@ -241,7 +241,7 @@ if (!empty($rs2)) {
if (!empty($rs2[$j]['idintervento'])) {
echo '
'.Modules::link('Interventi', $rs2[$j]['id'], tr('Intervento num. _NUM_ del _DATE_', [
'.Modules::link('Interventi', $rs2[$j]['idintervento'], tr('Intervento num. _NUM_ del _DATE_', [
'_NUM_' => $rs2[$j]['codice'],
'_DATE_' => Translator::dateToLocale($rs2[$j]['data_intervento']),
])).'<br>';

View File

@ -106,7 +106,7 @@ class HTMLWrapper implements WrapperInterface
$module = \Modules::get($id_module);
if (in_array($module['permessi'], ['r', 'rw'])) {
if (in_array($module->permission, ['r', 'rw'])) {
$result = '
<button '.$extras.' data-href="'.ROOTDIR.'/add.php?id_module='.$id_module.$get.'&select='.$values['id'].'&ajax=yes" data-target="#bs-popup2" data-toggle="modal" data-title="'.tr('Aggiungi').'" type="button" class="btn'.$classes.'">
<i class="fa fa-plus"></i>

View File

@ -4,12 +4,16 @@ namespace Models;
use App;
use Auth;
use Traits\Record;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Module extends Model
{
use Record;
protected $table = 'zz_modules';
protected $main_folder = 'modules';
protected $appends = [
'permission',
@ -83,7 +87,7 @@ class Module extends Model
public function plugins()
{
return $this->hasMany(Plugin::class, 'idmodule_to')->active();
return $this->hasMany(Plugin::class, 'idmodule_to');
}
public function prints()

View File

@ -2,14 +2,20 @@
namespace Models;
use Illuminate\Database\Eloquent\Model;
use App;
use Traits\Record;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Plugin extends Model
{
use Record;
protected $table = 'zz_plugins';
protected $main_folder = 'plugins';
protected $appends = [
'permission',
'option',
];
@ -27,9 +33,14 @@ class Plugin extends Model
});
}
public function getModuleDirAttribute()
/**
* Restituisce i permessi relativi all'account in utilizzo.
*
* @return string
*/
public function getPermissionAttribute()
{
return $this->originalModule()->directory;
return $this->originalModule()->permission;
}
public function getOptionAttribute()
@ -39,12 +50,30 @@ class Plugin extends Model
public function getOptionsAttribute($value)
{
return App::replacePlaceholder($value, app('parent_id'));
return App::replacePlaceholder($value, filter('parent_id'));
}
public function getOptions2Attribute($value)
{
return App::replacePlaceholder($value, app('parent_id'));
return App::replacePlaceholder($value, filter('parent_id'));
}
/* Metodi personalizzati */
public function getCustomAddFile()
{
if (empty($this->script)) {
return;
}
$directory = 'modules/'.$this->originalModule()->directory.'|custom|/plugins';
return App::filepath($directory, $this->script);
}
public function getCustomEditFile()
{
return $this->getAddFile();
}
/* Relazioni Eloquent */

View File

@ -32,7 +32,9 @@ class Modules
$modules = [];
$references = [];
$results = Auth::user()->modules();
$results = Auth::check() ? Auth::user()->modules() : Module::all();
$results->load('plugins');
foreach ($results as $result) {
$modules[$result['id']] = $result;
$references[$result['name']] = $result['id'];
@ -91,7 +93,7 @@ class Modules
*/
public static function getPermission($module)
{
return self::get($module)->permission ?? '-';
return self::get($module)->permission;
}
/**

View File

@ -9,8 +9,7 @@ class Plugins
{
/** @var array Elenco dei plugin disponibili */
protected static $plugins = [];
/** @var array Elenco delle query generiche dei plugin */
protected static $queries = [];
protected static $references = [];
/**
* Restituisce tutte le informazioni di tutti i plugin installati.
@ -20,25 +19,19 @@ class Plugins
public static function getPlugins()
{
if (empty(self::$plugins)) {
$database = Database::getConnection();
$results = $database->fetchArray('SELECT *, (SELECT directory FROM zz_modules WHERE id=idmodule_from) AS module_dir FROM zz_plugins');
$plugins = [];
$references = [];
foreach ($results as $result) {
$result['options'] = App::replacePlaceholder($result['options'], filter('id_parent'));
$result['options2'] = App::replacePlaceholder($result['options2'], filter('id_parent'));
$result['option'] = empty($result['options2']) ? $result['options'] : $result['options2'];
$result['permessi'] = Modules::getPermission($result['idmodule_to']);
$plugins[$result['id']] = $result;
$plugins[$result['name']] = $result['id'];
$modules = Modules::getModules();
foreach ($modules as $module) {
foreach ($module->plugins as $result) {
$plugins[$result['id']] = $result;
$references[$result['name']] = $result['id'];
}
}
self::$plugins = $plugins;
self::$references = $references;
}
return self::$plugins;
@ -53,11 +46,13 @@ class Plugins
*/
public static function get($plugin)
{
if (!is_numeric($plugin) && !empty(self::getPlugins()[$plugin])) {
$plugin = self::getPlugins()[$plugin];
$plugins = self::getPlugins();
if (!is_numeric($plugin) && !empty(self::$references[$plugin])) {
$plugin = self::$references[$module];
}
return self::getPlugins()[$plugin];
return $plugins[$plugin];
}
/**

View File

@ -1,6 +1,7 @@
<?php
use Respect\Validation\Validator as v;
use Models\Setting;
/**
* Classe per la gestione dell impostazioni del progetto.
@ -22,21 +23,20 @@ class Settings
public static function getSettings()
{
if (empty(self::$settings)) {
$database = Database::getConnection();
$settings = [];
$references = [];
$sections = [];
$results = $database->select('zz_settings', '*');
$results = Setting::all();
foreach ($results as $result) {
$settings[$result['id']] = $result;
$references[$result['nome']] = $result['id'];
$settings[$result->id] = $result;
$references[$result->nome] = $result->id;
if (!isset($sections[$result['sezione']])) {
$sections[$result['sezione']] = [];
}
$sections[$result['sezione']][] = $result['id'];
$sections[$result['sezione']][] = $result->id;
}
self::$settings = $settings;
@ -74,45 +74,47 @@ class Settings
*/
public static function getValue($setting)
{
return self::get($setting)['valore'];
return self::get($setting)->valore;
}
/**
* Imposta il valore dell'impostazione indicata.
*
* @param string|int $setting
* @param mixed $value
*
* @return bool
*/
public static function setValue($setting, $value)
{
$setting = self::get($setting);
// Trasformazioni
// Boolean (checkbox)
if ($setting['tipo'] == 'boolean') {
if ($setting->tipo == 'boolean') {
$value = (empty($value) || $value == 'off') ? false : true;
}
// Validazioni
// integer
if ($setting['tipo'] == 'integer') {
if ($setting->tipo == 'integer') {
$validator = v::intVal()->validate($value);
}
// list
// verifico che il valore scelto sia nella lista enumerata nel db
elseif (preg_match("/list\[(.+?)\]/", $setting['tipo'], $m)) {
elseif (preg_match("/list\[(.+?)\]/", $setting->tipo, $m)) {
$validator = v::in(explode(',', $m[1]));
}
// Boolean (checkbox)
elseif ($setting['tipo'] == 'boolean') {
elseif ($setting->tipo == 'boolean') {
$validator = v::boolType();
}
if (empty($validator) || $validator->validate($value)) {
$database = Database::getConnection();
$database->update('zz_settings', [
'valore' => $value,
], [
'id' => $setting['id'],
]);
self::$settings[$setting['id']]['valore'] = $value;
$setting->valore = $value;
$setting->save();
return true;
}
@ -124,7 +126,8 @@ class Settings
{
$setting = self::get($setting);
if (preg_match("/list\[(.+?)\]/", $setting['tipo'], $m)) {
// Lista predefinita
if (preg_match("/list\[(.+?)\]/", $setting->tipo, $m)) {
$m = explode(',', $m[1]);
$list = '';
for ($j = 0; $j < count($m); ++$j) {
@ -134,32 +137,36 @@ class Settings
$list .= '\\"'.$m[$j].'\\": \\"'.$m[$j].'\\"';
}
$result = '
{[ "type": "select", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "values": "list='.$list.'", "value": "'.$setting['valore'].'" ]}';
{[ "type": "select", "label": "'.$setting->nome.'", "name": "setting['.$setting->id.']", "values": "list='.$list.'", "value": "'.$setting->valore.'" ]}';
}
// query
elseif (preg_match('/^query=(.+?)$/', $setting['tipo'], $m)) {
// Lista da query
elseif (preg_match('/^query=(.+?)$/', $setting->tipo, $m)) {
$result = '
{[ "type": "select", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "values": "'.$setting['tipo'].'", "value": "'.$setting['valore'].'" ]}';
{[ "type": "select", "label": "'.$setting->nome.'", "name": "setting['.$setting->id.']", "values": "'.$setting->tipo.'", "value": "'.$setting->valore.'" ]}';
}
// Boolean (checkbox)
elseif ($setting['tipo'] == 'boolean') {
elseif ($setting->tipo == 'boolean') {
$result = '
{[ "type": "checkbox", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "placeholder": "'.tr('Attivo').'", "value": "'.$setting['valore'].'" ]}';
} elseif ($setting['tipo'] == 'textarea') {
$result = '
{[ "type": "textarea", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "value": '.json_encode($setting['valore']).' ]}';
{[ "type": "checkbox", "label": "'.$setting->nome.'", "name": "setting['.$setting->id.']", "placeholder": "'.tr('Attivo').'", "value": "'.$setting->valore.'" ]}';
}
// Campo di testo normale
else {
$numerico = in_array($setting['tipo'], ['integer', 'decimal']);
$tipo = preg_match('/password/i', $setting['nome'], $m) ? 'password' : $setting['tipo'];
// Textarea
elseif ($setting->tipo == 'textarea') {
$result = '
{[ "type": "textarea", "label": "'.$setting->nome.'", "name": "setting['.$setting->id.']", "value": '.json_encode($setting->valore).' ]}';
}
// Campo di testo
else {
$numerico = in_array($setting->tipo, ['integer', 'decimal']);
$tipo = preg_match('/password/i', $setting->nome, $m) ? 'password' : $setting->tipo;
$tipo = $numerico ? 'number' : 'text';
$result = '
{[ "type": "'.$tipo.'", "label": "'.$setting['nome'].'", "name": "'.$setting['id'].'", "value": "'.$setting['valore'].'"'.($numerico && $setting['tipo'] == 'integer' ? ', "decimals": 0' : '').' ]}';
{[ "type": "'.$tipo.'", "label": "'.$setting->nome.'", "name": "setting['.$setting->id.']", "value": "'.$setting->valore.'"'.($numerico && $setting->tipo == 'integer' ? ', "decimals": 0' : '').' ]}';
}
return $result;

55
src/Traits/Record.php Normal file
View File

@ -0,0 +1,55 @@
<?php
namespace Traits;
use App;
trait Record
{
public function getAddFile()
{
if (method_exists($this, 'getCustomAddFile')) {
$result = $this->getCustomAddFile();
if (!empty($result)) {
return $result;
}
}
$php = $this->filepath('add.php');
$html = $this->filepath('add.html');
return !empty($php) ? $php : $html;
}
public function hasAddFile()
{
return !empty($this->getAddFile());
}
public function getEditFile()
{
if (method_exists($this, 'getCustomEditFile')) {
$result = $this->getCustomEditFile();
if (!empty($result)) {
return $result;
}
}
$php = $this->filepath('edit.php');
$html = $this->filepath('edit.html');
return !empty($php) ? $php : $html;
}
public function getPath()
{
return $this->main_folder.'/'.$this->directory;
}
public function filepath($file)
{
return App::filepath($this->getPath().'|custom|', $file);
}
}

View File

@ -418,6 +418,8 @@ class Update
$database = Database::getConnection();
$database->getPDO()->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$mysql_ver = $database->getMySQLVersion();
if (version_compare($mysql_ver, '5.5.3') >= 0) {
@ -454,6 +456,8 @@ class Update
foreach ($engines as $engine) {
$database->query('ALTER TABLE `'.$engine['TABLE_NAME'].'` ENGINE=InnoDB');
}
$database->getPDO()->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}
/**