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:
312
lib/classes/HTMLBuilder/HTMLBuilder.php
Normal file
312
lib/classes/HTMLBuilder/HTMLBuilder.php
Normal 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('"', '"', $string);
|
||||
}
|
89
lib/classes/HTMLBuilder/Handler/ChoicesHandler.php
Normal file
89
lib/classes/HTMLBuilder/Handler/ChoicesHandler.php
Normal 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;
|
||||
}
|
||||
}
|
77
lib/classes/HTMLBuilder/Handler/DateHandler.php
Normal file
77
lib/classes/HTMLBuilder/Handler/DateHandler.php
Normal 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'] : '';
|
||||
}
|
||||
}
|
98
lib/classes/HTMLBuilder/Handler/DefaultHandler.php
Normal file
98
lib/classes/HTMLBuilder/Handler/DefaultHandler.php
Normal 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>';
|
||||
}
|
||||
}
|
12
lib/classes/HTMLBuilder/Handler/HandlerInterface.php
Normal file
12
lib/classes/HTMLBuilder/Handler/HandlerInterface.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace HTMLBuilder\Handler;
|
||||
|
||||
/**
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
interface HandlerInterface
|
||||
{
|
||||
public function handle(&$values, &$extras);
|
||||
}
|
41
lib/classes/HTMLBuilder/Handler/MediaHandler.php
Normal file
41
lib/classes/HTMLBuilder/Handler/MediaHandler.php
Normal 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|">';
|
||||
}
|
||||
}
|
||||
}
|
202
lib/classes/HTMLBuilder/Handler/SelectHandler.php
Normal file
202
lib/classes/HTMLBuilder/Handler/SelectHandler.php
Normal 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;
|
||||
}
|
||||
}
|
23
lib/classes/HTMLBuilder/Manager/CSRFManager.php
Normal file
23
lib/classes/HTMLBuilder/Manager/CSRFManager.php
Normal 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;
|
||||
}
|
||||
}
|
128
lib/classes/HTMLBuilder/Manager/FileManager.php
Normal file
128
lib/classes/HTMLBuilder/Manager/FileManager.php
Normal 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;
|
||||
}
|
||||
}
|
12
lib/classes/HTMLBuilder/Manager/ManagerInterface.php
Normal file
12
lib/classes/HTMLBuilder/Manager/ManagerInterface.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace HTMLBuilder\Manager;
|
||||
|
||||
/**
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
interface ManagerInterface
|
||||
{
|
||||
public function manage($options);
|
||||
}
|
146
lib/classes/HTMLBuilder/Wrapper/HTMLWrapper.php
Normal file
146
lib/classes/HTMLBuilder/Wrapper/HTMLWrapper.php
Normal 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' => _('€'),
|
||||
],
|
||||
[
|
||||
'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;
|
||||
}
|
||||
}
|
14
lib/classes/HTMLBuilder/Wrapper/WrapperInterface.php
Normal file
14
lib/classes/HTMLBuilder/Wrapper/WrapperInterface.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace HTMLBuilder\Wrapper;
|
||||
|
||||
/**
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
interface WrapperInterface
|
||||
{
|
||||
public function before(&$values, &$extras);
|
||||
|
||||
public function after(&$values, &$extras);
|
||||
}
|
Reference in New Issue
Block a user