Ir para conteúdo
Fórum Script Brasil

Frank K Hosaka

Membros
  • Total de itens

    1.623
  • Registro em

  • Última visita

Tudo que Frank K Hosaka postou

  1. Excelente resposta, se o plano de contas tivesse apenas cinco contas. No meu caso, tenho 46 contas, e preciso mostrar o máximo que eu puder dentro da tela de um celular. Outro problema bem chato de resolver é o user digitar uma conta que não existe, isso é uma dor de cabeça que eu não sei resolver há três anos. Como só eu uso essa rotina, deixei para o PHP explodir com as suas mensagens. Isso é uma solução bem porcaria, mas é a minha cara, eu só sei improvisar. Eu ainda estou no ambiente mono usuário, o máximo que eu consegui foi utilizar dois usuários. Já o ambiente multiusuário, eu não tenho a menor ideia de como implementar.
  2. Aqui a ideia é usar o PHP para montar o plano de contas e esconder num <div>. Quando o usuário clicar no <input> da conta devedora, o JavaScript mostra o plano de contas; quando o usuário escolhe a conta, o JavaScript esconde o plano de contas e preenche os dados da conta devedora. Esse é o mesmo raciocínio para conta credora. A grande dificuldade que eu senti foi na função slice do Javascript. Para pegar o lado esquerdo, usei escolha.slice(0,3) e deu certo. Para pegar o lado direito, eu tentei escolha.slice(3,-1), mas não deu certo. Então usei a função substr( ) : <script> var endereçoConta, endereçoDescrição function voltar(escolha){ destino=document.getElementById(endereçoConta) destino.value=escolha.slice(0,3) destino=document.getElementById(endereçoDescrição) tamanho=escolha.length-3; destino.innerHTML=escolha.substr(3,tamanho) conta.style.display='none'} function escolha(voltarConta,voltarDescrição){ conta.style.display='block' this.endereçoConta=voltarConta this.endereçoDescrição=voltarDescrição} </script> <div id=conta style=display:none> <table style="width:250px;margin:0 auto;margin-top:100"> <tr><td>Escolha uma conta: <?php $contas=[[101,'Banco'],[201,'Patrimônio'],[301,'Salário'],[401,'Despesa']]; foreach($contas as $conta): ?> <tr><td><a onclick=voltar(this.innerHTML)><?=$conta[0]." ".$conta[1]?></a> <?php endforeach; ?> </table> </div> <table style="width:250px;margin:0 auto;margin-top:100"><th style=width:50px><th> <tr><td>ContaD<td><input id=ContaD onclick="escolha('ContaD','DescriçãoD')" size=2> <a id=DescriçãoD></a> <tr><td>ContaC<td><input id=ContaC onclick="escolha('ContaC','DescriçãoC')" size=2> <a id=DescriçãoC></a> </table>
  3. Para reduzir o espaço da linha do Bootstrap eu usei o CSS line-height:0. Para não usar o espaço além do previsto, eu não usei o CSS nowrap. O problema são os textos longos, ele acaba se sobrepondo e tornando ilegível o texto. Como eu não consegui fazer funcionar o Bootstrap overflow e nem no CSS, eu tive que apelar para o PHP: <?php function ellipsis($texto){ if(strlen($texto)>44){ return substr($texto,0,44)." ...";} else { return $texto;}} ?> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <table style=line-height:0 class='table table-striped w-25 m-auto mt-5'> <tr><th><?=ellipsis("Prioridades do Cop-28")?> <tr><td><?=ellipsis("Acabar com o uso dos combustíveis fósseis e a queimada na floresta")?> <tr><td><?=ellipsis("Acabar com o poder Supremo")?> <tr><td><?=ellipsis("Acabar com a reeleição")?> </table>
  4. Estou estudando a programação orientada a objetos (POO) na base da tentativa e erro. Hoje eu queria criar um controle chamado diário, e dentro dele eu queria usar uma variável privada chamada diário. O PHP entrou num looping infinito, assim eu precisei mudar o nome da classe para controleDiário, e assim descobri porque os controladores tem o sufixo de Controller em seus nomes. Eu decidi usar o controle como prefixo. Outra coisa bacana é a definição das variáveis utilizada dentro da classe como privada. Eu queria mudar para público, isso me pouparia de escrever pelo menos dois métodos. Mas veio um enorme peso na consciência e decidi não mexer no tipo das variáveis utilizadas dentro da classe, decidi mandar o resultado de três consultas dentro de um vetor. Enfim, o POO é chato, mas dá para fazer gambiarra. arquivo mvc/controles/controleDiário.php <?php session_start(); require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/diário.php'; require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/funções.php'; class controleDiário { private $diário; public function __construct(){ $this->diário=new diário();} public function início($dia){ $consultas=$this->diário->consulta($dia); $lçtos=$consultas[0]; $somaDébito=$consultas[1]; $somaCrédito=$consultas[2]; require $_SERVER['DOCUMENT_ROOT']."/mvc/visões/diário.php";exit;}} $diário=new controleDiário(); if(isset($_POST['novaData'])){$diário->início($_POST['novaData']);} if(isset($_GET)){$dia=date('Y-m-d');$diário->início($dia);} arquivo mvc/modelos/diário.php <?php require $_SERVER['DOCUMENT_ROOT'].'/mvc/modelos/conexão.php'; class diário extends conexão { private $pdo; public function __construct(){ $this->pdo=conexão::instância();} public function consulta($dia){ $stmt=$this->pdo->query("select sum(valor) as somaDébito from diário where contaD>0 and dia='$dia'"); $somaDébito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaDébito']; $stmt=$this->pdo->query("select sum(valor) as somaCrédito from diário where contaC>0 and dia='$dia'"); $somaCrédito=$stmt->fetchAll(PDO::FETCH_ASSOC)[0]['somaCrédito']; $stmt=$this->pdo->query("select * from diário where dia='$dia'"); return [$stmt->fetchAll(PDO::FETCH_OBJ),$somaDébito,$somaCrédito];}} arquivo mvc/visões/diário.php <?php include $_SERVER['DOCUMENT_ROOT']."/mvc/visões/menu.php"; ?> <table class='table table-striped'> Lançamentos do dia <form method=post action='../controles/controleDiário.php'> <input type=date name=novaData value=<?=$dia?> onchange=submit()> </form> <th>lçto<th>contad<th>contac<th>valor<th>hist <?php foreach($lçtos as $lçto): ?> <tr> <td><?=$lçto->lçto?> <td><?=$lçto->contad?> <td><?=$lçto->contac?> <td class=text-end><?=dec($lçto->valor)?> <td><?=$lçto->hist?> <?php endforeach; ?> <tr><td><td><td><td><?=dec($somaDébito)?><td>Soma dos Débitos <tr><td><td><td><td class=text-danger><?=dec($somaCrédito)?> <td class=text-danger>Soma dos Créditos
  5. Hoje eu perguntei de novo ao safado Bard para saber onde ele conseguiu a informação, e olha só o que ele respondeu: Não, não é possível usar o método post com o marcador <a>. O método post é um método HTTP usado para enviar dados para um servidor. O marcador <a>, por outro lado, é um marcador HTML usado para criar links. Os marcadores <a> não podem ser usados para enviar dados para um servidor. Esse Bard herdou a mesma característica do motor de busca do Google, a cada hora tem resposta diferente!
  6. O meu conhecimento em HTML é bastante precário, mas foi graças ao PHP que conheci em 2020 é que aprendi o que é <table>, <form>, <input> e o <a>. Nesses três últimos anos, usei o marcador <a> com o método GET. Achei meio rídiculo perguntar ao Bard se é possível usar o método POST com o marcador <a>, olha só o que ele respondeu: Sim, é possível criar uma solicitação POST usando o elemento <a>. Para isso, basta definir o atributo method do elemento como post e o atributo href como a URL do servidor que receberá a solicitação. Por exemplo, o seguinte código criará uma solicitação POST para a URL https://example.com/api/v1/login: HTML <a href="https://example.com/api/v1/login" method="post"> Login </a> Fiquei entusiasmado, fui logo fazer um teste de campo assim: mvc/view/viewLogin.php <a href="/mvc/controller/controller.php" method="post" data="nome=Frank">Teste</a> mvc/controller/controller.php <?php class controller { } if(isset($_POST)){var_dump($_POST);} Mas na hora de fazer o teste, não consegui transportar os dados do view para o controller. Se o Bard estiver certo, o que eu fiz de errado?
  7. Frank K Hosaka

    Endereço fisico

    Eu uso esses dois comandos, quando preciso trabalhar com MVC: <?php echo $_SERVER['DOCUMENT_ROOT']; // C:\wamp64\www echo __DIR__; // C:\wamp64\www\astudy Sem dúvida, o primeiro comando é o melhor e é com ele que eu monto o endereço absoluto dos arquivos que o PHP precisa trabalhar, tipo require $_SERVER['DOCUMENT_ROOT'].'/astudy/Controller/produtoController.php'; já o segundo comando é problema, ele diz em que diretório se encontra o código que está sendo executado.
  8. Ontem o Omar do iMaster me apresentou a função spl, ele é ótimo para quem está estudando MVC. Ele é mais ou menos assim: function my_autoloader($class){include 'model/'.$class.'.php';} spl_autoload_register('my_autoloader'); Eu hospedei o código no index.php. Se você for tentar chamar uma classe assim $produto=new produto() e se ele não encontrar a classe, nesse caso, o PHP vai procurar a solução no spl_autoload, nesse caso particular ele vai procurar o arquivo model/produto.php. Eu gostei dessa função, assim eu fiquei imaginando em usar a função para abrir um arquivo da pasta view, por exemplo, o viewMenu. O viewMenu não é uma classe, mas sim um formulário. Mesmo assim, o truque funciona, assim: function my_autoloader($class){ if(substr($class,0,4)=="view"){ require 'View/'.$class.'php';} spl_autoload_register('my_autoloader'); Para fazer funcionar, eu escrevi $view=new viewMenu( ). E funcionou! Esse é um recurso super bacana, bem como as constantes do define('constante','valor'). O problema é que o ciclo de vida deles é bem curto. Qualquer solicitação post ou get acaba com a vida deles. O mesmo drama acontece com as classes do MVC. Pesquisei um pouco mais o PHP e ouvi dizer que existe uma extensão chamada phpize que dá vida a essas mágicas para todos os módulos do PHP, mas na hora de procurar na internet, eu não achei a extensão para o Windows. Além de não achar a extensão, eu descobri que a função right( ) e left( ) não funcionam no meu código, apesar da versão ser 8.2. Eu tive que trocar por substr($variavel,0,4) para os primeiros quatro caracteres da esquerda e substr($variavel,-4) para os quatro últimos caracteres da direita. Enfim, não me resta outra escolha senão continuar com a minha improvisação, usar a minha imaginação para dar mais vida a uma variável local o máximo que eu puder.
  9. <?php $zip = new ZipArchive(); $zip->open('arquivo.zip', ZipArchive::CREATE); $zip->addFile('index.php', 'index.php'); $zip->close();
  10. <?php $string='{"paging":{"offset":0,"limit":100,"total":37},"results":[ {"reason":"Plano Fidelidade 2","status":"active","subscribed":0,"back_url":"https://webhook.site/26b1e008-b05b-4b7a-a767-29bc21866c04","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebed70018bff3b0a600e2c","date_created":"2023-11-23T22:49:01.280-04:00","id":"2c9380848bebed70018bff3b0a600e2c","last_modified":"2023-11-23T23:05:33.382-04:00","application_id":7489360988572536}, {"reason":"Plano Fidelidade","status":"active","subscribed":0,"back_url":"https://pednowhats.com.br","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebed70018bff38e68d0e2a","date_created":"2023-11-23T22:46:41.037-04:00","id":"2c9380848bebed70018bff38e68d0e2a","last_modified":"2023-11-23T22:46:41.037-04:00","application_id":7489360988572536}, {"reason":"Plano Fidelidade","status":"active","subscribed":0,"back_url":"https://seu.site.com.br","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebedbc018c02446c111018","date_created":"2023-11-24T12:58:07.761-04:00","id":"2c9380848bebedbc018c02446c111018","last_modified":"2023-11-24T12:58:07.761-04:00","application_id":7489360988572536}, {"reason":"Plano Fidelidade","status":"active","subscribed":0,"back_url":"https://seu.site.com.br","auto_recurring":{"frequency":1,"repetitions":12,"currency_id":"BRL","transaction_amount":10.0,"frequency_type":"months","free_trial":{"frequency":1,"frequency_type":"months"},"billing_day":10},"collector_id":147453588,"init_point":"https://www.mercadopago.com.br/subscriptions/checkout?preapproval_plan_id=2c9380848bebed70018c02451f6c0f9c","date_created":"2023-11-24T12:58:53.676-04:00","id":"2c9380848bebed70018c02451f6c0f9c","last_modified":"2023-11-24T12:58:53.676-04:00","application_id":7489360988572536}]}'; $js=json_decode($string); $results=$js->results; $values=[]; foreach($results as $result){ $amount=$result->auto_recurring->transaction_amount; $values[]="('$result->id','$result->reason',$amount)";} $connect=new mysqli("localhost","root","","laravel"); foreach($values as $value){ $connect->query ("insert into plano (id,reason,transaction_amount) values $value");} Usei a seguinte tabela: CREATE TABLE `plano` ( `id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `reason` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, `transaction_amount` int DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  11. Frank K Hosaka

    Intranet

    Intranet é um trabalho bem difícil. Eu levei várias semanas para fazer um notebook enxergar outro notebook, usando a rede Windows, tudo na base da tentativa e erro. Depois que eu consegui os dois notebook se enxergarem, levei várias semanas para instalar uma impressora e compartilhar na rede. Tentei pelo Wi-Fi. Foi um desastre. Botei logo um cabo de rede nos três aparelhos. Agora, para fazer o celular enxergar a rede Windows, isso eu não consegui. O mais difícil é entender a gramática do manual do Windows, ele é muito difícil de entender. De 1999 até 2020 eu só consegui a intranet na base de cabo de rede. Em 2020 eu conheci o WampServe para Windows. Levei várias semanas para instalar e entender como funcionava, o mais difícil foi criar uma tal de porta 80. Mexer no Windows é difícil, e mexer no firewall é bem mais difícil. Mas enfim depois de vinte tentativas e três meses, eu consegui instalar o Wamp Server. Ele funciona que é uma maravilha, ele conecta os notebooks e a impressora tudo pelo WiFi. Depois de 2020, o WampServe teve várias atualizações, mas eu não atualizei nada. Tenho pavor de mexer nele. Aqui em Diadema, não encontro ninguém que entenda de WampServe e muito menos Windows.
  12. Hoje eu executo o Laravel pelo Hostinger, mas sempre faço o backup do Hostinger para o meu notebook. Tentei abrir o Laravel no notebook com "localhost/laravel", e deu certo! Antigamente, eu tinha que abrir o VS Code, usar a linha de comando, digitar "php artisan serve", depois usar "localhost:8000" no navegador.
  13. Eu encontrei um erro brutal no meu projeto MVC produtos, ele tinha que fazer uma lista de 8 produtos em 4 colunas, e ele acabou listando mais de 8 produtos, repetindo um ou outro produto que já tinha sido publicado. Tive que parar tudo e corrigir a lógica. Eu consegui corrigir o problema para 4 colunas, mas não sei como fazer a quinta coluna. <?php function colunar($itens,$colunas){ $contagem = count($itens); $linhas=intval($contagem/$colunas); if($contagem/$colunas>$linhas){$linhas++;} echo "<tr><td colspan=4>$colunas colunas<tr>"; for($iLinha=0;$iLinha<$linhas;$iLinha++){ for($iColuna=0;$iColuna<=$colunas;$iColuna++){ if(($iLinha+$iColuna*$linhas)<$contagem){ echo "<td>".$itens[$iLinha+$iColuna*$linhas];}} echo "<tr>";}} echo "<table>"; $itens=[0,1,2,3,4,5,6,7]; colunar($itens,1); colunar($itens,2); colunar($itens,3); colunar($itens,4); colunar($itens,5);
  14. O programa ScriptOut.php faz justamente o contrário. Ele varre o diretório astudy do meu notebook, e lista todos os arquivos bem como o código fonte do arquivo para eu poder publicar no fórum. O problema é que eu não sei como exibir o código fonte do PHP na tela do navegador, a não ser usando a opção do código fonte do navegador: <?php $script=""; $arquivos = scandir("astudy"); array_shift($arquivos); // retira . array_shift($arquivos); // retira .. foreach ($arquivos as $arquivo) { if(is_dir("astudy/$arquivo")){ $diretorio="astudy/$arquivo"; $files=scandir($diretorio); array_shift($files); array_shift($files); foreach($files as $file){ $script.="arquivo /$diretorio/$file\n"; $script.=file_get_contents("$diretorio/$file")."\n\n";}} else { $script.="arquivo /astudy/$arquivo\n"; $script.=file_get_contents("astudy/$arquivo")."\n\n"; }} echo $script; // não é possível ver o código fonte do PHP pelo comando echo // favor usar o comando exibir código fonte do navegador
  15. A minha sugestão é instalar o arquivo ScriptIn.php no diretório C:\wamp64\www. Você copia todo código fonte do tópico MVC projeto produto no mesmo diretório com o nome de script.txt. Em seguida você digita no navegador "localhost/scriptin", e o programa vai criar a pasta astudy, bem como as outras pastas e arquivos. Depois disso, basta você digita "localhost/astudy", para você conhecer o projeto produtos. arquivo c:/wamp64/www/ScriptIn.php <?php if (!is_dir("astudy")){ mkdir("astudy"); mkdir("astudy/Controller"); mkdir("astudy/Model"); mkdir("astudy/View");} $script=file_get_contents("script.txt"); $ocorrencias=substr_count($script,"arquivo /astudy/"); $substring = "arquivo /astudy/"; $posicao = []; $posicao[0]=strpos($script,$substring); for($i=1;$i<=$ocorrencias-1;$i++){ $posicao[$i]=strpos($script,$substring,$posicao[$i-1]+1);} $codigo=[]; for($i=0;$i<=$ocorrencias-2;$i++){ $codigo[]=substr($script,$posicao[$i],$posicao[$i+1]-$posicao[$i]);} $codigo[]=substr($script,$posicao[$ocorrencias-1],strlen($script)-$posicao[$ocorrencias-1]); for($i=0;$i<=$ocorrencias-1;$i++){ $lines=explode("\n",$codigo[$i]); $arquivo=trim(substr($lines[0],9)); $criar=fopen($arquivo,"w"); $tamanhoNome=strlen($arquivo)+9; $conteudo=trim(substr($codigo[$i],$tamanhoNome)); file_put_contents($arquivo,$conteudo); fclose($criar);} echo "Trabalho encerrado";
  16. Eu pedi um roteador para o Bard, mas o exemplo que ele passou usa a tecnologia Laravel, certamente não vai funcionar no ambiente PHP. Aqui no fórum estou publicando o projeto MVC produtos, e eu uso o arquivo index.php como roteador. O problema de você usar o index.php como roteador é que você só pode usar uma única chave, não pode usar a mesma chave várias vezes. No meu caso, eu só tenho a tabela produto, assim eu posso usar <input name=incluir> <input name=excluir> <input name=alterar> O problema é quando eu precisar criar uma outra tabela que precisa incluir, excluir e alterar um registro. Nesse caso, usar o index.php é um péssimo negócio. O único jeito que eu encontrei para resolver isso foi através de gambiarra, ou seja, usar o controlador como roteador, assim: /atest/Controller/testeController.php <?php class teste{public function ola(){echo "olá mundo!";}} if(isset($_GET['ola'])){ $teste=new teste(); $teste->ola();} /atest/View/viewTeste.html <form action="../Controller/testeController.php"> <input type=submit name=ola value="Me Clique"> </form> <a href="../Controller/testeController.php?ola">Me Clique</a> /atest/index.php <?php header('location:View/viewTeste.html');
  17. // histórico das atualizações no projeto produtos 18/11/23 foi criado conexao.php, tornando possível todo código se reportar a apenas uma conexão. 19/11/23 foi criado viewAtualizar.php 20/11/23 criei o código ScripIn.php para ajudar a testar o MVC projeto produtos. 21/11/23 criei o código ScripOut.php para publicar o projeto no fórum. 22/11/23 acrescentei a rotina de alteração e inclusão de produtos, bem como mudei o roteador do index.php para o controlador 23/11/23 acrescentei a rotina do orçamento
  18. Usei o meu programa ScriptOut.php para publicar todos os arquivos e os respectivos conteúdos da pasta astudy aqui. Agora, sugiro você copiar todo o texto e salvar em script.txt no diretório C:/wamp64/www, e em seguida executar o programa ScriptIn.php que publiquei em outro tópico, ele vai montar o diretório astudy e todos os arquivos do projeto no seu computador. arquivo /astudy/Controller/orçamentoController.php <?php session_start(); require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/produto.php"; require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/funções.php"; class orçamentoController { private $produto; public function __construct(){$this->produto=new produto();} public function produto(){ $produtos=$this->produto->listarTudo(); $irPara="Controller/orçamentoController"; require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewFiltro.php";exit;} public function inicio(){ $soma=0; $itens=[]; $_SESSION['itens']=[]; require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;} public function acrescentaItem($prod){ $soma=0; $_SESSION['itens'][]=$prod; $itens=$_SESSION['itens']; foreach($itens as $item){$soma+=$item[1]*$item[3];} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;} public function excluir($key){ $soma=0; array_splice($_SESSION['itens'],$key,1); $itens=$_SESSION['itens']; foreach($itens as $item){$soma+=$item[1]*$item[3];} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;} public function alterar($alterar,$chave){ $soma=0; $_SESSION['itens'][$chave][1]=$alterar; $_SESSION['itens'][$chave][4]=$alterar*$_SESSION['itens'][$chave][3]; $itens=$_SESSION['itens']; foreach($itens as $item){$soma+=$item[1]*$item[3];} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewOrçamento.php";exit;}} $get=$_GET; $class=new orçamentoController(); if(key($get)=='produto'){$class->produto();} if(key($get)=='inicio' || key($get)=='apagar'){$class->inicio();} if(key($get)=='id'){ $prod=$get['prod']; $un=$get['un']; $preço=$get['preço']; $total=$get['preço']; $class->acrescentaItem([$prod,1,$un,$preço,$total]);} if(key($get)=='excluir'){$class->excluir($get['excluir']);} if(key($get)=='alterar'){$class->alterar($get['alterar'],$get['chave']);} arquivo /astudy/Controller/produtoController.php <?php require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/produto.php"; class produtoController { private $produto; public function __construct(){ $this->produto=new produto();} public function criarTabela(){$this->produto->criarTabela();} public function listar(){ $produtos=$this->produto->listar(); $contagem=count($produtos); $colunas=4; $numLinhas=intval($contagem/$colunas); if($contagem/$colunas>$numLinhas){$numLinhas++;} require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewProduto.php';exit;} public function filtrar($filtro){ $produtos=$this->produto->filtrar($filtro); $irPara="View/viewAtualizar"; require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewFiltro.php';exit;} public function atualizar($dados){ $irPara="View/viewAtualizar"; $produtos=$this->produto->atualizar($dados); require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewFiltro.php';exit;} public function incluir($dados){ $produtos=$this->produto->incluir($dados); require $_SERVER['DOCUMENT_ROOT'].'/astudy/View/viewFiltro.php';exit;} public function excluir($dados){ $produtos=$this->produto->excluir($dados);}} if(isset($_GET)){ $get=$_GET; $classe=new produtoController(); if(key($get)=="criarProdutos"){$classe->criarTabela();} if(key($get)=="verProdutos"){$classe->listar();} if(key($get)=="item"){$classe->filtrar($get['item']);} if(key($get)=="atualizar"){$classe->atualizar($get['atualizar']);} if(key($get)=="excluir"){$classe->excluir($get['excluir']);} if(key($get)=="incluir"){$classe->incluir($get['incluir']);}} arquivo /astudy/Model/conexao.php <?php class conexao { private static $pdo; public function __construct(){} public static function getInstance(){ if(!self::$pdo){ self::$pdo=new PDO("mysql:host=localhost;dbname=laravel","root","");} return self::$pdo;}} arquivo /astudy/Model/funções.php <?php function nf($número){return number_format($número,2,',','.');} arquivo /astudy/Model/produto.php <?php require $_SERVER['DOCUMENT_ROOT']."/astudy/Model/conexao.php"; class produto { private $pdo; public function __construct(){ $this->pdo=conexao::getInstance();} public function criarTabela(){ $tabela='produto'; $stmt=$this->pdo->prepare("SELECT COUNT(*) AS total FROM information_schema.tables WHERE table_name = ?"); $stmt->execute([$tabela]); $total=$stmt->fetchColumn(); if($total>0){$this->pdo->exec("DROP TABLE $tabela");} $sql="CREATE TABLE $tabela (id INT NOT NULL AUTO_INCREMENT, prod VARCHAR(255) NOT NULL, preço FLOAT NOT NULL, un VARCHAR(2) NOT NULL, PRIMARY KEY (id))"; $this->pdo->exec($sql); $sql="INSERT INTO produto (prod,preço,un) values (?,?,?)"; $dados=[["Maçã Red",20,"kg"],["Macarrão Tipo Ninho",5.5,"un"], ["Pera Portuguesa",25,"kg"],["Picanha Fresca",50,"kg"], ["Pão de Forma",7,"un"],["Pão Francês",11,"kg"],["Banana Nanica",8,"kg"], ["Laranja Lima",5,"kg"],["Refrigerante 2L",8.50,"un"]]; foreach($dados as $dado){ $stmt=$this->pdo->prepare($sql); $stmt->execute($dado);} require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewBasico.html"; echo "<h1>Tabela criada com sucesso!<br>";} public function listarUm($id){ $stmt=$this->pdo->query("SELECT * from produto where id=$id"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function listarTudo(){ $stmt=$this->pdo->query("SELECT * from produto order by prod"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function listar(){ $stmt=$this->pdo->query("SELECT SUBSTRING_INDEX(prod,' ',1) AS grupo FROM produto GROUP BY grupo ORDER BY grupo"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function filtrar($filtro){ $stmt=$this->pdo->query("select * from produto where prod like '$filtro%' order by prod"); return $stmt->fetchALL(PDO::FETCH_ASSOC);} public function atualizar($dados){ $stmt=$this->pdo->prepare('UPDATE produto SET prod=?,preço=?,un=? WHERE id=?'); $stmt->execute([$dados[1],$dados[2],$dados[3],$dados[0]]); $filtro=$dados[0]; $stmt=$this->pdo->query("select * from produto where id=$filtro"); return $stmt->fetchAll(PDO::FETCH_ASSOC);} public function incluir($dados){ $stmt=$this->pdo->prepare('INSERT INTO produto (prod,preço,un) values (?,?,?)'); $stmt->execute([$dados[0],$dados[1],$dados[2]]); $filtro=$this->pdo->lastInsertId(); $stmt=$this->pdo->query("select * from produto where id=$filtro"); return $stmt->fetchAll(PDO::FETCH_ASSOC);} public function excluir($dados){ $id=$dados[1]; $produto=$dados[0]; $this->pdo->query("delete from produto where id=$id"); require $_SERVER['DOCUMENT_ROOT']."/astudy/View/viewBasico.html"; echo "<h1>o produto $produto foi excluido</h1>";}} arquivo /astudy/View/viewAtualizar.php <?php require('viewBasico.html'); $id=$_GET['id']; $prod=$_GET['prod']; $preço=$_GET['preço']; $un=$_GET['un']; ?> <table class="table table-striped fs-1"> <form action='../Controller/produtoController.php'> <tr><td>Código<td><?=$id?><input type=hidden name=atualizar[] value=<?=$id?>> <tr><td>Produto<td><input name=atualizar[] value='<?=$prod?>'> <tr><td>preço<td><input name=atualizar[] value=<?=$preço?>> <tr><td>Un<td><input name=atualizar[] value='<?=$un?>'> <tr><td><td colspan=2><input name=alterar type=submit value=Atualizar> </form> <tr><td><td> <form action='../Controller/produtoController.php'> <input type=hidden name=excluir[] value='<?=$prod?>'> <input type=hidden name=excluir[] value=<?=$id?>> <input type=submit value=Excluir> </form> </table> arquivo /astudy/View/viewBasico.html <!DOCTYPE html> <meta name="viewport" content="width=device"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"> <input id=inputMenu class=fs-1 type=submit value=Menu onclick="location.replace('../View/viewMenu.php')"> <a class='fs-1 link-underline-light' id=mensagem></a> <hr> arquivo /astudy/View/viewFiltro.php <?php include('viewBasico.html'); echo "<table class=table><th class=fs-1>Cód<th class=fs-1>Produto <th class=fs-1>preço<th class=fs-1>Un"; foreach($produtos as $produto){ $id=$produto['id']; $prod=$produto['prod']; $prodURL=urlencode($prod); $preço=$produto['preço']; $un=$produto['un']; echo "<tr><td class='fs-1 text-end'>$id"; echo "<td class='fs-1 text-nowrap overflow-hidden'>"; echo "<a class='link-underline-light' href=../$irPara?id=$id&prod=$prodURL&preço=$preço&un=$un>$prod</a>"; echo "<td class=fs-1>$preço<td class=fs-1>$un";} ?> </table> arquivo /astudy/View/viewIncluir.php <?php require('viewBasico.html'); ?> <form class="w-50 mt-5 m-auto" action='/astudy/Controller/produtoController.php'> <table class="table table-striped fs-1"> <tr><td><td class=fs-1>Novo Produto <tr><td>Produto<td><input name=incluir[] required> <tr><td>Preço<td><input name=incluir[] required> <tr><td>Un<td><input name=incluir[] required> <tr><td><td><input type=submit value='Incluir Novo Produto'> </form> </table> arquivo /astudy/View/viewMenu.php <?php include('viewBasico.html'); ?> <script>inputMenu.setAttribute('type','hidden')</script> <table class='table table-striped fs-1'> <tr><td><a class=link-underline-light href="/astudy/Controller/produtoController.php?criarProdutos"> Criar ou recriar tabela produtos</a> <tr><td><a class=link-underline-light href="/astudy/Controller/produtoController.php?verProdutos"> Ver todos produtos</a> <tr><td><a class=link-underline-light href="/astudy/View/viewIncluir.php"> Incluir novo produto</a> <tr><td><a class=link-underline-light href="/astudy/Controller/orçamentoController.php?inicio">Orçamento</a> </table> arquivo /astudy/View/viewOrçamento.php <?php include('viewBasico.html') ?> <script>mensagem.innerHTML="Orçamento"</script> <table class='fs-1 table table-striped'> <th>Produto<th>Qt<th>Un<th>Preço<th>Total <?php foreach($itens as $key=>$item): ?> <tr><td><a class=link-underline-light href='../Controller/orçamentoController.php?excluir=<?=$key?>'> <?=$item[0]?></a> <td><input class='border border-light bg-transparent' value=<?=$item[1]?> size=1 onchange="location.replace ('../Controller/orçamentoController.php?alterar='+ this.value+'&chave=<?=$key?>')"> <td><?=$item[2]?><td class=text-end><?=nf($item[3])?><td class=text-end><?=nf($item[4])?> <?php endforeach;?> <tr><td><input type=submit value=Produto onclick="location.replace ('../Controller/orçamentoController.php?produto')"> <input type=submit value=Apagar onclick="location.replace ('../Controller/orçamentoController.php?apagar')"> <td><td><th>Geral<th><?=nf($soma)?> </table> arquivo /astudy/View/viewProduto.php <?php include('viewBasico.html') ?> <p class='fs-1 text-center'><?=$contagem?> grupos de produtos <table class=table> <!--esse algorítimo é péssimo, ele só faz 4 colunas no máximo--> <?php for($iLinha=0;$iLinha<$numLinhas;$iLinha++){ for($iColuna=0;$iColuna<=$colunas;$iColuna++){ if(($iLinha+$iColuna*$numLinhas)<$contagem){ $item=$produtos[$iLinha+$iColuna*$numLinhas]['grupo']; echo "<td><a class='link-dark link-underline link-underline-opacity-0 fs-2' href='?item=$item'>$item</a>";}} echo "<tr>";} ?> </table> arquivo /astudy/index.php <?php header("location:View/viewMenu.php");
  19. O meu projeto é assim pasta <controller> produtoController.php pasta <model> tbproduto.php index.php Eu uso o endereço absoluto para pular do index para o controller ou chamar a classe tbproduto. O problema é quando eu crio o namespace Controller no produtoController. Aí o index reclama que não consegue achar o produtoController. Para resolver isso, eu mudei $classe = new produtoController para $classe = new Controller\produtoController. O drama começa quando eu crio um namespace no arquivo tbproduto como model. No produtoController, eu coloco "use model\tbproduto", e na hora de iniciar uma classe $tbproduto=new tbproduto() ou $tbproduto=new Model\tbproduto(), aí o controlador diz que não encontrou a classe. Alguém aqui usou o Namespace no PHP (ou seja, fora do Laravel) e conseguiu fazer funcionar?
  20. Valeu. Não consegui fazer funcionar as elipsis, mas o CSS do cálculo é bom demais! <style>p {width:calc(8cm - 8px);white-space: nowrap;overflow:hidden}</style> Pensei em usar a propriedade text-overflow, mas ele não funcionou. A função calc só funciona se você colocar espaço antes e depois do operador -.
  21. Eu fiz um código, estipulando 35 caracteres como o máximo que dá para colocar em 7 cm na tela do celular, mas ficou um horror: astudy/Model/funcoes.php <meta name="viewport" content="width=device-width"> <?php class funcoes { public function ajustarTexto($texto){ if(strlen($texto)>35){ return substr($texto,0,32)."...";} else {return $texto;}} } $funcoes=new funcoes(); echo "<br>".$funcoes->ajustarTexto("Descontinuar Abraçadeira Fluorescente"); echo "<br>".$funcoes->ajustarTexto("Descontinuar Acabamento Registro de Pressão"); Existe algum jeito de fazer os dois textos terminarem exatamente no canto direito do celular?
  22. <?php // mysql store (id,idProduto,qt,venda)(1,116,10,10)(2,115,2,2) // (3,115,1,1)(4,115,4,4)(5,116,20,20); $connect=new mysqli("localhost","root","","laravel"); $query=$connect->query("select idProduto, count(idProduto) as contagem from store group by idProduto order by contagem desc"); while($row=$query->fetch_assoc()){ echo "contagem ".$contagem=$row['contagem']." idProduto ".$row['idProduto']."<br>";} // contagem 3 idProduto 115 contagem 2 idProduto 116 Aqui, uma versão melhorada: <?php // mysql store (id,idProduto,qt,venda)(1,116,10,10)(2,115,2,2) // (3,115,1,1)(4,115,4,4)(5,116,20,20); // mysql produto (id,nome)(115,"canabis")(116,"papola") $connect=new mysqli("localhost","root","","laravel"); $query=$connect->query("select idProduto, count(idProduto) as contagem from store group by idProduto order by contagem desc"); while($row=$query->fetch_assoc()){ $idProduto=$row['idProduto']; $query2=$connect->query("select nome from produto where id=$idProduto"); $produto=$query2->fetch_assoc()['nome']; echo "contagem ".$contagem=$row['contagem']." produto $produto<br>";} // contagem 3 produto canabis contagem 2 produto papola
  23. Na listagem seguinte, o comando @include('menu') pressupõe que tem um link para o CDN do Bootstrap. web.php <?php use Illuminate\Support\Facades\Route; Route::middleware(['auth','verified'])->group(function(){ Route::get('megasena',[App\Http\Controllers\EstoqueController::class,'megasena']);} =============================== EstoqueController.php <?php namespace App\Http\Controllers; class EstoqueController extends Controller { public function megasena(){ $vr['escolha']=mt_rand(1,14); if($vr['escolha']<=6){ $vr['titulo']="Palpite para Mega-Sena: linha ".$vr['escolha'];} if($vr['escolha']>=7 and $vr['escolha']<=12){ $vr['coluna']=$vr['escolha']-6; $vr['titulo']="Palpite para Mega-Sena: coluna ".$vr['coluna'];} else {$vr['coluna']=0;} $vr['diagonal']=0; if($vr['escolha']>12){ $vr['diagonal']=$vr['escolha']-12; $vr['titulo']="Palpite para Mega-Sena: diagonal ".$vr['diagonal'];} $matriz=[]; for($j=1;$j<=6;$j++){ for ($i = 0, $palpites = []; $i < 1500; $i++) @$palpites[mt_rand(1, 60)]++; arsort($palpites); $i=0; $sorteio=[]; foreach($palpites as $key => $valor){ $sorteio[]=$key; $i++; if($i==6){break;}} sort($sorteio); $matriz[]=$sorteio;} return view('megasena',compact('vr','matriz'));} } ======================== megasena.blade.php @include('menu') <table class=table> <td colspan=6>{{$vr['titulo']}} @foreach($matriz as $linha=>$mat) <tr> @foreach($mat as $coluna=>$sorte) @if($vr['escolha'] < 7 && ($linha+1)==$vr['escolha'] || $vr['escolha'] > 6 && $vr['escolha'] < 13 && ($coluna+1)==$vr['coluna'] || $vr['diagonal']==1 && ($linha+$coluna==5) || $vr['diagonal']==2 && $linha==$coluna) <td class=text-danger>{{$sorte}} @else <td>{{$sorte}} @endif @endforeach @endforeach
  24. O Bard é bacana. Nem sempre ele encontra a melhor resposta. Hoje, por exemplo, eu queria saber como pegar o nome do cliente no Laravel. A resposta dele estava certa, dentro do contexto do Controller do Laravel. Eu precisava da resposta no contexto do Views. Eu apelei para a improvisação, e consegui achar a solução. No Model, eu tinha uma relação. No Controller eu fiz assim: $hists=tbhistprod::where('codprod',$codprod)->with('relação')->get( ). No Views, eu fiz assim <tr><td>{{$hists->relação->nomeCliente}}. Essa solução não é nada óbvia, mas quem inventou o Laravel é bastante engenhoso. Hoje de noite, eu perguntei se é possível criar um arquivo HTML que caiba na tela do celular. Ele deu várias dicas, e eu experimentei esse daqui: <!DOCTYPE html> <html lang="pt-br"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <title>Exemplo de HTML responsivo</title> </head> <body> <h1>Este é um exemplo de HTML responsivo</h1> <p>Este texto será exibido em toda a largura da tela, mesmo que ela seja pequena.</p> </body> </html> Eu fiquei bastante contente com a resposta. Ele funciona! Todos os códigos que eu fiz, eu pedi para trabalhar com 50% da tela de um notebook para ver se cabia na tela do celular. Mas não cabe, você é obrigado a empurrar a tela para o lado para ver o resto da informação. Mas com a dica do Bard, eu consigo colocar todo o meu layout exatamente no tamanho da tela do celular, o ruim é que é bem difícil de enxergar. Mas isso já vai ajudar bastante na hora de mudar o layout.
  25. Para resolver esse problema eu inventei uma classe chamada vr dentro da pasta Controllers do Laravel. Ficou esquisito, mas ele funcionou. Mas hoje eu senti um enorme peso na consciência e fiz um teste com PHP e eu vi que a maneira mais elegante de passar um monte de variáveis do Controller para um view é usando um vetor, assim: <?php $vr['nome']='Frank'; $vr['idade']=64; $vr['cidade']='Diadema'; $vr['cadastro']=date('Y-m-d'); var_dump($vr);
×
×
  • Criar Novo...