1
0
mirror of https://github.com/devcode-it/openstamanager.git synced 2025-06-05 22:09:38 +02:00

Commit iniziale (r1662)

Migrazione da SourceForge, partendo dal commit 1662 della carrtella trunk/openstamanager.
This commit is contained in:
Thomas Zilio
2017-08-04 16:28:16 +02:00
parent 662fcbd7b9
commit 1c9e7b1634
383 changed files with 55144 additions and 0 deletions

View File

@@ -0,0 +1,312 @@
<?php
namespace HTMLBuilder;
/**
* Classe dedicata alla gestione della conversione di tag in codice HTML.
*
* Campo di input generico:
* {[ "type": "text", "required": 1, "value": "$idintervento$" ]}
*
* Campo di testo normale e non modificabile:
* {[ "type": "span", "value": "$testo$" ]}
*
* Campo select automatizzatp:
* {[ "type": "select", "required": 1, "values": "query=SELECT id, descrizione FROM co_contratti WHERE idanagrafica=$idanagrafica$", "value": "$idcontratto$" ]}
*
* La sostituzione dei parametri compresi tra $$ viene effettuata attraverso il parametro $records.
*
* @since 2.3
*/
class HTMLBuilder
{
/** @var array Codici di apertura dei tag personalizzati */
public static $open = [
'handler' => '{[',
'manager' => '{(',
];
/** @var array Codici di chiusura dei tag personalizzati */
public static $close = [
'handler' => ']}',
'manager' => ')}',
];
/** @var array Lista degli attributi inseriit nel formato che necessitano solo di essere presenti */
protected static $specifics = [
'multiple',
'checked',
'disabled',
'readonly',
'required',
];
/** @var array Lista dei gestori dei campi HTML */
protected static $handlers = [
'list' => [
'default' => 'HTMLBuilder\Handler\DefaultHandler',
'image' => 'HTMLBuilder\Handler\MediaHandler',
'select' => 'HTMLBuilder\Handler\SelectHandler',
'checkbox' => 'HTMLBuilder\Handler\ChoicesHandler',
'radio' => 'HTMLBuilder\Handler\ChoicesHandler',
'bootswitch' => 'HTMLBuilder\Handler\ChoicesHandler',
'timestamp' => 'HTMLBuilder\Handler\DateHandler',
'date' => 'HTMLBuilder\Handler\DateHandler',
'time' => 'HTMLBuilder\Handler\DateHandler',
],
'instances' => [],
];
/** @var array Generatore del contenitore per i campi HTML */
protected static $wrapper = [
'class' => 'HTMLBuilder\Wrapper\HTMLWrapper',
'istance' => null,
];
/** @var array Lista dei gestori delle strutture HTML */
protected static $managers = [
'list' => [
'filelist_and_upload' => 'HTMLBuilder\Manager\FileManager',
'csrf' => 'HTMLBuilder\Manager\CSRFManager',
],
'instances' => [],
];
public static function replace($html)
{
preg_match_all('/'.preg_quote(self::$open['manager']).'(.+?)'.preg_quote(self::$close['manager']).'/i', $html, $managers);
foreach ($managers[0] as $value) {
$json = self::decode($value, 'manager');
$class = self::getManager($json['name']);
$html = str_replace($value, !empty($class) ? $class->manage($json) : '', $html);
}
preg_match_all('/'.preg_quote(self::$open['handler']).'(.+?)'.preg_quote(self::$close['handler']).'/i', $html, $handlers);
foreach ($handlers[0] as $value) {
$json = self::decode($value, 'handler');
$html = str_replace($value, self::generate($json), $html);
}
return $html;
}
protected static function generate($json)
{
// Elaborazione del formato
list($values, $extras) = self::elaborate($json);
$result = null;
if (!empty($values)) {
// Generazione dell'elemento
$html = self::getHandler($values['type'])->handle($values, $extras);
// Generazione del parte iniziale del contenitore
$before = self::getWrapper()->before($values, $extras);
// Generazione del parte finale del contenitore
$after = self::getWrapper()->after($values, $extras);
$result = $before.$html.$after;
// Elaborazione del codice HTML
$result = self::process($result, $values, $extras);
}
return $result;
}
protected static function decode($string, $type)
{
$string = '{'.substr($string, strlen(self::$open[$type]), -strlen(self::$close[$type])).'}';
$json = (array) json_decode($string, true, 2);
return $json;
}
protected static function elaborate($json)
{
global $records;
$values = [];
$extras = [];
if (!empty($json)) {
// Conversione delle variabili con i campi di database ($records)
foreach ($json as $key => $value) {
if (empty($value) && !is_numeric($value)) {
unset($json[$key]);
}
// Sostituzione delle variabili $nome$ col relativo valore da database
elseif (preg_match_all('/\$([a-z0-9\_]+)\$/i', $json[$key], $m)) {
for ($i = 0; $i < count($m[0]); ++$i) {
$record = isset($records[0][$m[1][$i]]) ? $records[0][$m[1][$i]] : '';
$json[$key] = str_replace($m[0][$i], prepareToField($record), $json[$key]);
}
}
}
// Valori speciali che richiedono solo la propria presenza
foreach (self::$specifics as $specific) {
if (isset($json[$specific])) {
if (!empty($json[$specific])) {
$extras[] = trim($specific);
}
unset($json[$specific]);
}
}
// Campo personalizzato "extra"
if (isset($json['extra'])) {
if (!empty($json['extra'])) {
$extras[] = trim($json['extra']);
}
unset($json['extra']);
}
// Attributi normali
foreach ($json as $key => $value) {
$values[trim($key)] = trim($value);
}
// Valori particolari
$values['name'] = str_replace(' ', '_', $values['name']);
$values['id'] = empty($values['id']) ? $values['name'] : $values['id'];
$values['id'] = str_replace(['[', ']', ' '], ['', '', '_'], $values['id']);
$values['value'] = isset($values['value']) ? $values['value'] : '';
// Gestione delle classi CSS
$values['class'] = [];
$values['class'][] = 'form-control';
if (!empty($json['class'])) {
$classes = explode(' ', $json['class']);
foreach ($classes as $class) {
if (!empty($class)) {
$values['class'][] = trim($class);
}
}
}
// Gestione grafica dell'attributo required
if (in_array('required', $extras)) {
if (!empty($values['label'])) {
$values['label'] .= '*';
} elseif (!empty($values['placeholder'])) {
$values['placeholder'] .= '*';
}
}
}
return [$values, $extras];
}
protected static function process($result, $values, $extras)
{
unset($values['label']);
$values['class'] = array_unique($values['class']);
foreach ($values as $key => $value) {
// Fix per la presenza di apici doppi
$value = prepareToField(is_array($value) ? implode(' ', $value) : $value);
if (strpos($result, '|'.$key.'|') !== false) {
$result = str_replace('|'.$key.'|', $value, $result);
} elseif (!empty($value) || is_numeric($value)) {
$attributes[] = $key.'="'.$value.'"';
}
}
$attributes = array_unique(array_merge($attributes, $extras));
$result = str_replace('|attr|', implode(' ', $attributes), $result);
return $result;
}
public static function getHandlerName($input)
{
$result = empty(self::$handlers['list'][$input]) ? self::$handlers['list']['default'] : self::$handlers['list'][$input];
return $result;
}
public static function getHandler($input)
{
$class = self::getHandlerName($input);
if (empty(self::$handlers['instances'][$class])) {
self::$handlers['instances'][$class] = new $class();
}
return self::$handlers['instances'][$class];
}
public static function setHandler($input, $class)
{
$original = $class;
$class = is_object($class) ? $class : new $class();
if ($class instanceof Handler\HandlerInterface) {
self::$handlers['list'][$input] = $original;
self::$handlers['instances'][$original] = $class;
}
}
public static function getWrapper()
{
if (empty(self::$wrapper['instance'])) {
$class = self::$wrapper['class'];
self::$wrapper['instance'] = new $class();
}
return self::$wrapper['instance'];
}
public static function setWrapper($class)
{
$original = $class;
$class = is_object($class) ? $class : new $class();
if ($class instanceof Wrapper\WrapperInterface) {
self::$wrapper['class'] = $original;
self::$wrapper['instance'] = $class;
}
}
public static function getManager($input)
{
$result = null;
$class = self::$managers['list'][$input];
if (!empty($class)) {
if (empty(self::$managers['instances'][$class])) {
self::$managers['instances'][$class] = new $class();
}
$result = self::$managers['instances'][$class];
}
return $result;
}
public static function setManager($input, $class)
{
$original = $class;
$class = is_object($class) ? $class : new $class();
if ($class instanceof Handler\ManagerInterface) {
self::$managers['list'][$input] = $original;
self::$managers['instances'][$original] = $class;
}
}
}
function prepareToField($string)
{
return str_replace('"', '&quot;', $string);
}

