Ir para conteúdo
Fórum Script Brasil

Todas Atividades

Atualizada automaticamente

  1. Recentemente
  2. Hoje
  3. These are some of the most important patterns we have noticed when reviewing publishing specifications for 2025 and Digital Publishing Solutions Specifications for 2025. In their existing publishing workflow, publishers are looking for ways to increase efficiency by reducing the amount of manual work, the number of hand-offs, and other dependencies involved. One of its top priorities is to improve its worldwide content offering by updating the backlist to the latest formats with flexible distribution channels so that people can find and use their content in the maximum way possible.
  4. はじめに:チャットGPTとは? チャットGPTとは、OpenAIが開発した最先端の人工知能(AI)によるチャットボットです。人間のように自然な会話ができ、質問への回答、文章の作成、翻訳、アイデア出しなど、幅広い用途で利用されています。最近では「チャットGPT 日本語」対応が進み、日本のユーザーにも使いやすくなっています。 チャットGPTは日本語に対応しているのか? はい、チャットGPTは日本語に対応しています。以前は英語が中心でしたが、アップデートにより日本語での会話が大幅に向上しました。日本語の入力に対して自然な返答が可能であり、複雑な文脈もある程度理解できます。 日本語対応の特徴: 丁寧な敬語表現にも対応 日本文化に関する質問への理解力 ビジネスや学術用途にも使えるレベルの日本語能力 チャットGPT 日本語の主な活用方法 1. 日常会話の練習 外国人の日本語学習者や、日本語を使いたい方が、実際の会話の練習相手として利用できます。 2. 文章作成・校正 エッセイ、ブログ記事、メール文などの作成や、日本語文法のチェックにも活用可能です。 3. 翻訳サポート 日本語⇔英語の翻訳はもちろん、他の言語との翻訳サポートも可能です。 4. ビジネス文書の下書き 提案書、プレゼン資料、報告書などの下書き作成に役立ちます。 5. 学習・教育補助 日本語の読解や漢字の意味など、教育目的での使用にも適しています。 チャットGPT 日本語のメリットと注意点 メリット: 日本語に強く、自然な会話が可能 24時間いつでも使える 多様なジャンルに対応できる柔軟性 注意点: 完全な正確性は保証されないため、情報の精査は必要 専門分野の知識は限られる場合がある 感情や倫理観については機械的な判断にとどまる チャットGPT 日本語は今後どう進化するのか? 将来的には、日本語の理解力と表現力がさらに向上すると期待されています。また、方言や話し言葉のニュアンスにも対応できるようになり、より自然なコミュニケーションが可能になるでしょう。 まとめ 「チャットGPT 日本語」は、日常会話からビジネス利用まで、幅広く活用できるAIツールです。日本語への対応が進み、誰でも気軽に使える時代が到来しています。うまく活用すれば、作業効率の向上や学習の質の改善にもつながるでしょう。
  5. Yesterday
  6. O marcador <flux:checkbox> desenha uma caixa de opção um pouco mais bonita do que o <input type="checkbox"> e só vale a pena utilizar, se você precisar de uma resposta do usuário. O meu caso é diferente, eu preciso mostrar ao usuário qual foi a opção que ele escolheu. Um coisa é pegar a informação e guardar no banco de dados, e outra bem diferente é fazer o caminho inverso. No caso do Livewire temos no componente public $teste e no blade <input type="checkbox" wire:model="teste">, aqui o usuário define a caixa ou a variável $teste define a caixa (mas a variável só pode usar os valores true ou false na versão Livewire 3.0). Já o marcador <flux:checkbox wire:model="teste"> só é útil para pegar a opção do usuário, já o caminho inverso não dá, o Livewire não é capaz de mudar o <flux:checkbox wire:model="teste"> para <flex:checkbox wire:model="teste" checked> quando o $teste está definido para true.
  7. Advanced automated material handling systems specifically designed for the food industry are CHL Systems' area of expertise. Our solutions, which are designed to maximize product flow and minimize manual work, include food-safe hydraulic dumpers, multi-level transfer conveyors, and hygienic stainless steel conveyors. Food makers can increase productivity, uphold strict hygienic requirements, and successfully grow operations by incorporating these systems. Because of CHL's experience, every system is tailored to the particular requirements of food manufacturing facilities.
  8. Última semana
  9. Mais Cedo
  10. No tempo do PHP e Laravel, eu usei o <form> para fazer uma ponte entre o view e o controller, mas no Livewire acredito que o <form> só serve para usar as regras de validação. Em vários tutoriais do Livewire você vai encontrar coisa do tipo unique:user, ou seja, o Livewire vai procurar a informação na tabela user. No meu caso, o nome da minha tabela é tbusuarios. Mesmo que eu tenho colocado a tabela no model User, o código no Livewire só vai funcionar se eu usar unique:tbusuarios. <?php // Teste.php namespace App\Livewire; use Livewire\Component; class Teste extends Component { public $email; function register() { $data=$this->validate(['email'=>'required|email|unique:tbusuarios']); dd("creating a user with email $this->email"); } } ?> <form wire:submit.prevent="register" class="w-25"> <!-- teste.blade.php --> <div class="h-5"></div> <flux:input wire:model="email" /> <div class="h-5"></div> <flux:button type=submit>Register</flux:button> <div class="h-5"></div> @error('email'){{ $message }}@enderror </form>
  11. Eu tentei testar o código que aparece logo no portal do livewire.laravel.com, ao invés de usar a tabela user, eu usei a tabela de produtos, mas o VS Code disse que encontrou um erro por eu não ter definido a propriedade produto no componente. O VS Code tem razão, o portal do Livewire apresenta um péssimo exemplo de programação, aonde deveria ser @foreach($users as $user), o rapaz escreveu $this->users.
  12. Hoje eu estudei o <wire:loading>, mas nenhum dos exemplos do tutorial funcionou comigo. O único que deu certo foi um que muda a cor de uma opção que foi selecionada: <div wire:click="multiploAtualiza" wire:loading.class="text-red-500" class="text-gray-500 font-semibold"> Atualizar Produtos Vinculados </div>
  13. Frank K Hosaka

    ODBC DB2 JSON

    A minha sugestão é usar o comando print_r ao invés do echo: $result=[['CDSCR'=>'RACCORD ASPIRAÇÃO']]; foreach($result as $r) { print_r($r); }
  14. paulo frutuoso

    ODBC DB2 JSON

    Ola Estou a tentar obter dados de uma base de dados DB2 via odbc e obter um objecto json do codigo acima, obtenho o seguinte output. A tabela está bem formatada, graças ao header utilizado. Depois, vou transformar o resultado num array para depois obter um objeto json. Senão converter o array com o mb_convert_encoding, o json_encode devolve um erro, porque é obrigatorio que o argumento esteja em UTF-8. Mas tenho um echo inesperado. Os caracteres à e Ç são substituidod pelo carater ? O que falta Onde está o erro? Obrigado Paulo Frutuoso
  15. que bom q deu certo. disponha👍
  16. ================= // ================= Finalmente eu achei o portal do heroicons.com, e lá achei o ícone da verificação ("check"), e coloquei no Blade assim: <div class="flex mt-2"> <div class=w-[310px]> <input id="codforn" wire:model="codforn" size="3" autofocus placeholder="codforn" onchange="qt.focus()" class="px-2 border-2 rounded py-0" autocomplete="off"> </div> <div class="w-[210px]"> <input id="qt" wire:model="qt" size="2" placeholder="qt" onchange="total.focus()" class="border-2 rounded py-0 text-center" autocomplete="off"> </div> <div class="text-right"> <input id="total" wire:model="total" size="2" placeholder="total" class="border-2 rounded py-0 text-center" autocomplete="off" wire:change="item" onchange="codforn.focus()"> </div> <flux:icon.check wire:click="item" class="ml-4" /> </div> O meu grande problema é que eu não encontrava espaço suficiente para colocar um botão, tentando simular um <button type=submit>, mas tem espaço para colocar um ícone. Graças ao ícone, eu não preciso mais das variáveis $codforn2, $qt2 e $total2, eu simplesmente só vou esvaziar as variáveis $codforn, $qt e $total só depois que elas forem usadas no cadastro do histórico do produto, ou seja, se o usuário ver a mensagem de que o produto não existe, tudo o que ele digitou vai permanecer no painel de entrada de produtos, e depois dele acertar o cadastro de produto, ele só vai ter que apertar o ícone da confirmação mais uma vez.
  17. Apesar do Livewire ser uma extensão do Laravel, aqui eu já considero como um novo recurso do PHP, principalmente para um programador eventual como eu que não conseguiu dominar o JavaScript e principalmente o Ajax. Eu tenho uma rotina que dá entrada no estoque, usando o serviço da digitação. Acredito que a grande maioria dos programadores utiliza o serviço de importação do xml para dar entrada no estoque, mas eu não tenho paciência de esperar e assim eu uso uma cópia da confirmação do pedido do fornecedor. No view, eu tenho três entradas: <input wire:model="codfornec">, <input wire:model="qt"> e <input wire:model="total">. Depois que o usuário fornece os dados, o componente procura na tabela de produtos o registro que contém o codfornec que foi digitado, e se encontrar, ele dá a entrada na tabela histórico do produto. O problema é se o componente não conseguir encontrar, aí o componente solta a mensagem "eu não achei" e fica por isso mesmo. O usuário pode abrir uma nova guia e acertar a tabela de produtos, atualizando ou criando um novo registro. Depois ele volta na guia da entrada de produto, e digita tudo de novo. A lei do menor esforço obriga o usuário a reclamar com o programador que não faz sentido digitar tudo de novo, coisa que já foi digitado antes. E ele tem razão. Eu não sei como resolver isso de maneira lógica, mas improvisei essa gambiarra: Eu criei três variáveis públicas: public $codfornec2, $qt2, $total2, e eles foram definidos quando o componente não encontrar o produto, assim: <?php // ... function item() { // ... $aux=tbprod::where('codforn','like',"%$codforn%")->get(); if (count($aux) == 0) { $this->codforn2=$codforn; $this->qt2=$qt; $this->total2=$total; $this->mensagem="Não existe produto com codforn $codforn"; $this->modal=true; return; } A rotina que fecha o modal anula o conteúdo de $codforn, $qt e $total, e assim o usuário vai ver três caixas vazias que ele não quer digitar. Eu mudei a primeira caixa de entrada: <input wire:model="codforn" wire:click="item">, e o método item no componente ficou assim: <?php // ... function item() { if($this->codforn2) { $codforn=$this->codforn2; $qt=$this->qt2; $total=$this->total2; $this->codforn2=$this->qt2=$this->total2=null; } else { if(is_null($this->codforn)) { return; } $codforn = $this->codforn; $qt = $this->qt; $total = deca($this->total); } Essa gambiarra funciona, o problema é como lembrar o usuário de que é possível recuperar a última digitação só com um clique na primeira caixa.
  18. Boa noite pessoal! Sou iniciante em javascript gostaria de saber se alguém poderia me ajudar a entender o conceito de funcão com parametros. Minha intenção é a seguinte: Estou tentando pegar o valor digitado no input e passar esse valor para uma função e dentro dessa função armazenar em uma variável que cria um Nó de texto criei um evento de click em um botão e consegui armazenar o valor do input em uma variavel "b" porém quando envio ela como parâmetro retorna um erro dizendo que "b" is not defined, acredito que seja porque ela está definida apenas no escopo da function do evento de click. seguindo esse raciocínio do meu código é possível receber esse valor do input e armazenar em uma variável pra ser usada como um nó de texto? A funcionalidade do código em questão não tem muita importação estou precisando mesmo fixar esse conceito, nesse meu raciocínio é possível passar como parâmetro? // mapeando o input var input = document.querySelector("#input"); // mapeando o botao var btn = document.querySelector("#btn"); //criando evento de click btn.addEventListener("click", function(){ var b = input.value; console.log(b); }) function criaEl(alpha){ var body = document.getElementsByName("body"); var paragrafo = document.createElement("p"); var criaNode = document.createTextNode(alpha); console.log(criaNode); } criaEl(b); // criaEl(input); // criaEl(input.value);
  19. Show... muito obrigado pela a sua atenção, deu certo aqui.
  20. 1. insira os nomes das colunas: insert into cursos (nome, descricao, carga, total_aulas, ano) values etc.. 2.é melhor prática não usar aspas ao inserir valores em colunas numericas; ex: ('Algoritmos', 'Logica de Programacao', 20, 15, '2014'), ('Photoshop', 'Dicas de Photoshop', 10, 8, '2014') etc.
  21. Boa noite Estou começando estudar MySQL e ao tentar inserir dados esta dando o seguinte erro "Error Code: 1366. Column count doesn't match value count at row 1, segue a minha tabela create table if not exists cursos( id_curso int not null primary key auto_increment, nome varchar(50) not null unique, descricao text, carga int unsigned, total_aulas int, ano year default '2025' )default charset = utf8; dados que estou tentando inserir: insert into cursos values ('Algoritmos', 'Logica de Programacao', '20', '15', '2014'), ('Photoshop', 'Dicas de Photoshop', '10', '8', '2014'), ('PHP', 'Curso de PHP para iniciantes', '40', '20', '2010'), ('Java', 'Introdução programação Java', '10', '29','2000'), ('MySQL', 'Bando de Dados MySQL', '30', '15', '2016'), ('Word', 'Curso completo de WOrd', '40', '30', '2018'), ('Análise e Desenvolvimento de Sistemas', 'Desenvolvimento de software', '80', '25', '2020'), ('Jogos Digitais', 'Desenvolvimento de jogos', '60', '20', '2021'), ('Engenharia de Software', 'Engenharia de Software', '100', '45', '2021'), ('Gestão da Tecnologia da Informação', 'Gestão da Tecnologia da Informação', '40', '15', '2022'), ('Rede de Computadores', 'Implementação e gerenciamento de redes', '80', '30', '2022'), ('Sistemas para Internet', 'Desenvolvimento para internet', '60', '20', '2021'), ('Ciências de Dados e Análise de Comportamento', 'Analise de dados', '120', '60', '2023'), ('Banco de Dados', 'Desenvovler, administrar banco de dados', '1000', '40', '2024');
  22. Bom dia, Gostaria de saber se alguém fez a prova DP-300 recentemente, para me indicar algum material para estudar A empresa que trabalho pegou um projeto e preciso tirar essa certificação o mais rápido possível. Obrigado.
  23. A seguir a listagem completa: arquivo app > Models > tbrendabruta.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class tbrendabruta extends Model { use HasFactory; protected $table="tbrendabruta"; protected $fillable=['apuracao','renda']; const UPDATED_AT=null; const CREATED_AT=null; } ?> arquivo app > Livewire > Simples.php <?php namespace App\Livewire; use App\Models\tbrendabruta; use Carbon\Carbon; use DOMDocument; use Livewire\Attributes\Layout; use Livewire\Component; #[Layout('components.layouts.app',['titulo'=>'Estimativa do Simples'])] class Simples extends Component { protected $listeners=['verArquivo']; public $aliquota=7.3, $reducao=5940, $efetiva; // 2a. faixa da tabela do simples no comércio public $comST,$grupos,$modal, $notasFiscais = [],$nfCanceladas = []; public $notasCanceladas,$primeiraNota,$receitasAnteriores,$renda12; public $semST,$somaTotal,$totalDeNotas,$ultimaNota; public $CST,$SST,$TT; public $apuracao,$proxApuracao,$venda; function incluir() { tbrendabruta::create(['apuracao'=>$this->proxApuracao,'renda'=>$this->venda]); $this->modal=true; } function verArquivo($arquivo) { $this->modal=false; $this->apuracao=tbrendabruta::max('apuracao'); $previa=Carbon::createFromFormat('Ym',$this->apuracao); $this->proxApuracao=$previa->addMonth()->format('Ym'); $arquivo=substr($arquivo,0,-4); $diretorio="C:/Users/Frank/Downloads/".$arquivo; $contaArquivos=count(scandir($diretorio))-2; $nfces = scandir($diretorio); $this->notasCanceladas=0; $this->somaTotal=0; $this->comST=0; $this->semST=0; foreach($nfces as $nfce) { if($nfce !== '.' && $nfce !=='..' ) { if(strpos($nfce,'-can') !== false) { $this->nfCanceladas[] = intval(substr($nfce,28,6)); $this->notasCanceladas++; continue; } $numeroNota=intval(substr($nfce,28,6)); if(in_array($numeroNota,$this->nfCanceladas)) { continue; } $this->notasFiscais[]=$numeroNota; $dom = new DOMDocument(); $dom->load("$diretorio/$nfce"); $nfe=$dom->documentElement; if($nfe->getElementsByTagName('vNF')->item(0)) { $somaNF=$nfe->getElementsByTagName('vNF')->item(0)->nodeValue; $this->somaTotal+=$somaNF; $produtos=$nfe->getElementsByTagName('prod'); foreach($produtos as $p) { $cfop=$p->getElementsByTagName('CFOP')->item(0)->nodeValue; $vProd=$p->getElementsByTagName('vProd')->item(0)->nodeValue; $vDesc=0; if($p->getElementsByTagName('vDesc')->item(0)) { $vDesc=$p->getElementsByTagName('vDesc')->item(0)->nodeValue; } if($cfop==5405) { $this->comST += $vProd - $vDesc; } else { $this->semST += $vProd - $vDesc; } } } } } sort($this->notasFiscais); $this->primeiraNota=intval($this->notasFiscais[0]); $this->ultimaNota=intval($this->notasFiscais[$contaArquivos-1]); $this->totalDeNotas=count($this->notasFiscais); $this->receitasAnteriores = tbrendabruta::orderBy('id','desc') ->skip(1)->take(12)->get(); $this->renda12=array_reduce($this->receitasAnteriores->toArray(),function($total,$r) { return $total + $r['renda']; },0); $this->grupos=array_chunk($this->receitasAnteriores->toArray(),3); $this->efetiva=round((($this->renda12*$this->aliquota/100-$this->reducao)/$this->renda12)*100,4); $this->CST=round($this->comST*$this->efetiva/100*(1-34/100),2); $this->SST=round($this->semST*$this->efetiva/100,2); $this->TT=$this->CST+$this->SST; } function mount() { $this->modal=true; } } ?> arquivo resources > views > livewire > simples.blade.php <div> <div class="mt-5"></div> @if($modal) <flux:input type="file" wire:model="zip" label="Escolha um arquivo zipado da Bling já descompactado" onchange="arquivo=event.target.files[0].name; Livewire.dispatch('verArquivo',[arquivo])" /> @else <div class=font-semibold>Estimativa do Simples Nacional {{ $apuracao }}</div> <div class="flex items-center"> Próxima Apuração {{ $proxApuracao }} <div class="w-[200px] ml-2"> <flux:input wire:model="venda" wire:change="incluir" size=xs placeholder="valor da venda"/> </div> </div> <div class=flex> <div>Total de Notas</div> <div class="ml-2">{{$totalDeNotas}}</div> </div> <div class=flex> <div>Notas Canceladas</div> <div class="ml-2 text-right mr-2">{{$notasCanceladas.": ";}}</div> @foreach($nfCanceladas as $n) {{ $n." "}} @endforeach </div> <div class=flex> <div>Primeira Nota</div> <div class="text-right ml-2 font-semibold">{{$primeiraNota}}</div> <div class="ml-5">Última Nota</div> <div class="text-right ml-5 font-semibold">{{$ultimaNota}}</div> </div> @foreach($grupos as $grupo) <div class='flex'> @foreach($grupo as $r) <div class="w-[40px] font-semibold">{{$r['apuracao']}}</div> <div class="w-[100px] text-right mr-5">{{dec($r['renda'])}}</div> @endforeach </div> @endforeach <div class="flex"> <div class="mr-5">Renda 12 meses:</div> <div class="font-semibold">{{dec($renda12)}}</div> </div> <div class="flex"> <div class="w-[130px]">Alíquota Efetiva</div> <div class="w-[320px]">{{"(".dec($renda12)." x ".virgula($aliquota). " % - ".dec($reducao).") / ".dec($renda12)}}</div> <div class="w-[10px]">{{" = "}}</div> <div class="w-[80px] text-right font-semibold">{{ virgula($efetiva)." %" }} </div> </div> <div class=flex> <div class="w-[70px]">Com ST</div> <div class="w-[100px] text-right">{{dec($comST)}}</div> <div class="ml-1 w-[160px]">{{ " x ".virgula($efetiva)." % x (1 - 34%)"}}</div> <div class="w-[10px]">=</div> <div class="w-[100px] font-semibold text-right">{{ dec($CST) }}</div> </div> <div class=flex> <div class="w-[70px]">Sem ST</div> <div class="w-[100px] text-right">{{dec($semST)}}</div> <div class="ml-1 w-[160px]">{{ " x ".virgula($efetiva)." %"}}</div> <div class="w-[10px]">=</div> <div class="w-[100px] font-semibold text-right">{{ dec($SST) }}</div> </div> <div class=flex> <div class="w-[70px]">Total</div> <div class="w-[100px] text-right">{{dec($somaTotal)}}</div> <div class="ml-1 w-[160px]"></div> <div class="w-[10px]">{{ " " }}</div> <div class="w-[100px] font-semibold text-right text-red-700">{{ dec($TT) }}</div> </div> @endif </div>
  24. Estou tentando criar uma aplicação online com PHP e JavaScript (Ajax) e a API do YouTube. Basicamente, quero que os vídeos do meu canal rodem em uma "SECTION" da minha aplicação. Quando digito o código, previamente cadastrado em banco de dados com as informações do vídeo, e clico em um PLAY o vídeo é carregado na "SECTION" (id=player-on). Na primeira vez, o vídeo aparece e roda perfeitamente, mas se eu digitar outro código, o próximo vídeo não carrega. Tentei retirar "window.addEventListener("load", (event) => {" do JavaScript e criar uma função e chamá-la diretamente no input "PLAY", mas também não funcionou. Ou seja, eu teria que atualizar a pagina toda para poder rodar outro vídeo e isso não é interessante. Alguém poderia ajudar? PÁGINA QUE EU ESCOLHERIA VÍDEO: index.php <script> window.addEventListener("load", (event) => { var botao = document.querySelector("#btn_cantar"); var codigo_musica = document.querySelector("#codigo_musica"); codigoLength = codigo_musica.value.length; botao.addEventListener("click", (event) => { if (codigoLength < 4) { $("#player-on").html(""); console.log("menor"); } if (codigoLength == 4) { primary = { codigo: codigo_musica.value, }; $.ajax({ type: 'post', url: "player.php", data: primary }).done(function(retorno) { $("#player-on").html(retorno); }); } else { alert("É necessário escolhe uma música!"); } }); }); function buscaVideo(input) { codigoLength = input.value.length; primary = { codigo: input.value, }; //SE O TAMANHO DO CODIGO FOR MENOR QUE 4 CARACTARES LIMPA O BOX DE LISTAGEM DE MUSICAS if (codigoLength < 4) { $("#lista_videos").html(""); console.log("menor"); } //SE O TAMANHO DO CODIGO FOR = A 4 CARACTARES CARREGA A PAGINA DE LISTAGEM DE MUSICAS if (codigoLength == 4) { $.ajax({ type: 'post', url: "busca_videos.php", data: primary }).done(function(retorno) { $("#lista_videos").html(retorno); }); } } </script> <section id="start" class="mx-auto py-5 col-2 float-start"> <div class="row"> <label class="col-12 text-center text-white fs-4 my-3">Enter with Code</label> </div> <div class="row"> <div class="col-10 mx-auto text-center"> <input id="codigo_musica" onkeyup="buscaVideo(this)" class="form-control text-center py-1 fs-4 border-5 rounded-5 " maxlength="4" type="text" id="codigo" value="" name="codigo" placeholder="Digite o código da música" autocomplete="off"> <button id="btn_cantar" class="p-3 fs-4 btn btn-primary my-5 rounded-5" type="buttom">PLAY</button> </div> </div> <div class="row"> <!-- SHOWS THE NAME OF THE CHOSEN VIDEO --> <div id="lista_videos" class="col-10 rounded-5 fs-3 bg-white mx-auto border-5 text-center p-2 text-center"> </div> </div> </section> <!-- SHOW THE CHOSEN VIDEO --> <section id="player-on" class="col-10 float-end bg-primary"> </section> PÁGINA QUE SERÁ CARREGADA: <div class="row"> <div class=""> <div id="player"></div> </div> </div> <script> (function() { var player; var height = window.screen.height; var width = window.screen.width; window.onYouTubeIframeAPIReady = function() { player = new YT.Player('player', { height: height, width: width, videoId: '<?= $video["id_video"] ?>', events: { 'onReady': onPlayerReady }, playerVars: { 'playsinline': 1 }, }); // player.getPlayerState(); }; // 4. Executa o play quando o video estiver pronto function onPlayerReady(event) { event.target.playVideo(); } var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName('script')[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); })(); </script> LAYOUT BÁSICO:
  25. O tutorial do Livewire afirma que é fácil fazer upload, mas eu só recebi a mensagem de que o upload falhou, no caso do arquivo zipado. Mas eu vi que o <input type=file> pegou o nome do arquivo selecionado. Com a ajuda do Copilot, consegui pegar o nome do arquivo e mandar para o Livewire: arquivo app > Livewire > Simples.php <?php namespace App\Livewire; use Livewire\Component; class Simples extends Component { protected $listeners=['verArquivo']; public function verArquivo($arquivo) { dd($arquivo); } } arquivo resources > views > livewire > simples.blade.php <flux:input type="file" onchange="arquivo=event.target.files[0].name; Livewire.dispatch('verArquivo',[arquivo])" /> Apesar do código ser bem pequeno, isso é resultado de várias tentativas e erros. Foi muita sorte o código JavaScript funcionar, a lista do Copilot era bem maior. Já o Livewire.dispatch, esse deu muito trabalho, a ideia de colocar colchete em torno da variável que contém o nome do arquivo foi pura tentativa erro, não sei como usar o comando dispatch, mas nesse caso, deu certo. Claro que o nome do arquivo não ajuda muito, mas eu espero explorar o diretório que tem o mesmo nome do arquivo zipado. O PHP, o Laravel e o Livewire não gostam de arquivos zipados, mas para trabalhar com arquivo xml, eles não reclamam.
  26. O orçamento é apenas uma equação do primeiro grau, onde orçamento = quantidade x preço. O PHP e o Laravel permitem pegar o valor do <input name=quantidade> e passar para a variável $quantidade através do recurso do <form>. Já o Livewire elimina o transtorno do <form> usando apenas <input wire:model=quantidade>. Isso é bem engenhoso. O problema é o preço. No PHP e no Laravel, eu tive que criar dois módulos, o orçamento e o produto. Para não perder as informações do orçamento eu usei a variável global session(['pedido'=>$pedido]), e assim eu pulava do módulo orçamento para o módulo produto. E no módulo produto, eu usei a variável global session(['codprod'=>$codprod]) e assim voltava para o módulo do orçamento para fazer o resto do serviço. A variável global é uma mão na roda, o problema são os outros módulos, e eu estou enfrentando um monte de problema de lógica. A minha ideia é acabar com a variável global, e usar o Livewire para carregar o orçamento e o produto ao mesmo tempo no navegador, a minha ideia é fazer do produto um modal do orçamento, e assim que o usuário selecionar o produto, ele usa o comando dispatch( ) para enviar o código do produto para o orçamento, e o orçamento usa o recurso do ouvinte ("listener") para pegar o código do produto para terminar a equação. Falar é fácil, codificar são outros quinhentos. Aqui só fiz o esboço.
  27. O Livewire é a soma de três arquivos: o componente, o layout e o encaixe, os dois últimos usam o CSS Tailwind. Eu comecei a estudar o Laravel em 2022, mas em 2025 é que consegui dominar melhor porque eu consegui decorar um pouco a sintaxe do Tailwind. Só é possível mexer com o Tailwind com a ajuda do Copilot. Para contornar o problema do Tailwind é que inventaram o <flux>, ele é um componente do HTML que já vem pré-formatado, você não precisa do Copilot para desenhar um <input>. Mas para o Tailwind, o Livewire e o Flux funcionarem, o seu arquivo layout deve seguir essa diretriz: arquivo resources > views > components > teste.blade.php <!DOCTYPE html> <title>{{ $title }}</title> @vite(['resources/css/app.css', 'resources/js/app.js']) @livewireScripts @fluxAppearance <body> <flux:main> {{ $slot }} </flux:main> @fluxScripts </body> arquivo app > Livewire > Lteste.php <?php namespace App\Livewire; use Livewire\Attributes\Layout; use Livewire\Component; #[Layout('components.layouts.teste',['title'=>'Teste'])] class Lteste extends Component { } ?> arquivo resources > views > livewire > lteste.blade.php <div> <flux:modal.trigger name="edit-profile"> <flux:button>Edit profile</flux:button> </flux:modal.trigger> <flux:modal name="edit-profile" class="md:w-96"> <div class="space-y-6"> <div> <flux:heading size="lg">Update profile</flux:heading> <flux:text class="mt-2">Make changes to your personal details.</flux:text> </div> <flux:input label="Name" placeholder="Your name" /> <flux:input label="Date of birth" type="date" /> <div class="flex"> <flux:spacer /> <flux:button type="submit" variant="primary">Save changes</flux:button> </div> </div> </flux:modal> </div> arquivo routes > web.php <?php use App\Livewire\Lteste; Route::middleware(['auth','verified'])->group(function() { Route::get('lteste',Lteste::class)->name('lteste'); } ?>
  28. Frank K Hosaka

    O arquivo csv

    Há muito tempo, eu consegui esse código para criar o arquivo csv no PHP e no Laravel <?php // listagem parcial class Orcamento extends Controller { function bling(Request $request) { // rotina para criar $dados $arquivo = fopen("$request->pBling.csv", "w"); fputcsv($arquivo, $dados[0]); foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha); } } fclose($arquivo); if (file_exists("$request->pBling.csv")) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . basename("$request->pBling.csv")); header('Content-Length: ' . filesize("$request->pBling.csv")); readfile("$request->pBling.csv"); unlink("$request->pBling.csv"); } } Mas esse código não funciona no Livewire. Depois de pesquisar o Livewire, o Laravel, o Copilot e um monte de tentativa e erro, cheguei nesse código: arquivo app > Livewire > Lorcamento.php <?php namespace App\Livewire; use App\Models\tbhistped; use App\Models\tbpedido; use App\Models\tbpessoa; use App\Models\tbprod; use Livewire\Attributes\Layout; use Livewire\Component; #[Layout('components.layouts.app',['titulo'=>'Orçamento'])] class Lorcamento extends Component { public $bling,$histped,$mensagem,$modal,$modal2; public $pedido,$pessoa,$procPed,$prod,$qt,$vendido,$vr=[]; // listagem parcial function gerarBling() { $this->modal = false; $this->modal2 = false; $pedido = $this->pedido; $pBling = $this->bling; tbpedido::where('ped',$pedido)->update(['bling'=>$pBling]); $contato="Consumidor Final"; $itens=tbhistped::where('ped',$pedido)->get(); $previa=tbhistped::where('ped',$pedido)->where('subtotal','<',0) ->sum('subtotal'); $desconto=$previa ? abs($previa) : 0; $total=tbpedido::where('ped',$pedido)->value('total'); $data=date('d/m/Y',strtotime(tbpedido::where('ped',$pedido)->value('dia'))); $dados = array( array("Número pedido","Nome Comprador","Data","CPF/CNPJ Comprador","Endereço Comprador", "Bairro Comprador","Número Comprador","Complemento Comprador","CEP Comprador","Cidade Comprador", "UF Comprador","Telefone Comprador","Celular Comprador","E-mail Comprador","Produto", "SKU","Un","Quantidade","Valor Unitário","Valor Total", "Total Pedido","Valor Frete Pedido","Valor Desconto Pedido","Outras despesas","Nome Entrega", "Endereço Entrega","Número Entrega","Complemento Entrega","Cidade Entrega","UF Entrega", "CEP Entrega","Bairro Entrega","Transportadora","Serviço","Tipo Frete", "Observações","Qtd Parcela","Data Prevista","Vendedor","Forma Pagamento", "ID Forma Pagamento")); foreach($itens as $item) { if($item->subtotal>0) { $dados[]=array($pBling,$contato,$data,null,null, null,null,null,null,null, null,null,null,null,null, $item->codprod,$item->un,$item->qt,$item->unitario,$item->subtotal, $total,null,$desconto,null,null, null,null,null,null,null, null,null,null,null,null, null,1,$data,null,1, 0); } } $path=storage_path(); $arquivo = fopen($path.$pBling.".csv", "w+"); fputcsv($arquivo, $dados[0]); foreach ($dados as $linha) { if ($linha != $dados[0]) { fputcsv($arquivo, $linha); } } fclose($arquivo); return response()->download($path.$pBling.".csv","$pBling.csv") ->deleteFileAfterSend(true); } } Esse código funciona tanto no Windows quanto no Hostinger. Mas dessa vez eu tive a curiosidade de saber onde exatamente o Laravel cria o arquivo csv. Do jeito que eu fiz, o Laravel cria o arquivo no diretório raíz, e eu chamei o arquivo de 1234.csv, já o Laravel muda o nome para storage1234.csv. Na hora de fazer o download, ele desce com o nome 1234.csv. Eu não sei se posso ou não usar o diretório raiz, mas é assim que estou trabalhando. Aqui no Windows, eu consegui criar o arquivo na pasta Storage, mas lá na Hostinger eu não tenho a menor ideia de como fazer isso.
  29. Tudo indica que o Livewire é a versão PHP do Ajax. Eu não consegui trabalhar com o Ajax, mas eu estou conseguindo me entrosar com o Livewire. Em homenagem ao Livewire, eu criei um código PHP que tenta imitar a mágica que ele faz: arquivo teste.php <?php class Teste { public $mensagem, $renda, $view; function visao() { $this->view = " <div>$this->mensagem</div> <form method=post> <input name=renda onchange=submit() placeholder=$this->renda> </form> a sua renda é de $this->renda "; echo $this->view; } function __construct() { $this->renda=$_POST['renda'] ?? null; $this->mensagem="Qual a sua renda?"; $this->visao(); } } new Teste;
  30. Fiz um ajuste para o modal informar ou solicitar informação do usuário. Ele funciona no notebook, não ficou nada legal no celular e não tenho um tablet para testar: arquivo resources > views > livewire > lorcamento.blade.php <div> @if($modal) <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> @if($modal2) <flux:input wire:model="bling" wire:change="gerarBling" /> @endif <flux:button wire:click="fecharModal" class="mt-2"> Fechar </flux:button> </div> </div> @endif <!-- listagem parcial --> </div> arquivo app > Livewire > Lorcamento.php <?php namespace App\Livewire; use App\Models\tbhistped; use App\Models\tbpedido; use App\Models\tbpessoa; use App\Models\tbprod; use Livewire\Attributes\Layout; use Livewire\Component; #[Layout('components.layouts.app',['titulo'=>'Orçamento'])] class Lorcamento extends Component { public $bling,$histped,$mensagem,$modal,$modal2; public $pedido,$pessoa,$procPed,$prod,$qt,$vendido,$vr=[]; function apagarBling($pedido) { tbpedido::where('ped',$pedido)->update(['bling'=>null]); $this->montarPedido($pedido); } function blingar($vendido=null) { if(is_null($vendido)) { $this->mensagem="O pedido Bling só pode ser criado depois de registrar a venda"; $this->modal=true; } else { $this->mensagem="Número do pedido Bling"; $this->modal=true; $this->modal2=true; } } function blingProximo() { $numeros=tbpedido::whereNotNull('bling')->orderBy('bling')->get(); $intervalos=[]; $inicio=$fim=$numeros[0]->bling; foreach($numeros as $numero) { if($numero->bling == $fim || $numero->bling == $fim + 1) { $fim=$numero->bling; } else { $intervalos[]=($inicio==$fim) ? $inicio : "$inicio-$fim"; $inicio=$fim=$numero->bling; } } $intervalos[]=($inicio==$fim) ? $inicio : "$inicio-$fim"; $this->mensagem="Pedidos já utilizados: "; foreach($intervalos as $key => $i) { $this->mensagem .= $i; if($key===array_key_last($intervalos)) { $this->mensagem .= "."; } else { $this->mensagem .= ","; } } $this->modal=true; } function fecharModal() { $this->modal=false; $this->modal2=false; } // listagem parcial }
  1. Mais Resultados


  • Estatísticas dos Fóruns

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