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:
Thomas Zilio 2018-01-12 16:23:26 +01:00
parent f8132abfc1
commit 965d467d7d
13 changed files with 335 additions and 103 deletions

View File

@ -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;

View File

@ -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">';

View File

@ -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": "&euro;" ]}
</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": "&euro;" ]}
@ -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>

View File

@ -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>';

View File

@ -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

View File

@ -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

View File

@ -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">

View File

@ -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';

View File

@ -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>';
}

View File

@ -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);
}

View File

@ -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>

View File

@ -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']);
}
}

View File

@ -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);
}