View File

@@ -0,0 +1,89 @@
<?php
namespace HTMLBuilder\Handler;
// Utilizzo della funzione prepareToField (PHP 5.6+)
// use function \HTMLBuilder\prepareToField;
/**
* @since 2.3
*/
class ChoicesHandler implements HandlerInterface
{
public function handle(&$values, &$extras)
{
$result = $this->{$values['type']}($values, $extras);
return $result;
}
protected function checkbox(&$values, &$extras)
{
unset($values['class'][0]);
$values['value'] = (empty($values['value']) || $values['value'] == 'off') ? false : true;
if (!empty($values['value']) && !in_array('checked', $extras)) {
$extras[] = 'checked';
}
if (in_array('readonly', $extras)) {
$extras[] = 'disabled';
}
$values['placeholder'] = (isset($values['placeholder'])) ? $values['placeholder'] : $values['label'];
$result .= '
<div class="input-group">
<span class="input-group-addon">
<input |attr| onchange="$(this).parent().find(\'[type=hidden]\').val( + this.checked)">
<input type="hidden" name="|name|" value="|value|">
</span>
<input type="text" class="form-control" placeholder="|placeholder|" disabled>
</div>';
return $result;
}
protected function bootswitch(&$values, &$extras)
{
unset($values['class'][0]);
$values['class'][] = 'bootstrap-switch';
$values['value'] = (empty($values['value']) || $values['value'] == 'off') ? false : true;
if (!empty($values['value']) && !in_array('checked', $extras)) {
$extras[] = 'checked';
}
return '
<div class="input-group">
<input type="checkbox" |attr|>
<input type="hidden" name="checkbox['.\HTMLBuilder\prepareToField($values['name']).']" value="'.\HTMLBuilder\prepareToField($values['value']).'">
</div>';
}
protected function radio(&$values, &$extras)
{
$result = '';
$originalExtras = $extras;
$radios = json_decode('{'.$values['values'].'}', true);
$values['value'] = !array_key_exists($values['value'], $radios) ? array_keys($radios)[0] : $values['value'];
foreach ($radios as $key => $value) {
$checked = false;
if ($key === $values['value']) {
$checked = true;
}
$result .= '
<input type="radio" class="bootstrap-switch" name="'.\HTMLBuilder\prepareToField($values['name']).'" id="'.\HTMLBuilder\prepareToField($values['id'].'_'.$key).'" value="'.\HTMLBuilder\prepareToField($key).'" data-label-text="'.\HTMLBuilder\prepareToField($value).'"'.($checked ? ' checked' : '').'>';
}
return $result;
}
}

