Aggiunta validazione AJAX dei campi

This commit is contained in:
Thomas Zilio 2019-07-05 12:28:19 +02:00
parent a8bad1e30a
commit 8d48d5c2e7
8 changed files with 199 additions and 17 deletions

View File

@ -10,7 +10,7 @@ $upload_dir = DOCROOT.'/'.Uploads::getDirectory($id_module, $id_plugin);
$database->beginTransaction();
// GESTIONE UPLOAD
// Upload allegati e rimozione
if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
// Controllo sui permessi di scrittura per il modulo
if (Modules::getPermission($id_module) != 'rw') {
@ -65,11 +65,36 @@ if (filter('op') == 'link_file' || filter('op') == 'unlink_file') {
redirect(ROOTDIR.'/editor.php?id_module='.$id_module.'&id_record='.$id_record.((!empty($options['id_plugin'])) ? '#tab_'.$options['id_plugin'] : ''));
}
} elseif (filter('op') == 'download_file') {
}
// Download allegati
elseif (filter('op') == 'download_file') {
$rs = $dbo->fetchArray('SELECT * FROM zz_files WHERE id_module='.prepare($id_module).' AND id='.prepare(filter('id')).' AND filename='.prepare(filter('filename')));
download($upload_dir.'/'.$rs[0]['filename'], $rs[0]['original']);
} elseif (post('op') == 'send-email') {
}
// Validazione dati
elseif (filter('op') == 'validate') {
// Lettura informazioni di base
$init = $structure->filepath('init.php');
if (!empty($init)) {
include_once $init;
}
// Validazione del campo
$validation = $structure->filepath('validation.php');
if (!empty($validation)) {
include_once $validation;
}
echo json_encode($response);
return;
}
// Invio email
elseif (post('op') == 'send-email') {
$id_template = post('template');
// Inizializzazione

View File

@ -201,12 +201,12 @@ function translateTemplate()
$template = ob_get_clean();
$template = \HTMLBuilder\HTMLBuilder::replace($template);
$template = str_replace('$id_module$', $id_module, $template);
$template = str_replace('$id_plugin$', $id_plugin, $template);
$template = str_replace('$id_record$', $id_record, $template);
$template = \HTMLBuilder\HTMLBuilder::replace($template);
// Informazioni estese sulle azioni dell'utente
if (!empty(post('op')) && post('op') != 'send-email') {
operationLog(post('op'));

View File

@ -48,11 +48,11 @@ echo '
<div class="box-body">
<div class="row">
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Partita IVA').'", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask" ]}
{[ "type": "text", "label": "'.tr('Partita IVA').'", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask", "validation": "partita_iva"]}
</div>
<div class="col-md-4">
{[ "type": "text", "label": "'.tr('Codice fiscale').'", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask" ]}
{[ "type": "text", "label": "'.tr('Codice fiscale').'", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask", "validation": "codice_fiscale" ]}
</div>
<div class="col-md-4">

View File

@ -43,7 +43,7 @@ if (!$cliente) {
</div>
<div class="col-md-3">
{[ "type": "text", "label": "<?php echo tr('Partita IVA'); ?>", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask text-uppercase", "value": "$piva$" ]}
{[ "type": "text", "label": "<?php echo tr('Partita IVA'); ?>", "maxlength": 13, "name": "piva", "class": "text-center alphanumeric-mask text-uppercase", "value": "$piva$", "validation": "partita_iva" ]}
</div>
<div class="col-md-3">
@ -62,7 +62,7 @@ if (!$cliente) {
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice fiscale'); ?>", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask text-uppercase", "value": "$codice_fiscale$" ]}
{[ "type": "text", "label": "<?php echo tr('Codice fiscale'); ?>", "maxlength": 16, "name": "codice_fiscale", "class": "text-center alphanumeric-mask text-uppercase", "value": "$codice_fiscale$", "validation": "codice_fiscale" ]}
</div>
</div>
@ -90,7 +90,7 @@ if (!$cliente) {
<div class="row">
<div class="col-md-2">
{[ "type": "text", "label": "<?php echo tr('Codice anagrafica'); ?>", "name": "codice", "required": 1, "class": "text-center alphanumeric-mask", "value": "$codice$", "maxlength": 20 ]}
{[ "type": "text", "label": "<?php echo tr('Codice anagrafica'); ?>", "name": "codice", "required": 1, "class": "text-center alphanumeric-mask", "value": "$codice$", "maxlength": 20, "validation": "codice" ]}
</div>
<div class="col-md-2">

View File

@ -0,0 +1,73 @@
<?php
include_once __DIR__.'/../../core.php';
use Modules\Anagrafiche\Anagrafica;
$name = get('name');
$value = get('value');
switch ($name) {
case 'codice':
$disponibile = Anagrafica::where([
['codice', $value],
['idanagrafica', '<>', $id_record],
])->count() == 0;
$message = $disponibile ? tr('Il codice è disponbile') : tr("Il codice è già utilizzato in un'altra anagrafica");
$response = [
'result' => $disponibile,
'message' => $message,
];
break;
case 'codice_fiscale':
$disponibile = Anagrafica::where([
['codice_fiscale', $value],
['idanagrafica', '<>', $id_record],
])->count() == 0;
$message = $disponibile ? tr('Il codice fiscale non è già inserito in una anagrafica') : tr("Il codice fiscale è già utilizzato in un'altra anagrafica");
// Validazione del Codice Fiscale, solo per anagrafiche Private e Aziende, ignoro controllo se codice fiscale e settato uguale alla p.iva
if (empty($anagrafica) || ($anagrafica->tipo != 'Ente pubblico' && $value != $anagrafica->partita_iva)) {
$check = Validate::isValidTaxCode($value);
if (empty($check)) {
$message .= '. '.tr('Attenzione: il codice fiscale _COD_ potrebbe non essere valido', [
'_COD_' => $value,
]);
}
}
$response = [
'result' => $disponibile,
'message' => $message,
];
break;
case 'partita_iva':
$disponibile = Anagrafica::where([
['piva', $value],
['idanagrafica', '<>', $id_record],
])->count() == 0;
$message = $disponibile ? tr('La partita iva non è già inserita in una anagrafica') : tr('La partita iva è già utilizzata in un altro articolo');
$partita_iva = !empty($anagrafica) && is_numeric($value) ? $anagrafica->nazione->iso2.$value : $value;
$check = Validate::isValidVatNumber($partita_iva);
if (empty($check)) {
$message .= '. '.tr('Attenzione: la partita IVA _IVA_ potrebbe non essere valida', [
'_IVA_' => $partita_iva,
]);
}
$response = [
'result' => $disponibile,
'message' => $message,
];
break;
}

View File

@ -30,7 +30,7 @@ if (!empty($record['immagine'])) {
</div>
<div class="col-md-4">
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "required": 1, "value": "$codice$" ]}
{[ "type": "text", "label": "<?php echo tr('Codice'); ?>", "name": "codice", "required": 1, "value": "$codice$", "validation": "codice" ]}
<br>
{[ "type": "select", "label": "<?php echo tr('Categoria'); ?>", "name": "categoria", "required": 1, "value": "$id_categoria$", "ajax-source": "categorie" ]}
</div>
@ -451,4 +451,4 @@ if (!empty($elementi)) {
<?php
}
?>
?>

View File

@ -0,0 +1,25 @@
<?php
include_once __DIR__.'/../../core.php';
use Modules\Articoli\Articolo;
$name = get('name');
$value = get('value');
switch ($name) {
case 'codice':
$disponibile = Articolo::where([
['codice', $value],
['id', '<>', $id_record],
])->count() == 0;
$message = $disponibile ? tr('Il codice è disponbile') : tr('Il codice è già utilizzato in un altro articolo');
$response = [
'result' => $disponibile,
'message' => $message,
];
break;
}

View File

@ -24,7 +24,7 @@ class HTMLWrapper implements WrapperInterface
<label for="'.prepareToField($values['id']).'">'.(empty($values['help']) ? $values['label'] : '<span class="tip" title="'.prepareToField($values['help']).'">'.$values['label'].' <i class="fa fa-question-circle-o"></i></span>').'</label>';
}
if (!empty($values['icon-before']) || !empty($values['icon-after'])) {
if (!empty($values['icon-before']) || !empty($values['icon-after']) || !empty($values['validation'])) {
$result .= '
<div class="input-group">';
@ -39,14 +39,24 @@ class HTMLWrapper implements WrapperInterface
public function after(&$values, &$extras)
{
$rand = rand(0, 99);
$pseudo_id = $values['id'].$rand;
$result = '';
if (!empty($values['icon-before']) || !empty($values['icon-after'])) {
if (!empty($values['icon-before']) || !empty($values['icon-after']) || !empty($values['validation'])) {
if (!empty($values['icon-after'])) {
$result .= '
<span class="input-group-addon after'.(!empty($values['icon-custom']) ? ' '.$values['icon-custom'] : '').'">'.$values['icon-after'].'</span>';
}
if (!empty($values['validation'])) {
$result .= '
<span class="input-group-addon" id="'.$pseudo_id.'_validation">
<span class="tip" title="'.tr('Validazione').'"><i class="fa fa-question-circle "></i></span>
</span>';
}
$result .= '
</div>';
@ -63,9 +73,7 @@ class HTMLWrapper implements WrapperInterface
unset($values['show-help']);
}
$rand = rand(0, 99);
$values['data-parsley-errors-container'] = '#'.$values['id'].$rand.'-errors';
$values['data-parsley-errors-container'] = '#'.$pseudo_id.'-errors';
$result .= '
<div id="'.$values['id'].$rand.'-errors"></div>';
@ -76,6 +84,57 @@ class HTMLWrapper implements WrapperInterface
unset($values['label']);
}
if (!empty($values['validation'])) {
$result .= '
<script>
var container = $("#'.$pseudo_id.'_validation");
container.closest(".input-group").find("input").on("change", function(){
value = $(this).val();
container = $("#'.$pseudo_id.'_validation");
parent = container.closest(".input-group");
message = container.find("span");
icon = container.find("i");
icon.attr("class", "fa fa-spinner fa-spin");
$.ajax({
url: globals.rootdir + "/actions.php",
type: "get",
data: {
id_module: "$id_module$",
id_record: "$id_record$",
name: "'.$values['validation'].'",
value: value,
op: "validate",
},
success: function(data) {
data = JSON.parse(data);
if(data.result) {
icon.attr("class", "fa fa-check");
parent.addClass("has-success").removeClass("has-error");
} else {
icon.attr("class", "fa fa-close");
parent.addClass("has-error").removeClass("has-success");
}
message.tooltipster("content", data.message);
if (data.fields) {
fields = data.fields;
Object.keys(fields).forEach(function(element) {
$("[name=" + element + "]").val(fields[element]);
});
}
}
});
});
</script>';
}
return $result;
}