openstamanager/src/Modules.php

355 lines
10 KiB
PHP
Raw Normal View History

<?php
use Models\Module;
/**
* Classe per la gestione delle informazioni relative ai moduli installati.
*
* @since 2.3
*/
class Modules
{
/** @var array Elenco dei moduli disponibili */
protected static $modules = [];
2018-06-23 15:41:32 +02:00
protected static $references = [];
/** @var array Elenco delle condizioni aggiuntive disponibili */
protected static $additionals = [];
2018-05-11 14:48:46 +02:00
/** @var array Elenco dei segmenti disponibili */
protected static $segments = [];
/** @var array Elenco gerarchico dei moduli */
protected static $hierarchy;
/**
* Restituisce tutte le informazioni di tutti i moduli installati.
*
* @return array
*/
public static function getModules()
{
if (empty(self::$modules)) {
$modules = [];
2018-06-23 18:35:08 +02:00
$references = [];
$results = Auth::user()->modules();
foreach ($results as $result) {
2018-06-23 18:35:08 +02:00
$modules[$result['id']] = $result;
$references[$result['name']] = $result['id'];
}
self::$modules = $modules;
2018-06-23 15:41:32 +02:00
self::$references = $references;
}
return self::$modules;
}
/**
* Restituisce l'elenco dei moduli con permessi di accesso accordati.
*
* @return array
*/
public static function getAvailableModules()
{
// Individuazione dei moduli con permesso di accesso
$modules = self::getModules();
2018-06-23 15:41:32 +02:00
foreach ($modules as $key => $module) {
if ($module->permission == '-') {
unset($modules[$key]);
}
}
return $modules;
}
/**
* Restituisce le informazioni relative a un singolo modulo specificato.
*
* @param string|int $module
*
* @return Module
*/
public static function get($module)
{
2018-06-23 18:35:08 +02:00
$modules = self::getModules();
2018-06-23 15:41:32 +02:00
if (!is_numeric($module) && !empty(self::$references[$module])) {
$module = self::$references[$module];
}
2018-06-23 18:35:08 +02:00
return $modules[$module];
}
/**
* Restituisce i permessi accordati all'utente in relazione al modulo specificato.
*
* @param string|int $module
*
* @return string
*/
public static function getPermission($module)
{
return self::get($module)->permission ?? '-';
}
/**
* Restituisce i filtri aggiuntivi dell'utente in relazione al modulo specificato.
*
* @param int $id
*
* @return string
*/
public static function getAdditionals($module)
{
$module = self::get($module);
2018-05-31 11:36:14 +02:00
$user = Auth::user();
2018-06-23 15:41:32 +02:00
if (!isset(self::$additionals[$module['id']])) {
$database = Database::getConnection();
$additionals['WHR'] = [];
$additionals['HVN'] = [];
$results = $database->fetchArray('SELECT * FROM `zz_group_module` WHERE `idgruppo` = (SELECT `idgruppo` FROM `zz_users` WHERE `id` = '.prepare($user['id_utente']).') AND `enabled` = 1 AND `idmodule` = '.prepare($module['id']));
foreach ($results as $result) {
if (!empty($result['clause'])) {
$result['clause'] = App::replacePlaceholder($result['clause']);
$additionals[$result['position']][] = $result['clause'];
}
}
// Aggiunta dei segmenti
$segments = self::getSegments($module['id']);
foreach ($segments as $result) {
if (!empty($result['clause']) && $result['id'] == $_SESSION['module_'.$module['id']]['id_segment']) {
$result['clause'] = App::replacePlaceholder($result['clause']);
$additionals[$result['position']][] = $result['clause'];
}
}
self::$additionals[$module['id']] = $additionals;
}
return (array) self::$additionals[$module['id']];
}
2018-05-11 14:48:46 +02:00
/**
* Restituisce i filtri aggiuntivi dell'utente in relazione al modulo specificato.
*
* @param int $id
*
* @return string
*/
public static function getSegments($module)
{
if (Update::isUpdateAvailable()) {
return [];
}
$module = self::get($module)['id'];
if (!isset(self::$segments[$module])) {
$database = Database::getConnection();
self::$segments[$module] = $database->fetchArray('SELECT * FROM `zz_segments` WHERE `id_module` = '.prepare($module).' ORDER BY `predefined` DESC, `id` ASC');
2018-05-11 14:48:46 +02:00
}
return (array) self::$segments[$module];
}
/**
* Restituisce le condizioni SQL aggiuntive del modulo.
*
* @param string $name
*
* @return array
*/
public static function getAdditionalsQuery($module, $type = null)
{
$array = self::getAdditionals($module);
if (!empty($type) && isset($array[$type])) {
2017-09-20 10:33:22 +02:00
$result = (array) $array[$type];
} else {
2017-09-20 10:33:22 +02:00
$result = array_merge((array) $array['WHR'], (array) $array['HVN']);
}
$result = implode(' AND ', $result);
$result = empty($result) ? $result : ' AND '.$result;
return $result;
}
public static function replaceAdditionals($id_module, $query)
{
$result = $query;
// Aggiunta delle condizione WHERE
$result = str_replace('1=1', '1=1'.self::getAdditionalsQuery($id_module, 'WHR'), $result);
// Aggiunta delle condizione HAVING
$result = str_replace('2=2', '2=2'.self::getAdditionalsQuery($id_module, 'HVN'), $result);
return $result;
}
/**
* Restituisce tutte le informazioni dei moduli installati in una scala gerarchica fino alla profondità indicata.
*
*
* @param int $depth
*
* @return array
*/
public static function getHierarchy()
{
if (!isset(self::$hierarchy)) {
self::$hierarchy = Module::getCompleteHierarchy()->toArray();
}
return self::$hierarchy;
}
/**
* Restituisce il menu principale del progetto.
*
* @param int $depth Profondità del menu
*
* @return string
*/
public static function getMainMenu($depth = 3)
{
$menus = self::getHierarchy();
$module = App::getCurrentModule();
$module_name = isset($module) ? $module->name : '';
$result = '';
foreach ($menus as $menu) {
$result .= self::sidebarMenu($menu, $module_name, $depth)[0];
}
return $result;
}
/**
* Restituisce l'insieme dei menu derivato da un'array strutturato ad albero.
*
* @param array $element
* @param int $actual
* @param int $max_depth
* @param int $actual_depth
*
* @return string
*/
protected static function sidebarMenu($element, $actual = null, $max_depth = 3, $actual_depth = 0)
{
if ($actual_depth >= $max_depth) {
return '';
}
$link = (!empty($element['option']) && $element['option'] != 'menu') ? ROOTDIR.'/controller.php?id_module='.$element['id'] : 'javascript:;';
$title = $element['title'];
2018-06-23 15:41:32 +02:00
$target = '_self'; // $target = ($element['new'] == 1) ? '_blank' : '_self';
$active = ($actual == $element['name']);
$show = (self::getPermission($element['id']) != '-' && !empty($element['enabled'])) ? true : false;
$submenus = $element['all_children'];
if (!empty($submenus)) {
$temp = '';
foreach ($submenus as $submenu) {
$r = self::sidebarMenu($submenu, $actual, $actual_depth + 1);
$active = $active || $r[1];
if (!$show && $r[2]) {
$link = 'javascript:;';
}
$show = $show || $r[2];
$temp .= $r[0];
}
}
$result = '';
if ($show) {
$result .= '<li class="treeview';
if ($active) {
$result .= ' active actual';
}
$result .= '" id="'.$element['id'].'">
<a href="'.$link.'" target="'.$target.'" >
<i class="'.$element['icon'].'"></i>
<span>'.$title.'</span>';
if (!empty($submenus) && !empty($temp)) {
$result .= '
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
'.$temp.'
</ul>';
} else {
$result .= '
</a>';
}
$result .= '
</li>';
}
return [$result, $active, $show];
}
/**
2018-06-26 09:41:43 +02:00
* Costruisce un link HTML per il modulo e il record indicati.
*
* @param string|int $modulo
* @param int $id_record
* @param string $testo
* @param string $alternativo
* @param string $extra
*
* @return string
*/
2017-09-19 18:14:23 +02:00
public static function link($modulo, $id_record = null, $testo = null, $alternativo = true, $extra = null, $blank = true)
{
$testo = isset($testo) ? nl2br($testo) : tr('Visualizza scheda');
$alternativo = is_bool($alternativo) && $alternativo ? $testo : $alternativo;
// Aggiunta automatica dell'icona di riferimento
if (!str_contains($testo, '<i ')) {
$testo = $testo.' <i class="fa fa-external-link"></i>';
}
$module = self::get($modulo);
$extra .= !empty($blank) ? ' target="_blank"' : '';
if (!empty($module) && in_array($module->permission, ['r', 'rw'])) {
2017-09-19 18:14:23 +02:00
$link = !empty($id_record) ? 'editor.php?id_module='.$module['id'].'&id_record='.$id_record : 'controller.php?id_module='.$module['id'];
return '<a href="'.ROOTDIR.'/'.$link.'" '.$extra.'>'.$testo.'</a>';
} else {
return $alternativo;
}
}
2018-06-26 09:41:43 +02:00
/**
* Individua il percorso per il file.
*
* @param string|int $module
* @param string $file
*
* @return string|null
*/
public static function filepath($module, $file)
{
$module = self::get($module);
$directory = 'modules/'.$module['directory'].'|custom|';
return App::filepath($directory, $file);
}
}