View File

@@ -0,0 +1,77 @@
<?php
namespace HTMLBuilder\Handler;
/**
* @since 2.3
*/
class DateHandler implements HandlerInterface
{
public function handle(&$values, &$extras)
{
// Impostazione alla data corrente se il contenuto corrisponde a "now"
if ($values['value'] == '-now-') {
$values['value'] = date(\Translator::getEnglishFormatter()->getTimestampPattern());
}
if ($values['max-date'] == '-now-') {
$values['max-date'] = date(\Translator::getEnglishFormatter()->getTimestampPattern());
}
if ($values['min-date'] == '-now-') {
$values['min-date'] = date(\Translator::getEnglishFormatter()->getTimestampPattern());
}
if (\Translator::getEnglishFormatter()->isTimestamp($values['value']) && $values['type'] == 'timestamp') {
$values['value'] = \Translator::timestampToLocale($values['value']);
} elseif (\Translator::getEnglishFormatter()->isDate($values['value']) && $values['type'] == 'date') {
$values['value'] = \Translator::dateToLocale($values['value']);
} elseif (\Translator::getEnglishFormatter()->isTime($values['value']) && $values['type'] == 'time') {
$values['value'] = \Translator::timeToLocale($values['value']);
}
$resetValues = [
\Translator::timestampToLocale('0000-00-00 00:00:00'),
\Translator::dateToLocale('0000-00-00'),
\Translator::timeToLocale('00:00:00'),
];
$values['value'] = in_array($values['value'], $resetValues) ? '' : $values['value'];
$result = $this->{$values['type']}($values, $extras);
$values['type'] = 'text';
if (empty($result)) {
$result = '
<input |attr|>';
}
return $result;
}
protected function timestamp(&$values, &$extras)
{
$values['class'][] = 'text-center';
$values['class'][] = 'timestamp-picker';
$values['value'] = (\Translator::getLocaleFormatter()->isTimestamp($values['value'])) ? $values['value'] : '';
}
protected function date(&$values, &$extras)
{
$values['class'][] = 'text-center';
$values['class'][] = 'datepicker';
$values['class'][] = 'date-mask';
$values['value'] = (\Translator::getLocaleFormatter()->isDate($values['value'])) ? $values['value'] : '';
}
protected function time(&$values, &$extras)
{
$values['class'][] = 'text-center';
$values['class'][] = 'timepicker';
$values['value'] = (\Translator::getLocaleFormatter()->isTime($values['value'])) ? $values['value'] : '';
}
}

