[Application 61] PompeStation .

pompestation

Introduction


PompeStation, gestion de station service.

Un Gros projet, la gestion du  crud est importante ici, avec un back end en Php-Mysql.

Les jointures seront omniprésentes, ainsi que les contraintes d’intégrité !

Qu’est que la contrainte d’intégrité ? Un exemple on ne peut plus simple , si je crée une station service, puis que je lui associe 2 citernes, il ne serait pas logique de pouvoir supprimer ensuite cette station service puis de laisser les 2 citernes orphelines. La contrainte d’intégrité, en l’occurence, 2 clefs étrangères, nous empéchera donc de supprimer cette station service.

Inspiré par la rapidité de la génération automatique de code de Hibernate avec Java et Hibernate Code Génération, je décide d’aller plus vite avec le CRUD en PHP. 

Les phases de conception de la Base de données :
. Création du modèle conceptuel avec Merise (Création des Entités, Création des attributs, Création des relations, Création des cardinalités.) (MCD)
. Création du modèle relationnel avec Mysql Workbench (Mise en Place de l’auto incrémentation sur les IDS, Création des clefs étrangères pour la contrainte d’intégrité, création des triggers.) (MPD)
. Phase de recettes avec les utilisateurs.

Voici un schéma du mpd au jour 1, par contre je placerais les clefs étrangères dans un second temps . (Dans mySql Workbench, cliquer sur Database/reverce Engineering pour générer le Mpd, ici, on peut voir que je n’ai créé qu’une clef étrangère entre station et citernes qui empêche la suppression d’une station si une citerne est encore associée à celle ci, la cardinalité étant 1(station)->n(citernes), la relation Merise étant « appartient » .

Par contre, pour les produits, la cardinalité vis à vis d’une station sera M,N, étant donné qu’un même produit pourra être stocké dans plusieurs stations, la relation étant le Stock, et qu’il exite plusieurs produits.

Je n’ai pas encore intégré les tables de la gestion des stocks et le trigger concerné… Générer le Mpd est bien utile pour détecter des erreurs de conception, par exemple, là on peut constater que la colonne idstation de la table produits n’a pas le bon type(varchar au lieux de int):

aaaaaaaa.png

J’ai donc élaboré une méthode pour normaliser et aller le plus vite possible pour créer une application AngularJs avec un Back End Php-Mysql : Toutes les vues sont copiées collées, ainsi que tous les controleurs ainsi que le code PHP-Mysql , ensuite, à la création de la nouvelle vue, je ne fais qu’un control+H, puis je change seulement le nom du modèle de données(Au singulier) dans le contrôleur et dans la vue et dans le code PHP-MYSQL Tout est pratiquement immédiat… Du coup j’ai pu faire un CRUD complet sur 8 vues en 1 heure et demi !
C’est un tout petit peu plus long lorsqu’il faut faire des jointures, mais on a la main sur tout le code facilement et le code est  hyper clair et facile à comprendre contrairement à ce que je faisais avant. Il est également facilement maintenable, étant donné que si il faut ajouter un champs dans une vue, il n’y a rien à faire hormis remanier la table SQL, la vue et un peu le back end…

Je n’utilise pas de générateur de CRUD, parce qu’avec ce Crud perso, je vais pouvoir ajouter des photos et pleins d’autres personnalisations …

Photo de l’application au jour 1 :


pompestationlogi

Principe du code :


Chaque vue est associée à un controleur AngularJs qui lance des appels Crud au Back End.

Le code PHP (Back End)


Le code du Back End (Pas encore de PDO ni de prévention d’injection SQL ), je copie colle à GOGO, puis les touches control+H « remplacer » dans notepad, c’est vraiment très rapide ( quelques minutes pour chaque nouveaux crud !

vues

On peut renvoyer un message JSON confirmant la bonne marche du back end avec une ligne de ce type :
print_r(json_encode(‘Procédure Back end Ok’));
ensuite, on récupère ce message dans la fonction de rappel AngularJS, il est contenu dans data
:

<?php

include('connexionConfig.php');
mysql_set_charset('utf-8');  /// très important
/* header( 'content-type: text/html; charset=utf-8' );  */
error_reporting(E_ALL ^ E_NOTICE); // important pour ne pas afficher les notice PHP sans cela le script ne marche pas.

/**  Switch Case pour récupérer la l'action demandée par le controleur  Angular **/

switch($_GET['action'])  {
	case 'get_stations' :	get_stations();
    break;
	case 'insert_station' :	insert_station();
    break;
	case 'delete_station' :	delete_station();
    break;
	case 'update_station' :	update_station();
    break;
    case 'get_produits' :	get_produits();
    break;
	case 'insert_produit' :	insert_produit();
    break;
	case 'delete_produit' :	delete_produit();
    break;
	case 'update_produit' :	update_produit();
    break;
	case 'get_citernes' :	get_citernes();
    break;
	case 'insert_citerne' :	insert_citerne();
    break;
	case 'delete_citerne' :	delete_citerne();
    break;
	case 'update_citerne' :	update_citerne();
    break;
	case 'get_pompes' :		get_pompes();
    break;
	case 'insert_pompe' :	insert_pompe();
    break;
	case 'delete_pompe' :	delete_pompe();
    break;
	case 'update_pompe' :	update_pompe();
    break;
	case 'get_intervenants' :	get_intervenants();
    break;
	case 'insert_intervenant' :	insert_intervenant();
    break;
	case 'delete_intervenant' :	delete_intervenant();
    break;
	case 'update_intervenant' :	update_intervenant();
    break;
	case 'get_fournisseurs' :	get_fournisseurs();
    break;
	case 'insert_fournisseur' :	insert_fournisseur();
    break;
	case 'delete_fournisseur' :	delete_fournisseur();
    break;
	case 'update_fournisseur' :	update_fournisseur();
    break;
	case 'get_tresoreries' :	get_tresoreries();
    break;
	case 'insert_tresorerie' :	insert_tresorerie();
    break;
	case 'delete_tresorerie' :	delete_tresorerie();
    break;
	case 'update_tresorerie' :	update_tresorerie();
    break;
	case 'get_reglements' :		get_reglements();
    break;
	case 'insert_reglement' :	insert_reglement();
    break;
	case 'delete_reglement' :	delete_reglement();
    break;
	case 'update_reglement' :	update_reglement();
    break;
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

function get_stations() {
	/* SQL. */
    $q = "SELECT * from stations";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_station() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO stations VALUES (null,'".$data->nom."','".$data->type."','".$data->photo."','".$data->telephone."','".$data->email."','".$data->taille."')";
	$qry = mysql_query($q);
	exit();
}

 function delete_station() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM stations WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_station() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE stations SET nom='".$data->nom."',type='".$data->type."',photo='".$data->photo."',telephone='".$data->telephone."',email='".$data->email."',taille='".$data->taille."',idfournisseur='".$data->idfournisseur."' WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

 function get_produits() {
	/* SQL. */
    $q = "SELECT * from produits";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_produit() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO produits VALUES (null,'".$data->reference."','".$data->designation."','".$data->prixachat."','".$data->prixvente."','".$data->idfournisseur."')";
	$qry = mysql_query($q);
	exit();
}

 function delete_produit() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM produits WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_produit() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE produits SET reference='".$data->reference."',designation='".$data->designation."',prixachat='".$data->prixachat."',prixvente='".$data->prixvente."',idfournisseur='".$data->idfournisseur."' WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

function get_citernes() {
	/* SQL. */
    $q = "SELECT * from citernes";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_citerne() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO citernes VALUES (null,'".$data->nom."','".$data->volumemax."','".$data->typecarburant."')";
	$qry = mysql_query($q);
	exit();
}

 function delete_citerne() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM citernes WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_citerne() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE citernes SET nom='".$data->nom."',volumemax='".$data->volumemax."',typecarburant='".$data->typecarburant."' WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

function get_pompes() {
	/* SQL. */
    $q = "SELECT * from pompes";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_pompe() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO pompes VALUES (null,'".$data->nom."','".$data->type."','".$data->idciterne."')";
	$qry = mysql_query($q);
	exit();
}

 function delete_pompe() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM pompes WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_pompe() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE pompes SET nom='".$data->nom."',type='".$data->type."',idciterne='".$data->idciterne."'  WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

function get_intervenants() {
	/* SQL. */
    $q = "SELECT * from intervenants";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_intervenant() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO intervenants VALUES (null,'".$data->nom."','".$data->prenom."','".$data->photo."','".$data->telephone."','".$data->email."','".$data->fonction."')";
	$qry = mysql_query($q);
	exit();
        print_r(json_encode('Procédure Back end Ok'));
}

 function delete_intervenant() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM intervenants WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_intervenant() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE intervenants SET nom='".$data->nom."',prenom='".$data->prenom."',photo='".$data->photo."',telephone='".$data->telephone."',email='".$data->email."',fonction='".$data->fonction."' WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

function get_fournisseurs() {
	/* SQL. */
    $q = "SELECT * from fournisseurs";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_fournisseur() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO fournisseurs VALUES (null,'".$data->nom."','".$data->adresse."','".$data->photo."')";
	$qry = mysql_query($q);
	exit();
}

 function delete_fournisseur() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM fournisseurs WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_fournisseur() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE fournisseurs SET nom='".$data->nom."',adresse='".$data->adresse."',photo='".$data->photo."' WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

function get_tresoreries() {
	/* SQL. */
    $q = "SELECT * from tresoreries";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_tresorerie() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO tresoreries VALUES (null,'".$data->nom."','".$data->adresse."')";
	$qry = mysql_query($q);
	exit();
}

 function delete_tresorerie() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM tresoreries WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_tresorerie() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE tresoreries SET nom='".$data->nom."',adresse='".$data->adresse."' WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}

/* --------------------------------------------------CRUD  ------------------------------------------*/

function get_reglements() {
	/* SQL. */
    $q = "SELECT * from reglements";
    $qry = mysql_query($q);

     /* Mets le resultat  dans un tableau . */
      while($row = mysql_fetch_assoc($qry))
        {
        $tab[]= $row;
        }
    /* Convertit en JSON  */
    print_r(json_encode($tab));
    exit();
}

function insert_reglement() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "INSERT INTO reglements VALUES (null,'".$data->type."')";
	$qry = mysql_query($q);
	exit();
}

 function delete_reglement() {
	/* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input"));
	/* SQL. */
	$q = "DELETE FROM reglements WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
	exit();
}

 function update_reglement() {
	$data = json_decode(file_get_contents("php://input"));
	$q = "UPDATE reglements SET type='".$data->type."' WHERE  id=".$data->id." ";
	$qry = mysql_query($q);
}
?>

La vue des intervenants  :


<div class="row" ng-controller="intervenantsCtrl">
	<div class="col-lg-12 " >
		<div class="panel panel-default">

		<div class="panel-heading">Liste</div>
		<scrollable-table watch="intervenants">
		<table  class="table table-bordered table-hover  "  >
			<thead>
			  <tr>
				<th sortable-header col="nom">Nom</th>
				<th sortable-header col="prenom">Prénom</th>
				<th sortable-header col="photo"> Photo</th>
				<th sortable-header col="telephone"> Teléphone</th>
				<th sortable-header col="email"> Email</th>
				<th sortable-header col="fonction"> Fonction</th>
			  </tr>
			</thead>

			<tbody >
			  <tr  ng-repeat="intervenant in intervenants" ng-click="edit($index)"  ng-class="{'selected':$index == selectedRow}">
				 <td >{{intervenant.nom| uppercase}}</td>
				 <td >{{intervenant.prenom}}</td>
				 <td >{{intervenant.photo}}</td>
				 <td >{{intervenant.telephone}}</td>
				 <td >{{intervenant.email}}</td>
				 <td >{{intervenant.fonction}}</td>
			  </tr>
			</tbody>

		</table>
		</scrollable-table>
		 <br>
		   <div class="panel panel-default">
				<!-- Default panel contents -->
				<div class="panel-heading">Intervenant</div>

				<div class="panel-body">
					<div class="row">
					<p>
					 <div class="col-md-3">
						<div class="input-group">
						<span class="input-group-addon" >Nom</span>
						<input class="form-control" ng-model="intervenant.nom"> </input>
						</div><br>
						<div class="input-group">
						<span class="input-group-addon">Prénom</span>
						<input class="form-control" ng-model="intervenant.prenom"> </input>
						</div><br>
						<div class="input-group">
						<span class="input-group-addon">Photo</span>
						<input class="form-control" ng-model="intervenant.photo"> </input>
						</div><br>

					</div>	

					<div class="col-md-3">
						<div class="input-group">
						<span class="input-group-addon" >Téléphone</span>
						<input class="form-control" ng-model="intervenant.telephone"> </input>
						</div><br>
						<div class="input-group">
						<span class="input-group-addon">Email</span>
						<input class="form-control" ng-model="intervenant.email"> </input>
						</div><br>
						<div class="input-group">
						<span class="input-group-addon">Fonction</span>
						<input class="form-control" ng-model="intervenant.fonction"> </input>
						</div><br>

					</div>	

					</p>
					</div>
				</div>

				<div class="panel-footer text-right">
					<button ng-click="nouveau()"  ng-show ="montreBtn4">Nouveau </button>
					<button ng-click="supprimer(intervenant.id)" ng-show ="montreBtn3">Supprimer </button>
					<button ng-click="enregistrer()" ng-show ="montreBtn1">Créer</button>
					<button ng-click="appliquer()" ng-show ="montreBtn2">Valider</button>
				</div>

			</div>

		</div>
	</div>

Le controleur de la vue Intervenants


Le controleur AngularJs de la vue Intervenants. il faut, bien sur, charger la lib angularJs dans index.html pour que cela fonctionne.

La gestion des boutons fonctionne bien mais aurait probablement être simplifiée ….

Lorsque je crée un nouveau controleur pour une nouvelle vue, je ne fais strictement rien d’autre que de copier coller l’ancien controleur puis, dans notepad, bouttons controle + H et « remplacer » l’ancien nom du modèle de données par le nom du nouveau modèle de données !

En d’autres terme, je ne les modifie pas tant qu’il n’y pas de jointures ou du js complexe à coder…

Note: Avec AngularJs 1.5 , les accès $http sont normalement stockés dans des services, cependant, je les créerais après si besoin est.

Note 2: je préfère la notation $scope à la notation this

EDIT IMPORTANT: On peut voir qu’ici j’utilise une sorte d’astuce pour copier une partie du JSON de la liste dans l’objet unique, hors en faisant cela j’ai contrevenu à la la rêgle simple qui implique u’une liste doit présenter une quantité limitée de colonnes (pas d’* dans la requête SQL) et que, lors du clic dans une liste, l’objet UNIQUE doit etre chargé en fonction de son id, avec une requête $http( Ce qui est la normale pour la majorité des sites et apps). Je ne sais pas ce qu’il m’a pris de faire cette « astuce »(peut être pour faire genre c’est immédiat) mais cela n’est pas normalisé, cela fonctionne bien pour les petites listes d’objets comportant peu de critères, mais dans le cas normal, il ne faut pas faire comme cela. Je vais commencer à modifier les vues comportant des objets avec beaucoup de données afin de charger les objets sur requêtes $http à partir de leur ID, pluttôt qu’à partir de la liste JSON pré acquise, ce qui sera beaucoup plus clair si d’autres personnes doivent intervenir dans le prog.. Il faudra du coup inclure dans chaque CRUD dans le fichier PHP, une requête SELECT avec un critère ID. visant à afficher un objet unique .
EDIT 2 : Voir plus bas(Sous le dump) le controleur et la vue modifiée pour cahrger un objet unique à partir de la BDD, en ce cas le filtrage angularJs conitnue à fonctionn


app.controller('intervenantsCtrl', function($scope,$http) {	

/* INITIALISATIONS */
$scope.intervenant = {}; // Contient un seul intervenant et ses variables
$scope.intervenants=[]; // Contient tous les intervenants, ce sont des objets JSON

/* INITIALISATIONS  DIVERSES*/
$scope.montreBtn1 = true; $scope.montreBtn4 = false;
$scope.selectedRow = null;  // Initialiser la var selection de ligne dans le tableau

/* Charge la liste des intervenants dans le tableau */
$scope.liste = function(){
	$http.get('crud.php?action=get_intervenants').success(function(data){
	$scope.intervenants = data;
}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
}

$scope.liste();

/* Clic sur une ligne dans  le tableau */
$scope.edit		=function(index){
	$scope.montreBtn1 = false; $scope.montreBtn2 = true;$scope.montreBtn3 = true;$scope.montreBtn4 = true; // Gestion des bouttons
	$scope.selectedRow = index; // Coloration du choix de la ligne
	$scope.intervenant = angular.copy($scope.intervenants[index]); // permet d afficher les details dun intervenant en rompant le 2 way binding
	id = index; // Récupère l id de la ligne qui a été cliquée, on s en sert plus bas dans le code
}

/* Clic sur bouton nouveau */
$scope.nouveau 	= function(){
	$scope.montreBtn1 = true;$scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = false;
	$scope.intervenant = {};
}

/* INSERT */
$scope.enregistrer = function(){
	var intervenant = (angular.copy($scope.intervenant));
	$scope.montreBtn1 = true; $scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = false;
	$http.post('crud.php?action=insert_intervenant',intervenant).success(function(data){
		$scope.liste();
	}).error(function(data){ $scope.infos = data});
	$scope.intervenant = {};
}

/* DELETE */
$scope.supprimer = function(idBdd){
	$scope.intervenants.splice(id,1); // Supprime dans le tableau
	$scope.montreBtn1 = true; $scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = true;
	$http.post('crud.php?action=delete_intervenant',{'id':idBdd}).success(function(data){// Supprimer dans la BDD
		$scope.liste();
	}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
	$scope.intervenant = {}; // Reinit
}

/* UPDATE */
$scope.appliquer = function(){

	$scope.montreBtn1 = false; $scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = true;
	$http.post('crud.php?action=update_intervenant',$scope.intervenant).success(function(data){
		$scope.liste();
	}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
	$scope.intervenant = {};
}

/* FIN DU CONTROLEUR */

})

Le DUMP de la base de données de l’application au jour 1, très facile à faire avec Mysql WorkBench !!

-- MySQL dump 10.13  Distrib 5.7.12, for Win32 (AMD64)
--
-- Host: 127.0.0.1    Database: test
-- ------------------------------------------------------
-- Server version	5.7.13

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `caisses`
--

DROP TABLE IF EXISTS `caisses`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `caisses` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `idresto` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `caisses`
--

LOCK TABLES `caisses` WRITE;
/*!40000 ALTER TABLE `caisses` DISABLE KEYS */;
INSERT INTO `caisses` VALUES (1,'caisse1',1),(2,'caisse2',1),(3,'caisse1',2),(4,'caisse274',2);
/*!40000 ALTER TABLE `caisses` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `citernes`
--

DROP TABLE IF EXISTS `citernes`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `citernes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `volumemax` varchar(45) DEFAULT NULL,
  `typecarburant` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `citernes`
--

LOCK TABLES `citernes` WRITE;
/*!40000 ALTER TABLE `citernes` DISABLE KEYS */;
INSERT INTO `citernes` VALUES (19,'Citerne 1','1000','super'),(20,'Citerne 2','1500','diesel');
/*!40000 ALTER TABLE `citernes` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `cuisines`
--

DROP TABLE IF EXISTS `cuisines`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `cuisines` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `idresto` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `cuisines`
--

LOCK TABLES `cuisines` WRITE;
/*!40000 ALTER TABLE `cuisines` DISABLE KEYS */;
INSERT INTO `cuisines` VALUES (1,'cuisine 1',1),(2,'cuisine 1',2);
/*!40000 ALTER TABLE `cuisines` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `fournisseurs`
--

DROP TABLE IF EXISTS `fournisseurs`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `fournisseurs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `adresse` varchar(45) DEFAULT NULL,
  `photo` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `fournisseurs`
--

LOCK TABLES `fournisseurs` WRITE;
/*!40000 ALTER TABLE `fournisseurs` DISABLE KEYS */;
INSERT INTO `fournisseurs` VALUES (1,'Bp','','test'),(2,'Total','45 rue de Lilas',''),(3,'Elf','',''),(5,'PSA','',''),(6,'Leclerc','12 Avenue de Lis','');
/*!40000 ALTER TABLE `fournisseurs` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `intervenants`
--

DROP TABLE IF EXISTS `intervenants`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `intervenants` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `prenom` varchar(45) DEFAULT NULL,
  `photo` varchar(45) DEFAULT NULL,
  `telephone` varchar(45) DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `fonction` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `intervenants`
--

LOCK TABLES `intervenants` WRITE;
/*!40000 ALTER TABLE `intervenants` DISABLE KEYS */;
INSERT INTO `intervenants` VALUES (1,'José','Kirckpatrick','test','01.45.56.78.52','jo@jo.fr','pompiste'),(2,'Phil','Covert','2.jpg','01.54.65.98.45','jo@jo.fr','Barman'),(3,'Aziz','Benhammed','3.jpg','02.45.65.45.98','','Caissier'),(4,'Phil','Bertrand','fze','227','ye@ye.fr','Pompiste');
/*!40000 ALTER TABLE `intervenants` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `pompes`
--

DROP TABLE IF EXISTS `pompes`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `pompes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `type` varchar(45) DEFAULT NULL,
  `idciterne` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `pompes`
--

LOCK TABLES `pompes` WRITE;
/*!40000 ALTER TABLE `pompes` DISABLE KEYS */;
INSERT INTO `pompes` VALUES (6,'Pompe 1','2',20),(7,'Pompe 2','xl',19),(8,'Pompe 7','r',19),(9,'Pompe 185','K',19);
/*!40000 ALTER TABLE `pompes` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `produits`
--

DROP TABLE IF EXISTS `produits`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `produits` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `reference` varchar(45) DEFAULT NULL,
  `designation` varchar(45) DEFAULT NULL,
  `prixachat` varchar(45) DEFAULT NULL,
  `prixvente` varchar(45) DEFAULT NULL,
  `idfournisseur` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `produits`
--

LOCK TABLES `produits` WRITE;
/*!40000 ALTER TABLE `produits` DISABLE KEYS */;
INSERT INTO `produits` VALUES (1,'id24','Enjoliveurs Noirs 15\"','10.25','12.65',3),(3,'Id4587','Fanta Orange 10cl','1.25','2.35',6),(4,'id85','Orangina','1','2',6),(5,'if45878','Coca Cola','1.25','2.3',6),(6,'fr4587','Roues 15 \" Aluminium','15.2','25.3',5),(7,'xl45','Jantes Xeres Grises 15 \"','26.85','27.52',6),(8,'FAREV','Lave vitre 50cl','3.45','5.55',1),(9,'Farev','Lave Vitre 100cl','15.5','16.5',2);
/*!40000 ALTER TABLE `produits` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `reglements`
--

DROP TABLE IF EXISTS `reglements`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `reglements` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `reglements`
--

LOCK TABLES `reglements` WRITE;
/*!40000 ALTER TABLE `reglements` DISABLE KEYS */;
INSERT INTO `reglements` VALUES (1,'Carte Bleue'),(2,'Chêque');
/*!40000 ALTER TABLE `reglements` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `reservoirs`
--

DROP TABLE IF EXISTS `reservoirs`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `reservoirs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `adresse` varchar(45) DEFAULT NULL,
  `idstation` varchar(45) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `idstation` FOREIGN KEY (`id`) REFERENCES `stations` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `reservoirs`
--

LOCK TABLES `reservoirs` WRITE;
/*!40000 ALTER TABLE `reservoirs` DISABLE KEYS */;
INSERT INTO `reservoirs` VALUES (2,'treter','gergerg','5'),(3,'fez','fezf','1');
/*!40000 ALTER TABLE `reservoirs` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `stations`
--

DROP TABLE IF EXISTS `stations`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `stations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `type` varchar(45) DEFAULT NULL,
  `photo` varchar(45) DEFAULT NULL,
  `telephone` varchar(45) DEFAULT NULL,
  `email` varchar(45) DEFAULT NULL,
  `taille` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `stations`
--

LOCK TABLES `stations` WRITE;
/*!40000 ALTER TABLE `stations` DISABLE KEYS */;
INSERT INTO `stations` VALUES (2,'Station 2','Poids lourd','','01 45 84 98 78','bp@go.fr','grande'),(3,'station3','Poids lourd','','01 54 98 78 44','g@g.fr','Big'),(4,'Station 4','Autonome','','01 50 405040','f@f.fr','L');
/*!40000 ALTER TABLE `stations` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `tresoreries`
--

DROP TABLE IF EXISTS `tresoreries`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tresoreries` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(45) DEFAULT NULL,
  `adresse` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `tresoreries`
--

LOCK TABLES `tresoreries` WRITE;
/*!40000 ALTER TABLE `tresoreries` DISABLE KEYS */;
INSERT INTO `tresoreries` VALUES (1,'Banque Postale','6 Rue de Lis 56800 Senlis');
/*!40000 ALTER TABLE `tresoreries` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2016-08-08 15:27:03

Nouveau controleur qui permet le loading d’un seul objet, je ferais les services $http dans un second temps, l’intérêt étant assez limité :



app.controller('intervenantsCtrl', function($scope,$http,notifier) {	

/* INIT  */
$scope.intervenant 	= {}; // Contient un seul
$scope.intervenants	= []; // Contient tous 

/* INIT DIVERS */
$scope.montreBtn1 = true; 
$scope.montreBtn4 = false;
$scope.selectedRow = null; 

$scope.liste = function(){
	$http.get('crud.php?action=get_intervenants').success(function(data){
	$scope.intervenants = data;
}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
}

$scope.liste();

/* Les stations dans le menu deroulant */
$http.get('crud.php?action=get_stations').success(function(data){
	$scope.stations = data;
}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});


/* Clic sur le tableau */
$scope.edit		=function(idBdd,index){
	$scope.montreBtn1 = false; $scope.montreBtn2 = true;$scope.montreBtn3 = true;$scope.montreBtn4 = true; // Gestion des bouttons
	$scope.selectedRow = index; // Coloration du choix de la ligne
	$http.post('crud.php?action=get_intervenant',{'id':idBdd}).success(function(data){
		$scope.intervenant = data;
	}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
}

/* Clic sur bouton nouveau */
$scope.nouveau 	= function(){
	$scope.montreBtn1 = true;$scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = false;$scope.produit = {};
	$scope.intervenant = {};
		notifier.notify('Entrez un nouvel intervenant');
		$scope.selectedRow = null; 
}

/* INSERT */
$scope.enregistrer = function(){
	var intervenant = (angular.copy($scope.intervenant));
	console.log(intervenant);
	$scope.montreBtn1 = true; $scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = false;
	$http.post('crud.php?action=insert_intervenant',intervenant).success(function(data){
		$scope.liste();
	}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
	$scope.intervenant = {};
}

/* DELETE */
$scope.supprimer = function(idBdd){
	$scope.montreBtn1 = true; $scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = true;
	$http.post('crud.php?action=delete_intervenant',{'id':idBdd}).success(function(data){
		$scope.liste();
	}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
	$scope.intervenant = {};
}

/* UPDATE */
$scope.appliquer = function(){
	$scope.montreBtn1 = false; $scope.montreBtn2 = false;$scope.montreBtn3 = false;$scope.montreBtn4 = true;
	$http.post('crud.php?action=update_intervenant',$scope.intervenant).success(function(data){
		$scope.liste();
		notifier.notify('Modifié !');
	}).error(function(data){ $scope.infos = " Pas de données ou pb de connexion"});
	
}

/* CHARGEMENT DE FICHIERS SUR LE SERVEUR */
$scope.uploadFile = function(files,destinationPhp) {

	var fd = new FormData();
	//Take the first selected file
	fd.append("file", files[0]);

	var uploadUrl = destinationPhp;
	$http.post(uploadUrl, fd, {
		withCredentials: true,
		headers: {'Content-Type': undefined },
		transformRequest: angular.identity
	}).success(function(data){ 
	
		if(destinationPhp=='uploadPhotoEmployes.php'){
			notifier.notify('image téléchargée sur le serveur!');
			$scope.intervenant.image = 'img-employes/'+files[0].name;
		}
		if(destinationPhp=='uploadContratEmployes.php'){
			notifier.notify('Fichier téléchargé sur le serveur!');
			$scope.intervenant.contrat = 'contrats-employes/'+files[0].name;
		}
		
		
		})
		.error(function(data){
			notifier.notify("Echec du téléchargement sur le serveur");
		});

};
	/* Parametrage de l'aspect des KNOBS pour evaluer un mec*/
	$scope.options = {
	  skin: {
		type: 'tron'
	  },
	  size: 150,
	  unit: "",
	  barWidth: 20,
	   bgColor: '#2C3E50',
		 barColor: '#FFAE1A',
	  textColor: '#eee',
	  trackColor: 'rgba(255,0,0,.1)',
	  prevBarColor: 'rgba(0,0,0,.2)',
	  subText: {
		enabled: false,
		text: 'CPU used'
	  },
	  scale: {
		enabled: true,
		type: 'lines',
		width: 3
	  },
	  step: 0.1,
	  max:10,
	  displayPrevious: true
	};
/* FIN DU CONTROLEUR */
 
})

Nouvelle vue :


<div class="row" ng-controller="intervenantsCtrl">
	<div class="col-lg-12 " >
		<div class="panel panel-default">
		
		<div class="panel-heading"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> Liste</div>
		<scrollable-table watch="intervenants"> 
		<table  class="table table-bordered table-hover  "  >
			<thead>
			  <tr>
				<th> Image</th>
				<th sortable-header col="nom">Nom</th>
				<th sortable-header col="prenom">Prénom</th>
				<th sortable-header col="telephone"> Teléphone</th>
				<th sortable-header col="email"> Email</th>
				<th sortable-header col="fonction"> Fonction</th>
				<th sortable-header col="idstation"> Idstation</th>
			  </tr>
			</thead>
			
			<tbody >
			  <tr  ng-repeat="intervenant in intervenants" ng-click="edit(intervenant.id,$index)"  ng-class="{'selected':$index == selectedRow}">
				 <td><img src="{{::intervenant.image}}" class="imageX" ></img></td>
				 <td >{{::intervenant.nom| uppercase}}</td>
				 <td >{{::intervenant.prenom}}</td>
				<td >{{::intervenant.telephone}}</td>
				 <td >{{::intervenant.email}}</td>
				 <td >{{::intervenant.fonction}}</td>
				  <td >{{::intervenant.idstation}}</td>
			  </tr>
			</tbody>
			
		</table>
		</scrollable-table>
		 <br>
		   <div class="panel panel-default">
				<!-- Default panel contents -->
				<div class="panel-heading"><img class="imageX" src="img-app/infos.png"></img> Intervenant</div>
				<form name="myForm">
				<div class="panel-body">
				<uib-tabset active="active">
					<uib-tab index="0" >
					<tab-heading>
					  <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> 
					</tab-heading>
					<h4>Informations générales</h4>
					
					<div class="row">
					<p>
					
					<div class="col-md-3">
					
						<div class="input-group">
							<span class="input-group-addon" >Image</span>
							<img src = "{{intervenant.image}}" id="nouvelleImage" class = "img-responsive" style ="width : 150px; height:150px;">
						</div><br>
					</div>
					 
					 <div class="col-md-3">
					 
					 
						<div class="input-group">
						<span class="input-group-addon" >Nom</span>
						<input class="form-control" ng-model="intervenant.nom" required> </input>
						</div><br>
						<div class="input-group">
						<span class="input-group-addon">Prénom</span>
						<input class="form-control" ng-model="intervenant.prenom" required> </input>
						</div><br>
						<div class="input-group">
						<span class="input-group-addon">Fonction</span>
						<select class="form-control" ng-model="intervenant.fonction" class="  form-control form-field ">
						<option value="" >Choisir la fonction</option>
							<option  value="Pompiste">Pompiste</option>
							<option  value="Barman">Barman</option>
							<option  value="Caissier">Caissier</option>
							<option  value="Comptable">Comptable</option> 	
							<option  value="Commercial">Commercial</option> 	 							
						</select>
						</div><br>
						
					</div>	
					
					<div class="col-md-3">
						<div class="input-group">
						<span class="input-group-addon" >Téléphone</span>
						<input class="form-control" ng-model="intervenant.telephone" required> </input>
						</div><br>
						<div class="input-group">
						<span class="input-group-addon">Email</span>
						<input class="form-control" ng-model="intervenant.email" required> </input>
						</div><br>
						<div class="input-group">
							<span class="input-group-addon">Image</span>
							<span class="btn btn-default btn-file">
							<input  class="form-control " type="file" name="file" onchange="angular.element(this).scope().uploadFile(this.files,'uploadPhotoEmployes.php')" >Choisir une photo</input>	
							</span>
						</div><br>
						
					</div>	
					
					<div class="col-md-3">
							
						<div class="input-group">
							<span class="input-group-addon" >Station</span>
						<ui-select  theme="select2" ng-model="intervenant.idstation"   ng-required="true" style="min-width: 100%;">
						<ui-select-match placeholder="Selectionnez ..." >{{$select.selected.nom}}</ui-select-match>
							<ui-select-choices repeat="station.id as station in stations | filter:{nom:$select.search}   "  >
								 <div ng-bind-html="::station.nom | highlight: $select.search"></div>
							  <small ng-bind-html="::station.telephone | highlight: $select.search"></small>
							</ui-select-choices>
						</ui-select>
						</div><br>
				
					</div>
					</p>
				<!-- FIN DE DIV ROW -->
				</div>
				
				
			</uib-tab>
			<uib-tab index="1" heading="Contrat de travail ( En cours de dev)">
			<tab-heading>
				 <span class=" glyphicon glyphicon-list-alt" aria-hidden="true"></span> 
			</tab-heading>
			<h4>Contrat de travail </h4>
				<h4></h4>
				<div class="row">
					<p>
						
						<div class="col-md-3 ">
							
							
							
							
							<div class="input-group">
								<span class="input-group-addon" >Salaire</span>
								<input class="form-control" type="number" step="any" number-converter ng-model="intervenant.salaire " > </input>
								<span class="input-group-addon" >€</span>
							</div><br>
							
							<div class="input-group">
								<span class="input-group-addon">Type</span>
								<select class="form-control" ng-model="intervenant.typecontrat" class="  form-control form-field ">
								<option value="" >Choisir le type</option>
									<option  value="cdd">Cdd</option>
									<option  value="cdi">Cdi</option>
									<option  value="interim">interim</option>							
								</select>
							</div><br>
							
							<div class="input-group">
								<span class="input-group-addon" >Durée</span>
								<input class="form-control" type="number" step="any" number-converter ng-model="intervenant.dureecontrat " > </input>
								<span class="input-group-addon" >mois</span>
							</div><br>
							
						</div>	
						
						<div class="col-md-3 ">
						
							
							
							<div class="input-group">
								<span class="input-group-addon" href=""  >Contrat</span>
								<span class="btn btn-default btn-file" ng-show="intervenant.contrat">
								<a href="{{intervenant.contrat}}"  target="_blank" >{{intervenant.contrat |capitalize}}</a> 
								</span>
							</div><br>

							<div class="input-group">
								<span class="input-group-addon" href="" >Contrat</span>
								<span class="btn btn-default btn-file">
								<input  class="form-control " type="file" name="file" onchange="angular.element(this).scope().uploadFile(this.files,'uploadContratEmployes.php')" >Choisir un fichier</input>	
								</span>
							</div><br>							
							
					
							
						</div>	<br>
						
						
						
					</p>	
						
						
				<!-- FIN DE DIV ROW -->		
				</div>
				</uib-tab>
				
				<uib-tab index="2" heading="Evaluation">
				<tab-heading>
					 <span class="glyphicon glyphicon-signal" aria-hidden="true"></span> 
				</tab-heading>
				<div class="row">
				
					<p>
						
						<div class="col-md-12 ">
						<h4>Evaluations des ressources humaines </h4>
							
						<div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon ">Motivation</span>
                            <ui-knob  value="intervenant.motivation" options="options" ></ui-knob>
                        </div>
                        <div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon">C.V</span>
                            <ui-knob  value="intervenant.cv" options="options"></ui-knob>
                        </div>
                        <div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon">Etudes</span>
                            <ui-knob  value="intervenant.etudes" options="options"></ui-knob>
                        </div>
 
                        <div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon">Expérience</span>
                            <ui-knob  value="intervenant.experiences" options="options"></ui-knob>
                        </div>
                        <div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon">Com</span>
                            <ui-knob  value="intervenant.com" options="options"></ui-knob>
                        </div>
                        <div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon">Présentation</span>
                            <ui-knob value="intervenant.presentation" options="options"></ui-knob>
                        </div>
                        <div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon">Orthographe</span>
                            <ui-knob value="intervenant.orthographe" options="options"></ui-knob>
                        </div>
                        <div class="form-group input-group col-lg-3" style="float: left;">
                            <span class="input-group-addon">Créativité</span>
                            <ui-knob  value="intervenant.creativite" options="options"></ui-knob>
                        </div>
						
						
						
						
						</div>	<br>
						
						
						
					</p>	
						
						
				<!-- FIN DIV ROW		 -->		
				</div>
				
				<!-- FIN DE PANEL -->
				</div>
					
				
			
				<div class="panel-footer text-right">
					<button ng-click="nouveau()"  ng-show ="montreBtn4">Nouveau </button>
					<button ng-click="supprimer(intervenant.id)" ng-show ="montreBtn3">Supprimer </button>
					<button ng-click="myForm.$valid && enregistrer()" ng-show ="montreBtn1">Créer</button>
					<button ng-click="myForm.$valid && appliquer()" ng-show ="montreBtn2">Valider</button></form>
				</div>
			</div>
			</div>

		</div>
	</div>

Et enfin voici le CRUD Php get_intervenant qui telecharge un objet unique, composé de 2 tables sql ! On peut le rendre très gros, on s’en fout c’est un objet unique.Par contre la partie du Crud qui constitue la liste get_intervenants() devra être optimisé et comporter peu de champs !

function get_intervenant() {  
  /* Récupération des données POST */
	 $data = json_decode(file_get_contents("php://input")); 
	/* echo($data->id); */
	try 
	{   
		$DB = connection();	
		$sql = $DB->query("SELECT intervenants2.*,
		evaluationsrh.motivation,
		evaluationsrh.cv,
		evaluationsrh.etudes,
		evaluationsrh.experiences,
		evaluationsrh.com,
		evaluationsrh.presentation,
		evaluationsrh.orthographe
		FROM intervenants2 LEFT JOIN evaluationsrh on intervenants2.id = evaluationsrh.idintervenant WHERE intervenants2.id=".$data->id."");
		
		$sql->execute();
		$row = $sql->fetch();

		print_r(json_encode($row));  
		
		$DB=null;
	}  
	catch(PDOException $e) 
	{
		file_put_contents('PDOErreurs.txt', $e->getMessage(), FILE_APPEND);  
	} 		
} 
Publicités