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

Liveware: usando o foreach para nomear vários <input>


Frank K Hosaka

Pergunta

arquivo app > Liveware > Lprevisao.php
<?php
namespace App\Livewire;
use App\Models\tbdiario;
use App\Models\tbmercado;
use App\Models\tbprevisao;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Livewire\Component;
use Livewire\Attributes\Layout;

#[Layout('components.layouts.app',['title'=>'Previsão'])]
class Lprevisao extends Component {

    public $conta,$mercado,$painel,$total,$valor=[];

    public function alterar($index,$conta) { 
        $valor=deca($this->valor[$index]);
        tbprevisao::where('conta',$conta)->update(
            ['valor'=>$valor]);
        return $this->mount();
    }

    public function mount() {
        $balancete = new Lbalancete();
        $balancete->tbw(new Request(['opcao'=>1]));
        $this->mercado=tbmercado::all();
        $this->total = DB::table('tbmercado')->select(
            DB::raw('SUM(venda) as tvenda'), DB::raw('SUM(tarifa) as ttarifa'),
            DB::raw('SUM(conta) as tconta'))->first();
        $this->painel=DB::table('tbprevisao')->join('tbw', 'tbprevisao.conta', '=', 'tbw.conta')
            ->orderBy('tbprevisao.conta')->get();
    }
}

arquivo resources > views > livewire > lprevisao.blade.php
<div>
    <div class="flex">
        <div class="w-[50px] text-right">Conta</div>
        <div class="w-[130px] px-2">Descricao</div>
        <div class="w-[150px] text-right">Previsão</div>
        <div class="w-[150px] text-right">Contábil</div>
        <div class="w-[150px] text-right">Divergência</div>
    </div>
    
    <?php foreach($painel as $index => $p): ?>
        <div class=flex>
            <div class="w-[50px] text-right"><?=$p->conta?></div>
            <div class="w-[188px] ml-2 truncate"><?=$p->descricao?></div>
            <div class="w-[130px] py-0">
                    <input class="w-[130px] text-right py-0 border-none" 
                        wire:model="valor.{{$index}}"
                        wire:change="alterar({{$index}},{{$p->conta}})"
                        value=<?=dec($p->valor)?>>
            </div>
            <div class="w-[130px] text-right"><?=dec($p->fim)?></div>
            <div class="w-[130px] text-right">
                <?=dec(abs(round($p->valor - $p->fim,2)))?>
            </div>
        </div>
    <?php endforeach;?>
</div>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

O código que eu publiquei não funcionou na Hostinger, há muito erro de lógica que o Copilot encontrou.

Ele disse que eu não posso executar a função mount( ) mais de uma vez.

Para emparelhar a variável array( ) do Livewire com wire:model no blade, você precisa ter cereteza que o array( ) não está vazio, senão não vai aparecer nada no Blade.

arquivo app > Livewire > lprevisao.php
<?php
namespace App\Livewire;
use App\Models\tbdiario;
use App\Models\tbmercado;
use App\Models\tbprevisao;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Livewire\Component;
use Livewire\Attributes\Layout;

#[Layout('components.layouts.app',['title'=>'Previsão'])]
class Lprevisao extends Component {

    public $mercado,$painel,$total;
    public $inputs=[];

    public function atualizar($index,$conta) {
        $valor=deca($this->inputs[$index]);
        tbprevisao::where('conta',$conta)->update(['valor'=>$valor]);
        $this->painel=DB::table('tbprevisao')->join('tbw', 'tbprevisao.conta', '=', 'tbw.conta')
            ->orderBy('tbprevisao.conta')->get();
        $this->inputs=[];
        foreach($this->painel as $p) {
            $this->inputs[] = dec($p->valor);
        }
    }

    public function mount() {
        $balancete = new Lbalancete();
        $balancete->tbw(new Request(['opcao'=>1]));
        $this->mercado=tbmercado::all();
        $this->total = DB::table('tbmercado')->select(
            DB::raw('SUM(venda) as tvenda'), DB::raw('SUM(tarifa) as ttarifa'),
            DB::raw('SUM(conta) as tconta'))->first();
        $this->painel=DB::table('tbprevisao')->join('tbw', 'tbprevisao.conta', '=', 'tbw.conta')
            ->orderBy('tbprevisao.conta')->get();
        foreach($this->painel as $p) {
            $this->inputs[] = dec($p->valor);
        }
    }
}

arquivo lprevisao.blade.php
div>
    <div class="flex">
        <a href=diarioInicio class="w-[100px] text-blue-700">Diario</a>
        <a href=previsaoPoupanca class="w-[100px] text-blue-700">Poupança</a>
    </div>
    <div class="flex">
        <div class="w-[50px] text-right">Conta</div>
        <div class="w-[130px] px-2">Descricao</div>
        <div class="w-[150px] text-right">Previsão</div>
        <div class="w-[150px] text-right">Contábil</div>
        <div class="w-[150px] text-right">Divergência</div>
    </div>
    
    <?php foreach($painel as $key => $p): ?>
        <div class=flex>
            <div class="w-[50px] text-right"><?=$p->conta?></div>
            <div class="w-[188px] ml-2 truncate"><?=$p->descricao?></div>
            <div class="w-[130px] py-0">
                    <input class="w-[130px] text-right py-0 border-none" 
                        wire:model.defer="inputs.{{$key}}"
                        wire:change="atualizar({{$key}},{{$p->conta}})">
            </div>
            <div class="w-[130px] text-right"><?=dec($p->fim)?></div>
            <div class="w-[130px] text-right">
                <?=dec(abs(round($p->valor - $p->fim,2)))?>
            </div>
        </div>
    <?php endforeach;?>
</div>

 

Editado por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

Participe da discussão

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

Visitante
Responder esta pergunta...

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

  Apenas 75 emoticons são permitidos.

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

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

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



  • Estatísticas dos Fóruns

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