View File

@@ -0,0 +1,98 @@
<?php
namespace HTMLBuilder\Handler;
/**
* @since 2.3
*/
class DefaultHandler implements HandlerInterface
{
public function handle(&$values, &$extras)
{
if (in_array($values['type'], get_class_methods($this))) {
$result = $this->{$values['type']}($values, $extras);
} else {
$result = $this->custom($values, $extras);
}
return $result;
}
protected function text(&$values, &$extras)
{
return '
<input |attr|>';
}
protected function file(&$values, &$extras)
{
return $this->text($values, $extras);
}
protected function password(&$values, &$extras)
{
return $this->text($values, $extras);
}
protected function hidden(&$values, &$extras)
{
$original = $values;
$values = [];
$values['type'] = $original['type'];
$values['value'] = $original['value'];
$values['name'] = $original['name'];
$values['class'] = [];
return $this->text($values, $extras);
}
protected function email(&$values, &$extras)
{
$values['class'][] = 'email-mask';
$values['type'] = 'text';
return $this->text($values, $extras);
}
protected function number(&$values, &$extras)
{
$values['class'][] = 'inputmask-decimal';
$values['value'] = !empty($values['value']) ? $values['value'] : 0;
$decimals = true;
if (isset($values['decimals'])) {
if (is_numeric($values['decimals'])) {
$decimals = $values['decimals'];
} elseif (starts_with($values['decimals'], 'qta')) {
$parts = explode('|', $values['decimals']);
$values['min-value'] = isset($parts[1]) ? $parts[1] : 1;
$decimals = \Settings::get('Cifre decimali per quantità');
$values['decimals'] = $decimals;
}
}
$values['value'] = (\Translator::getEnglishFormatter()->isNumber($values['value'])) ? \Translator::numberToLocale($values['value'], $decimals) : $values['value'];
$values['type'] = 'text';
return $this->text($values, $extras);
}
protected function custom(&$values, &$extras)
{
return '
<span |attr|>|value|</span>';
}
protected function textarea(&$values, &$extras)
{
$values['class'][] = 'autosize';
return '
<textarea |attr|>|value|</textarea>';
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace HTMLBuilder\Handler;
/**
*
* @since 2.3
*/
interface HandlerInterface
{
public function handle(&$values, &$extras);
}

View File

@@ -0,0 +1,41 @@
<?php
namespace HTMLBuilder\Handler;
/**
* @since 2.3
*/
class MediaHandler implements HandlerInterface
{
/**
* @since 2.3
*
* @param array $values
* @param array $extras
*
* @return string
*/
public function handle(&$values, &$extras)
{
unset($values['class'][0]);
// Form upload
if (empty($values['value'])) {
$values['type'] = 'file';
return '
<input |attr|>';
} else {
// Visualizzazione dell'immagine e della relativa spunta per la cancellazione
$values['class'][] = 'img-thumbnail';
$values['class'][] = 'img-responsive';
return '
<img src="|value|" |attr|><br>
<label>
<input type="checkbox" name="delete_|name|" id="delete_|id|"> '._('Elimina').'
</label>
<input type="hidden" name="|name|" value="|value|" id="|id|">';
}
}
}

View File

@@ -0,0 +1,202 @@
<?php
namespace HTMLBuilder\Handler;
// Utilizzo della funzione prepareToField (PHP 5.6+)
// use function \HTMLBuilder\prepareToField;
/**
* @since 2.3
*/
class SelectHandler implements HandlerInterface
{
public function handle(&$values, &$extras)
{
$values['class'][] = (!empty($values['ajax-source'])) ? 'superselectajax' : 'superselect';
$values['data-source'] = (!empty($values['ajax-source'])) ? $values['ajax-source'] : '';
$values['value'] = explode(',', $values['value']);
if (count($values['value']) === 1 && strlen($values['value'][0]) === 0) {
$values['value'] = [];
}
// Se il valore presente non è valido, carica l'eventuale valore predefinito
if (empty($values['value']) && !is_numeric($values['value']) && !empty($values['valore_predefinito'])) {
$values['value'] = get_var($values['valore_predefinito']);
}
$values['value'] = (array) $values['value'];
$result = '
<select |attr|>';
if (!empty($values['ajax-source'])) {
if (!empty($values['value']) || is_numeric($values['value'])) {
$result .= $this->select2($values['ajax-source'], $values['value']);
}
}
// Generazione <select> da query
elseif (preg_match_all('/^query=(.+?)$/', $values['values'], $matches)) {
$result .= '
<option></option>';
$result .= $this->selectQuery($matches[1][0], $values['value']);
}
// Generazione <select> da JSON
// esempio creazione select con opzioni: Maschio, Femmina, Unisex
// {[ "type": "select", "label": "Sesso", "name": "sesso", "values": "list=\"\": \"\", \"M\": \"Maschio\", \"F\": \"Femmina\", \"U\": \"Unisex\"", "value": "$sesso$" ]}
elseif (preg_match_all('/^list=(.+?)$/', $values['values'], $matches)) {
$result .= '
<option></option>';
$result .= $this->selectList(json_decode('{'.$matches[1][0].'}', true), $values);
} elseif (preg_match_all('/^json=(.+?)$/', $values['values'], $matches)) {
$result .= '
<option></option>';
$result .= $this->selectJSON(json_decode('[{'.$matches[1][0].'}]', true), $values['value']);
}
$values['placeholder'] = !empty($values['placeholder']) ? $values['placeholder'] : '- '._("Seleziona un'opzione").' -';
$values['data-placeholder'] = $values['placeholder'];
unset($values['values']);
$result .= '
</select>';
if (in_array('disabled', $extras) || in_array('readonly', $extras)) {
$result .= '
<script>$("#'.$values['id'].'").prop("disabled", true);</script>';
}
if (in_array('readonly', $extras) && empty($values['ajax-source'])) {
$result .= '
<select class="hide" name="'.\HTMLBuilder\prepareToField($values['name']).'"'.((in_array('multiple', $extras)) ? ' multiple' : '').'>';
foreach ($values['value'] as $value) {
$result .= '
<option value="'.\HTMLBuilder\prepareToField($value).'" selected></option>';
}
$result .= '
</select>';
}
return $result;
}
protected function select2($op, $elements)
{
// Richiamo alla pagina ajax_select.php per aggiungere il valore iniziale al select
ob_start();
$dbo = \Database::getConnection();
include DOCROOT.'/ajax_select.php';
$text = ob_get_clean();
$result = '';
$array = (array) json_decode($text, true);
foreach ($array as $element) {
$element = (array) $element;
if (isset($element['children'][0])) {
$element = (array) $element['children'][0];
}
$attributes = [];
if (in_array($element['id'], $elements)) {
$attributes[] = 'selected';
}
if (!empty($element['_bgcolor_'])) {
$attributes[] = 'style="background:'.$element['_bgcolor_'].'; color:'.color_inverse($element['_bgcolor_'].';"');
}
$exclude = ['id', 'text'];
// Leggo ulteriori campi oltre a id e descrizione per inserirli nell'option nella forma "data-nomecampo1", "data-nomecampo2", ecc
foreach ($element as $key => $value) {
if (!in_array($key, $exclude)) {
$attributes[] = 'data-'.$key.'="'.\HTMLBuilder\prepareToField($value).'"';
}
}
$result .= '
<option value="'.\HTMLBuilder\prepareToField($element['id']).'" '.implode(' ', $attributes).'>'.$element['text'].'</option>';
}
return $result;
}
protected function selectJSON($array, $values)
{
$prev = '';
foreach ($array as $element) {
if (!empty($element['optgroup'])) {
if ($prev != $element['optgroup']) {
$result .= '
<optgroup label="'.\HTMLBuilder\prepareToField($element['optgroup']).'"></optgroup>';
$prev = $element['optgroup'];
}
}
$element['text'] = empty($element['text']) ? $element['descrizione'] : $element['text'];
$attributes = [];
if (in_array($element['id'], $values)) {
$attributes[] = 'selected';
}
if (!empty($element['_bgcolor_'])) {
$attributes[] = 'style="background:'.$element['_bgcolor_'].'; color:'.color_inverse($element['_bgcolor_']).';"';
}
$exclude = ['optgroup'];
// Leggo ulteriori campi oltre a id e descrizione per inserirli nell'option nella forma "data-nomecampo1", "data-nomecampo2", ecc
foreach ($element as $key => $value) {
if (!in_array($key, $exclude)) {
$attributes[] = 'data-'.$key.'="'.\HTMLBuilder\prepareToField($value).'"';
}
}
$result .= '
<option value="'.\HTMLBuilder\prepareToField($element['id']).'" '.implode(' ', $attributes).'>'.$element['text'].'</option>';
}
return $result;
}
protected function selectQuery($query, $values)
{
$result = '';
$database = \Database::getConnection();
$array = $database->fetchArray($query);
return $this->selectJSON($array, $values);
}
protected function selectList($datas, &$values)
{
$result = '';
foreach ($datas as $key => $value) {
if (!empty($key)) {
$attributes = [];
if (in_array($key, $values['value'])) {
$attributes[] = 'selected';
}
$result .= '
<option value="'.\HTMLBuilder\prepareToField($key).'" '.implode(' ', $attributes).'>'.$value.'</option>';
} elseif (empty($values['placeholder'])) {
$values['placeholder'] = $value;
}
}
return $result;
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace HTMLBuilder\Manager;
/**
* @since 2.3
*/
class CSRFManager implements ManagerInterface
{
public function manage($options)
{
$token = \CSRF::getInstance()->getToken();
$keys = array_keys($token);
$values = array_values($token);
$result = '
{[ "type": "hidden", "name": "'.$keys[0].'", "value": "'.$values[0].'" ]}
{[ "type": "hidden", "name": "'.$keys[1].'", "value": "'.$values[1].'" ]}';
return $result;
}
}

View File

@@ -0,0 +1,128 @@
<?php
namespace HTMLBuilder\Manager;
/**
* @since 2.3
*/
class FileManager implements ManagerInterface
{
public function manage($options)
{
$options['showpanel'] = isset($options['showpanel']) ? $options['showpanel'] : true;
$options['label'] = isset($options['label']) ? $options['label'] : 'Nuovo allegato:';
$dbo = \Database::getConnection();
$result .= '
<a name="attachments"></a>';
if (!empty($options['showpanel'])) {
$result .= '
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">'._('Allegati').'</h3>
</div>
<div class="panel-body">';
}
// Visualizzo l'elenco di file già caricati
$rs = $dbo->fetchArray('SELECT * FROM zz_files WHERE id_module='.prepare($options['id_module']).' AND id_record='.prepare($options['id_record']));
if (!empty($rs)) {
$result .= '
<table class="table table-condensed table-hover table-bordered">
<tr>
<th>'._('Nome').'</th>
<th>'._('Data').'</th>
<th style="width:5%;text-align:center;">#</th>
</tr>';
foreach ($rs as $r) {
$result .= '
<tr>
<td align="left">
<a href="'.ROOTDIR.'/files/'.\Modules::getModule($options['id_module'])['directory'].'/'.$r['filename'].'" target="_blank">
<i class="fa fa-external-link"></i> '.$r['nome'].'
</a>
</td>
<td>'.\Translator::timestampToLocale($r['created_at']).'</td>
<td>
<a class="btn btn-danger ask" data-backto="record-edit" data-msg="'._('Vuoi eliminare questo file?').'" data-op="unlink_file" data-id="'.$r['id'].'" data-filename="'.$r['filename'].'">
<i class="fa fa-trash"></i>
</a>
</td>
</tr>';
}
$result .= '
</table>
<div class="clearfix"></div>
<br>';
}
// Form per l'upload di un nuovo file
$result .= '
<b>'.$options['label'].'</b>
<div class="row">
<div class="col-lg-4">
{[ "type": "text", "placeholder": "'._('Nome').'", "name": "nome_allegato", "required": 1 ]}
</div>
<div class="col-lg-6">
{[ "type": "file", "placeholder": "'._('File').'", "name": "blob", "required": 1 ]}
</div>
<div class="col-lg-2 text-right">
<button type="button" class="btn btn-success" id="upload_button" onclick="SaveFile();">
<i class="fa fa-upload"></i> '._('Carica').'
</button>
</div>
</div>';
$result .= '
<script>
function SaveFile(){
if(!$("#blob").val()){
alert("Devi selezionare un file con il tasto Sfoglia...");
return false;
} else if(!$("input[name=nome_allegato]").val()){
alert("Devi inserire un nome per il file!");
return false;
}
var file_data = $("#blob").prop("files")[0];
var form_data = new FormData();
form_data.append("blob", file_data);
form_data.append("nome_allegato", $("input[name=nome_allegato]").val());
form_data.append("op","link_file");
form_data.append("id_record","'.$options['id_record'].'");
form_data.append("id_module", "'.$options['id_module'].'");
$.ajax({
url: "'.ROOTDIR.'/actions.php",
cache: false,
type: "post",
processData: false,
contentType: false,
dataType : "html",
data: form_data,
success: function(data) {
location.href = globals.rootdir + "/editor.php?id_module='.$options['id_module'].'&id_record='.$options['id_record'].'";
},
error: function(data) {
alert(data);
}
})
}
</script>';
if (!empty($options['showpanel'])) {
$result .= '
</div>
</div>';
}
return $result;
}
}

View File

@@ -0,0 +1,12 @@
<?php
namespace HTMLBuilder\Manager;
/**
*
* @since 2.3
*/
interface ManagerInterface
{
public function manage($options);
}

View File

@@ -0,0 +1,146 @@
<?php
namespace HTMLBuilder\Wrapper;
// Utilizzo della funzione prepareToField (PHP 5.6+)
// use function \HTMLBuilder\prepareToField;
/**
* @since 2.3
*/
class HTMLWrapper implements WrapperInterface
{
public function before(&$values, &$extras)
{
$result = '';
// Valori particolari
$values['icon-before'] = $this->parser($values, $values['icon-before']);
$values['icon-after'] = $this->parser($values, $values['icon-after']);
// Generazione dell'etichetta
if (!empty($values['label'])) {
$result .= '
<div class="form-group">
<label for="'.\HTMLBuilder\prepareToField($values['id']).'">'.(empty($values['help']) ? $values['label'] : '<span class="tip" title="'.\HTMLBuilder\prepareToField($values['help']).'">'.$values['label'].'</span>').'</label>';
}
if (!empty($values['icon-before']) || !empty($values['icon-after'])) {
$result .= '
<div class="input-group">';
if (!empty($values['icon-before'])) {
$result .= '
<span class="input-group-addon'.(!empty($values['icon-custom']) ? ' '.$values['icon-custom'] : '').'">'.$values['icon-before'].'</span>';
}
}
return $result;
}
public function after(&$values, &$extras)
{
$result = '';
if (!empty($values['icon-before']) || !empty($values['icon-after'])) {
if (!empty($values['icon-after'])) {
$result .= '
<span class="input-group-addon'.(!empty($values['icon-custom']) ? ' '.$values['icon-custom'] : '').'">'.$values['icon-after'].'</span>';
}
$result .= '
</div>';
unset($values['icon-before']);
unset($values['icon-after']);
unset($values['icon-custom']);
}
if (!empty($values['help']) && !empty($values['show-help'])) {
$result .= '
<span class="help-block pull-left"><small>'.$values['help'].'</small></span>';
unset($values['help']);
unset($values['show-help']);
}
$values['data-parsley-errors-container'] = '#'.$values['id'].'-errors';
$result .= '
<div id="'.$values['id'].'-errors"></div>';
if (!empty($values['label'])) {
$result .= '
</div>';
unset($values['label']);
}
return $result;
}
protected function parser(&$values, $string)
{
$result = $string;
if (starts_with($string, 'add|')) {
$result = $this->add($values, $string);
$values['icon-custom'] = 'no-padding';
} elseif (starts_with($string, 'choice|')) {
$result = $this->choice($values, $string);
$values['icon-custom'] = 'no-padding';
}
return $result;
}
protected function add(&$values, $string)
{
$result = null;
$pieces = explode('|', $string);
$id_module = $pieces[1];
$extra = empty($pieces[2]) ? '' : '&'.$pieces[2];
$classes = empty($pieces[3]) ? '' : ' '.$pieces[3];
$module = \Modules::getModule($id_module);
if (in_array($module['permessi'], ['r', 'rw'])) {
$result = '
<button data-href="'.ROOTDIR.'/add.php?id_module='.$id_module.$extra.'&select='.$values['id'].'&ajax=yes" data-target="#bs-popup2" data-toggle="modal" data-title="'._('Aggiungi').'" type="button" class="btn'.$classes.'">
<i class="fa fa-plus"></i>
</button>';
}
return $result;
}
protected function choice(&$values, $string)
{
$result = null;
$choices = [
[
'id' => 'UNT',
'descrizione' => _('&euro;'),
],
[
'id' => 'PRC',
'descrizione' => '%',
],
];
$pieces = explode('|', $string);
$type = $pieces[1];
$value = (empty($pieces[2]) || !in_array($pieces[2], array_column($choices, 'id'))) ? 'UNT' : $pieces[2];
if ($type == 'untprc') {
$result = '{[ "type": "select", "name": "tipo_'.\HTMLBuilder\prepareToField($values['name']).'", "value": "'.\HTMLBuilder\prepareToField($value).'", "values": "json='.substr(str_replace('"', '\"', json_encode($choices)), 2, -2).'", "class": "no-search" ]}';
$result = \HTMLBuilder\HTMLBuilder::replace($result);
}
return $result;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace HTMLBuilder\Wrapper;
/**
*
* @since 2.3
*/
interface WrapperInterface
{
public function before(&$values, &$extras);
public function after(&$values, &$extras);
}