php-rt:tp4-corr

Ceci est une ancienne révision du document !


Module M2105 - RT web dyna - TD/P 4

Prise en main du projet RT-Cloud et du micro-framework

  • Télécharger ou cloner le projet https://github.com/jcheron/RT-Cloud
  • Copier les fichiers dans le dossier htdocs de votre serveur.
  • Renommer éventuellement le dossier RT-Cloud-master en RT-Cloud
  1. Créer un contrôleur Exemples,
  2. charger les services (instances de la classe Service) dans la méthode index.
  3. Affichez les services directement depuis le contrôleur,
  4. Testez le résultat à l'adresse /Exemples ou /exemples/index

controllers/Exemples.php
1
2
3
4
5
6
7
8
9
class Exemples extends \BaseController {
 
    public function index() {
        $services=DAO::getAll("Service");
        foreach ($services as $service){
            echo $service->getNom()."<br>";
        }
    }
}

  1. Dans le contrôleur Exemples, charger les Utilisateurs dans la méthode users.
  2. Créer une vue users.php dans le dossier views/exemples/.

controllers/Exemples.php
1
2
3
4
5
6
7
8
class Exemples extends \BaseController {
    ...
 
    public function users(){
        $users=DAO::getAll("Utilisateur");
        $this->loadView("Exemples/users",array("users"=>$users));
    }
}

views/exemples/users.php
1
2
3
4
5
<h1>Utilisateurs</h1>
<?php
foreach ($users as $user){
    echo $user->getLogin()."<br>";
}

  1. Dans le contrôleur Exemples, charger les Disques dans la méthode disques.
  2. Créer une vue disques.html (utilisant Twig) dans le dossier views/exemples/.
  3. Afficher le nom du disque et l'utilisateur associé.

controllers/Exemples.php
1
2
3
4
5
6
7
8
class Exemples extends \BaseController {
    ...
 
    public function disques(){
        $disques=DAO::getAll("Disque");
        $this->loadView("Exemples/disques.html",array("disques"=>$disques));
    }
}

views/exemples/disques.html
1
2
3
4
<h1>Disques</h1>
{% for disque in disques %}
<b>{{ disque.getNom() }}</b> {{ disque.getUtilisateur() }}<br>
{% endfor %}

  1. Créer la méthode sortedUsers pour qu'elle prenne en paramètre le champ field sur lequel on effectuera un tri, et un deuxième déterminant l'ordre de tri (order ASC ou DESC) : le champ par défaut sera “login” et l'ordre “ASC”.
  2. Créer le template sortedUsers.html pour qu'il affiche le champ sur lequel s'effectue le tri, son ordre, et qu'il puisse le modifier.
  3. Afficher les colonnes login, mail et tel dans un tableau

