Ir para conteúdo
Fórum Script Brasil
  • 0

Criando um gerenciador de modal no PHP


Frank K Hosaka

Pergunta

Desde 2020 sempre tive problema na hora de criar modal, não sabia como lidar com o JavaScript. Aqui em 2025 eu conheci o Livewire, e com ele percebi que era bem fácil criar o modal através do PHP. Nessa semana, eu criei cinco modais dentro de um HTML. É muito modal para um só HTML, mas para facilitar eu inventei um gerenciador de modal, assim:

    function modalDefinir($modais) {
        $this->modal=array_fill(0,5,false);
        foreach($modais as $indice) { $this->modal[$indice]=true; }
    }

Para ativar a modal de índice 1, eu uso o comando $this->modalDefinir([1]). Para ativar outros modais, uso apenas uma vírgula para acrescentar outro índice.
 

Outro truque bacana que eu aprendi foi passar toda a instância da classe para a view, assim:

 

return view('nfView',['n'=>$this]); }

Isso acabou com o pesadelo de passar um monte de parâmetros na hora de chamar o HTML, é bem mais fácil mandar toda a classe para ele. Para isso funcionar, eu usei um monte de variável pública. Mas o PHP não é Livewire, ele não tem o truque do "wire:model" e nem o "wire:click", o único recurso que sobre é a atualização do navegador, onde o HTML passa os dados obtidos do usuário, e o PHP monta um novo HTML baseado nas informações que recebeu, o problema é que tudo é perdido no meio do caminho. Para contornar esse problema, eu criei a função recuperarMemoria:

function recuperarMemoria() {
        $this->nNF = $_SESSION['vetor']['nNF'];
        $this->xNome = $_SESSION['vetor']['xNome'];
        $this->previa = $_SESSION['vetor']['previa'];
        $this->codp = $_SESSION['vetor']['codp'];
        $this->vNF = $_SESSION['vetor']['vNF'];
        $this->difAliqICMS = $_SESSION['vetor']['difAliqICMS'];
        $this->soma = $_SESSION['vetor']['soma'];
        $this->inativos = $_SESSION['vetor']['inativos'];
    }

Finalmente, um código exemplo de como usar tudo isso:

 

arquivo nf.php
<?php

class NF {

    public $codp,$difAliqICMS,$inativos=[],$indicador,$modal=[],$nNF,$previa=[];
    public $soma,$vNF,$xNome;

    function atualizar($indicador) {
        $this->indicador=$indicador;
        $this->recuperarMemoria();
        $this->modalDefinir([0,2,3]);
        return view('nfView',['n'=>$this]);
    }

    function CFOP() {
        $this->recuperarMemoria();
        $this->modalDefinir([2,4]);
        return view('nfView',['n'=>$this]); 
    }

    function CFOPatualizar() {
        $cfop=$_POST['cfop'];
        $codprod = $_POST['codprod'];
        (new Conn)->update("tbprod set cfop='$cfop' where codprod = $codprod");
        return ;
    }


    function custo() {
        $custoAtual = $_POST['custoAtual'];
        $codprod = $_POST['codprod'];
        $margem=(new Conn)->select("marg from tbprod where codprod=$codprod")[0]->marg;
        $venda=pvenda($custoAtual,$margem);
        $class=addslashes("class='w-[80px] text-right'");
        (new Conn)->update("tbnf set custoanterior=$custoAtual, class='$class' where codprod=$codprod");
        (new Conn)->update("tbprod set custo=$custoAtual, 
            venda=$venda where codprod = $codprod");
    }
    
    function incluir() {
        $lcto=$_POST['lcto'];
        $verifica=count((new Conn)->select("* from tbhistprod where lcto=$lcto"));
        if($verifica) {
            $mensagem="<h1>Nota já lançada. <a href=?NF.atualiza>Voltar</a></h1>";
            return view('mensagemView',['mensagem'=>$mensagem]);
        }
        $dia=(new Conn)->select("dia from tbdiario where lcto=$lcto")[0]->dia;
        $matriz=(new Conn)->select("* from tbnf");
        foreach($matriz as $vetor) {
            (new Conn)->insert("tbhistprod (codprod,dia,qt,custototal,codp,lcto)
                values ('$vetor->codprod','$dia',$vetor->qt,$vetor->custototal,$vetor->codp,$lcto)");
        }
        return header("location:?Diario.inicio.$dia");
    }

    function inicio() { 
        $this->modalDefinir([1]);
        return view('nfView',['n'=>$this]); }

    function modalDefinir($modais) {
        $this->modal=array_fill(0,5,false);
        foreach($modais as $indice) { $this->modal[$indice]=true; }
    }

    function montarVetor() {
        $this->inativos=[]; // falta definir inativos
        $this->previa=[];
        $nfe=simplexml_load_file($_FILES['arquivo']['tmp_name']);
        $itens=$nfe->NFe->infNFe->det;
        $this->difAliqICMS=0;
        $aliquotaInterna=0.18;
        foreach ($itens as $item) {
            if ((float)$item->prod->CFOP == 6102 || (float)$item->prod->CFOP ==6101) {
                $vBC = (float)$item->imposto->ICMS->ICMS10->vBC;
                $vBC = $vBC ? $vBC : (float)$item->imposto->ICMS->ICMS00->vBC;
                $vICMS = (float)$item->imposto->ICMS->ICMS10->vICMS;
                $vICMS = $vICMS ? $vICMS : (float)$item->imposto->ICMS->ICMS00->vICMS;
                $this->difAliqICMS += round(($vBC * $aliquotaInterna - $vICMS+0.00001),2);
            }     
        }
        $this->vNF = (float)$nfe->NFe->infNFe->total->ICMSTot->vNF;
        $this->nNF = (float)$nfe->NFe->infNFe->ide->nNF;
        $this->xNome = (string)$nfe->NFe->infNFe->emit->xNome;
        $nome = explode(" ", $this->xNome)[0];        
        $this->codp = (new Conn)->select("codp from tbpessoa where pessoa like '%$nome%'")[0]->codp;
        $this->soma=0;
        foreach ($itens as $item){
            // no campo codforn uso a primeira letra para identificar o fornecedor
            $codforn = (string)$item->prod->cProd;
            $criterio= strtolower($nome[0].$codforn);
            $consulta = (new Conn)->select("* from tbprod where codforn like '%$criterio%' ");
            $codprod = 'null';
            $cfop = (string)$item->prod->CFOP;
            $ncm = (string)$item->prod->NCM;
            if (count($consulta) == 1) {
                $codprod = $consulta[0]->codprod;
                if(substr($consulta[0]->cfop,0,1)==0) {
                    $this->inativos[]=$consulta[0]->codprod;
                }
                $fclass=($cfop == substr($consulta[0]->cfop,-4)) ? "w-[50px] text-right" : 
                    "w-[50px] text-red-500 text-right";
                $nclass=($ncm == $consulta[0]->cf) ? "w-[100px] text-right" : 
                    "w-[100px] text-red-500 text-right";
            } 
            if (count($consulta) > 1) {
                $consulta2 = (new Conn)->select("* from tbprod where codforn like '$criterio'");
                if(count($consulta2) == 1){
                    $codprod = $consulta2[0]->codprod;
                    $consulta = $consulta2;
                } else { $codprod="mult"; }
            }
            if (count($consulta)==0) { $codprod = "none"; }            
            $produto = substr((string)$item->prod->xProd,0,79);
            $quantidade = (float)$item->prod->qCom;
            if($cfop==6101 || $cfop==6102 || $cfop==5101) { $cfop=5102; }
            if($cfop==6401 || $cfop==6402 || $cfop==6403 || $cfop==5401 || $cfop==5403 || $cfop==5655) {
                $cfop=5405;
            }
            if (is_numeric($codprod)) {
                $produtox2 = [506, 507, 508, 509, 510, 519, 1768, 1770, 1772];
                if (in_array($codprod, $produtox2)) { $quantidade = 2 * $quantidade; }
                $produtox5=[1798];
                if (in_array($codprod,$produtox5 )) { $quantidade = 5 * $quantidade; }
                $produtox6 = [2652];
                if (in_array($codprod,$produtox6 )) { $quantidade = 6 * $quantidade; }
                $produtox10 = [2192,1782,2456];
                if (in_array($codprod, $produtox10)) { $quantidade = 10 * $quantidade; }
                $produtox12 = [2403,2406,2407,2408,2496,2497,2498,2499,2561,2653,2654];
                if (in_array($codprod, $produtox12)) { $quantidade = 12 * $quantidade; }
                $produtox24 = [2493,2405,2494,2495,2409];
                if (in_array($codprod, $produtox24)) { $quantidade = 24 * $quantidade; }
                $produtox36 = [2404];
                if (in_array($codprod, $produtox36)) { $quantidade = 36 * $quantidade; }
            }
            $vICMSST1 = ((float)$item->imposto->ICMS->ICMS10->vICMSST) ?
                (float)$item->imposto->ICMS->ICMS10->vICMSST : null;
            $vICMSST2 = ((float)$item->imposto->ICMS->ICMSSN202->vICMSST) ?
                (float)$item->imposto->ICMS->ICMSSN202->vICMSST : null;
            $vICMSST = $vICMSST1 ? $vICMSST1 : $vICMSST2;
            $difAliq = 0;
            if ((float)$item->prod->CFOP == 6102 || (float)$item->prod->CFOP == 6101){
                $vBC = (float)$item->imposto->ICMS->ICMS10->vBC;
                $vBC = $vBC ? $vBC : (float)$item->imposto->ICMS->ICMS00->vBC;
                $vICMS = (float)$item->imposto->ICMS->ICMS10->vICMS;
                $vICMS = $vICMS ? $vICMS : (float)$item->imposto->ICMS->ICMS00->vICMS;
                $difAliq = round(($vBC * $aliquotaInterna - $vICMS+0.00001),2);
            }
            $vIPI =(isset($item->imposto->IPI->IPITrib->vIPI) && (float)$item->imposto->IPI->IPITrib->vIPI) ? 
                (float)$item->imposto->IPI->IPITrib->vIPI : 0;
            $vProd = (string)$item->prod->vProd;
            $valorTotal = $vProd + $vICMSST + $difAliq + $vIPI;
            $this->soma += $valorTotal;
            $custoAtual=0;
            $custoAnterior=0;
            $marg=0;
            $cclass="w-[80px] text-right";
            $nclass="w-[100px] text-right";
            $fclass="w-[50px] text-right";
            if (is_numeric($codprod)) {
                $custoAtual = intval($valorTotal / $quantidade * 100) / 100;
                $consulta = (new Conn)->select("* from tbprod where codprod=$codprod");
                $custoAnterior = $consulta[0]->custo;
                $marg=$consulta[0]->marg;
                if (abs($custoAnterior - $custoAtual) > 0.02) {
                    $cclass = 'w-[80px] text-right text-red-500';
                }
                if ($ncm !== $consulta[0]->cf) {
                    $nclass = 'w-[100px] text-right text-red-500';
                }
                if (trim($cfop) !== trim(substr($consulta[0]->cfop,-4))) {
                    $fclass = 'w-[50px] text-right text-red-500';
                }
            }
            $produto=str_replace("'","''",$produto);
            $this->previa[]=['codforn'=>$codforn,'codprod'=>$codprod,'prod'=>$produto,
                'qt'=>$quantidade,'custoanterior'=>$custoAnterior,'custoatual'=>$custoAtual,
                'custototal'=>$valorTotal, 'fclass'=>$fclass,
                'cfop'=>$cfop,'codp'=>$this->codp,'ncm'=>$ncm,'nclass'=>$nclass,'cclass'=>$cclass,
                'marg'=>$marg];
        }
        $_SESSION['vetor']=['nNF' => $this->nNF,'xNome' => $this->xNome,'previa'=>$this->previa,'inativos'=>$this->inativos,
            'codp' => $this->codp,'vNF' => $this->vNF,'difAliqICMS' => $this->difAliqICMS, 'soma'=>$this->soma];
        $this->modalDefinir([2,3]);
        return view('nfView',['n'=>$this]);
    }

    function nfBasico() {
        $this->recuperarMemoria();
        $this->modalDefinir([2,3]);
        return view('nfView',['n'=>$this]);
    }

    function qt() {
        $this->recuperarMemoria();     
        $qt=$_POST['qt'];
        $id=$_POST['id'];
        $novoClass=$this->previa[$id]['cclass'];
        $custoAtual=intval($this->previa[$id]['custototal']/$qt*100)/100;
        if($custoAtual!==$this->previa[$id]['custoanterior']) {
            $novoClass='w-[80px] text-red-700 text-right';
        } else {
            $novoClass='w-[80px] text-right';
        }
        $this->previa[$id]['cclass']=$novoClass;
        $this->previa[$id]['custoatual']=$custoAtual;
        $this->previa[$id]['qt']=$qt;
        $_SESSION['vetor']['previa']=$this->previa;
        $this->modalDefinir([2,3]);
        return view('nfView',['n'=>$this]);
    }

    function recuperarMemoria() {
        $this->nNF = $_SESSION['vetor']['nNF'];
        $this->xNome = $_SESSION['vetor']['xNome'];
        $this->previa = $_SESSION['vetor']['previa'];
        $this->codp = $_SESSION['vetor']['codp'];
        $this->vNF = $_SESSION['vetor']['vNF'];
        $this->difAliqICMS = $_SESSION['vetor']['difAliqICMS'];
        $this->soma = $_SESSION['vetor']['soma'];
        $this->inativos = $_SESSION['vetor']['inativos'];
    }
}

arquivo nfView.php
<?php include('menuView.php'); ?>
<script>btMenu.innerHTML='NF Fornecedor';document.title="NF Fornecedor"</script>
<?php if($n->modal[0]): ?>
    <div class="fixed inset-0 flex items-center justify-center z-10" style="background-color: rgba(243,244,246,0.5)">
        <div class="bg-white p-6 rounded shadow-lg">
            <div class=w-[300px]>
                <div class="w-[300px] flex items-center border rounded overflow-hidden">
                    <label for=custoatual class="px-4 py-2 bg-gray-100 text-gray-700 text-sm whitespace-nowrap">
                        Custo Atual
                    </label>
                    <input class="flex-grow px-4 py-2 bg-white text-sm text-gray-900 placeholder-gray-400 focus:outline-none" 
                        id=custoatual value=<?=$n->previa[$n->indicador]['custoatual']?>>
                </div>
                <div class="w-[300px] mt-2 flex items-center border rounded overflow-hidden">
                    <label for=custoanterior class="px-4 py-2 bg-gray-100 text-gray-700 text-sm whitespace-nowrap">
                        Custo Anterior
                    </label>
                    <input class="flex-grow px-4 py-2 bg-white text-sm text-gray-900 placeholder-gray-400 focus:outline-none" 
                        id=custoatual value=<?=$n->previa[$n->indicador]['custoanterior']?>>
                </div>
                <div class="flex gap-4 mt-2">
                    <button class="px-4 py-2 bg-green-600 text-white rounded hover:bg-green-700">
                        Alterar
                    </button>
                    <button class="px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700">
                        Cancelar
                    </button>
                </div>
            </div>
        </div>
    </div>
<?php endif; ?>

<?php if($n->modal[1]): ?>
    <div class="mb-3 w-[530px]">
        <form method=post enctype="multipart/form-data" action="?NF.montarVetor">
            <label for=arquivo class=form-label>Escolha o arquivo XML</label>
            <input type=file name=arquivo class=form-control id=arquivo onchange=submit()>
        </form>
    </div>
<?php endif; ?>

<?php if($n->modal[2]): ?>
    <div class="flex">
        <div class="w-[530px]">NF <?=$n->nNF." ".substr($n->xNome,0,10)." codp ".$n->codp?></div>
        <div class="w-[100px] text-right"><?=dec($n->vNF)?></div>
        <?php if(count($n->inativos)): print_r($n->inativos); endif;?>
    </div>
    <?php if($n->difAliqICMS!==0): ?>
        <div class="flex">
            <div class="w-[530px] text-right">Diferença de Alíquota de ICMS</div>
            <div class="w-[100px] text-right"><?=dec($n->difAliqICMS)?></div>
        </div>
        <div class="flex">
            <div class="w-[530px] text-right">Total a conferir</div>
            <div class="w-[100px] text-right"><?=dec($n->difAliqICMS+$n->vNF)?></div>
        </div>
    <?php endif; ?>

    <?php if($n->modal[3]): ?>
        <div class="flex bg-gray-200">
            <div class="w-[50px]">Cforn</div>
            <div class="w-[50px] text-right">Cod</div>
            <div class="w-[318px] ml-1">Produto</div>
            <div class="w-[50px] text-right">Qt</div>
            <div class="w-[80px] text-right">Custo</div>
            <div class="w-[80px] text-right font-semibold"
                onclick="location.replace('?NF.CFOP')">
                Total
            </div>
        </div>
        <?php foreach($n->previa as $index => $p): ?>
            <div class="flex odd:bg-gray-200">
                <div class="w-[50px] truncate"><?=$p['codforn']?></div>
                <div class="w-[50px] text-right"><?=$p['codprod']?></div>
                <div class="w-[318px] ml-1 truncate"><?=$p['prod']?></div>
                <div class="w-[50px]">
                    <form method=post action=?NF.qt>
                        <input name=qt value='<?=$p['qt']?>' 
                            class="w-[50px] text-right text-gray-500 font-semibold bg-transparent" 
                            size='1' onchange=submit()>
                        <input type=hidden name=id value='<?=$index?>'>
                    </form>
                </div>
                <div class="<?=$p['cclass']?>"
                    onclick="location.replace('?NF.atualizar.<?=$index?>')">
                    <?=dec($p['custoatual'])?>
                </div>
                <div class="w-[80px] text-right"><?=dec($p['custototal'])?></div>
            </div>
        <?php endforeach; ?>
    <?php endif; ?>

    <?php if($n->modal[4]): ?>
        <div class="flex odd:bg-gray-200">
            <div class="w-[50px] text-right">Cforn</div>
            <div class="w-[50px] text-right">Cod</div>
            <div class="w-[318px] ml-2">Produto</div>
            <div class="w-[50px] text-right">CFOP</div>
            <div class="w-[100px] text-right font-semibold"
                onclick="location.replace('?NF.nfBasico')">NCM</div>
        </div>
        <?php foreach($n->previa as $p): ?>
            <div class="flex odd:bg-gray-200">
                <div class="w-[50px] text-right truncate"><?=$p['codforn']?></div>
                <div class="w-[50px] text-right"><?=$p['codprod']?></div>
                <div class="w-[318px] ml-2 truncate"><?=$p['prod']?></div>
                <div class="<?=$p['fclass']?>" onclick="atualizar(<?=$p['cfop']?>,<?=$p['codprod']?>)">
                    <?=$p['cfop']?>
                </div>
                <div class="<?=$p['nclass']?>"><?=$p['ncm']?></div>
            </div>
        <?php endforeach; ?>
    <?php endif; ?>

    <div class="odd:bg-gray-200 flex">
        <div class="w-[530px] flex items-center border rounded overflow-hidden">
            <label for=lcto class="px-4 py-2 bg-gray-100 text-gray-700 text-sm whitespace-nowrap">Enviar para </label>
            <input class="flex-grow px-4 py-2 bg-white text-sm text-gray-900 placeholder-gray-400 focus:outline-none" id=lcto placeholder="Lançamento"
                onchange="wire('incluir.'+this.value)">
        </div>
        <div class="w-[100px] text-right"><?=dec($n->soma)?></div>
    </div>
<?php endif; ?>

 

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,5k
    • Posts
      652,3k
×
×
  • Criar Novo...