Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia, então, estou desenvolvendo um sistema de gestão na empresa me que trabalho, e no meio do processo reparei que existiam demasiados formulários com os mesmos campos, ou atributos que poderiam ser aproveitados, então com isso, criei um padrão de formulários, e uma classe, que faz desde tratar e validar os campos, até gerar um query, tudo com base em parametros fornecidos via data-attr.
Classe easyValidate:
<?php
class EasyValidate {
public function create_easy_validate_query() {
$data = $_POST['data'];
$interaction = $_POST['form_interaction'];
$form_type = $_POST['form_type'];
$name = $_POST['form_name'];
$object = $_POST['form_obj'];
$param = $_POST['form_param'];
$layers_num = $_POST['layers_num'];
$secondary_layer_form_name = $_POST['secondary_layer_form_name'];
$count = count($data);
$count_errors = 0;
$field = [];
$a = 1;
$comp_fields_query = '';
$comp_values_query = '';
$comp_query = '';
$validate = [];
foreach ($data as $arr) {
$arrEXP[$a] = explode('::', $arr);
$field[$a] = $arrEXP[$a][0];
$value[$a] = $arrEXP[$a][1];
$type[$a] = $arrEXP[$a][2];
$layer[$a] = $arrEXP[$a][3];
if ($type[$a] != 'undefined') {
if (strstr($type[$a], '_confirm')) {
$b = $a - 1;
$validate[$a][$field[$a]] = validateModel::define_validate_function($type[$a], $value[$a], $value[$b]);
} else {
$validate[$a][$field[$a]] = validateModel::define_validate_function($type[$a], $value[$a]);
}
//print_r($validate[$a][$field[$a]]);
if ($type[$a] == 'date') {
$value[$a] = Components::exec_format_date($value[$a], 'd/m/Y', 'Y-m-d');
} else {
$value[$a] = $value[$a];
}
if ($validate[$a][$field[$a]]['status'] == '1') {
} else {
$count_errors = $count_errors + 1;
//echo $value."<br>";
}
} else {
// echo $value."<br>";
}
if (strstr($type[$a], '_confirm')) { if ($interaction == 'insert') {
if ($a < $count) {
$comp_fields_query[$layer[$a]] .= $field[$a] . ",";
$comp_values_query[$layer[$a]] .= "'" . $value[$a] . "',";
} else {
$comp_fields_query[$layer[$a]] .= $field[$a];
$comp_values_query[$layer[$a]] .= "'" . $value[$a] . "'";
}
} elseif ($interaction == 'update') {
if ($a < $count) {
$comp_query .= $field[$a] . "='" . $value[$a] . "', ";
} else {
$comp_query .= $field[$a] . "='" . $value[$a] . "'";
}
}
}
$a = $a + 1;
}
$sql = [];
if ($layers_num == '') {
$layers_num = 1;
}
for ($i = 1; $i <= $layers_num; $i++) {
$sql[$i] = '';
if ($interaction == 'insert') {
$sql[$i] .= 'INSERT INTO';
} elseif ($interaction == "update") {
$sql[$i] .= 'UPDATE';
}
if ($i == 1) {
$sql[$i] .= " " . $name . " ";
} elseif ($i == 2) {
$sql[$i] .= " " . $secondary_layer_form_name . " ";
}
if ($interaction == 'insert') {
$sql[$i] .= "(" . $comp_fields_query[$i] . ") VALUES (" . $comp_values_query[$i] . ")";
} elseif ($interaction == "update") {
$sql[$i] .= " SET ";
$sql[$i] .= $comp_query;
if ($object != '') {
$sql[$i] .= " WHERE " . $param . " = '" . $object . "'";
}
}
}
return $sql;
}
}
O .js feito em jquery responsável por passar os dados no formato correto via metodo POST:
$(document).on('click', '.exec_form', function (a) {
a.preventDefault;var $this = $(this);
var data = [];
var form = $this.data('form');
var n_fields = $this.closest('.'+form).find(".input_field").length;
var inputs = $this.closest('.'+form).find('.input_field');
var param = $this.closest('.'+form).data('param');
var layers_num = $this.closest('.'+form).data('compose-layers-num');
var form_type = $this.closest('.'+form).data('form-type');
var form_interaction = $this.closest('.'+form).data('form-interaction');
var form_name = $this.closest('.'+form).data('form-name');
var secondary_layer_form_name = $this.closest('.'+form).data('secondary-layer-form-name');
inputs.each(function (a) {
var field = $(this).data('field');
var type = $(this).data('input-type');
var layer = $(this).data('field-layer');
var value = $(this).val();
if (n_fields < a) {
var concat = field + "::" + value + "::" + type + "::" + layer + ",";
} else {
var concat = field + "::" + value + "::" + type + "::" + layer;
}
data.push(concat);
});
$.ajax({
type: "POST",
url: "call_functions.php",
data: {function: 'exec_insert_new_company_in_database', data, param: param, layers_num:layers_num, form_type:form_type,form_interaction:form_interaction,form_name:form_name,secondary_layer_form_name:secondary_layer_form_name},
dataType: 'json',
success: function (data)
{
var status = data['status'];
var msg = data['msg'];
if (status === 1) {
swal("Sucesso!", msg, "success");
} else {
swal("Erro!", msg, "error");
$('.input_field').keyup();
}
}
});
});
Exemplo de formulário que seria auto validado e teria uma query construida pela classe corretamente
<div class="edit_user_form easy_form" data-param='false' data-obj='false' data-form-type='not_composed' data-form-interaction='insert' data-form-name='internal_users' data-layers_num='1' >
<fieldset>
<legend>Dados de login para: <strong class="text-dark"><?php echo $data['name'] ?></strong></legend>
<div class="row">
<div class="form-group col-md-12">
<label class="control-label">
Login <span class="symbol required"></span>
</label>
<input type="text" value='' placeholder="Login" class="form-control login input_field" data-field='login' data-input-type='login' name="login" id="login">
</div>
</div>
<div class="row">
<div class="form-group col-md-6">
<label class="control-label">
Senha <span class="symbol required"></span>
</label>
<input type="password" placeholder="Senha" class="form-control password input_field" data-field='password' data-input-type='password' name="password" id="password">
</div>
<div class="form-group col-md-6">
<label class="control-label">
Confirmar Senha <span class="symbol required"></span>
</label>
<input type="password" placeholder="Reescreva a senha anterior" class="form-control password_confirm input_field"data-field='password_confirm' data-input-type='password_confirm' name="password_again">
</div>
<button class='btn btn-primary btn-o exec_form'>Salvar</button>
</div>
</fieldset>
</div>
Vamos para a explicação:
Na parte geral do formulário:
1 - O attr 'param' é o parâmetro de comparação que deve ser passado caso o formulário seja para UPDATE.
2 - O attr 'obj' é o objeto relacional caso deva ser usado pelo 'param' para comparar.
3 - O data-form-type é o que define se é composto ou não, ou seja, se vai precisar gerar mais de uma query.
4 - O data-form-interaction é o atributo que vaio ser usado no banco de dados, UPDATE, INSERT, DELETE.
5 - O data-form-name é além do nome do formulário é o parâmetro que indica qual tabela deve ser usada.
6 - o data-layers-num é o número de querys que a classe precisará gerar.
Agora os atributos que podem ser inseridos nos inputs:
1 - Para ser um input válido para a classe ele precisa ter um className 'input_field'
2 - data-field é o nome do campo que ele representa com o banco de dados.
3 - data-input-type é o tipo do dado que é contido no campo, se false não faz nada, deve possuir algum valor, que sirva como parametro para a que outra classe 'validateModel' saiba como validar o campo, ex: password, personal_name, cpf, cnpj, essa classe é uma biblioteca de validação de tipos de dados.
Por fim:
Queria uma opinião acerca disso, ou se alguém tiver alguma ideia, ainda não está concluída, mas já está funcional, em alguns forms já não preciso escrever no php pra validar e fazer querys para interação com o banco.Carregando comentários...