controllers/Exemples.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Exemples extends \BaseController {
    ...
    public function sortedUsers($field="login",$order="ASC"){
        $fields=["login","mail","tel"];
        if(!array_search($field,$fields))
            $field=$fields[0];
        $header="";
        foreach ($fields as $f){
            $header.="<th>";
            $icon="sort-by-alphabet";
            $url="Exemples/sortedUsers/".$f;
            if($field==$f){
                if(strtoupper($order)=="ASC"){
                    $icon="sort-by-alphabet-alt";
                    $url.="/DESC";
                }
                $header.="<a href='{$url}'>{$f}&nbsp;<span class='glyphicon glyphicon-{$icon}' aria-hidden='true'></span></a>";
            }else{
                $header.="<a href='{$url}'>{$f}</a>";
            }
            $header.="</th>";
        }
        $users=DAO::getAll("Utilisateur","1=1 ORDER BY ".$field." ".$order);
 
 
        $this->loadView("Exemples/sortedUsers.html",array("users"=>$users,"header"=>$header));
    }

views/exemples/sortedUsers.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<table class='table table-striped'>
    <thead>
    <tr>
        {{header|raw}}
    </tr>
    </thead>
        <tbody>
        {% for user in users %}
            <tr>
            <td>{{user.getLogin()}}</td>
            <td>{{user.getMail()}}</td>
            <td>{{user.getTel()}}</td>
            </tr>
        {% endfor %}
        </tbody>
</table>

  1. Créer la méthode usersDisques chargeant les utilisateurs, et leurs disques (les disques de chaque utilisateur doivent être chargés explicitement)
  2. Créer une vue userDisques.html affichant un utilisateur et ses disques
  3. Le résultat à obtenir doit permettre d'afficher tous les utilisateurs (nom), et leurs disques (nom).

controllers/Exemples.php
1
2
3
4
5
6
7
8
9
10
11
class Exemples extends \BaseController {
    ...
    public function usersDisques(){
        $users=DAO::getAll("Utilisateur");
        foreach ($users as $user) {
            DAO::getOneToMany($user, "disques");
            if(sizeof($user->getDisques())>0)
            $this->loadView("exemples/userDisques.html",array("user"=>$user));
        }
    }
}

views/exemples/userDisques.html
1
2
3
4
5
6
<h4>{{user}}</h4>
<ul class="list-group">
{% for disque in user.getDisques() %}
    <li class="list-group-item">{{disque}}</li>
{% endfor %}
</ul>

  1. Créer une méthode displayService($id=null) permettant de charger un service pas son id, ou d'en instancier un nouveau
  2. displayService doit ensuite afficher la vue views/exemples/displayService.html affichant l'objet $service

controllers/Exemples.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Exemples extends \BaseController {
    ...
    public function displayService($id=null){
        $edit=false;
        $service=null;
        if(isset($id)){
            $service=DAO::getOne("Service", $id);
            $edit=isset($service);
        }
        if(!$edit)
            $service=new Service();
        $this->loadView("exemples/displayService.html",array("service"=>$service));
    }
}

views/exemples/displayService.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="panel panel-default">
    <div class="panel-heading">
        <b>Service</b>
    </div>
    <div class="panel-body"><b>{{service.getNom()}}</b></div>
    <ul class="list-group">
        <li class="list-group-item">
            <h5>Description : </h5> <span>{{service.getDescription()}}</span>
        </li>
        <li class="list-group-item">
            <b>Prix : </b> {{service.getPrix()}}
        </li>
    </ul>
</div>

  1. Dans le contrôleur Exemples, créer une méthode serviceAdd($nom,$prix=0) permettant de créer un service de nom $nom et de prix $prix
  2. Afficher ensuite le service ajouté en appelant la méthode displayService
  3. Tester en allant à l'adresse Exemples/serviceAdd/Test de service offert/ puis Exemples/serviceAdd/Service à 5 euros/5/

controllers/Exemples.php
1
2
3
4
5
6
7
8
9
10
class Exemples extends \BaseController {
    ...
    public function serviceAdd($nom,$prix=0){
        $service=new Service();
        $service->setNom($nom);
        $service->setPrix($prix);
        DAO::insert($service);
        $this->forward("Exemples","displayService",$service->getId());
    }
}

  1. Dans la vue displayService, afficher un bouton “Augmenter prix” si le service est existant ($edit=true)
  2. Créer la méthode updatePrix($idService,$update=1) augmentant le prix de $update

views/exemples/displayService.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<div class="panel panel-default">
    <div class="panel-heading">
        <b>Service</b>
    </div>
    <div class="panel-body"><b>{{service.getNom()}}</b></div>
    <ul class="list-group">
        <li class="list-group-item">
            <h5>Description : </h5> <span>{{service.getDescription()}}</span>
        </li>
        <li class="list-group-item">
            <b>Prix : </b> {{service.getPrix()}} {%if edit %} <a class="btn btn-primary" href="exemples/updatePrix/{{service.getId()}}/1">Augmenter</a>{% endif %}
        </li>
    </ul>
</div>

controllers/exemples.php
1
2
3
4
5
6
7
8
9
10
11
12
13
class Exemples extends \BaseController {
    ...
    public function updatePrix($idService,$update=1){
        $service=DAO::getOne("Service", $idService);
        if(isset($service)){
            $service->setPrix($service->getPrix()+$update);
            DAO::update($service);
            $this->forward("Exemples","displayService",$service->getId());
        }else{
            $this->_showMessage("Impossible de charger le service","warning");
        }
    }
}

  1. Créer le contrôleur Services héritant de _DefaultController
  2. Affecter “Service” à son membre model

Accéder à l'url /services ou /services/index pour visualiser le résultat

controllers/services.php
1
2
3
4
5
6
7
8
class Services extends \_DefaultController {
 
    public function __construct(){
        parent::__construct();
        $this->title="Services";
        $this->model="Service";
    }
}

  1. Implémenter la méthode frm($id=NULL) permettant d'afficher le formulaire de modification d'un service :

controllers/services.php
1
2
3
4
public function frm($id=NULL){
    $service=$this->getInstance($id);
    $this->loadView("exemples/frmService.html",array("service"=>$service));
}

  1. Créer la vue frmServices.html affichant un formulaire de modification du service, et dont l'action est Services/update :

views/exemples/frmService.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<form action="services/update" method="post">
    <fieldset>
        <legend>Service</legend>
        <div class="form-group">
            <input type="hidden" name="id" id="id" value="{{service.getId()}}">
            <input placeholder="Entrez un nom" type="text" class="form-control" name="nom" id="nom" value="{{service.getNom()}}">
            <input placeholder="Enrez un prix" type="number" class="form-control" name="prix" id="prix" value="{{service.getPrix()}}">
            <textarea rows="5" class="form-control" name="description" id="description">{{service.getDescription()}}</textarea>
        </div>
        <div class="form-group">
            <button class="btn btn-primary">Valider</button>
        </div>
    </fieldset>
</form>

  • php-rt/tp4-corr.1459177186.txt.gz
  • Dernière modification : il y a 6 ans
  • (modification externe)