Display options with multiple select and mark the options chosen in Laravel

Asked

Viewed 265 times

1

I have a Collection in the variable $paymentMethods with forms of payment:

inserir a descrição da imagem aqui

And I have another Collection in the $timelines variable that has a Many to Many relationship with payment methods. I need to list in the view in a select the available payment methods and mark the selected ones. With what I did the available payment methods are repeated and are marked the payment methods of all timelines.

Controller:

namespace App\Http\Controllers;

use App\Timeline;
use App\Order;
use App\PaymentMethod;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class TimelineController extends Controller
{

public function indexCustomer($order, $supplier)
{
    $user = Auth::user();
    $typeUser = $user->userable_type;
    $order = Order::find($order);
    $paymentMethods = PaymentMethod::all();
    $paymentMethodsOrder = $order->paymentMethods->map(function ($item, $key) {
        return $item['name'];
    })->toArray();

    $timelines = Timeline::where('order_id', $order->id)->where('supplier_id', $supplier)->get();

    return view('customer.order.timeline')
        ->with('order', $order)
        ->with('paymentMethods', $paymentMethods)
        ->with('paymentMethodsOrder', $paymentMethodsOrder)
        ->with('timelines', $timelines)
        ->with('supplier', $supplier);
}

public function storeCustomer(Request $request, $order, $supplier)
{
    $user = Auth::user();
    $typeUser = $user->userable_type;
    $order = Order::find($order);
    $paymentMethods = PaymentMethod::all();
    $paymentMethodsOrder = $order->paymentMethods->map(function ($item, $key) {
        return $item['name'];
    })->toArray();

    $timeline = new Timeline;
    $timeline->user_id = $user->id;
    $timeline->order_id = $order->id;
    $timeline->customer_id = $user->userable->id;
    $timeline->supplier_id = $supplier;
    $timeline->status = $request->status;
    $priceAverage = str_replace('.', '', $request->price_average);
    $priceAverage = str_replace(',', '.', $priceAverage);
    $priceAverage = floatval($priceAverage);
    $timeline->price_average = $priceAverage;
    $timeline->description = $request->description;
    $timeline->save();

    $timelines = Timeline::where('order_id', $order->id)->where('supplier_id', $supplier)->get();

    return view('customer.order.timeline')
        ->with('order', $order)
        ->with('paymentMethods', $paymentMethods)
        ->with('paymentMethodsOrder', $paymentMethodsOrder)
        ->with('timelines', $timelines)
        ->with('supplier', $supplier);
}

public function indexSupplier($order)
{
    $user = Auth::user();
    $typeUser = $user->userable_type;
    $order = Order::find($order);
    $paymentMethods = PaymentMethod::all();
    $paymentMethodsOrder = $order->paymentMethods->map(function ($item, $key) {
        return $item['id'];
    })->toArray();

    $timelines = Timeline::where('order_id', $order->id)->where('supplier_id', $user->userable->id)->get();

    return view('supplier.order.timeline')
        ->with('order', $order)
        ->with('paymentMethods', $paymentMethods)
        ->with('paymentMethodsOrder', $paymentMethodsOrder)
        ->with('timelines', $timelines);

}


public function storeSupplier(Request $request, $order)
{
    $user = Auth::user();
    $typeUser = $user->userable_type;
    $order = Order::find($order);
    if (Timeline::activeSupplierOrder($user->userable->id)->count() == 0) {
        $order->suppliers()->attach($user->userable->id);
    }
    $paymentMethods = PaymentMethod::all();
    $paymentMethodsOrder = $order->paymentMethods->map(function ($item, $key) {
        return $item['name'];
    })->toArray();

    $timeline = new Timeline;
    $timeline->user_id = $user->id;
    $timeline->order_id = $order->id;
    $timeline->supplier_id = $user->userable->id;
    $timeline->customer_id = $order->user->userable->id;
    $timeline->status = $request->status;
    $priceAverage = str_replace('.', '', $request->price_average);
    $priceAverage = str_replace(',', '.', $priceAverage);
    $priceAverage = floatval($priceAverage);
    $timeline->price_average = $priceAverage;
    $timeline->description = $request->description;
    $timeline->save();

    foreach ($request->payment_methods as $paymentMethodId) {
        $timeline->paymentMethods()->attach($paymentMethodId);
    }

    $timelines = Timeline::where('order_id', $order->id)->where('supplier_id', $user->userable->id)->get();

    return view('supplier.order.timeline')
        ->with('timelines', $timelines)
        ->with('order', $order)
        ->with('paymentMethods', $paymentMethods)
        ->with('paymentMethodsOrder', $paymentMethodsOrder);

}
}

View:

@extends('customer.app')
@section('title', 'Histórico')
@section('content')
<div class="row">
<div class="col-sm-12">
    <div class="timeline">

        <article class="timeline-item alt">
            <div class="text-right">
                <div class="time-show">
                    <a href="#" class="btn btn-custom w-lg">Histórico</a>
                </div>
            </div>
        </article>

        @foreach($timelines as $timeline)
            <article class="timeline-item @if($timeline->user_id == Auth::user()->id) alt @else "" @endif">
                <div class="timeline-desk">
                    <div class="panel m-t-20 m-b-20">
                        <div class="panel-body">
                            <span class="arrow-alt"></span>
                            <span class="timeline-icon bg-info"><i class="zmdi zmdi-circle"></i></span>
                            <p class="timeline-date text-muted"><small>{{ date( 'd/m/Y H:i' , strtotime($timeline->created_at)) }}</small></p>
                            <p class="m-t-10">Status: {{ $timeline->status }}</p>
                            @isset($timeline->price_average)
                                <p class="m-t-10">Valor: R$ {{ number_format($timeline->price_average, 2, ',', '.') }}</p>
                            @endisset
                            @isset($timeline->price_average)
                                @foreach($timeline->paymentMethods as $paymentMethod)
                                    <p class="m-t-10">{{ $paymentMethod['name'] }}</p>
                                @endforeach
                            @endisset
                            <p class="m-t-10">{{ $timeline->description }}</p>
                            <div class="btn-group dropup @if($timeline->user_id == Auth::user()->id) pull-right @else pull-left @endif m-t-10">
                                <a type="button" class="btn btn-primary" href="#" data-toggle="modal" data-target="#con-close-modal">Responder</a>
                            </div>
                        </div>
                    </div>
                </div>
            </article>
        @endforeach
    </div>
</div>
</div>

<!-- Modal -->
<div id="con-close-modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true" style="display: none;">
<form class="form-horizontal" method="POST" action="{{ route('customer.timelines.store', ['order' => $order, 'supplier' => $supplier]) }}">
    {{ csrf_field() }}
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
                <h4 class="modal-title">{{ $order->category->name }}</h4>
            </div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-md-12">
                        <div class="form-group">
                            <label class="control-label m-b-10" style="text-align: left">Você aprova o valor de R$ {{ number_format($timeline->price_average, 2, ',', '.') }} e as condições de pagamento proposto pela banda ou quer fazer uma contraproposta?</label>
                            <select class="form-control" id="status" name="status">
                                <option value="">Selecione</option>
                                <option value="Aprovado">Aprovado</option>
                                <option value="Contraproposta">Contraproposta</option>
                            </select>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div id="price-average-div">
                        <div class="col-md-12">
                            <div class="form-group">
                                <label class="control-label">Informe um valor em reais para contraproposta:</label>
                                <input type="text" class="form-control" id="price-average" name="price_average" value="{{ $timeline->price_average }}">
                            </div>
                        </div>
                        <div class="form-group{{ $errors->has('payment_methods') ? ' has-error' : '' }}">
                            <div class="col-md-9">
                                <label for="payment_methods">Formas de Pagamento<h6>Selecione as formas de pagamento oferecidas.</h6></label>
                                <select multiple class="form-control" name="payment_methods[]" required>
                                    @foreach($paymentMethods as $paymentMethod)
                                        <option {{ $paymentMethod->id == 3 ? 'selected' : '' }} value="{{ $paymentMethod->id }}">{{ $paymentMethod->name }}</option>
                                    @endforeach
                                </select>
                                @if ($errors->has('payment_methods'))
                                    <span class="help-block">
                                        <strong>{{ $errors->first('payment_methods') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>
                    </div>
                    <div class="col-md-12">
                        <div class="form-group no-margin">
                            <label class="control-label">Observações:</label>
                            <textarea name="description" class="form-control autogrow" style="overflow: hidden; word-wrap: break-word; resize: horizontal; height: 104px;">{{ $timeline->description }}</textarea>
                        </div>
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default waves-effect" data-dismiss="modal">Fechar</button>
                <button type="submit" class="btn btn-primary waves-effect waves-light warning-alert-interest">Enviar</button>
            </div>
        </div>
    </div>
</form>
</div>
@endsection

@push('scripts')
<script src="{{ asset('assets/js/jquery.mask.js') }}"></script>
<script>
$(document).ready(function(){
    $('#price-average').mask('000.000,00', {reverse: true});
});
</script>
@endpush

View with repeated payment methods and selected payment options for all timelines:

inserir a descrição da imagem aqui

1 answer

1


easy:

1.

exchange the parts: $paymentMethods = PaymentMethod::all(); $paymentMethodsOrder = $order->paymentMethods->map(function ($item, $key) { return $item['id']; })->toArray();

for: $paymentMethods = PaymentMethod::pluck('name', 'id'); $paymentMethodsOrder = $order->paymentMethods->pluck('id')->toArray();

2.

using (https://laravelcollective.com/docs/5.3/html#drop-down-lists) change your < select > by: Form::select('payment_methods[]', $paymentMethods, $paymentMethodsOrder, ['multiple', 'class' => 'form-control', 'required']);

Note: something else takes a look over (https://laravel.com/docs/5.3/eloquent-mutators) to clean up this code, also take a look at the ->fill().

  • How would you look without the Canon?

  • Another thing, I want to compare $paymentsMethods with $timelines each of which has a Many to Many with the Paymentmethods class and not with $paymentsMethodsOrder

  • installation Collective: https://laravelcollective.com/docs/5.3/html#installation for use in Formulars, already bindings for vc

  • so your timeline has to have a relationship with Paymentmethod

  • I’ve used Windows and I don’t like it. Timeline has a relationship with Paymentmethod. I believe that this way will not have how to do, in the case when I click on a button that has the data opens a modal that has this view. I have to pass the data already on the card to that modal.

  • I put the whole view.

  • is in modal q has select, right? but, $timelines ta off...

  • you need to extract the id from the Timeline relationship with Paymentmethod and then use it in Form::select. cara vc don’t like Collective, but it’s the easiest way to mount html/Formularios

Show 4 more comments

Browser other questions tagged

You are not signed in. Login or sign up in order to post.