Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

AnthraxisBR

Opinião sobre classe de validação de form + auto construção de query MySQL

Recommended Posts

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')) {
//nada
            } else {
                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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Minha dica é!
Quebre o código para que tenha suas respectivas responsabilidades, tanto o PHP quanto o JS.

 

Deixando os menos acoplados.

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, Williams Duarte disse:

Minha dica é!
Quebre o código para que tenha suas respectivas responsabilidades, tanto o PHP quanto o JS.

 

Deixando os menos acoplados.

 

Quebrar o código seria dividir as responsabilidades em várias funções, ou diminuir ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Por favor, me permita tirar uma dúvida com os amigos.

      Tenho um Formulário onde o Usuário digita todos os Dados necessários.

      Minha dúvida:
      --> como faço após o usuário digitar os dados e salvar, o Sistema chamar uma Modal ou mensagem perguntando se deseja imprimir agora ?

      Grato,
       
      Cesar
    • Por Carcleo
      Tenho uma abela de usuarios e uma tabela de administradores e clientes.
      Gostaria de uma ajuda para implementar um cadastro
       
      users -> name, login, passord (pronta) admins -> user_id, registratiom, etc.. client -> user_id, registratiom, etc...
      Queria ajuda para extender de user as classes Admin e Client
      Olhem como estáAdmin
      <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Admin extends User {     use HasFactory;            protected $fillable = [         'name',         'email',         'password',         'registration'     ];      private string $registration;     public function create(         string $name,          string $email,          string $password,         string $registration     )     {         //parent::create(['name'=>$name, 'email'=>$email, 'password'=>$password]);         parent::$name = $name;         parent::$email = $email;         parent::$password = $password;         $this->registration = $registration;     } } User
      <?php namespace App\Models; // use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable {     /** @use HasFactory<\Database\Factories\UserFactory> */     use HasFactory, Notifiable;     static string $name;     static string $email;     static string $password;     /**      * The attributes that are mass assignable.      *      * @var list<string>      */     protected $fillable = [         'name',         'email',         'password',     ];          /**      * The attributes that should be hidden for serialization.      *      * @var list<string>      */     protected $hidden = [         'remember_token',     ];     /**      * Get the attributes that should be cast.      *      * @return array<string, string>      */     protected function casts(): array     {         return [             'email_verified_at' => 'datetime',             'password' => 'hashed',         ];     }          public function roles() : BelongsToMany {         return $this->belongsToMany(Role::class);     }       public function hasHole(Array $roleName): bool     {                 foreach ($this->roles as $role) {             if ($role->name === $roleName) {                 return true;             }         }         return false;     }         public function hasHoles(Array $rolesName): bool     {                 foreach ($this->roles as $role) {             foreach ($rolesName as $rolee) {             if ($role->name === $rolee) {                 return true;             }          }         }         return false;     }         public function hasAbility(string $ability): bool     {         foreach ($this->roles as $role) {             if ($role->abilities->contains('name', $ability)) {                 return true;             }         }         return false;     }     } Como gravar um Admin na tabela admins sendo que ele é um User por extensão?
      Tentei assim mas é claro que está errado...
      public function store(Request $request, Admin $adminModel) {         $dados = $request->validate([             "name" => "required",             "email" => "required|email",             "password" => "required",             "registration" => "required"         ]);         $dados["password"] =  Hash::make($dados["password"]);                  $admin = Admin::where("registration",  $dados["registration"])->first();                  if ($admin)              return                    redirect()->route("admin.new")                             ->withErrors([                                 'fail' => 'Administrador já cadastrados<br>, favor verificar!'                   ]);                            $newAdmin = $adminModel->create(                                    $dados['name'],                                    $dados['email'],                                    $dados['password'],                                    $dados['registration']                                 );         dd($newAdmin);         $adminModel->save();         //$adminModel::create($admin);                  return redirect()->route("admin.new")->with("success",'Cadastrado com sucesso');     }  
    • Por violin101
      Caros amigos, saudações.
       
      Gostaria de tirar uma dúvida com os amigos, referente a PDV.
       
      Estou escrevendo um Sistema com Ponto de Vendas, a minha dúvida é o seguinte, referente ao procedimento mais correto.

      Conforme o caixa vai efetuando a venda, o Sistema de PDV já realiza:
      a baixa direto dos produtos no estoque
      ou
      somente após concretizar a venda o sistema baixa os produtos do estoque ?
       
      Grato,
       
      Cesar
       
    • Por violin101
      Caros amigos do grupo, saudações e um feliz 2025.
       
      Estou com uma pequena dúvida referente a Teclas de Atalho.

      Quando o Caps Lock está ativado o Comando da Tecla de Atalho não funciona.
      ou seja:
      se estiver para letra minúscula ====> funciona
      se estiver para letra maiúscula ====> não funciona
       
      Como consigo evitar essa falha, tanto para Letra Maiúscula quanto Minúscula ?

      o Código está assim:
      document.addEventListener( 'keydown', evt => { if (!evt.ctrlKey || evt.key !== 'r' ) return;// Não é Ctrl+r, portanto interrompemos o script evt.preventDefault(); });  
      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.
       
      Por favor, poderiam me ajudar.

      Estou com a seguinte dúvida:
      --> como faço para para implementar o input código do produto, para quando o usuário digitar o ID o sistema espera de 1s a 2s, sem ter que pressionar a tecla ENTER.

      exemplo:
      código   ----   descrição
           1       -----   produto_A
       
      Grato,
       
      Cesar
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.