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. Eu criei o projeto PHP em 2020, antes disso ele se chamava projeto MS Access 1990. O MS Access já tem uma rotina pronta para autenticar a senha, esse não é o caso do PHP. No caso do PHP, eu fiz essa gambiarra: if(!$row){$_SESSION['mensagem']="email incorreto";header("location:index.php"); Ele nunca funcionou! Lá em 2022 eu comecei a estudar o Laravel e eu conheci um facilitador chamado middleware. Ele é bacana, bastante funcional, mas não me ajudou a consertar o projeto PHP, o middleware é tão obscuro quanto a rotina de autenticação do MS Access. Finalmente, em 2023, eu tomei coragem e usei o poderoso "var_dump(!$variavel);exit;" aqui e ali até achar o erro, até eu chegar nessa linha: if(!$row){$_SESSION['mensagem']="email incorreto"; header("location:index.php");var_dump($row);exit; Para a minha surpresa, a rotina funcionou, depois de três longos anos! É óbvio que não foi o var_dump que consertou o erro, mas sim o comando exit. Ou seja, o comando header não funciona, se você não fizer o programa parar. Que coisa!
  2. O projeto portaria - Google Drive contém vírus. Sem ele não dá apresentar o meu projeto alternativo, onde tentei achar uma solução para o problema do relatório da portaria. É uma pena.
  3. O meu irmão mandou um WhatsApp reclamando que não conseguia entrar no projeto PHP pelo tablet e nem pelo celular, disse que recebeu a mensagem 403. Entrei no portal da Hostinger, e fui até a pasta public_HTML, e a única coisa que eu achei de estranho é o arquivo .htacess, fiz uma cópia de segurança no meu notebook, e deletei. O projeto PHP voltou no ar. Eu fui testar o projeto em Laravel, um se chama laravel e outro teste, ambos estavam acessíveis. Ainda não sei o que é esse .htacess, o que encontrei dentro dele foi isso: RewriteEngine On RewriteRule ^$ http://127.0.0.1:80/ [P,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ http://127.0.0.1:80/$1 [P,L]
  4. Frank K Hosaka

    A classe

    Finalmente, eu consegui terminar a tradução do meu projeto em PHP para Laravel. Tudo o que eu precisava era criar uma classe no Laravel. O Laravel não permite criar uma classe dentro de outra classe. Eu tentei colocar num arquivo chamado Helpers.php, mas o Laravel não aceitou. O único jeito foi criar um controller, assim: php artisan make:controller vr Eu queria chamar a minha classe de var, mas o Laravel também não deixa. A seguir a listagem da classe vr, o controller do orçamento e seu respectivo blade: vr.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class vr extends Controller { public $ped; public $diaped; public $totalped; public $codp; public $pessoa; public $end; public $cnpj; public $tel; public $nota; public $codprod; public $prod; public $un; public $preço; public function getPed(){return $this->ped;} public function getDiaped(){return $this->diaped;} public function getTotalPed(){return $this->totalped;} public function getCodp(){return $this->codp;} public function getPessoa(){return $this->pessoa;} public function getEnd(){return $this->end;} public function getCNPJ(){return $this->cnpj;} public function getTel(){return $this->tel;} public function getNota(){return $this->nota;} public function getCodprod(){return $this->codprod;} public function getProd(){return $this->prod;} public function getUn(){return $this->un;} public function getPreco(){return $this->preço;} } ------------------------------------------------------------------ OrcamentoController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbsupervariavel; use App\Models\tbpedido; use App\Models\tbpessoa; use App\Models\vw_histped; use App\Models\tbprod; use App\Models\tbhistped; use Auth; class OrcamentoController extends Controller { public function orcamento(request $request){ $vr=new vr(); if($request->input('qt')){ $qt=$request->input('qt'); if($qt!=0){ $qt=fmt($qt); $texto=$request->input('texto'); $vetor=explode(",",$texto); $preço=$vetor[0]; $codprod=tbsupervariavel::where('codsuper',Auth::id())->value('codprod'); $ped=$vetor[1]; $un=$vetor[2]; $subtotal=$qt*$preço; tbhistped::create(['ped'=>$ped,'codprod'=>$codprod,'un'=>$un,'unitario'=>$preço,'subtotal'=>$subtotal,'qt'=>$qt]); $total=tbhistped::where('ped',$ped)->sum('subtotal'); tbpedido::where('ped',$ped)->update(['total'=>$total]);}} if($request->input('excluir')){ $id=$request->input('excluir'); $ped=$request->input('pedido'); tbhistped::destroy($id); $total=tbhistped::where('ped',$ped)->sum('subtotal'); tbpedido::where('ped',$ped)->update(['total'=>$total]);} if($request->input('produto')){ $produto=$request->input('produto'); $tamanho=strlen($produto); $posicao=strpos($produto,":"); $vr->codprod=substr($produto,$posicao+1,$tamanho-$posicao); tbsupervariavel::where('codsuper',Auth::id())->update(['codprod'=>$vr->codprod]); $produto=tbprod::where('codprod',$vr->codprod)->first(); $vr->prod=$produto->prod; $vr->un=$produto->un; $vr->preço=pvenda($produto->custo,$produto->marg);} if($request->input('anterior')){ $ped=$request->input('anterior'); if($ped>0){$ped--;} tbsupervariavel::where('codsuper',Auth::id())->update(['ped'=>$ped]);} if($request->input('novo')){ $pedido=tbpedido::orderBy('ped','desc')->first(); if($pedido->total!=0){ $pedido->ped++; tbpedido::create(['ped'=>$pedido->ped,'dia'=>now()]);} tbsupervariavel::where('codsuper',Auth::id())->update(['ped'=>$pedido->ped]);} tbsupervariavel::where('codsuper',Auth::id())->update(['end'=>'orcamento']); $vr->ped=tbsupervariavel::where('codsuper',Auth::id())->value('ped'); $vr->diaped=tbpedido::where('ped',$vr->ped)->value('dia'); $vr->totalped=tbpedido::where('ped',$vr->ped)->value('total'); $vr->codp=tbpedido::where('ped',$vr->ped)->value('codp'); if($vr->codp){ $pessoa=tbpessoa::where('codp',$vr->codp)->first(); $vr->pessoa=$pessoa->pessoa; $vr->end=$pessoa->end; $vr->cnpj=$pessoa->cnpj; $vr->tel=$pessoa->tel; $vr->nota=$pessoa->nota;} $histped=vw_histped::where('ped',$vr->ped)->get(); $prod=tbprod::orderBy('prod')->get(); return view('orcamento',compact('vr','histped','prod'));} } --------------------------------------------------------------------------------- orcamento.blade.php @include('menu') <script>document.title="Orçamento" btmenu.innerHTML='Barraca do Frank<br>Esquina da Magazine Luiza' </script> <div><table class='table table-striped'> <td><form><input type='submit' value='anterior'><input type='hidden' name='anterior' value={{$vr->ped}}></form> <td style=color:red>Pedido {{$vr->ped}} de {{dbr($vr->diaped)}} <td><form><input type='submit' value='novo'><input type='hidden' name='novo' value='novo'></form></table> <div><table class='table table-striped linha2'><th>Produto<th style=text-align:right>Qt<th>Un<th>Preço<th>Total @foreach($histped as $item) <tr> <td nowrap>{{$item->prod}} <td align=right> @if($item->qt==intval($item->qt)) {{$item->qt}} @else {{dec($item->qt)}} @endif <td><a href=?excluir={{$item->id}}&pedido={{$item->ped}}>{{$item->un}}</a> <td align=right>{{dec($item->unitario)}} <td align=right>{{dec($item->subtotal)}} @endforeach <tr> @if(!isset($_GET['produto'])) <td> <form> <input list=lsproduto name=produto placeholder=produto onchange=submit() size=40> <datalist id='lsproduto'> @foreach($prod as $pr) <option value='{{$pr->prod}} :{{$pr->codprod}}'> @endforeach </datalist> </form> @else <td>{{$vr->prod}} @endif @if(!isset($_GET['qt'])) <td align=right> <form> <input id=qt name=qt onchange=submit() size=1 placeholder=qt autofocus> <input type=hidden name=texto value="{{fmt($vr->preço)}},{{$vr->ped}},{{$vr->un}}"> </form> <td>{{$vr->un}}<td>{{$vr->preço}} @endif <tr><td> @if(empty($vr->codp)) <a href=pessoa>Selecione um cliente</a> @else <details> <summary><b>{{$vr->pessoa}}</b></summary> Endereço <b>{{$vr->end}}</b> <br> CNPJ <b>{{$vr->cnpj}}</b> <br> Telefone <b>{{$vr->tel}}</b> <br> Nota <b>{{$vr->nota}}</b> <br> <a href=pessoa>Mudar cliente</a> <br> <a href="pessoa?busca={{$vr->pessoa}}">Atualizar cliente</a> </details> @endif <td><td><td><td><b>{{dec($vr->totalped)}} </table> </div> O único problema desse código é que ele usa o método GET, o que deixa um monte de comandos na barra de navegação. Ou seja, se você atualizar o navegador, ele vai incluir o mesmo produto tantas vezes quanto você atualizar a tela do navegador. Para contornar isso, o pessoal recomenda usar o método POST, mas aí você não consegue enxergar coisa alguma na barra de navegação. Isso é um dilema difícil de resolver.
  5. Hoje eu encontrei uma dica nessa página php - Laravel filter a value in all columns - Stack Overflow, e eu criei esse método na classe PessoaController: <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbpessoa; use Schema; class PessoaController extends Controller{ public function pessoa(Request $request){ if($request->input('busca')){ if(($request->input('busca'))[0]=="@"){ $busca=$request->input('busca'); $tamanho=strlen($busca); $busca=substr($busca,1,$tamanho-1); $query=tbpessoa::query(); $columns=Schema::getColumnListing('tbpessoa'); foreach($columns as $column){ $query->orWhere($column,'like','%'.$busca.'%');} $pessoas=$query->get(); return view('pessoa',compact('pessoas'));}} }
  6. Eu gosto bastante do Hostinger, ele me cobra R$ 23,00 por mês e assim consigo hospedar nele o meu banco de dados e 14 códigos em PHP. A conexão é estável, bem melhor que o meu notebook, que não é um servidor e usa o ngrok e a Claro, e só funciona quando não preciso. Mas ontem eu queria me aventurar mais, eu queria ver se era possível instalar o Laravel 10. O projeto inicial do Laravel vem com 9.000 arquivos e para arrumar tudo isso são necessários dois programas: o Composer e npm. Não é fácil usar esses programas no notebook, e muito menos na hospedagem. Apanhei muito para instalar o Composer no Hostinger. Já o npm foi bem mais difícil, mas no final do dia eu encontrei um tutorial: How to host a Node.js app on shared host | by Mayomi Ayandiran | Medium. Tentei ver os vídeos do YouTube bem como eu vi o manual do Laravel, mas eu não consegui aprender nada. Assim, usei o famoso método da tentativa e erro. Primeiro, eu zipei um Laravel 10 que tinha no meu notebook, e mandei o zip para o Hostinger, e lá descompactei. Na hora de entrar no projeto, eu recebi a mensagem 403, ou seja, eu não tenho autorização para entrar. Para resolver esse problema, eu fiquei imaginando se o PHP e o Laravel não é a mesma coisa. Então eu criei um arquivo chamado index.php com o comando echo "olá mundo!", e assim consegui entrar na pasta onde estava o Laravel, mas essa gambiarra não funcionou para entrar no Laravel. Então, eu decidi jogar o projeto fora, como eu faço no meu notebook. Mas no Hostinger, as coisas são diferentes. O Hostinger perguntou se eu tinha certeza que eu queria jogar o projeto fora, eu respondi sim, mas para a minha surpresa o Hostinger também jogou fora o banco de dados que estava vinculado no projeto. Esse é o grande problema do método da tentativa e erro, a gente só aprende depois de muita surra.
  7. Frank K Hosaka

    Tuning

    Ah, consegui achar o erro. Esqueci de fazer a prova dos nove! <?php for($i=1000;$i<=9999;$i++){ $j=intval($i/100); $k=intval(($i/100-$j)*100); $l=($j+$k)**2; if($l==$i){echo "$i => $j $k => ( $j + $k)**2= $l <br>";} if($l>$i){$i=(intval($i/100)+1)*100;if($i>9999){exit;}} } // resultado: 2025 => 20 25 => ( 20 + 25)**2= 2025 3025 => 30 25 => ( 30 + 25)**2= 3025 9801 => 98 1 => ( 98 + 1)**2= 9801
  8. Frank K Hosaka

    Tuning

    No fórum do DevMedia surgiu uma questão que queria todos os números dentro do intervalo 1000 a 9999 que pudesse satisfazer essa equação: AABB = (AA + BB)**2 O meu conhecimento em matemática é precário, o máximo que consegui resolver foi equação do 2o. grau com uma incógnita e mesmo assim quase repeti de ano. Então, usei o PHP e achei três soluções: <?php for($i=1000;$i<=9999;$i++){ $i=intval($i); $j=intval($i/100); $k=intval(($i/100-$j)*100); $l=($j+$k)**2; if($l==$i){echo "$i => $j $k => ( $j + $k)**2= $l <br>";} } // resultado: 2025 => 20 25 => ( 20 + 25)**2= 2025 3025 => 30 25 => ( 30 + 25)**2= 3025 9801 => 98 1 => ( 98 + 1)**2= 9801 Mas o rapaz disse que existe um outro método chamado tuning. Pesquisei no Google, e eu vi que tem algo a ver com a lentidão no banco de dados. Ou seja, eu preciso otimizar o programa para evitar o superaquecimento do processador. Então, fiz uma pequena alteração no programa, mas, para o meu azar, o novo programa encontrou 9 resultados. <?php for($i=1000;$i<=9999;$i++){ $j=intval($i/100); $k=intval(($i/100-$j)*100); $l=($j+$k)**2; if($l>$i){$i=(intval($i/100)+1)*100;if($i>9999){exit;}} if($l==$i){echo "$i => $j $k => ( $j + $k)**2= $l <br>";} } // resultado: 1600 => 15 25 => ( 15 + 25)**2= 1600 2025 => 20 25 => ( 20 + 25)**2= 2025 2500 => 24 26 => ( 24 + 26)**2= 2500 3025 => 30 25 => ( 30 + 25)**2= 3025 3600 => 35 25 => ( 35 + 25)**2= 3600 4900 => 48 22 => ( 48 + 22)**2= 4900 6400 => 63 17 => ( 63 + 17)**2= 6400 8100 => 80 10 => ( 80 + 10)**2= 8100 9801 => 98 1 => ( 98 + 1)**2= 9801 O algorítimo é o mesmo, a única diferença é que no segundo programa o processador trabalha menos, e isso não faz o menor sentido. Ou eu fiz uma tremenda besteira que não estou conseguindo enxergar?
  9. Encontrei o Biehl no fórum iMasters, e ele queria saber como salvar a ordem dos menus. Eu não sabia que era possível alterar a posição dos menus, mas o Biehl deixou o código JavaScript que faz essa mágica. Como eu tenho mais conhecimento na área de banco de dados, eu decidi ajudá-lo: <?php // tab_menu (menu_id, menu_nome, menu_order) $ggCon=new mysqli("localhost","root","","astudy"); if(!isset($_POST['recordsArray'])){goto inicio;} else { $VGT_posicoes=$_POST['recordsArray']; foreach ($VGT_posicoes as $menu_order => $menu_nome) { mysqli_query($ggCon, "update tab_menu set menu_order=$menu_order where menu_nome='$menu_nome'");}} inicio:?> <form method=post> <table id=table style=border:1> <?php $sqlVF = mysqli_query($ggCon, "SELECT * FROM tab_menu ORDER BY menu_order ASC"); while($linha = mysqli_fetch_array($sqlVF)){ $menu_id= $linha['menu_id']; $menu_nome= $linha['menu_nome']; $menu_order= $linha['menu_order']; echo "<tr><td><input id='recordsArray_$menu_id' name=recordsArray[] value='$menu_nome' onclick=getSelectedRow()>";} ?> </table> <input type=submit value=Salvar> </form> <button onclick="upNdown('up');">&ShortUpArrow;</button> <script> function getSelectedRow(){ for(var i = 1; i < table.rows.length; i++){ table.rows[i].onclick = function(){ if(typeof index !== "undefined"){ table.rows[index].classList.toggle("selected");} index = this.rowIndex; this.classList.toggle("selected");};}} function upNdown(direction){ rows = table.rows parent = rows[index].parentNode if(direction === "up"){ if(index!=0){parent.insertBefore(rows[index],rows[index - 1]);index--;}}} </script>
  10. CSS ainda é coisa nova para mim, eu estou no nível básico, ou seja, vou usando na base da tentativa e erro.
  11. Depois de três anos, finalmente consegui fazer um orçamento em JavaScript. O programa está incompleto, ele busca o produto pelo código, quando o correto é pela descrição. Ele não calcula o total do item e nem o total do orçamento. É um programa bem incompleto, mas pelo menos eu consegui fazer a metade do programa. A minha estimativa é que vou ter 100% do programa em 2026. <?php // tbprod (codprod,un,prod,custo,marg,codbar,loc,emb,cf,codforn,updated_at,created_at) $mysqli=new mysqli("localhost","root","","astudy"); $query=$mysqli->query("select * from tbprod"); $rows=$query->fetch_all(MYSQLI_ASSOC); $jrows=json_encode($rows); ?> <script> produtos=<?=$jrows?>; function ver(codprod){ prod=produtos.filter(function(produtos){return produtos.codprod == codprod}); inptcod.value=prod[0].prod preço.value=prod[0].custo qt.focus()} function fim(){ texto="<tr><td>"+inptcod.value+"<td>"+qt.value+"<td>"+preço.value linha.insertAdjacentHTML('beforebegin',texto) inptcod.value="" qt.value="" preço.value="" inptcod.focus()} </script> <table><th>Produto<th>Qt<th>Preço <tr id=linha><td><input id=inptcod onchange=ver(inptcod.value) placeholder="codigo do produto"> <td><input id=qt onchange=fim()> <td><input id=preço>
  12. Obrigado pela sirene. O site é bem grande, lamento por não poder ajudar. O css que trabalha com o webkit afeta muita coisa, e eu não tenho nenhuma ideia de como isolar, só posso desejar sorte e persevarança.
  13. <?php // no diretório /wamp64/www/astudy, usei o comando composer require mpdf/mpdf require_once __DIR__.'/vendor/autoload.php'; $mpdf=new \Mpdf\Mpdf(); $mysqli=new mysqli("localhost","root","","astudy"); $query=$mysqli->query("select * from tbprod limit 5"); $mpdf->WriteHTML('<table>'); while($row=$query->fetch_assoc()){ $mpdf->WriteHTML('<tr><td>'.$row['prod']); $mpdf->WriteHTML('<td align=right>'.$row['custo']);} $mpdf->WriteHTML('</table>'); $mpdf->Output(); Tentei usar o Bootstrap, mas não consegui.
  14. Foi por puro acidente que descobri que é possível usar a tela de consulta como a tela de atualização. Tudo que é preciso é de um formulário com um input. O problema é que a tela de consulta sempre apresentava os primeiros cinco itens da tabela de produtos. Eu precisava dar um jeito de manter o mesmo critério da consulta. Por exemplo, se eu estou atualizando o endereço do bacalhau na Geladeira n. 12 (abreviado em g12), eu gostaria que a consulta apresentasse o bacalhau novamente, agora com o endereço correto. Para resolver esse problema, eu usei a variável global $_SESSION, assim: <style> form{margin:0} .camufla {border:0;background:transparent} </style> <?php session_start(); $mysqli=new mysqli("localhost","root","","astudy"); if(isset($_GET['procurar'])){ $filtro="where prod like '%".$_GET['procurar']."%'"; $_SESSION['filtro']=$filtro;} else {$filtro="limit 5";} if(isset($_GET['local'])){ $local=$_GET['local']; $codprod=$_GET['codprod']; $query2=$mysqli->query("update tbprod set loc='$local' where codprod=$codprod"); $filtro=$_SESSION['filtro'];} $query=$mysqli->query("select * from tbprod $filtro"); echo "<form><input name=procurar></form>"; echo "<table><th>Produto<th>Local"; while($row=$query->fetch_assoc()){ echo "<form>"; echo "<tr><td>".$row['prod']."<td>"; echo "<input type=hidden name=codprod value=".$row['codprod'].">"; echo "<input size=2 name=local class=camufla value='".$row['loc']."'>"; echo "</form>";}
  15. Falei besteira no final da mensagem anterior. Eu disse que o route do tutorial estava mais legível, mas não está não. Eu tentei colocar o view('theme') depois do Auth::routes( ); mas isso não mudou em nada. Não sei exatamente para que serve a instrução Auth::routes( ). Para bloquear o acesso ao view('theme') eu tive que mudar o route e criar um controller para essa função, assim: routes/web.php <?php use Illuminate\Support\Facades\Route; Auth::routes(); Route::get('/', [App\Http\Controllers\TesteController::class,'theme']); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); app/Http/Controllers/TesteController.php <?php namespace App\Http\Controllers; use Illuminate\Http\Request; class TesteController extends Controller { public function __construct(){$this->middleware('auth');} public function theme(){return view('theme');}} Hoje, eu aprendi como barrar o usuário. Tudo indica que a function __construct( ) tem prioridade maior do que a função que foi originalmente chamada, se ele estiver dentro da mesma classe.
  16. Hoje, encontrei uma dica no Google, que me ensinou a usar o MySQL. É possível editar a descrição diretamente no MySQL através do comando: update tabela set descricao=replace(descricao,"stringvelha","stringnova"); Isso é bem mais fácil que apelar para o PHP ou o Laravel.
  17. Ah, desculpe, entendi tudo errado. Acabei de fazer a pesquisa no Google e aprendi que responsivo é adequar o código HTML que seja legível na tela de um PC, de um tablete, de um smartphone. Eu acabei atrapalhando você, peço desculpas. Por enquanto, só sei usar o CSS estático. O Bootstrap tem recursos bem avançados que calculam a dimensão da tela do cliente e usa o cálculo para melhor apresentar a informação de acordo com a dimensão. Eu ainda não cheguei lá. No momento, só estou montando um projeto que se adapte na tela do celular, mas não estou conseguindo.
  18. O manual oficial do Laravel 10 começa apresentando o projeto Chirps ou o Kit Start, ambos instalam o Breeze no projeto, ele é um "facilitador" que loga, valida, cadastra novo usuário ou exclui o usuário. O problema é entender a gramática do blade.php, ele usa o estilo da Tailwind, e como eu não estou familiarizado com esse estilo, não sei o que posso mexer. Estou mais familiarizado com o estilo do Bootstrap. Por exemplo, para azular um texto eu faço assim <td class=text-primary>, pelo menos eu acho bem fácil consultar o Bootstrap na internet. Para usar o Bootstrap no meu projeto, eu criei um link dentro do menu.blade.php que é usado em todo o projeto. Ontem, no entanto, eu encontrei um tutorial, ensinando a instalar o Bootstrap no Laravel 9. O endereço dele é esse: https://www.itsolutionstuff.com/post/how-to-install-bootstrap-in-laravelexample.html Esse tutorial não funciona no Laravel 10. Eu criei um projeto chamado laravel no diretório downloads, esses foram os comandos que eu usei: cd downloads composer create-project laravel/laravel cd laravel composer require laravel/ui php artisan ui bootstrap php artisan ui bootstrap --auth npm install npm run build No tutorial, ele não diz para você mudar de diretório na linha de comando, depois que você cria o projeto. Ele também usa a gramática "npm run production", coisa que não funciona na versão que eu tenho. Com o que eu aprendi ontem, acredito que o "npm run dev" atualiza o navegador de tempo em tempo, já o "npm run build" obriga você a atualizar a tela do navegador, se você quiser ver o resultado das modificações que fez no código. Outra coisa que não funciona no tutorial é o theme.blade.php, eu tive que mudar assim: <!doctype html> <html> <head> <!-- Scripts --> <!--script src="{{ asset('js/app.js') }}" defer></script --> <!-- Styles --> <!-- link href="{{ asset('css/app.css') }}" rel="stylesheet" --> @vite(['resources/sass/app.scss', 'resources/js/app.js']) </head> <body> <p class="h1 text-primary">This is example from ItSolutionStuff.com</p> </body> </html> Ou seja, eu comentei os links, e introduzi um novo comando Blade @vite, principalmente porque não tem nada dentro do arquivo 'css/app.css'. O tutorial não explica como rodar o theme.blade.php - eu criei esse arquivo na pasta views, e alterei o routes/web.php assim: <?php use Illuminate\Support\Facades\Route; Route::get('/', function () {return view('theme');}); Auth::routes(); Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home'); Pelo menos a gramática do route não é tão assustador quanto o que aparece no projeto Chirps ou na hora de instalar o Breeze. Pelo que eu entendi nesse código, qualquer usuário pode ver a página theme, mas para ver os demais, primeiro o usuário precisa ser cadastrado.
  19. Eu não consegui instalar o Octane no meu projeto. Você tem um tutorial de como fazer isso?
  20. Ontem, eu estava consertando a tabela de produtos. Tinha muito item com essa descrição "produto pt10", eu mudei para "produto 10 pc". A sintaxe do PHP para fazer essa tarefa é: $novo=str_replace("pt10","10 pc",$descricao); O problema é que esse código não funciona se a descrição tiver "Pt10", "pT10","PT10", assim eu fiz uma sequência de casos, imaginando que uma delas iria funcionar: $novo=str_replace("pt10","10 pc",$descricao); $novo=str_replace("pT10","10 pc",$descricao); $novo=str_replace("Pt10","10 pc",$descricao); $novo=str_replace("PT10","10 pc",$descricao); Na prática, isso não deu certo. Tudo indica que um comando str_replace anula o trabalho de um str_replace anterior. Assim, usei o velho método da tentativa e erro, assim: <?php namespace App\Http\Controllers; use App\Models\tbprod; use Illuminate\Http\Request; class CorrigirController extends Controller { public function inicio(Request $request){ if($request->input('consertar')){ $descricao=$request->input('consertar'); $novo=str_replace("pt10","10 pc",$descricao); if($novo==$descricao){ $novo=str_replace("Pt10","10 pc",$descricao);} if($novo==$descricao){ $novo=str_replace("pT10","10 pc",$descricao);} if($novo==$descricao){ $novo=str_replace("PT10","10 pc",$descricao);} $codprod=$request->input('codprod'); tbprod::where('codprod',$codprod)->update(['prod'=>$novo]); } $itens=tbprod::where('prod','like','%pt10%')->get(); return view('corrigir',compact('itens'));} }
  21. Você pode mostrar como você definiu as variáveis $dadosbanner, $dadosbanner2 e $dadosbanner3? No meu caso eu criei uma classe chamada dadosbanner conforme a listagem mais acima, e $dadosbanner passou a ser uma instância daquela classe. Outra coisa errada que eu vi no código é o <a href="#">, ou seja, os slides não estão amarrados com os links.
  22. Estou começando a estudar. A primeira correção é $dadosbanner3->link3 e $dadosbanner3->img3, o correto é $dadosbanner->link3 e $dadosbanner->img3. A segunda correção é $dadosbanner2->img2 e $dadosbanner2->link_2 para $dadosbanner->img2 e $dadosbanner->img2. A terceira correção: você precisa tirar a vírgula depois de label#img-dot-3. Olha, os únicos erros que eu encontrei foram esses. O seu código é responsivo, tanto no notebook bem como no celular. Para testar o seu código, copiei três imagens na internet e salvei na pasta /img/banner como teste.jpg, teste1.jpg e teste2.jpg, e criei uma classe chamada dadosbanner( ), assim: <?php class dadosbanner { public $img; public $img2; public $img3; public $link_1; public $link_2; public $link_3; public function getImg(){return $this->img;} public function getImg2(){return $this->img2;} public function getImg3(){return $this->img3;} public function getLink1(){return $this->link_1;} public function getLink2(){return $this->link_2;} public function getLink3(){return $this->link_3;}} $dadosbanner=new dadosbanner(); $dadosbanner->img="teste.jpg"; $dadosbanner->img2="teste2.jpg"; $dadosbanner->img3="teste3.jpg"; $dadosbanner->link_1="uol.com.br"; $dadosbanner->link_2="facebook.com"; $dadosbanner->link_3="nyt.com"; ?> <style> .div-slider{width:auto;height: 400px;text-align: center;} .slides-front {padding: 0;width: 980px;height: 370px;display: block;margin: auto; position: relative;} .slides-front * {user-select: none;-ms-user-select: none; -moz-user-select: none;-khtml-user-select: none; -webkit-user-select: none;-webkit-touch-callout: none;} .slides-front input { display: none; } .slide-container { display: block; } .slide {top: 0;opacity: 0;width: 980px;height: 370px; display: block;position: absolute; transform: scale(0); transition: all .7s ease-in-out 0.1s;} .slide img {width: 100%;height: 100%;} .nav label {width: 150px;height: 100%;display: none; position: absolute;opacity: 0;z-index: 9;cursor: pointer; transition: opacity .2s;color: #FFF;font-size: 156pt; text-align: center;line-height: 380px;font-family: "Varela Round", sans-serif; background-color: rgba(255, 255, 255, .3); text-shadow: 0px 0px 15px rgb(119, 119, 119);} .slide:hover + .nav label { opacity: 0.5; } .nav label:hover { opacity: 1; } .nav .next { right: 0; } input:checked + .slide-container .slide { opacity: 1;transform: scale(1); transition: opacity 1s ease-in-out 0.1s;} input:checked + .slide-container .nav label { display: block; } .nav-dots {width: 100%;bottom: 9px;height: 11px;display: block; position: relative;text-align: center;} .nav-dots .nav-dot {top: 375px;width: 11px; height: 11px;margin: 0 4px;position: relative; border-radius: 100%;display: inline-block; background-color: rgba(0, 0, 0, 0.6);} .nav-dots .nav-dot:hover { cursor: pointer;background-color: rgba(0, 0, 0, 0.8);} input#img-1:checked ~ .nav-dots label#img-dot-1, input#img-2:checked ~ .nav-dots label#img-dot-2, input#img-3:checked ~ .nav-dots label#img-dot-3 { background: rgba(0, 0, 0, 0.8);} </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="div-slider"> <ul class="slides-front"> <input type="radio" name="radio-btn" id="img-1" checked=""> <li class="slide-container"> <div class="slide"> <div class="mg-b-10" align="center"><a href="#" class="view_data" id="<?php print $dadosbanner->link_1;?>"><img src="img/banner/<?php echo $dadosbanner->img;?>" class="img-fluid" /></a></div> </div> <div class="nav"> <label for="img-3" class="prev">‹</label> <label for="img-2" class="next">›</label> </div> </li> <input type="radio" name="radio-btn" id="img-2"> <li class="slide-container"> <div class="slide "> <div class="mg-b-10" align="center"><a href="#" class="view_data" id="<?php print $dadosbanner->link_2;?>"><img src="img/banner/<?php echo $dadosbanner->img2;?>" class="img-fluid" /></a></div> </div> <div class="nav"> <label for="img-1" class="prev">‹</label> <label for="img-3" class="next">›</label> </div> </li> <input type="radio" name="radio-btn" id="img-3"> <li class="slide-container"> <div class="slide"> <div class="mg-b-10" align="center"><a href="#" class="view_data" id="<?php print $dadosbanner->link_3;?>"><img src="img/banner/<?php echo $dadosbanner->img3;?>" class="img-fluid" /></a></div> </div> <div class="nav"> <label for="img-2" class="prev">‹</label> <label for="img-1" class="next">›</label> </div> </li> </ul> </div> <script> $(document).ready(function(){ var slids = $(".div-slider [type=radio]"); // busca os radios na div var slids_len = slids.length; // conta o número de radios var intervalo = 2; // intervalo em segundos function rodar(){ var slids_ativo = $(".div-slider [type=radio]:checked") .attr("id") .match(/\d+/)[0]; // pega o valor numérico do id do radio checado if(slids_ativo == slids_len) slids_ativo = 0; // se estiver no último slide, volta pro primeiro slids.eq(slids_ativo).prop("checked", true); // checa o radio da vez } var tempo = setInterval(rodar, intervalo*1000); // inicia o temporizador $(".div-slider").hover( function(){ // função quando entra o mouse clearInterval(tempo); // cancela o temporizador }, function(){ // função quando retira o mouse tempo = setInterval(rodar, intervalo*1000); // reinicia o temporizador } ); }); </script>
  23. O route::resource é bacana, mas ainda prefiro usar o route::get, assim: //route Route::get('venda2',[Venda2Controller::class,"inicio"])->name('venda2'); //controller <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\tbvenda; use Exception; class Venda2Controller extends Controller { public function inicio(Request $request){ if($request->input('atualizar')){ $venda=fmt($request->input('atualizar')); $id=$request->input('id'); tbvenda::where('id',$id)->update(['venda'=>$venda]);} if($request->input('excluir')){ $id=$request->input('excluir'); tbvenda::where('id',$id)->delete();} if($request->input('dia')){ $dia=$request->input('dia'); $venda=$request->input('venda'); try {tbvenda::create(['dia'=>$dia,'venda'=>$venda]);} catch(Exception $e){redirect('venda2')->with(['msg'=>'Venda já registrada']);} } $hoje=date('Y-m-d'); $vendas=tbvenda::orderBy('dia','desc')->get(); return view('venda2',['hoje'=>$hoje],compact('vendas'));} //venda2.blade.php @include('menu') <table class="table table-striped"> <form> @csrf <tr><td><input type=date name=dia value={{$hoje}}> <td><input name=venda autofocus> @if(Session::has('msg')) {{Session::get('msg')}} @endif </form> @foreach($vendas as $venda) <tr><td><a href=?excluir={{$venda->id}}>{{date('d/m/Y',strtotime($venda->dia))}}</a> <form> @csrf <td class=text-end><input placeholder={{dec($venda->venda)}} style=text-align:right;border:none;background:none name=atualizar> <input type=hidden name=id value={{$venda->id}}> </form> @endforeach
  24. <!-- mysql CREATE TABLE `tbacougue` ( `id` int NOT NULL AUTO_INCREMENT, `cod` int DEFAULT NULL, `fab` date DEFAULT NULL, `val` date DEFAULT NULL, `lote` int DEFAULT NULL, `qt` int DEFAULT NULL, `peso` float DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci --> <style> td{text-align:right} </style> <?php function fmt($dia){return date('d/m/y',strtotime($dia));} $mysqli=new mysqli("localhost","root","","astudy"); $query=$mysqli->query("select cod from tbacougue group by cod"); while($row=$query->fetch_assoc()){ $cod=$row['cod']; echo "Código do produto: $cod"; $subq=$mysqli->query("select * from tbacougue where cod=$cod"); $num_rows=mysqli_num_rows($subq); echo "<table><th>Fab<th>Val<th>Lote<th>Qt<th>Peso<th>|<th>Fab<th>Val<th>Lote<th>Qt<th>Peso"; for($i=0;$i<$num_rows;$i=$i+2){ $s=$subq->fetch_array(); echo "<tr><td>".fmt($s[2])."<td>".fmt($s[3])."<td>".$s[4]."<td>".$s[5]."<td>".$s[6]; $s=$subq->fetch_array(); if($s){ echo "<td>|<td>".fmt($s[2])."<td>".fmt($s[3])."<td>".$s[4]."<td>".$s[5]."<td>".$s[6];}} echo "<tr></table>";}
  25. Eu criei uma tabela tbvenda (dia,venda), onde dia é um campo com chave única, e com ele criei apenas um blade e com ele incluo, excluo e edito. Claro que se trata de uma gambiarra para fins pedagogicos e mostrar o misterioso rote::resource, que força a trabalhar com <form method=post> bem como uma gramática fixa (update, destroy, create), não funciona se você alterar essa gramática: //Model tbvenda <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class tbvenda extends Model { use HasFactory; protected $table="tbvenda"; protected $fillable=['dia','venda'];} //route Route::resource('venda',VendaController::class) ->only(['index','store','destroy','update']); //controller <?php namespace App\Http\Controllers; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; use App\Models\tbvenda; use Exception; class VendaController extends Controller{ public function index():View { $hoje=date('Y-m-d'); return view('venda',['hoje'=>$hoje,'vendas'=>tbvenda::orderBy('dia','desc')->get()]); } public function store(Request $request):RedirectResponse { $validated=$request->validate(['dia'=>'required','venda'=>'required']); try { tbvenda::create($validated); } catch (Exception $e) {return redirect(route('venda.index'))->with( ['msg'=>"venda já registrada"]);} return redirect(route('venda.index'));} public function destroy(tbvenda $venda): RedirectResponse { $venda->delete(); return redirect(route('venda.index'));} public function update(Request $request, tbvenda $venda): RedirectResponse { $novavenda=fmt($request->input('novavenda')); $dia=$venda->dia; $atualizar=['dia'=>$dia,'venda'=>$novavenda]; $venda->update($atualizar); return redirect(route('venda.index')); } } // Helpers function dec($value){return number_format($value,2,',','.');} function fmt($value){$value=str_replace(".","",$value); return str_replace(",",".",$value);} // venda.blade.php @include('menu') <script>document.title='Registro de Vendas';btmenu.innerHTML='Registro de Vendas'</script> <table class="table table-striped"> <tr><td> <form action="{{route('venda.store')}}" method=post> @csrf <input type=date name=dia value={{$hoje}}><td align=right> <input name=venda autocomplete=off autofocus> @if(Session::has('msg')) {{Session::get('msg')}} @endif </form> @foreach($vendas as $venda) <tr><td> <form method=post action="{{route('venda.destroy',$venda)}}"> @csrf @method('delete') <a href="{{route('venda.destroy',$venda)}}" onclick="event.preventDefault(); this.closest('form').submit()"> {{date('d/m/Y',strtotime($venda->dia))}} </a> </form> <td class=text-end> <form method=post action={{route('venda.update',$venda)}}> @csrf @method('patch') <input name=novavenda placeholder="{{dec($venda->venda)}}" style=text-align:right;border:none;background:transparent> </form> @endforeach // blade
×
×
  • Criar Novo...