Miglioramento della documentazione del codice
Miglioramento della documentazione del codice nelle classi dedicata alla generazione dell'input HTML. Aggiunto supporto agli array in formato JSON nel campo "values" dei select. Aggiunto redirect automatico nel file _controller.php_: se specificati $id_record e $id_module indirizza al file _editor.php_.
This commit is contained in:
parent
f8132abfc1
commit
965d467d7d
|
@ -21,7 +21,7 @@ session_write_close();
|
|||
// Permesso di accesso all'API da ogni dispositivo
|
||||
header('Access-Control-Allow-Origin: *');
|
||||
|
||||
// Attenzione: al momento l'API permette la lettura di tutte le tabelle rpesenti nel database (non limitate a quelle del progetto).
|
||||
// Attenzione: al momento l'API permette la lettura di tutte le tabelle presenti nel database (non limitate a quelle del progetto)
|
||||
|
||||
try {
|
||||
// Controlli sulla chiave di accesso
|
||||
|
@ -30,21 +30,33 @@ try {
|
|||
// Lettura delle informazioni
|
||||
$request = API::getRequest();
|
||||
|
||||
// Gestione della richiesta
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
switch ($method) {
|
||||
// Richiesta PUT (modifica elementi)
|
||||
case 'PUT':
|
||||
$result = $api->update($request);
|
||||
break;
|
||||
|
||||
// Richiesta POST (creazione elementi)
|
||||
case 'POST':
|
||||
$result = $api->create($request);
|
||||
break;
|
||||
|
||||
// Richiesta GET (ottenimento elementi)
|
||||
case 'GET':
|
||||
// Risorsa specificata
|
||||
if (!empty($request)) {
|
||||
$result = $api->retrieve($request);
|
||||
} else {
|
||||
}
|
||||
|
||||
// Risorsa non specificata (lista delle risorse disponibili)
|
||||
else {
|
||||
$result = API::response(API::getResources()['retrieve']);
|
||||
}
|
||||
break;
|
||||
|
||||
// Richiesta DELETE (eliminazione elementi)
|
||||
case 'DELETE':
|
||||
$result = $api->delete($request);
|
||||
break;
|
||||
|
@ -55,4 +67,5 @@ try {
|
|||
$result = API::error('serverError');
|
||||
}
|
||||
|
||||
// Stampa dei risultati
|
||||
echo $result;
|
||||
|
|
|
@ -2,6 +2,12 @@
|
|||
|
||||
include_once __DIR__.'/core.php';
|
||||
|
||||
if (!empty($id_record) && !empty($id_module)) {
|
||||
redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record);
|
||||
} elseif (empty($id_module)) {
|
||||
redirect(ROOTDIR.'/index.php');
|
||||
}
|
||||
|
||||
if (file_exists($docroot.'/include/custom/top.php')) {
|
||||
include $docroot.'/include/custom/top.php';
|
||||
} else {
|
||||
|
@ -22,10 +28,10 @@ include $docroot.'/actions.php';
|
|||
/*
|
||||
* Widget top
|
||||
*/
|
||||
|
||||
|
||||
//se non sono mobile nascondo i widget controller_top
|
||||
if (!isMobile()){
|
||||
echo Widgets::addModuleWidgets($id_module, 'controller_top');
|
||||
if (!isMobile()) {
|
||||
echo Widgets::addModuleWidgets($id_module, 'controller_top');
|
||||
}
|
||||
|
||||
// Lettura eventuali plugins modulo da inserire come tab
|
||||
|
@ -87,20 +93,19 @@ echo '
|
|||
|
||||
redirectOperation($id_module, $id_record);
|
||||
|
||||
/**
|
||||
/*
|
||||
* Widget laterali.
|
||||
*/
|
||||
// Controllo se ho widget per il lato destro dello schermo, altrimenti non creo la colonna di destra
|
||||
|
||||
//se sono mobile pesco anche i widget di controller_top
|
||||
if (isMobile()){
|
||||
$extra_where = " OR location = 'controller_top'";
|
||||
}else{
|
||||
$extra_where = "";
|
||||
if (isMobile()) {
|
||||
$extra_where = " OR location = 'controller_top'";
|
||||
} else {
|
||||
$extra_where = '';
|
||||
}
|
||||
|
||||
|
||||
$result_widgets = $dbo->fetchArray('SELECT `id`, `location`, `class` FROM `zz_widgets` WHERE `id_module`='.prepare($id_module)." AND (`location`='controller_right' ".$extra_where." ) AND `enabled`=1 ORDER BY `order` ASC");
|
||||
$result_widgets = $dbo->fetchArray('SELECT `id`, `location`, `class` FROM `zz_widgets` WHERE `id_module`='.prepare($id_module)." AND (`location`='controller_right' ".$extra_where.' ) AND `enabled`=1 ORDER BY `order` ASC');
|
||||
if (count($result_widgets) > 0) {
|
||||
echo '
|
||||
<div class="col-md-12">';
|
||||
|
|
|
@ -29,11 +29,11 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
|
|||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
|
||||
|
||||
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "required": 1, "value": "$codice$" ]}
|
||||
<br>
|
||||
{[ "type": "checkbox", "label": "<?php echo tr("Seleziona per rendere visibile l'articolo"); ?>", "name": "attivo", "value": "$attivo$", "help": "", "placeholder": "<?php echo tr('ATTIVO'); ?>" ]}
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-md-5">
|
||||
|
@ -50,7 +50,7 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
|
|||
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
{[ "type": "number", "label": "<?php echo tr('Quantità'); ?>", "name": "qta", "required": 1, "value": "$qta$", "readonly": 1, "decimals": "qta|undefined" ]}
|
||||
{[ "type": "number", "label": "<?php echo tr('Quantità'); ?>", "name": "qta", "required": 1, "value": "$qta$", "readonly": 1, "decimals": "qta", "min-value": "undefined" ]}
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Modifica manualmente quantità'); ?>", "name": "qta_manuale", "value": 0, "help": "<?php echo tr('Seleziona per modificare manualmente la quantità'); ?>", "placeholder": "<?php echo tr('Quantità manuale'); ?>" ]}
|
||||
|
@ -68,34 +68,34 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
|
|||
<div class="col-md-2">
|
||||
{[ "type": "select", "label": "<?php echo tr('Unità di misura'); ?>", "name": "um", "value": "$um$", "ajax-source": "misure", "icon-after": "add|<?php echo Modules::get('Unità di misura')['id']; ?>" ]}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-2">
|
||||
{[ "type": "number", "label": "<?php echo tr('Soglia minima quantità'); ?>", "name": "threshold_qta", "value": "$threshold_qta$", "decimals": "qta|undefined" ]}
|
||||
{[ "type": "number", "label": "<?php echo tr('Soglia minima quantità'); ?>", "name": "threshold_qta", "value": "$threshold_qta$", "decimals": "qta", "min-value": "undefined" ]}
|
||||
</div>
|
||||
|
||||
|
||||
<?php
|
||||
if (empty($records[0]['abilita_serial'])) {
|
||||
$plugin = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Serial'");
|
||||
echo '<script>$("#link-tab_'.$plugin[0]['id'].'").addClass("disabled");</script>';
|
||||
}
|
||||
?>
|
||||
|
||||
if (empty($records[0]['abilita_serial'])) {
|
||||
$plugin = $dbo->fetchArray("SELECT id FROM zz_plugins WHERE name='Serial'");
|
||||
echo '<script>$("#link-tab_'.$plugin[0]['id'].'").addClass("disabled");</script>';
|
||||
}
|
||||
?>
|
||||
|
||||
<div class="col-md-3">
|
||||
{[ "type": "checkbox", "label": "<?php echo tr('Abilita serial number'); ?>", "name": "abilita_serial", "value": "$abilita_serial$", "help": "", "placeholder": "<?php echo tr('Abilita serial number in fase di aggiunta articolo in fattura o ddt'); ?>" ]}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
{[ "type": "number", "label": "<?php echo tr('Prezzo di acquisto'); ?>", "name": "prezzo_acquisto", "value": "$prezzo_acquisto$", "icon-after": "€" ]}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-2">
|
||||
{[ "type": "number", "label": "<?php echo tr('Prezzo di vendita base'); ?>", "name": "prezzo_vendita", "value": "$prezzo_vendita$", "icon-after": "€" ]}
|
||||
|
@ -104,18 +104,18 @@ $_SESSION['superselect']['id_categoria'] = $records[0]['id_categoria'];
|
|||
<div class="col-md-3">
|
||||
{[ "type": "select", "label": "<?php echo tr('Iva di vendita'); ?>", "name": "idiva_vendita", "values": "query=SELECT * FROM co_iva ORDER BY descrizione ASC", "value": "$idiva_vendita$", "valore_predefinito": "Iva predefinita" ]}
|
||||
</div>
|
||||
|
||||
|
||||
<div class="col-md-2">
|
||||
{[ "type": "number", "label": "<?php echo tr('Garanzia'); ?>", "name": "gg_garanzia", "decimals": 0, "value": "$gg_garanzia$", "icon-after": "GG" ]}
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row">
|
||||
|
||||
|
||||
<div class="col-md-2">
|
||||
{[ "type": "number", "label": "<?php echo tr('Peso lordo'); ?>", "name": "peso_lordo", "value": "$peso_lordo$", "icon-after": "KG" ]}
|
||||
</div>
|
||||
|
@ -298,13 +298,12 @@ $elementi = $dbo->fetchArray('SELECT `co_documenti`.`id`, `co_documenti`.`data`,
|
|||
SELECT `dt_ddt`.`id`, `dt_ddt`.`data`, `dt_ddt`.`numero`, `dt_ddt`.`numero_esterno`, `dt_tipiddt`.`descrizione` AS tipo_documento, `dt_tipiddt`.`dir` FROM `dt_ddt` JOIN `dt_tipiddt` ON `dt_tipiddt`.`id` = `dt_ddt`.`idtipoddt` WHERE `dt_ddt`.`id` IN (SELECT `idddt` FROM `dt_righe_ddt` WHERE `idarticolo` = '.prepare($id_record).') UNION
|
||||
SELECT `co_preventivi`.`id`, `co_preventivi`.`data_bozza`, `co_preventivi`.`numero`, 0 AS numero_esterno , "Preventivo" AS tipo_documento, 0 AS dir FROM `co_preventivi` WHERE `co_preventivi`.`id` IN (SELECT `idpreventivo` FROM `co_righe_preventivi` WHERE `idarticolo` = '.prepare($id_record).') ORDER BY `data`');
|
||||
|
||||
|
||||
if (!empty($elementi)) {
|
||||
echo '
|
||||
<div class="alert alert-warning">
|
||||
<p>'.tr('_NUM_ altr_I_ document_I_ collegat_I_', [
|
||||
'_NUM_' => count($elementi),
|
||||
'_I_' => (count($elementi)>1) ? tr('i') : tr('o')
|
||||
'_I_' => (count($elementi) > 1) ? tr('i') : tr('o'),
|
||||
]).':</p>
|
||||
<ul>';
|
||||
|
||||
|
@ -314,17 +313,17 @@ if (!empty($elementi)) {
|
|||
'_NUM_' => !empty($elemento['numero_esterno']) ? $elemento['numero_esterno'] : $elemento['numero'],
|
||||
'_DATE_' => Translator::dateToLocale($elemento['data']),
|
||||
]);
|
||||
|
||||
//se non è un preventivo è un ddt o una fattura
|
||||
//se non è un ddt è una fattura.
|
||||
if (in_array($elemento['tipo_documento'], ['Preventivo'])) {
|
||||
$modulo ='Preventivi';
|
||||
} else if (!in_array($elemento['tipo_documento'], ['Ddt di vendita', 'Ddt di acquisto'])) {
|
||||
$modulo = ($elemento['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
|
||||
} else {
|
||||
$modulo = ($elemento['dir'] == 'entrata') ? 'Ddt di vendita' : 'Ddt di acquisto';
|
||||
}
|
||||
|
||||
|
||||
//se non è un preventivo è un ddt o una fattura
|
||||
//se non è un ddt è una fattura.
|
||||
if (in_array($elemento['tipo_documento'], ['Preventivo'])) {
|
||||
$modulo = 'Preventivi';
|
||||
} elseif (!in_array($elemento['tipo_documento'], ['Ddt di vendita', 'Ddt di acquisto'])) {
|
||||
$modulo = ($elemento['dir'] == 'entrata') ? 'Fatture di vendita' : 'Fatture di acquisto';
|
||||
} else {
|
||||
$modulo = ($elemento['dir'] == 'entrata') ? 'Ddt di vendita' : 'Ddt di acquisto';
|
||||
}
|
||||
|
||||
$id = $elemento['id'];
|
||||
|
||||
echo '
|
||||
|
@ -341,4 +340,4 @@ if (!empty($elementi)) {
|
|||
|
||||
<a class="btn btn-danger ask" data-backto="record-list">
|
||||
<i class="fa fa-trash"></i> <?php echo tr('Elimina'); ?>
|
||||
</a>
|
||||
</a>
|
||||
|
|
|
@ -41,7 +41,7 @@ foreach ($rs as $key => $value) {
|
|||
echo '
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
{[ "type": "select", "label": "'.tr('Intervento').'", "name": "idintervento", "required": 1, "values": "json='.substr(str_replace('"', '\"', json_encode($rs)), 2, -2).'", "extra": "onchange=\"$data = $(this).selectData(); $(\'#descrizione\').val($data.descrizione); $(\'#prezzo\').val($data.prezzo);\"" ]}
|
||||
{[ "type": "select", "label": "'.tr('Intervento').'", "name": "idintervento", "required": 1, "values": '.json_encode($rs).', "extra": "onchange=\"$data = $(this).selectData(); $(\'#descrizione\').val($data.descrizione); $(\'#prezzo\').val($data.prezzo);\"" ]}
|
||||
</div>
|
||||
</div>';
|
||||
|
||||
|
|
|
@ -119,7 +119,7 @@ if (!empty($rs)) {
|
|||
echo '
|
||||
<tr>
|
||||
<td>
|
||||
|
||||
|
||||
<input type="hidden" name="abilita_serial['.$r['id'].']" value="'.$r['abilita_serial'].'" />
|
||||
<input type="hidden" id="idarticolo_'.$i.'" name="idarticolo['.$r['id'].']" value="'.$r['idarticolo'].'" />
|
||||
<input type="hidden" id="descrizione_'.$i.'" name="descrizione['.$r['id'].']" value="'.$r['descrizione'].'" />';
|
||||
|
@ -144,7 +144,7 @@ if (!empty($rs)) {
|
|||
// Q.tà da evadere
|
||||
echo '
|
||||
<td>
|
||||
{[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "extra" : "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"", "decimals": "qta|0" ]}
|
||||
{[ "type": "number", "name": "qta_da_evadere['.$r['id'].']", "id": "qta_'.$i.'", "required": 1, "value": "'.$r['qta_rimanente'].'", "extra" : "onkeyup=\"ricalcola_subtotale_riga('.$i.');\"", "decimals": "qta", "min-value": "0" ]}
|
||||
</td>';
|
||||
|
||||
// Subtotale
|
||||
|
|
|
@ -88,6 +88,7 @@ class HTMLBuilder
|
|||
*/
|
||||
public static function replace($html)
|
||||
{
|
||||
// Gestione dei manager generici
|
||||
preg_match_all('/'.preg_quote(self::$open['manager']).'(.+?)'.preg_quote(self::$close['manager']).'/is', $html, $managers);
|
||||
|
||||
foreach ($managers[0] as $value) {
|
||||
|
@ -99,6 +100,7 @@ class HTMLBuilder
|
|||
$html = str_replace($value, !empty($result) ? $result : $value, $html);
|
||||
}
|
||||
|
||||
// Gestione del formato di input HTML semplificato
|
||||
preg_match_all('/'.preg_quote(self::$open['handler']).'(.+?)'.preg_quote(self::$close['handler']).'/is', $html, $handlers);
|
||||
|
||||
foreach ($handlers[0] as $value) {
|
||||
|
@ -155,10 +157,10 @@ class HTMLBuilder
|
|||
{
|
||||
$string = '{'.substr($string, strlen(self::$open[$type]), -strlen(self::$close[$type])).'}';
|
||||
|
||||
// Fix per contenuti con newline integrate
|
||||
// Fix per contenuti con newline integrati
|
||||
$string = str_replace(["\n", "\r"], ['\\n', '\\r'], $string);
|
||||
|
||||
$json = (array) json_decode($string, true, 2);
|
||||
$json = (array) json_decode($string, true);
|
||||
|
||||
return $json;
|
||||
}
|
||||
|
@ -212,7 +214,7 @@ class HTMLBuilder
|
|||
|
||||
// Attributi normali
|
||||
foreach ($json as $key => $value) {
|
||||
$values[trim($key)] = trim($value);
|
||||
$values[trim($key)] = is_string($value) ? trim($value) : $value;
|
||||
}
|
||||
|
||||
// Valori particolari
|
||||
|
|
|
@ -3,33 +3,50 @@
|
|||
namespace HTMLBuilder\Handler;
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "checkbox".
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
class ChoicesHandler implements HandlerInterface
|
||||
{
|
||||
public function handle(&$values, &$extras)
|
||||
{
|
||||
// Delega della gestione al metodo specifico per il tipo di input richiesto
|
||||
$result = $this->{$values['type']}($values, $extras);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "checkbox".
|
||||
* Esempio: {[ "type": "checkbox", "label": "Checkbox di test", "placeholder": "Test", "name": "checkbox", "value": "1" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function checkbox(&$values, &$extras)
|
||||
{
|
||||
unset($values['class'][0]);
|
||||
|
||||
// Restrizione dei valori permessi
|
||||
$values['value'] = (empty($values['value']) || $values['value'] == 'off') ? false : true;
|
||||
|
||||
// Gestione della proprietà "checked"
|
||||
if (!empty($values['value']) && !in_array('checked', $extras)) {
|
||||
$extras[] = 'checked';
|
||||
}
|
||||
|
||||
// Gestione della proprietà "readonly"
|
||||
if (in_array('readonly', $extras)) {
|
||||
$extras[] = 'disabled';
|
||||
}
|
||||
|
||||
$values['placeholder'] = (isset($values['placeholder'])) ? $values['placeholder'] : $values['label'];
|
||||
// Gestione dei placeholder
|
||||
$values['placeholder'] = isset($values['placeholder']) ? $values['placeholder'] : $values['label'];
|
||||
|
||||
// Generazione del codice HTML
|
||||
$result .= '
|
||||
<div class="input-group">
|
||||
<span class="input-group-addon">
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
namespace HTMLBuilder\Handler;
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "timestamp", "date" e "time".
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
class DateHandler implements HandlerInterface
|
||||
|
@ -10,26 +12,34 @@ 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::getFormatter()->getStandardFormats()['timestamp']);
|
||||
}
|
||||
|
||||
if ($values['max-date'] == '-now-') {
|
||||
$values['max-date'] = date(\Translator::getFormatter()->getStandardFormats()['timestamp']);
|
||||
}
|
||||
|
||||
if ($values['min-date'] == '-now-') {
|
||||
$values['min-date'] = date(\Translator::getFormatter()->getStandardFormats()['timestamp']);
|
||||
$detect = [
|
||||
'value',
|
||||
'max-date',
|
||||
'min-date',
|
||||
];
|
||||
foreach ($detect as $attr) {
|
||||
if ($values[$attr] == '-now-') {
|
||||
$values[$attr] = date(\Translator::getFormatter()->getStandardFormats()['timestamp']);
|
||||
}
|
||||
}
|
||||
|
||||
// Restrizione dei valori permessi
|
||||
// Timestamp
|
||||
if ($values['type'] == 'timestamp' && \Translator::getFormatter()->isStandardTimestamp($values['value'])) {
|
||||
$values['value'] = \Translator::timestampToLocale($values['value']);
|
||||
} elseif ($values['type'] == 'date' && \Translator::getFormatter()->isStandardDate($values['value'])) {
|
||||
}
|
||||
|
||||
// Data
|
||||
elseif ($values['type'] == 'date' && \Translator::getFormatter()->isStandardDate($values['value'])) {
|
||||
$values['value'] = \Translator::dateToLocale($values['value']);
|
||||
} elseif ($values['type'] == 'time' && \Translator::getFormatter()->isStandardTime($values['value'])) {
|
||||
}
|
||||
|
||||
// Orario
|
||||
elseif ($values['type'] == 'time' && \Translator::getFormatter()->isStandardTime($values['value'])) {
|
||||
$values['value'] = \Translator::timeToLocale($values['value']);
|
||||
}
|
||||
|
||||
// Controllo sulla correttezza sintattica del valore impostato
|
||||
if (!(
|
||||
($values['type'] == 'timestamp' && \Translator::getFormatter()->isFormattedTimestamp($values['value'])) ||
|
||||
($values['type'] == 'date' && \Translator::getFormatter()->isFormattedDate($values['value'])) ||
|
||||
|
@ -38,10 +48,12 @@ class DateHandler implements HandlerInterface
|
|||
$values['value'] = '';
|
||||
}
|
||||
|
||||
// Delega della gestione al metodo specifico per il tipo di input richiesto
|
||||
$result = $this->{$values['type']}($values, $extras);
|
||||
|
||||
$values['type'] = 'text';
|
||||
|
||||
// Generazione del codice HTML di default
|
||||
if (empty($result)) {
|
||||
$result = '
|
||||
<input |attr|>';
|
||||
|
@ -50,6 +62,15 @@ class DateHandler implements HandlerInterface
|
|||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "timestamp".
|
||||
* Esempio: {[ "type": "timestamp", "label": "Timestamp di test", "name": "timestamp", "value": "2018-01-01 12:00:30" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function timestamp(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = 'text-center';
|
||||
|
@ -57,6 +78,15 @@ class DateHandler implements HandlerInterface
|
|||
$values['class'][] = 'timestamp-mask';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "date".
|
||||
* Esempio: {[ "type": "date", "label": "Data di test", "name": "date", "value": "2018-01-01" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function date(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = 'text-center';
|
||||
|
@ -64,6 +94,15 @@ class DateHandler implements HandlerInterface
|
|||
$values['class'][] = 'date-mask';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "time".
|
||||
* Esempio: {[ "type": "time", "label": "Orario di test", "name": "time", "value": "12:00:30" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function time(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = 'text-center';
|
||||
|
|
|
@ -3,37 +3,98 @@
|
|||
namespace HTMLBuilder\Handler;
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "text", "file", "password", "email", "number", "textarea" e "hidden".
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
class DefaultHandler implements HandlerInterface
|
||||
{
|
||||
public function handle(&$values, &$extras)
|
||||
{
|
||||
// Delega della gestione al metodo specifico per il tipo di input richiesto
|
||||
if (in_array($values['type'], get_class_methods($this))) {
|
||||
$result = $this->{$values['type']}($values, $extras);
|
||||
} else {
|
||||
}
|
||||
|
||||
// Caso non previsto
|
||||
else {
|
||||
$result = $this->custom($values, $extras);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo non altrimenti previsto.
|
||||
* Esempio: {[ "type": "undefined", "label": "Custom di test", "placeholder": "Test", "name": "custom", "value": "custom" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function custom(&$values, &$extras)
|
||||
{
|
||||
// Generazione del codice HTML
|
||||
return '
|
||||
<span |attr|>|value|</span>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "text".
|
||||
* Esempio: {[ "type": "text", "label": "Text di test", "placeholder": "Test", "name": "text" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function text(&$values, &$extras)
|
||||
{
|
||||
// Generazione del codice HTML
|
||||
return '
|
||||
<input |attr|>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "file".
|
||||
* Esempio: {[ "type": "file", "label": "File di test", "placeholder": "Test", "name": "file" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function file(&$values, &$extras)
|
||||
{
|
||||
// Delega al metodo "text", per la generazione del codice HTML
|
||||
return $this->text($values, $extras);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "password".
|
||||
* Esempio: {[ "type": "password", "label": "Password di test", "placeholder": "Test", "name": "password" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function password(&$values, &$extras)
|
||||
{
|
||||
// Delega al metodo "text", per la generazione del codice HTML
|
||||
return $this->text($values, $extras);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "hidden".
|
||||
* Esempio: {[ "type": "hidden", "label": "Hidden di test", "placeholder": "Test", "name": "hidden" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function hidden(&$values, &$extras)
|
||||
{
|
||||
$original = $values;
|
||||
|
@ -44,54 +105,81 @@ class DefaultHandler implements HandlerInterface
|
|||
$values['name'] = $original['name'];
|
||||
$values['class'] = [];
|
||||
|
||||
// Delega al metodo "text", per la generazione del codice HTML
|
||||
return $this->text($values, $extras);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "email".
|
||||
* Esempio: {[ "type": "email", "label": "Email di test", "placeholder": "Test", "name": "email" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function email(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = 'email-mask';
|
||||
|
||||
$values['type'] = 'text';
|
||||
|
||||
// Delega al metodo "text", per la generazione del codice HTML
|
||||
return $this->text($values, $extras);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "number".
|
||||
* Esempio: {[ "type": "number", "label": "Number di test", "placeholder": "Test", "name": "number" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function number(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = 'inputmask-decimal';
|
||||
|
||||
$values['value'] = !empty($values['value']) ? $values['value'] : 0;
|
||||
|
||||
// Gestione della precisione (numero specifico, oppure "qta" per il valore previsto nell'impostazione "Cifre decimali per quantità").
|
||||
$decimals = null;
|
||||
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;
|
||||
// Se non è previsto un valore minimo, lo imposta a 1
|
||||
$values['min-value'] = isset($values['min-value']) ? $values['min-value'] : 1;
|
||||
|
||||
$decimals = \Settings::get('Cifre decimali per quantità');
|
||||
$values['decimals'] = $decimals;
|
||||
}
|
||||
}
|
||||
|
||||
// Controllo sulla correttezza sintattica del valore impostato
|
||||
$values['value'] = (\Translator::getFormatter()->isStandardNumber($values['value'])) ? \Translator::numberToLocale($values['value'], $decimals) : $values['value'];
|
||||
|
||||
$values['type'] = 'text';
|
||||
|
||||
// Delega al metodo "text", per la generazione del codice HTML
|
||||
return $this->text($values, $extras);
|
||||
}
|
||||
|
||||
protected function custom(&$values, &$extras)
|
||||
{
|
||||
return '
|
||||
<span |attr|>|value|</span>';
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "textarea".
|
||||
* Esempio: {[ "type": "textarea", "label": "Textarea di test", "placeholder": "Test", "name": "textarea" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function textarea(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = 'autosize';
|
||||
|
||||
// Generazione del codice HTML
|
||||
return '
|
||||
<textarea |attr|>|value|</textarea>';
|
||||
}
|
||||
|
|
|
@ -3,10 +3,19 @@
|
|||
namespace HTMLBuilder\Handler;
|
||||
|
||||
/**
|
||||
* Intefaccia utilizzata per interagire con la classe HTMLBuilder.
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
interface HandlerInterface
|
||||
{
|
||||
/**
|
||||
* Gestore pubblico, liberamente implementabile per la creazione del codice HTML.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function handle(&$values, &$extras);
|
||||
}
|
||||
|
|
|
@ -3,33 +3,49 @@
|
|||
namespace HTMLBuilder\Handler;
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "image".
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
class MediaHandler implements HandlerInterface
|
||||
{
|
||||
public function handle(&$values, &$extras)
|
||||
{
|
||||
// Delega della gestione al metodo specifico per il tipo di input richiesto
|
||||
$result = $this->{$values['type']}($values, $extras);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @since 2.3
|
||||
* Gestione dell'input di tipo "image".
|
||||
* Esempio: {[ "type": "image", "label": "Immagine di test", "name": "image", "class": "img-thumbnail", "value": "image_path" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function handle(&$values, &$extras)
|
||||
public function image(&$values, &$extras)
|
||||
{
|
||||
unset($values['class'][0]);
|
||||
|
||||
// Form upload
|
||||
// Valore non imposato
|
||||
if (empty($values['value'])) {
|
||||
$values['type'] = 'file';
|
||||
|
||||
// Generazione del codice HTML
|
||||
return '
|
||||
<input |attr|>';
|
||||
} else {
|
||||
// Visualizzazione dell'immagine e della relativa spunta per la cancellazione
|
||||
}
|
||||
|
||||
// Valore presente
|
||||
// Visualizzazione dell'immagine e della relativa spunta per la cancellazione
|
||||
else {
|
||||
$values['class'][] = 'img-thumbnail';
|
||||
$values['class'][] = 'img-responsive';
|
||||
|
||||
// Generazione del codice HTML
|
||||
return '
|
||||
<img src="|value|" |attr|><br>
|
||||
<label>
|
||||
|
|
|
@ -3,16 +3,21 @@
|
|||
namespace HTMLBuilder\Handler;
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "select".
|
||||
*
|
||||
* @since 2.3
|
||||
*/
|
||||
class SelectHandler implements HandlerInterface
|
||||
{
|
||||
public function handle(&$values, &$extras)
|
||||
{
|
||||
$values['class'][] = (!empty($values['ajax-source'])) ? 'superselectajax' : 'superselect';
|
||||
// Individuazione della classe per la corretta gestione JavaScript
|
||||
$values['class'][] = !empty($values['ajax-source']) ? 'superselectajax' : 'superselect';
|
||||
|
||||
$values['data-source'] = (!empty($values['ajax-source'])) ? $values['ajax-source'] : '';
|
||||
// Individuazione della richiesta AJAX (se presente)
|
||||
$values['data-source'] = !empty($values['ajax-source']) ? $values['ajax-source'] : '';
|
||||
|
||||
// Individuazione e gestione dei valori tramite array
|
||||
$values['value'] = explode(',', $values['value']);
|
||||
if (count($values['value']) === 1 && strlen($values['value'][0]) === 0) {
|
||||
$values['value'] = [];
|
||||
|
@ -25,16 +30,19 @@ class SelectHandler implements HandlerInterface
|
|||
|
||||
$values['value'] = (array) $values['value'];
|
||||
|
||||
// Inizializzazione del codice HTML
|
||||
$result = '
|
||||
<select |attr|>';
|
||||
|
||||
// Delega della generazione del codice HTML in base alle caratteristiche del formato
|
||||
// Gestione delle richieste AJAX (se il campo "ajax-source" è impostato)
|
||||
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
|
||||
// Gestione del select da query specifica (se il campo "values" è impostato a "query=SQL")
|
||||
elseif (preg_match_all('/^query=(.+?)$/', $values['values'], $matches)) {
|
||||
$result .= '
|
||||
<option></option>';
|
||||
|
@ -42,21 +50,23 @@ class SelectHandler implements HandlerInterface
|
|||
$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$" ]}
|
||||
// Gestione del select dal formato JSON parziale (valori singoli)
|
||||
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)) {
|
||||
}
|
||||
|
||||
// Gestione del select dal formato JSON completo, convertito in array
|
||||
elseif (is_array($values['values'])) {
|
||||
$result .= '
|
||||
<option></option>';
|
||||
|
||||
$result .= $this->selectJSON(json_decode('[{'.$matches[1][0].'}]', true), $values['value']);
|
||||
$result .= $this->selectArray($values['values'], $values['value']);
|
||||
}
|
||||
|
||||
// Impostazione del placeholder
|
||||
$values['placeholder'] = !empty($values['placeholder']) ? $values['placeholder'] : '- '.tr("Seleziona un'opzione").' -';
|
||||
$values['data-placeholder'] = $values['placeholder'];
|
||||
|
||||
|
@ -65,11 +75,13 @@ class SelectHandler implements HandlerInterface
|
|||
$result .= '
|
||||
</select>';
|
||||
|
||||
// Gestione delle proprietà "disabled" e "readonly"
|
||||
if (in_array('disabled', $extras) || in_array('readonly', $extras)) {
|
||||
$result .= '
|
||||
<script>$("#'.$values['id'].'").prop("disabled", true);</script>';
|
||||
}
|
||||
|
||||
// Ulteriore gestione della proprietà "readonly" (per rendere il select utilizzabile dopo il submit)
|
||||
if (in_array('readonly', $extras) && empty($values['ajax-source'])) {
|
||||
$result .= '
|
||||
<select class="hide" name="'.prepareToField($values['name']).'"'.((in_array('multiple', $extras)) ? ' multiple' : '').'>';
|
||||
|
@ -86,9 +98,18 @@ class SelectHandler implements HandlerInterface
|
|||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "select" con richieste AJAX (nome della richiesta indicato tramite attributo "ajax-source").
|
||||
* Esempio: {[ "type": "select", "label": "Select di test", "name": "test", "ajax-source": "test" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function select2($op, $elements)
|
||||
{
|
||||
// Richiamo alla pagina ajax_select.php per aggiungere il valore iniziale al select
|
||||
// Richiamo del file dedicato alle richieste AJAX per ottenere il valore iniziale del select
|
||||
ob_start();
|
||||
$dbo = \Database::getConnection();
|
||||
include DOCROOT.'/ajax_select.php';
|
||||
|
@ -127,7 +148,16 @@ class SelectHandler implements HandlerInterface
|
|||
return $result;
|
||||
}
|
||||
|
||||
protected function selectJSON($array, $values)
|
||||
/**
|
||||
* Gestione dell'input di tipo "select" basato su un array associativo.
|
||||
* Esempio: {[ "type": "select", "name": "tipo", "values": [{"id":"M","text":"Maschio"},{"id":"F","text":"Femmina"},{"id":"U","text":"Unisex"}], "value": "U", "placeholder": "Non specificato" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function selectArray($array, $values)
|
||||
{
|
||||
$prev = '';
|
||||
foreach ($array as $element) {
|
||||
|
@ -150,7 +180,9 @@ class SelectHandler implements HandlerInterface
|
|||
$attributes[] = 'style="background:'.$element['_bgcolor_'].'; color:'.color_inverse($element['_bgcolor_']).';"';
|
||||
}
|
||||
|
||||
$exclude = ['optgroup'];
|
||||
$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)) {
|
||||
|
@ -165,6 +197,15 @@ class SelectHandler implements HandlerInterface
|
|||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "select" basato su una query specifica.
|
||||
* Esempio: {[ "type": "select", "label": "Select di test", "name": "select", "values": "query=SELECT id, name as text FROM table" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function selectQuery($query, $values)
|
||||
{
|
||||
$result = '';
|
||||
|
@ -173,27 +214,30 @@ class SelectHandler implements HandlerInterface
|
|||
|
||||
$array = $database->fetchArray($query);
|
||||
|
||||
return $this->selectJSON($array, $values);
|
||||
return $this->selectArray($array, $values);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gestione dell'input di tipo "select" basato su una lista parzialmente JSON.
|
||||
* Esempio: {[ "type": "select", "label": "Sesso", "name": "sesso", "values": "list=\"\": \"Non specificato\", \"M\": \"Maschio\", \"F\": \"Femmina\", \"U\": \"Unisex\"", "value": "M" ]}.
|
||||
*
|
||||
* @param array $values
|
||||
* @param array $extras
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function selectList($datas, &$values)
|
||||
{
|
||||
$result = '';
|
||||
$array = [];
|
||||
|
||||
foreach ($datas as $key => $value) {
|
||||
if (!empty($key)) {
|
||||
$attributes = [];
|
||||
if (in_array($key, $values['value'])) {
|
||||
$attributes[] = 'selected';
|
||||
}
|
||||
|
||||
$result .= '
|
||||
<option value="'.prepareToField($key).'" '.implode(' ', $attributes).'>'.$value.'</option>';
|
||||
$array[] = ['id' => $key, 'text' => $value];
|
||||
} elseif (empty($values['placeholder'])) {
|
||||
$values['placeholder'] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
return $this->selectArray($array, $values['value']);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -135,7 +135,7 @@ class HTMLWrapper implements WrapperInterface
|
|||
$value = (empty($pieces[2]) || !in_array($pieces[2], array_column($choices, 'id'))) ? 'UNT' : $pieces[2];
|
||||
|
||||
if ($type == 'untprc') {
|
||||
$result = '{[ "type": "select", "name": "tipo_'.prepareToField($values['name']).'", "value": "'.prepareToField($value).'", "values": "json='.substr(str_replace('"', '\"', json_encode($choices)), 2, -2).'", "class": "no-search" ]}';
|
||||
$result = '{[ "type": "select", "name": "tipo_'.prepareToField($values['name']).'", "value": "'.prepareToField($value).'", "values": '.json_encode($choices).', "class": "no-search" ]}';
|
||||
|
||||
$result = \HTMLBuilder\HTMLBuilder::replace($result);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue