Laravel France

Laravel 8 - Créer une vue père/enfants (Master/details)

Avatar de AiméWahi
AiméWahi

Bonjour à TOUS, Je viens d'arriver sur ce forum. Voici pratiquement 01 mois que je cherche une solution pour un élément de mon application. Je cherche en effet à créer une vue qui permet d'insérer simultanément dans 02 différentes tables, un enregistrement père avec les enregistrement enfants associés. Il s'agit concrètement des informations sur une fiche d'objectifs et les objectifs associés. Ci-dessous les informations du controleur et de la vue Merci d'avance pour votre aide.

Controller --------------------------------------------------------------------------

Avatar de CinquièmeDimension
CinquièmeDimension

Salut,

Utilise le bouton </> sinon on ne voit pas ton code

Avatar de AiméWahi
AiméWahi

Bonjour, Bien noté. Ci-dessous le code.

Controller --------------------------------------------------------------------------
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Http\Controllers\ObjsagController;
use App\Ficsobjsag;
use App\Objsag;
use App\Catacteval;
use App\Typesobjs;
use App\Perevals;
use App\Http\Requests\FicsobjsagRequest;
use App\Http\Requests\ObjsagRequest;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

 public function index(Ficsobjsag $model)
    {
		$objsags = objsag::where('idficobjs','idficobjs')->get();
		return view('ficsobjsag.index',['ficsobjsag' =>$model->all()->sortBy('Nomagent')]);
    }
	
	public function create()
    {
    $objsags = objsag::orderBy('Numobjag')->get();
	$typesobjs = typesobjs::orderBy('idtypeobjs')->get();
	$catactevals = catacteval::orderBy('idcatacteval')->get();
	$perevals = Perevals::where('Etpereval','En cours')->get();
	$objsags = objsag::all();
    return view('ficsobjsag.create',compact('objsags','typesobjs','catactevals','perevals'));
    }

   public function store(FicsobjsagRequest $request)
    {
     $model->create($request->all());
	 $numobjags = $request->input('numobjags',[]);
	 $typeobjags = $request->input('typeobjags',[]);
     $libobjags = $request->input('libobjags',[]);
     for ($objsag=0; $objsag < count($objsags); $objsag++) {
        if ($objsags[$objsag] != '') {
            $ficobjsag->objsags()->attach($objsags[$objsag], ['numobjag' => $numobjags[$objsag],'typeobjag' => $typeobjags[$objsag],'libobjag' => $libobjags[$objsag]]);
        }
    }
	 return redirect()->route('ficsobjsag.index')->withStatus(__('La fiche a été bien créée. Merci'));   
    }
	
   public function update(FicsobjsagRequest $request, Ficsobjsag $ficsobjsag)
    {
		$ficsobjsag->update($request->all());
        return redirect()->route('ficsobjsag.index')->withStatus(__('La fiche a été mise à jour.'));
    }

   
    public function edit(Ficsobjsag $ficobjsag)
    {
 	 return view('ficsobjsag.edit', compact('ficobjsag'));
    }
	
}

Vue -------------------------------------------------------------------------
@extends('layouts.app')
@section('content')
  <div class="content">
    <div class="container-fluid">
      <div class="row">
        <div class="col-md-12">
          <form method="post" enctype="multipart/form-data" action="{{ route('ficsobjsag.store') }}" autocomplete="off" class="form-horizontal">
            @csrf
            @method('post')
            <div class="card ">
              <div class="card-header card-header-warning card-header-icon">
                <div class="card-icon">
                  <i class="material-icons">edit_calendar</i>
                </div>
                <h4 class="card-title">{{ __('Nouvelle fiche d\'objectifs') }}</h4>
              </div>
              <div class="card-body ">
                <div class="row">
                  <div class="col-md-12 text-right text-lowercase">
                      <a href="{{ route('ficsobjsag.index') }}" class="btn btn-sm btn-warning">{{ __('Annuler') }}</a>
                  </div>
                </div>

                <div class="row">
                  <label class="col-sm-2 col-form-label">{{ __('Campagne') }}</label>
                  <div class="col-sm-7">
                    <div class="form-group{{ $errors->has('ancamp') ? ' has-danger' : '' }}">
                      <input class="form-control{{ $errors->has('ancamp') ? ' is-invalid' : '' }}" name="ancamp" id="input-ancamp" type="text" placeholder="{{ __('Année de campagne') }}" value="{{ old('ancamp') }}" required="true" aria-required="true"/>
                      @include('alerts.feedback', ['field' => 'ancamp'])
                    </div>
                  </div>
                </div>
                <div class="row">
                  <label class="col-sm-2 col-form-label">{{ __('Nom & Prénoms') }}</label>
                  <div class="col-sm-7">
                    <div class="form-group{{ $errors->has('Nomagent') ? ' has-danger' : '' }}">
                      <input class="form-control{{ $errors->has('Nomagent') ? ' is-invalid' : '' }}" name="Nomagent" id="input-Nomagent" type="text" placeholder="{{ __('Nom & Prénoms') }}" value="{{ old('Nomagent') }}" required="true" aria-required="true" />
                      @include('alerts.feedback', ['field' => 'Nomagent'])
                    </div>
                  </div>
                </div>	
										
               <div class="row">
                  <label class="col-sm-2 col-form-label">{{ __('Matricule') }}</label>
                  <div class="col-sm-7">
                    <div class="form-group{{ $errors->has('Matagent') ? ' has-danger' : '' }}">
                      <input class="form-control{{ $errors->has('Matagent') ? ' is-invalid' : '' }}" name="Matagent" id="input-Matagent" type="text" placeholder="{{ __('Matricule') }}" value="{{ old('Matagent') }}" required="true" aria-required="true"/>
                      @include('alerts.feedback', ['field' => 'Matagent'])
                    </div>
                  </div>
                </div>
                
				<div class="row">
                  <label class="col-sm-2 col-form-label">{{ __('Catégorie') }}</label>
                  <div class="col-sm-7">
                    <div class="form-group{{ $errors->has('catevalag') ? ' has-danger' : '' }}">
                      <input class="form-control{{ $errors->has('catevalag') ? ' is-invalid' : '' }}" name="catevalag" id="input-catevalag" type="text" placeholder="{{ __('Catégorie') }}" value="{{ old('catevalag') }}" required="true" aria-required="true"/>
                      @include('alerts.feedback', ['field' => 'catevalag'])
                    </div>
                  </div>
                </div>
				<div class="row">
                  <label class="col-sm-2 col-form-label">{{ __('Type d\'évaluation') }}</label>
                  <div class="col-sm-7">
                    <div class="form-group{{ $errors->has('typeval') ? ' has-danger' : '' }}">
                      <input class="form-control{{ $errors->has('typeval') ? ' is-invalid' : '' }}" name="typeval" id="input-typeval" type="text" placeholder="{{ __('Type d\'évaluation') }}" value="{{ old('typeval') }}" required="true" aria-required="true"/>
                      @include('alerts.feedback', ['field' => 'typeval'])
                    </div>
                  </div>
				</div>
				<div class="row">
                  <label class="col-sm-2 col-form-label">{{ __('Evaluateur') }}</label>
                  <div class="col-sm-7">
                    <div class="form-group{{ $errors->has('Nomevaltr') ? ' has-danger' : '' }}">
                      <input class="form-control{{ $errors->has('Nomevaltr') ? ' is-invalid' : '' }}" name="Nomevaltr" id="input-Nomevaltr" type="text" placeholder="{{ __('Evaluateur') }}" value="{{ old('Nomevaltr') }}" required="true" aria-required="true"/>
                      @include('alerts.feedback', ['field' => 'Nomevaltr'])
                    </div>
                  </div>
				</div>
				
				<div class="row">
					<div class="col-md-12">
						<div class="card">
							<div class="card-header">Objectifs de l’agent</div>
								<div class="card-body">
								<div class="row">
						<div class="col-md-12">	
						<table class="table table-no-bordered table-hover">
						<thead class="text-sm text-white bg-success"><strong>
						<tr>
                        <th>N°</th>
                        <th>Type</th>
						<th>Libellé</th>
                        <th scope="col"><a class="addRow"><i class="fa fa-plus"></i></a></th>
						</tr>
						</thead>
					<tbody>
						<tr>
						<td><input type="integer" name="numobjag[]" class="form-control"/></td>
						<td><input type="integer" name="typeobjag[]" class="form-control"/></td>
						<!--
						<td><select name="typeobjag" class="form-control">
                                <option value="">...Sélectionnez...</option>
                                @foreach ($typesobjs as $typesobj)
                                    <option value="{{ $typesobj->Destypeobjs }}">
                                        {{ $typesobj->Destypeobjs }} 
                                    </option>
                                @endforeach
                            </select>
                        </td>
						-->
                        <td><input type="text" name="libobjag[]" class="form-control"/></td>
						<td><a href="javascript:void(0)" id="delete-row" class="remove">
							<i class="fa fa-fw fa-trash fa-lg text-danger"></i>
							</a>
						</td>
						</tr>
                   </tbody>
				</table>
			</div>
		    		</div>
				</div>
			</div>
	
              </div>
              
            </div>				
					</div>
				</div>
			<div class="row">
              <div class="card-footer ml-auto mr-auto">
                <button type="submit" class="btn btn-success">{{ __('Valider') }}</button>
              </div>
			</div>
		</form>
		</div>
	</div>
  </div>
</div>
<script type="text/javascript">
    $(document).ready(function(){
        $('.addRow').on('click', function () {
            addRow();
        });
        function addRow() {
            var addRow = '<tr>\n' +
              ' <td><input type="text" name="numobjag[]" class="form-control"></td>\n' +
              ' <td><input type="text" name="typeobjag[]" class="form-control" ></td>\n' +
              ' <td><input type="text" name="libobjag[]" class="form-control"></td>\n' +
			  ' <td><a id="remove"   class="remove"><i class="fa fa-fw fa-trash fa-lg text-danger"></i></a>\n' +
			  '</tr>';
              $('tbody').append(addRow);
        };
        $('.remove').live('click', function () {
            var l =$('tbody tr').length;
            if(l==1){
                alert('Vous ne pouvez pas supprimer la dernière ligne')
            }else{

                $(this).parent().parent().remove();
            }

        });
    });
</script>
@endsection
Avatar de CinquièmeDimension
CinquièmeDimension

Tel quel qu'est-ce qui se passe ? T'as une erreur ? La page s'affiche ?

Attention aux majuscules du genre $objsags = objsag::where('idficobjs','idficobjs')->get(); alors que l'objet use est Objsag avec une majuscule.

Avatar de AiméWahi
AiméWahi

Merci pour votre feedback. Alors lorsque je valide, la page du formulaire principal reste affichée à l'écran avec les données dans les champs. Pas de message d'erreur. Par contre les lignes d'objectifs ajoutées sont réinitialise (01 seule comme à l'ouverture du formulaire). Aucune donnée insérée dans les tables

Concernant la casse des noms des objets: objsag est la migration contenant les objectifs Objsag, le modèle. Je confirme que j'ai établi les relations un-à-plusieurs entre les modèles Ficsobjsag et Objsag.

Merci

Vous ne pouvez pas répondre à ce sujet.