IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Formulaire en MVC


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Points : 55
    Points
    55
    Par défaut Formulaire en MVC
    Bonjour tout le monde, je poste une nouvelle discussion car j'ai besoin de vous.
    Je voudrais mettre en place un système de formulaire mais avec le pattern MVC le tout en PHP.


    ma classe singleton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php
    /**
     * Classe MySqlConnection : singleton
     */
     
    class Singleton {
        private static $instance;
     
      const DEFAULT_SQL_USER = 'root';
      const DEFAULT_SQL_PORT = '3306';
      const DEFAULT_SQL_HOST = 'localhost';
      const DEFAULT_SQL_PASS = '';
      const DEFAULT_SQL_DTB = 'test';
     
    private function __construct()   {
      try
         {
          $this->PDOInstance = new PDO('mysql:host='.self::DEFAULT_SQL_HOST.';port='.self::DEFAULT_SQL_PORT.';dbname='.self::DEFAULT_SQL_DTB,self::DEFAULT_SQL_USER ,self::DEFAULT_SQL_PASS,array (PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''));
         }
      catch (PDOExeption $e)
         {
           die("Erreur ! Connection serveur SQL impossible !" );
         }
      }
     
    	public static function getInstance() {
    		if(!isset(self::$instance) || self::$instance == null)
                        {
    			self::$instance = new Singleton();
                        }
    		return self::$instance; 
    	}
     
            public function prepare($query)
      {
        return $this->PDOInstance->prepare($query);
      }
     
            public function query($query)
      {
        return $this->PDOInstance->query($query);
      }
    }
     
    ?>
    voici ma classe Article (modele)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    <?php
    class Article{
     
        private $id;
        private $titre;
     
        function __construct($titre=null, $id=null) {
            $this->id = $id;
            $this->titre = $titre;
        }
     
        public function getId() {
            return $this->id;
        }
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getTitre() {
            return $this->titre;
        }
     
        public function setTitre($titre) {
            $this->titre = $titre;
        }
    }
    ?>
    Voici mon controller

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    <?php
    require_once 'class.singleton.php';
    require '../model/class.article.php';
     
    class ManageArticle{
     
     
        public static function add(Article $article)
        {
            $connexion = Singleton::getInstance();
            $sql =$connexion->prepare("insert into article(`titre`) VALUES ('".$article->getTitre()."')");
            $sql->execute();
            $article->setId($connexion->insert_id());
            return true;
        }
     
     
       public static function getAll()
       {
            $connexion = Singleton::getInstance();
            $ress = $connexion->prepare("select * from article");
            $ress->execute();
            $listArticle = array();
     
            foreach ($ress as $value) 
            {
                $listArticle[] = new Article($data['titre'],$data['id_article']);
            }
     
            return $listArticle;
        }
    }
    ?>
    Et ma vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    require_once"../controller/control.article.php";
     
    $ajout = new ManageArticle();
    add($ajout);
     
     
    $fonction = ManageArticle::getAll();
     
     
    echo "<pre>";print_r($ajout);
    echo "<pre>";print_r($fonction);die;
     
    ?>
    Lorsque j'execute le programme j'ai le message d'erreur suivant:

    Fatal error: Call to undefined function add() in C:\wamp\www\MVC_FORM\view\liste.php on line 5
    Pouvez-vous m'aider svp
    Meric beaucoup

  2. #2
    Membre régulier
    Homme Profil pro
    Développeur PHP
    Inscrit en
    Mai 2014
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Développeur PHP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 37
    Points : 76
    Points
    76
    Par défaut
    Pas trop MVC tout ça.
    La vue ne fait que l'affichage des données fournies par le contrôleur.
    Le contrôleur fait le lien entre le modèle et la vue.
    Ici dans ta vue il y a une instanciation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ajout = new ManageArticle();
    Il y a appel à une fonction add non définie.
    Ton controleur appelle la connexion BDD dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public static function add(Article $article)
        {
            $connexion = Singleton::getInstance();
            $sql =$connexion->prepare("insert into article(`titre`) VALUES ('".$article->getTitre()."')");
            $sql->execute();
            $article->setId($connexion->insert_id());
            return true;
        }
    cette partie devrait être en modèle.

    Pour finir pour résoudre ton erreur dans ta vue ligne 5 tu dois faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ManageArticle::add($ajout);
    Si tu as des questions à dispo.

    JFFM

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Points : 55
    Points
    55
    Par défaut
    Ha ok, je pensais justement à faire comme ceci:

    créer le modèle d'un article :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    <?php
    class Article{
     
        private $id;
        private $titre;
     
        function __construct($titre=null, $id=null) {
            $this->id = $id;
            $this->titre = $titre;
        }
     
        public function getId() {
            return $this->id;
        }
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getTitre() {
            return $this->titre;
        }
     
        public function setTitre($titre) {
            $this->titre = $titre;
        }
    }
    ?>
    Mais les requêtes comme l'insertion et la récupération des différentes données de la base ne doivent pas se faire dans le controller ??
    Comme je l'ai mis précédemment ? :

    Controller / control.article.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    <?php
    require_once 'class.singleton.php';
    require '../model/class.article.php';
     
    class ManageArticle{
     
     
        public static function add(Article $article)
        {
            $connexion = Singleton::getInstance();
            $sql =$connexion->prepare("insert into article(`titre`) VALUES ('".$article->getTitre()."')");
            $sql->execute();
            $article->setId($connexion->insert_id());
            return true;
        }
     
     
       public static function getAll()
       {
            $connexion = Singleton::getInstance();
            $ress = $connexion->prepare("select * from article");
            $ress->execute();
            $listArticle = array();
     
            foreach ($ress as $value) 
            {
                $listArticle[] = new Article($data['titre'],$data['id_article']);
            }
     
            return $listArticle;
        }
    }
    ?>
    et Donc l'affichage des données doivent aussi se faire dans le controller ?
    mais je fait un simple include dans ma vue du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <html>
    <head>
    </head>
    <body>
    <?php include_once"controller/control.article.php";
    </body>
    </html>
    Quelque chose comme ça ?

    Ou bien ma vue ne doit contenir que un simple formulaire ???


    j'ai penser une arborescence MVC comme ceci : Modele : création des variables et GET SET de mon objet :
    Controller : appel de la base et création des différentes requêtes.
    Vue : appel du controller + simple code HTML

  4. #4
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Points : 55
    Points
    55
    Par défaut
    Personne n'a d'idée pour mon petit problème,
    je ne trouve pas de solution sur les différents forums.

    merci de vos réponses

  5. #5
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    En effet , il y a un décalage dans ton mécanisme car tu vas au delà tu MVC, tu tentes d'implémenter également une ORM.

    Le modèle permet de représenter la bdd, mais également d'y accéder. Donc ce que tu appelles "contrôleur" plus haut est en fait une partie de ton modèle, et tu n'as pas de contrôleur.

  6. #6
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Points : 55
    Points
    55
    Par défaut
    Alors comment pourrais-je mettre le tout en place pour la structure soit bonne

  7. #7
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 275
    Points
    3 275
    Par défaut
    Tout est bon, juste créer un contrôleur, et tu dois arriver dans ce contrôleur (ton url doit amener à ce contrôleur) qui peut instancier un manager (ManageArticle), et ton contrôleur doit se terminer par l'inclusion de la vue.

  8. #8
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Points : 55
    Points
    55
    Par défaut
    Je pourrais avoir un exemple avec mon code alors,
    car je n'ai pas encore trouver la solution,

    Ma fonction GetAll() marche très bien, j'ai mes résultats mais l'ajout reste un problème.

    Désolé si j'ai pas compri tout de suite

  9. #9
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2013
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2013
    Messages : 116
    Points : 55
    Points
    55
    Par défaut
    rebonjour à tous

    Après plusieurs jours de recherche et de test, je viens de retravailler mon formulaire en MVC:


    Voici mon Modele: membre.class.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    <?php
     
    class membre {
     
        private $id_membre;
        private $nom_membre;
        private $prenom_membre;
        private $date_naissance;
        private $cp_membre;
        private $adresse_membre;
        private $ville_membre;
        private $pays_membre;
        private $tel_membre;
        private $email_membre;
     
     
    	public function __construct(array $params)
    	{
    		foreach($params as $k => $p)
    		{
    			$kTmp = explode('_', $k);
    			foreach($kTmp as &$k2)
    			{
    				$k2 = ucfirst($k2);
    			}
     
    			$methodName = 'set' . implode('', $kTmp); 
    			if(method_exists($this, $methodName))
    			{
    				$this->$methodName($p);
    			}
    		}
    	}
     
     
        public function getId_membre() {
            return $this->id_membre;
        }
     
        public function getNom_membre() {
            return $this->nom_membre;
        }
     
        public function getPrenom_membre() {
            return $this->prenom_membre;
        }
     
        public function getDate_naissance() {
            return $this->date_naissance;
        }
     
        public function getCp_membre() {
            return $this->cp_membre;
        }
     
        public function getAdresse_membre() {
            return $this->adresse_membre;
        }
     
        public function getVille_membre() {
            return $this->ville_membre;
        }
     
        public function getPays_membre() {
            return $this->pays_membre;
        }
     
        public function getTel_membre() {
            return $this->tel_membre;
        }
     
        public function getEmail_membre() {
            return $this->email_membre;
        }
     
        public function setId_membre($id_membre) {
            $this->id_membre = $id_membre;
        }
     
        public function setNom_membre($nom_membre) {
            $this->nom_membre = $nom_membre;
        }
     
        public function setPrenom_membre($prenom_membre) {
            $this->prenom_membre = $prenom_membre;
        }
     
        public function setDate_naissance($date_naissance) {
            $this->date_naissance = $date_naissance;
        }
     
        public function setCp_membre($cp_membre) {
            $this->cp_membre = $cp_membre;
        }
     
        public function setAdresse_membre($adresse_membre) {
            $this->adresse_membre = $adresse_membre;
        }
     
        public function setVille_membre($ville_membre) {
            $this->ville_membre = $ville_membre;
        }
     
        public function setPays_membre($pays_membre) {
            $this->pays_membre = $pays_membre;
        }
     
        public function setTel_membre($tel_membre) {
            $this->tel_membre = $tel_membre;
        }
     
        public function setEmail_membre($email_membre) {
            $this->email_membre = $email_membre;
        }
     
        public function getReqParams()
        {
            return array('nom_membre' => $this->getNom_membre(),
                         'prenom_membre' => $this->getPrenom_membre(),
                         'date_naissance' => $this->getDate_naissance(),
                         'code_postal' => $this->getCp_membre(),
                         'adresse' => $this->getAdresse_membre(),
                         'ville' => $this->getVille_membre(),
                         'pays' => $this->getPays_membre(),
                         'tel' => $this->getTel_membre(),
                         'email' => $this->getEmail_membre(),
                        );
        }
     
     
    }

    Voici Mon controller : add.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    <?php
     
    require_once 'connect.php';
    require_once '../model/membre.class.php';
    require_once 'loadingView.php';
     
    class Add {
     
    public static function addMembre($membre)
    {
        $connexion = Connexion::getInstance();
     
    	if(!is_array($membre))
    	{
    		$membre = array($membre);
    	}
     
    	$sql = $connexion->query('INSERT INTO ps_membre(id_membre,nom_membre,prenom_membre,date_naissance,cp_membre,adresse_membre,ville_membre,pays_membre,tel_membre`,email_membre)
                        VALUE(?,?,?,?,?,?,?,?,?)');
     
            $sql->execute($membre);
     
            foreach($membre as $member)
    	{
                        $params = $member->getReqParams();
                        echo"<pre> mon ";print_r($params);
     
     
    		foreach($params as $k => $v)
    		{
                        echo"<pre>";echo print_r($k);
                        $sql->bindParam(':' . $k,$v);    
    		}
     
    	}
     
                return $sql;
     
                    }
    }
     
     
            $membre = new membre(array(
                'nom_membre' => $_POST['nom'],
                'prenom_membre' => $_POST['prenom'],
                'date_naissance' => $_POST['date_naissance'],
                'cp_membre' => $_POST['code_postal'],
                'adresse_membre' => $_POST['adresse'],
                'ville_membre' => $_POST['ville'],
                'pays_membre' => $_POST['pays'],
                'tel_membre' => $_POST['tel'],
                'email_membre' => $_POST['email'],
     
            ));
            echo  $membre->getNom_membre();
            echo  $membre->getPrenom_membre();
            echo  $membre->getEmail_membre();
     
            echo"<pre>";print_r($membre);
     
            Add::addMembre($membre);
    Et ma vue : un simple formulaire

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     <form id="register-form" class="form" action="../controller/addClass.php" method="POST">
                <legend>DEPOT D'ANNONCE</legend>
                        <hr>
            	<div class="body">
                        <!-- ENTREPRISE -->
                        <label for="name">NOM</label>
                        <input name="nom" class="input-huge" type="text">
                        <!-- TITRE DE LA MISSION -->
                        <label for="surname">PRENOM</label>
                        <input name="prenom" class="input-huge" type="text">
                        <!-- VILLE DE LA MISSION -->
                        <label for="surname">DATE NAISSANCE</label>
                        <input name="date_naissance" class="input-huge" type="text">
                        <!-- DESCRIPTION DE L'OFFRE -->
                        <label for="surname">CODE POSTALE</label>
                        <input name="code_postal" class="input-huge" type="text">
                        <!-- DESCRIPTION DE L'OFFRE -->
                        <label for="surname">ADRESSE</label>
                        <input name="adresse" class="input-huge" type="text">
                        <!-- DESCRIPTION DE L'OFFRE -->
                        <label for="surname">VILLE</label>
                        <input name="ville" class="input-huge" type="text">
                        <!-- DESCRIPTION DE L'OFFRE -->
                        <label for="surname">PAYS</label>
                        <input name="pays" class="input-huge" type="text">
                        <!-- DESCRIPTION DE L'OFFRE -->
                        <label for="surname">TELEPHONE</label>
                        <input name="tel" class="input-huge" type="text">
     
                        <label for="surname">EMAIL</label>
                        <input name="email" class="input-huge" type="text">
                	</div>
     
            	<div class="footer">
                        <button type="submit"  name="submit" class="btn btn-success">Enregistrer</button>
            	</div>
            </form>


    Mon problème est le suivant :

    j'ai une erreur dans mon controller concernant mon execute()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql->execute($membre);
    l'erreur est :

    Catchable fatal error: Object of class membre could not be converted to string in C:\wamp\www\lorraine_call_admin\LorraineCallAdmin\controller\addClass.php on line 36

    Je ne sais pas, malgrès plusieur solutions sur le net, comment résoudre mon problème

Discussions similaires

  1. problème sur formulaire sans mvc
    Par cedrick21 dans le forum Zend_Form
    Réponses: 2
    Dernier message: 19/12/2012, 09h53
  2. Erreur dans un formulaire - Spring MVC
    Par Livingstone dans le forum Spring Web
    Réponses: 2
    Dernier message: 21/08/2012, 14h43
  3. Formulaire authentification MVC
    Par Kishin dans le forum Zend_Acl & Zend_Auth
    Réponses: 1
    Dernier message: 07/01/2009, 11h39
  4. Réponses: 6
    Dernier message: 17/06/2008, 12h04
  5. Formulaire et MVC
    Par jbin-1 dans le forum Langage
    Réponses: 1
    Dernier message: 09/02/2008, 11h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo