Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.673
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Para consultar uma nota fiscal eu usava o Windows e o OneDrive, isso é um serviço bem chato, mas consegui passar o serviço para o Livewire. Criei a tabela tblivroentrada e dentro dele guardei uma cópia do xml da nota fiscal. Para o Livewire procurar o CFOP e o NCM de um produto, ele usa essa função: <?php // listagem parcial function consultaLivro($lcto = null) { if($lcto) { $consulta=tblivroentrada::where('lcto',$lcto)->first(); if(!$consulta) { $this->mensagem = "Não há registro no livro para o lançamento $lcto"; } else { $xml=simplexml_load_string($consulta->xml); $namespaces=$xml->getNamespaces(true); $xml->registerXPathNamespace('n',$namespaces['']); $nome=$xml->xpath('//n:emit/n:xNome')[0]; $letra=strtolower(substr($nome,0,1)); $codigos=explode(" ",$this->codforn); foreach($codigos as $codigo) { if(strtolower($codigo[0]) === $letra) { $codXML = substr($codigo,1); break; } } $itens=$xml->xpath('//n:det'); foreach($itens as $item) { if($item->prod->cProd==$codXML) { $cfop=$item->prod->CFOP; $ncm=$item->prod->NCM; $prod=$item->prod->xProd; } } $this->mensagem = "Foi encontrado $this->codforn <br> Fornecedor $nome <br> Produto $prod <br> CFOP $cfop NCM $ncm"; } } else { $this->mensagem = null; } } e no blade tenho: @if($mensagem) <div class="fixed inset-0 flex items-center justify-center" style="background-color: rgba(0, 0, 0, 0.5)"> <div class="bg-white p-6 rounded shadow-lg"> <h2 class="text-lg font-semibold">Mensagem</h2> <p class="mt-2 text-gray-700 text-xl whitespace-nowrap">{!! $mensagem !!}</p> <button wire:click="consultaLivro" class="border rounded-lg px-2 py-2 ">Fechar</button> </div> </div> @endif
  2. Para usar o Visual Basic no Microsof Access eu marco as seguintes referências: Visual Basic for Applications Microsoft Access 16.0 Object Library Microsoft Office 16.0 Access database engine Object Library OLE Automation
  3. eu tirei a função array_column no momento de definir a variável $ambiente e isso me obrigou a trabalhar com a chave 'ambiente' da variável lá na frente. É quase difícil de enxergar. Estou estudando PHP desde 2020, e até hoje eu apanho na hora de definir uma classe, método e argumento. Eu também não sei quase nada de HTML e menos ainda MySQL. Vou fazendo tudo com tentativa e erro, hoje eu conto com a ajuda do Copilot. Espero que você tenha mais sorte na hora de resolver os problemas, estou estudando desde 2020, e não consegui resolver nada ou sequer ganhar algum trocado.
  4. Boa tarde, Cleimar, eu não tenho o projeto Portaria, mas se você mandar um arquivo zipado para frankhosaka@gmail.com, eu vou estudar e ver no que eu posso ajudar.
  5. Isso só é possível se a sua versão do php for anterior ao 5.5, e nós já estamos na versão 8.4. Ou você atualiza o PHP ou muda o código assim: <?php Class Teste { public $ambiente,$item,$selecionado; function selecionado($ambiente) { $this->selecionado=$ambiente; $mysqli=new mysqli("localhost","root","","teste"); $this->ambiente=$mysqli->query("select ambiente from tbcomodo order by ambiente")->fetch_all(MYSQLI_ASSOC); $id_comodo=$mysqli ->query("select id from tbcomodo where ambiente='$ambiente'") ->fetch_assoc()['id']; $this->item=$mysqli->query("select * from tbservico where id_comodo = $id_comodo group by item order by item")->fetch_all(MYSQLI_ASSOC); } } $teste=new Teste(); // $teste->criarTabela();exit; if(isset($_GET['rota'])) { $teste->selecionado($_GET['rota']); } else { $teste->selecionado("cozinha"); } ?> <script src="https://cdn.tailwindcss.com"></script> <body class="w-[500px] m-0 m-auto"> <h2>Selecione um cômodo</h2> <select onchange="location.replace('?rota='+this.value)"> <?php foreach($teste->ambiente as $a) : ?> <option <?=$a['ambiente']==$teste->selecionado ? 'selected' : ''?>> <?= $a['ambiente'] ?> </option> <?php endforeach; ?> </select> <h2 class="mt-5">Serviços executados</h2> <?php foreach($teste->item as $i) : ?> <div class="flex even:bg-gray-200"> <div class="w-[200px]"><?=$i['item']?></div> <div class="w-[150px]"><?=date('d/m/y H:i',strtotime($i['data']))?></div> </div> <?php endforeach; ?> </body>
  6. Frank K Hosaka

    PHP Mailer

    <?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'vendor/autoload.php'; // Certifique-se de que o autoload está correto $mail = new PHPMailer(true); try { // Configurações do servidor SMTP do Gmail $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'frankhosaka@gmail.com'; // Seu e-mail Gmail $mail->Password = 'abcd abcd abcd abcd'; // senha de app $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; // Remetente e destinatário $mail->setFrom('frankhosaka@gmail.com', 'Frank K Hosaka'); $mail->addAddress('frankhosaka2@hotmail.com', 'Frank K Hosaka'); // Conteúdo do e-mail $mail->CharSet='UTF-8'; $mail->Encoding='base64'; $mail->Subject = 'Teste de envio via PHPMailer'; $mail->Body = 'Olá Frank, este é um teste de envio usando PHPMailer'; $mail->send(); echo 'Mensagem enviada com sucesso!'; } catch (Exception $e) { echo "Erro ao enviar: {$mail->ErrorInfo}"; } ?> Finalmente consegui testar o PHP Mailer, o único problema é definir a senha do app na conta do Gmail. Na verdade, é o Gmail que fornece a senha do app, e você precisa incorporar no código.
  7. A dica que eu recebi hoje do Copilot para colocar o Laravel no localhost do notebook é usar esse comando no terminal do VS Code: npx concurrently -c "#93c5fd,#c4b5fd,#fdba74" "php artisan serve" "php artisan queue:work --tries=1" "npm run dev" --names="server,queue,vite"
  8. Ao invés de trabalhar com duas caixas de combinação, a minha sugestão é trabalhar com apenas um: <?php Class Teste { public $ambiente,$item,$selecionado; function criarTabela() { $mysqli=new mysqli("localhost","root","","teste"); $mysqli->query("drop table if exists tbcomodo"); $mysqli->query("create table tbcomodo (id int auto_increment primary key, ambiente varchar(50) not null)"); $mysqli->query("insert into tbcomodo (ambiente) values ('cozinha'),('sala'),('quarto 1'),('quarto 2'), ('quarto 3'),('quarto 4'),('banheiro'),('churrascaria')"); $mysqli->query("drop table if exists tbservico"); $mysqli->query("create table tbservico (id int auto_increment primary key, id_comodo int,item varchar(45),data datetime)"); $mysqli->query("insert into tbservico (id_comodo,item,data) values (1,'tomada forno','2025-08-25 17:04'), (1,'tomada microonda','2025-08-25 17:04'), (1,'janela pequena','2025-08-25 17:04'), (1,'janela jardim','2025-08-28 17:04'), (2,'janela jardim', '2025-08-28 17:04'), (2,'janela estrada','2025-08-28 17:04'), (2,'tomada aspirador','2025-08-28 17:04'), (2,'tomada tv','2025-08-28 17:04'), (2,'tomada candieiro','2025-08-28 17:04'), (2,'luz principal','2025-08-28 17:04'), (2,'tomada tv','2025-08-28 17:04'), (3,'tomada cama','2025-08-28 17:04')"); } function selecionado($ambiente) { $this->selecionado=$ambiente; $mysqli=new mysqli("localhost","root","","teste"); $this->ambiente=array_column($mysqli->query("select ambiente from tbcomodo order by ambiente")->fetch_all(MYSQLI_ASSOC),'ambiente'); $id_comodo=$mysqli ->query("select id from tbcomodo where ambiente='$ambiente'") ->fetch_assoc()['id']; $this->item=$mysqli->query("select * from tbservico where id_comodo = $id_comodo group by item order by item")->fetch_all(MYSQLI_ASSOC); } } $teste=new Teste(); // $teste->criarTabela();exit; if(isset($_GET['rota'])) { $teste->selecionado($_GET['rota']); } else { $teste->selecionado("cozinha"); } ?> <script src="https://cdn.tailwindcss.com"></script> <body class="w-[500px] m-0 m-auto"> <h2>Selecione um cômodo</h2> <select onchange="location.replace('?rota='+this.value)"> <?php foreach($teste->ambiente as $a) : ?> <option <?=$a==$teste->selecionado ? 'selected' : ''?>> <?= $a ?> </option> <?php endforeach; ?> </select> <h2 class="mt-5">Serviços executados</h2> <?php foreach($teste->item as $i) : ?> <div class="flex even:bg-gray-200"> <div class="w-[200px]"><?=$i['item']?></div> <div class="w-[150px]"><?=date('d/m/y H:i',strtotime($i['data']))?></div> </div> <?php endforeach; ?> </body>
  9. Eu acredito que você não acrescentou a caixa de combinação no formulário UserForm1. Se você acrescentou, precisa mudar a propriedade (Name) de ComboBox1 para cbxPermissao.
  10. <?php // include "config.php"; // verifica se o usuário está logado Class Teste { public $ambiente,$item,$selecionado; function criarTabela() { $mysqli=new mysqli("localhost","root","","teste"); $mysqli->query("drop table if exists tbcomando"); $mysqli->query("create table tbcomando (id int auto_increment primary key, ambiente varchar(50) not null, item text not null)"); $mysqli->query("insert into tbcomando (ambiente,item) values ('cozinha','1 janela grande')"); $mysqli->query("insert into tbcomando (ambiente,item) values ('cozinha','2 janela pequena')"); $mysqli->query("insert into tbcomando (ambiente,item) values ('cozinha', '3 luzes')"); $mysqli->query("insert into tbcomando (ambiente,item) values('cozinha','4 tomadas')"); $mysqli->query("insert into tbcomando (ambiente,item) value ('sala','nada')"); $mysqli->query("insert into tbcomando (ambiente,item) values('quarto','nada')"); } function selecionado($ambiente) { $this->selecionado=$ambiente; $mysqli=new mysqli("localhost","root","","teste"); $this->ambiente=array_column($mysqli->query("select ambiente from tbcomando group by ambiente order by ambiente")->fetch_all(MYSQLI_ASSOC),'ambiente'); $this->item=array_column($mysqli->query("select item from tbcomando where ambiente = '$ambiente' group by item order by item")->fetch_all(MYSQLI_ASSOC),'item'); } } $teste=new Teste(); if(isset($_GET['rota'])) { $teste->selecionado($_GET['rota']); } else { $teste->selecionado("cozinha"); } ?> <select name="ambiente" onchange="location.replace('?rota='+this.value)"> <?php foreach($teste->ambiente as $ambiente) : ?> <option <?= $teste->selecionado == $ambiente ? 'selected' : '' ?>> <?=$ambiente?> </option> <?php endforeach; ?> </select> <select name="detalhe"> <?php foreach($teste->item as $item) : ?> <option><?=$item?></option> <?php endforeach; ?> </select>
  11. Conversando com o Copilot, ele descobriu que a mensagem de erro não vem do Microsoft Access, mas do aplicativo "Sociedade Harmonia Jaguarão". Eu nunca usei o modo SQL nas consultas, mas eu acredito que o seu ponto de partida deveria ser lá, e não dentro de um aplicativo de terceiros.
  12. Eu coloquei o vetor para explicar o problema do combo box. Para tirar o vetor do banco de dados a sequência é mais ou menos assim, você precisa estar familiarizado com o MySQL. Fase 1: CREATE TABLE comodos ( id INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(50), item VARCHAR(100) ); Fase 2: INSERT INTO comodos (nome, item) VALUES ('cozinha', '1 janela grande'), ('cozinha', '2 janelas pequenas'), ('cozinha', '3 luzes'), ('cozinha', '4 tomadas'), ('sala', NULL), ('quarto', NULL); Fase 3: <?php $pdo = new PDO('mysql:host=localhost;dbname=seubanco', 'usuario', 'senha'); // Consulta agrupando os itens por cômodo $sql = "SELECT nome, item FROM comodos"; $stmt = $pdo->query($sql); $vetor = []; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $comodo = $row['nome']; $item = $row['item']; // Se o cômodo ainda não foi adicionado ao vetor if (!array_key_exists($comodo, $vetor)) { $vetor[$comodo] = []; } // Adiciona o item ou 'nada' se for nulo if ($item !== null) { $vetor[$comodo][] = $item; } } // Garante que cômodos sem itens apareçam com 'nada' foreach ($vetor as $comodo => $itens) { if (empty($itens)) { $vetor[$comodo][] = 'nada'; } } // Transforma em estrutura desejada $resultado = []; foreach ($vetor as $comodo => $itens) { $resultado[] = [$comodo => $itens]; } print_r($resultado); ?>
  13. Você precisa tirar duas linhas do seu código: <?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; // ---------------------> tira isso use PHPMailer\PHPMailer\Exception; require 'vendor/autoload.php'; // Certifique-se de que o autoload está correto $mail = new PHPMailer(true); try { // Configurações do servidor SMTP do Gmail $mail->SMTPDebug = SMTP::DEBUG_SERVER; // ---------------------> tira isso $mail->isSMTP(); $mail->Host = 'smtp.gmail.com'; $mail->SMTPAuth = true; $mail->Username = 'frankhosaka@gmail.com'; // Seu e-mail Gmail $mail->Password = 'abcd abcd abcd abcd'; // senha de app $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; $mail->Port = 465; // Remetente e destinatário $mail->setFrom('frankhosaka@gmail.com', 'Frank K Hosaka'); $mail->addAddress('frankhosaka2@hotmail.com', 'Frank K Hosaka'); // Conteúdo do e-mail $mail->CharSet='UTF-8'; $mail->Encoding='base64'; $mail->Subject = 'Teste de envio via PHPMailer'; $mail->Body = 'Olá Frank, este é um teste de envio usando PHPMailer'; $mail->send(); echo 'Mensagem enviada com sucesso!'; } catch (Exception $e) { echo "Erro ao enviar: {$mail->ErrorInfo}"; } ?>
  14. <?php Class Teste { public $ambiente=[], $detalhe=[], $selecionado; public $vetor=[ ['cozinha'=>['1 janela grande','2 janelas pequenas','3 luzes','4 tomadas']], ['sala'=>['nada']], ['quarto'=>['nada']] ]; function inicio() { $this->ambiente=[]; foreach($this->vetor as $key => $subvetor) { foreach($subvetor as $ambiente => $detalhe) { $this->ambiente[]=$ambiente; } } $this->detalhe=$this->vetor[0]['cozinha']; } function selecionado($ambiente) { $this->inicio(); $this->selecionado=$ambiente; $this->detalhe=[]; foreach($this->vetor as $item){ if(array_key_exists($ambiente,$item)) { $this->detalhe=$item[$ambiente]; break; } } } } if(isset($_GET['rota'])) { $rota=$_GET['rota']; $teste=new Teste(); $teste->selecionado($rota); } else { $teste=new Teste(); $teste->inicio(); } ?> <select name="ambiente" onchange="location.replace('?rota='+this.value)"> <?php foreach($teste->ambiente as $ambiente) : ?> <option <?= $teste->selecionado == $ambiente ? 'selected' : '' ?>> <?=$ambiente?> </option> <?php endforeach; ?> </select> <select name="detalhe"> <?php foreach($teste->detalhe as $detalhe) : ?> <option><?=$detalhe?></option> <?php endforeach; ?> </select>
  15. <?php $vetor=[ ['cozinha'=>['1 janela grande','2 janelas pequenas','3 luzes','4 tomadas']], ['sala'=>['nada']], ['quarto'=>['nada']] ]; ?> <select id="ambienteSelect"> <option value="">Selecione um ambiente</option> </select> <select id="detalhesSelect"> <option value="">Selecione um detalhe</option> </select> <script> const dados = <?php echo json_encode($vetor); ?> </script> <script> const ambienteSelect = document.getElementById('ambienteSelect'); const detalhesSelect = document.getElementById('detalhesSelect'); // Preenche o primeiro select com os ambientes dados.forEach(item => { const ambiente = Object.keys(item)[0]; const option = document.createElement('option'); option.value = ambiente; option.textContent = ambiente.charAt(0).toUpperCase() + ambiente.slice(1); ambienteSelect.appendChild(option); }); // Atualiza o segundo select com base na escolha do primeiro ambienteSelect.addEventListener('change', () => { const ambienteEscolhido = ambienteSelect.value; detalhesSelect.innerHTML = '<option value="">Selecione um detalhe</option>'; const ambienteData = dados.find(item => item[ambienteEscolhido]); if (ambienteData) { ambienteData[ambienteEscolhido].forEach(detalhe => { const option = document.createElement('option'); option.value = detalhe; option.textContent = detalhe; detalhesSelect.appendChild(option); }); } }); </script>
  16. Eu criei a tblivroentrada (id - auto-increment, primary, xml - text), copiei um xml da tela do navegador e colei no campo xml. O resultado foi um desastre. O pior é que não sabia como ludibriar o PHP para ler um registro MySQL como se fosse um arquivo xml, e foi aí que o Copilot me ensinou o comando simplexml_load_string: <?php require 'config.php'; if (isset($_FILES['arquivoXml']) && $_FILES['arquivoXml']['error'] === UPLOAD_ERR_OK) { $caminhoTemporario = $_FILES['arquivoXml']['tmp_name']; $xml = simplexml_load_file($caminhoTemporario); $xmlString = $xml->asXML(); (new Conn)->update("tblivroentrada set xml='$xmlString' where id=1"); $registro=(new Conn)->select("* from tblivroentrada where id=1")[0]->xml; $novoXml = simplexml_load_string($registro); echo($novoXml->NFe->infNFe['Id']); unset($_POST['arquivoXML']); } ?> <form method="post" enctype="multipart/form-data"> <label>Selecione o arquivo XML:</label> <input type="file" name="arquivoXml"> <button type="submit">Enviar</button> </form>
  17. Essa é uma pergunta difícil de responder, o Livewire é dividido em duas partes, o Componente e o Blade. O Blade começa com um <div> e termina com um </div>, logo o único lugar para colocar um código JavaScript é dentro desse marcador. A minha intuição me disse que isso vai dar dor de cabeça, assim usei o método da tentativa e erro. Eu embuti o código JavaScript dentro do componente HTML, assim: arquivo resources > views > livewire > pagar.blade.php (parcial) <div class="w-[180px] truncate text-gray-500" onclick="this.classList.toggle('truncate')"> {{ $pendencia['lcto'].":".$pendencia['hist']}} </div> Tentei usar o comando wire:click, mas isso acabou expandindo todas as linhas, quando eu queria expandir apenas uma linha, a que foi clicado. Esse truque deu certo, e o DevTools do Chrome não apontou nenhum erro.
  18. O meu primeiro roteador só funcionava com um argumento, com a ajuda do Copilot mudei para ele suportar mais de um argumento. Mas quando um dos argumentos tinha um ponto no meio do caminho, o roteador separava o que era um valor em vários argumentos. O Copilot fez auditoria no meu roteador, e descobriu que usei o comando $_GET indevidamente, sem uma chave. O meu roteador é assim: <?php spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'); $rota = 'login_login'; $parametros = []; if ($_GET) { $chaveCompleta = key($_GET); // Ex: Login_menu_param1_param2_param3 if (strpos($chaveCompleta, '_') === false) { exit; // proteção contra valores inválidos } $rota=$chaveCompleta; } $segmentos = explode('_', $rota); $nomeControle = $segmentos[0]; $metodo = $segmentos[1]; $parametros = array_slice($segmentos, 2); $controle = new $nomeControle(); call_user_func_array([$controle, $metodo], $parametros); e o Copilot disse que o correto é assim: <?php spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'); $rota = $_GET['rota'] ?? 'login_login'; $segmentos = explode('_', $rota); $nomeControle = $segmentos[0]; $metodo = $segmentos[1]; $parametros = array_slice($segmentos, 2); $controle = new $nomeControle(); call_user_func_array([$controle, $metodo], $parametros); Ainda não testei a nova sugestão do Copilot, estou tentando me recompor. Que vergonha!
  19. Frank K Hosaka

    O roteador

    Eu estava me referindo a esse código: <?php spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'); $rota = 'login_login'; $parametros = []; if ($_GET) { $chaveCompleta = key($_GET); // Ex: Login_menu_param1_param2_param3 if (strpos($chaveCompleta, '_') === false) { exit; // proteção contra valores inválidos } $rota=$chaveCompleta; } $segmentos = explode('_', $rota); $nomeControle = $segmentos[0]; $metodo = $segmentos[1]; $parametros = array_slice($segmentos, 2); $controle = new $nomeControle(); call_user_func_array([$controle, $metodo], $parametros); mas o Copilot disse que o código está equivocado, eu não posso usar diretamente a variável $_GET sem nenhuma chave.
  20. Eu ainda não tenho a menor noção sobre segurança na programação, o máximo que eu consegui foi criar a seguinte rotina no arquivo menuView.php que é invocado pelos outros arquivos: <?php if(!isset($_SESSION['id'])) {header('Location: ?Login_login');} ?> O Copilot comentou que ele parece confuso, ele esperava coisa do tipo <?php if(!isset($_SESSION['id'])) {header('Location: login.php');} ?> Eu comentei que isso não iria funcionar no meu caso. No meu caso, iria funcionar se fosse assim: <?php if(!isset($_SESSION['id'])) {header('Location: index.php');} ?> Mas eu acredito que o nível de segurança é o mesmo.
  21. <details> é uma excelente ferramenta para mostrar os detalhes de um item, desde que você não invente de colocar um monte de coisas dentro do <summary>, foi o que eu fiz, assim precisei abandonar essa ferramenta para criar a seguinte gambiarra: <script src="https://cdn.tailwindcss.com"></script> <script> function exibir(element) { const filhos=element.querySelectorAll("div") filhos.forEach(filho => { filho.classList.toggle("hidden"); }) } </script> <?php $historico="Detalhe da lista"; ?> <div class="w-[200px] m-0 m-auto" onclick="exibir(this)"> Lista <div class="hidden"><?=$historico?></div> <div class="hidden"><?=$historico?></div> </div> O Copilot é uma excelente ferramenta para fazer gambiarra.
  22. Faz muito tempo que tenho pensado no meu projeto orçamento dentro de um celular. O problema é que a tela do celular é bem pequena, mal dá para colocar duas colunas, no modo retrato. No Galaxy Note 10, eu consegui <div class="w-[630px]"></div> no modo paisagem e é baseado nesse limite é que estou fazendo o meu projeto. O problema é que não dá para exibir toda a informação numa só coluna, posso mostrar alguma coisa usando o CSS truncate do Tailwind. Mas e se o usuário quiser ver tudo? Desde 2020 é que estou quebrando a cabeça, só hoje é que surgiu essa ideia: <script src="https://cdn.tailwindcss.com"></script> <script> function expandir() { const descricao = document.getElementById("descricao"); descricao.classList.toggle("truncate"); } </script> <?php $historico="Vamos ver se isso funciona"; ?> <div class="w-[100px] m-0 m-auto"> <div class="w-[100px] odd:bg-gray-200">Teste</div> <div id="descricao" class="w-[100px] truncate" onclick="expandir()"><?=$historico?></div> <div class="w-[100px] odd:bg-gray-200">Teste</div> </div> / ==================== / A ideia é péssima, coloquei o código JavaScript no config.php, e em outro código tentei invocar a função expandir. Não deu certo. O código só funciona se existir apenas um único <div> com o id="descricao". Isso é bem constrangedor, o Copilot corrigiu o código: <script src="https://cdn.tailwindcss.com"></script> <script> function expandir(element) { element.classList.toggle("truncate"); } </script> <?php $historico="Vamos ver se isso funciona"; ?> <div class="w-[100px] m-0 m-auto"> <div class="w-[100px] odd:bg-gray-200">Teste</div> <div class="w-[100px] truncate" onclick="expandir(this)"><?=$historico?></div> <div class="w-[100px] odd:bg-gray-200">Teste</div> </div> /===== Outra ideia péssima, eu tive que tirar a função expandir( ) do JavaScript do config.php e colocar em cada código que precisava dessa função. Usar o config.php pareceu uma boa ideia, mas ele acabou aparecendo no cabeçalho de um arquivo csv e a Bling se recusou a receber por estar fora do layout esperado.
  23. Desde que o Copilot surgiu é que eu tento pintar a borda do <input> com Tailwind, e eu não consegui. Para pintar a borda, a solução é "border border-blue-700", o problema é na hora do <input> receber o foco, ele fica preto e grosso, e eu queria azul e grosso. O Copilot sempre repetiu a mesma solução que não resolvia "focus:border-2 focus:border-blue-700 focus:outline-none". Decidi abandonar o Copilot, e usar o velho método da tentativa e erro: <input class="border border-blue-700 focus:outline-blue-700"> O Copilot comentou que o meu código está incorreto, mas ele funciona! Eu estou usando <script src="https://cdn.tailwindcss.com"></script> ao invés do output.css no código que define a página de layout de todo projeto. O DevTools do Chrome reclama que eu não posso usar o cdn na produção, mas é o único jeito que eu encontrei para fazer o Tailwind funcionar no PHP.
  24. A grande maioria dos celulares não têm teclado físico e nem mouse, assim eu perguntei ao Copilot quantos eventos sobram para o programador trabalhar com o celular, e ele respondeu: [Eventos de toque] touchstart, touchmove, touchend e touchcancel. Há outros tipos de eventos, eu comecei a explorar o touchmove: <div class="w-[70px] text-right" title='<?=$grupo->pessoa?>' ontouchmove="alert('o cliente é o <?=$grupo->pessoa?>')" > <?=$grupo->codp?> </div>
  25. Não sei exatamente como o Laravel faz a rotina do login, mas hoje eu mudei a rotina no PHP de tal forma que conduz o usuário para as opções ao invés de fazer login novamente: <?php class Login { // listagem parcial function login() { if(isset($_SESSION['id']) && isset($_SESSION['nome'])) { return view('menuView'); } $mensagem=""; $email=""; return view('loginView',['mensagem'=>$mensagem,'email'=>$email]); } }
×
×
  • Criar Novo...