Partage
  • Partager sur Facebook
  • Partager sur Twitter

PHP objet - Site Web dynamique

    17 février 2017 à 23:52:37

    Bonsoir,

    La formation s'intensifie de plus en plus. Je dois gérer un site Web avec uniquement du PHP. Plus je développe et plus je rencontre des soucis. Je n'ai pas encore assez d'expérience. Actuellement, j'essaie de gérer un menu via deux classes (Rubrique et Menu). J'ai commencé aussi une classe Connexion (PDO) pour l'interaction avec la base de données.

    J'ai deux grosses erreurs (voir image). Je ne vois qu'une solution. Ce serait passer par de l'héritage. Donc, j'aurais une classe Generalite avec le constructeur et la fonction hydrater. Ensuite, mes classes Rubrique et Menu hériteraient de la classe Generalite.

    Est-ce la meilleure solution?

    Le problème de l'héritage est qu'une méthode définie dans une classe mère ne peut pas toujours être suffisante pour une classe fille. Le constructeur de la classe Connexion contient une ligne supplémentaire (self::setConnexion();). Par contre, la méthode hydrater restera la même.

    Est-ce qu'il faut redéfinir la méthode?

    Afin de tester ma classe Rubrique, j'ai créé des tableaux associatifs ($infosAccueil, $infosPresentation et $infosContact) avec l'id, le nom, ... Par contre, j'ai aussi un tableau de vérifications qui est un membre de la classe Rubrique.

    Comment encoder des données dans un tableau d'un tableau associatif (lignes 146, 165 et 176)?

    En même temps, j'aimerais l'avis de spécialiste concernant ma façon de créer tout en PHP.

    Est-ce qu'au niveau professionnel cela reste valable?

    Par la suite, je dois aussi faire des vérifications en JavaScript. Donc, la variable $js servira à cela. Ce n'est pas évident de tout écrire en PHP dans des variables. On n'a plus l'auto-complétion pour nous aider.

    J'entends souvent parler soit d'hydrater ou d'instancier un objet.

    Est-ce que ce sont des synonymes ou y a-t-il vraiment une différence entre les deux?

    Je vous remercie énormément d'avance pour votre aide.

    Sarah

    <?php
        $html1 = '<!DOCTYPE html><html lang="fr"><head>';
        $html1 .= '<title>Gestion dynamique d\'un mini site Web</title>';
        $html1 .= '<meta name="viewport" content="width=device-width, initial-scale=1.0">';
        $css =  '<style>
                body
                {
                    font-family: verdana, sans-serif;
                    font-size: 1.25em;
                    color: #000000;
                    margin: 0 auto;
                    padding: 0;
                    width: 95%;
                }
                </style>';
        $js = '<script language="javascript" type="text/javascript">';
        $js .= '</script>';
        $html2 = '</head><body><section><header>';
        $html2 .= '<h1>Gestion dynamique d\'un mini site Web</h1>';
        $html3 = '</header></section></body></html>';
    
        class Rubrique
        {
            private $id;
            private $nom;
            private $destination;
            private $classe;
            private $tableauVerifications = array();
            
            function __construct(array $donnees = null)
            {
                if($donnees)
                {
                    $this->hydrater($donnees);
                }
            }
            
            function setId($id)
            {
                $this->id = $id;
            }
    
            function setNom($nom)
            {
                $this->nom = $nom;
            }
    
            function setDestination($destination)
            {
                $this->destination = $destination;
            }
    
            function setClasse($classe)
            {
                $this->classe = $classe;
            }
            
            function setTableauVerifications($tableauVerifications)
            {
                $this->tableauVerifications = $tableauVerifications;
            }
    
            
            function getId()
            {
                return $this->id;
            }
    
            function getNom()
            {
                return $this->nom;
            }
    
            function getDestination()
            {
                return $this->destination;
            }
    
            function getClasse()
            {
                return $this->classe;
            }
            
            function getTableauVerifications()
            {
                return $this->tableauVerifications;
            }
            
            public function hydrater(array $donnees)
            {
                foreach ($donnees as $propriete => $valeur)
                {
                    $nomMethode = 'set' . ucfirst($propriete);
                    if (method_exists($this, $nomMethode))
                    {
                        $this->$nomMethode($valeur);
                    }
                }
            }
            
        }
    
        class Menu
        {
            private $tableauRubriques = array();
    
            public function __construct($tableauRubriques = null)
            {
                    if($tableauRubriques)
                    {
                        Rubrique::hydrater();
                    }
            }
            
            function setTableauRubriques($tableauRubriques)
            {
                $this->tableauRubriques = $tableauRubriques;
            }
            
            function getTableauRubriques()
            {
                return $this->tableauRubriques;
            }
            
            public function getCreerTableauRubriques()
            {
                $code = '<ul>';
                foreach($this->getTableauRubriques() as $rubrique)
                {
                    $code .= '<li id="'. $rubrique::Rubrique.getId() . '>';
                    $code .= '<a href="' . $rubrique::Rubrique.getDestination();
                    $code .= ' class="' . $rubrique::Rubrique.getClassse() . '"';
                    $code .= '>' . $rubrique::Rubrique.getNom() . '</li>';
                }
                $code += '</ul>';
                return $code;
            }
        }
        
        $infosAccueil = array
        (
            'id' => 'accueil', 
            'nom' => 'Accueil', 
            'destination' => '#', 
            'classe' => 'actif'
            // VERIFICATIONS: MIN: 5 CARACTÈRES ET MAX: 20 CARACTÈRES
        );
        
        $accueil = new Rubrique($infosAccueil);
        
        $afficherAccueil = '<p>' . $accueil->getId(). '<br />'; 
        $afficherAccueil .= $accueil->getDestination() . '<br />';
        $afficherAccueil .= $accueil->getClasse() . '<br />';
        $afficherAccueil .= $accueil->getNom() . '<br /></p>';
        
        $resultat = $html1 . $css . $js . $html2 . $afficherAccueil . $html3;
        echo $resultat;
        
        $infosPresentation = array
        (
            'id' => 'presentation', 
            'nom' => 'Presentation', 
            'destination' => '#', 
            'classe' => ''
            // VERIFICATIONS: MIN: 5 CARACTÈRES ET MAX: 20 CARACTÈRES
        );
        
        $presentation = new Rubrique($infosPresentation);
        
        $infosContact = array
        (
            'id' => 'contact', 
            'nom' => 'Contact', 
            'destination' => '#', 
            'classe' => ''
            // VERIFICATIONS: MIN: 5 CARACTÈRES ET MAX: 20 CARACTÈRES
        );
        
        $contact = new Rubrique($infosContact);
        
        $tableauRubriques = array ($accueil, $presentation, $contact);
        
        echo afficherTableauRubriques($tableauRubriques);
          
        function afficherTableauRubriques($tableauRubriques)
        {
            $code = '';
            foreach($tableauRubriques as $rubrique)
            {
                $code .= '<p>' . $rubrique->getId() . '<br />';
                $code .= $rubrique->getDestination() . '<br />';
                $code .= $rubrique->getNom() . '<br />';          
                $code .=  $rubrique->getNom() . '<br /></p>';
            }
            return $code;
        }
        
        $menu = new Menu($tableauRubriques);
        echo $menu->getCreerTableauRubriques();
    
        Class Connexion
        {
            // ICI IL Y A LES MEMBRES
    
            // CONSTRUCTEUR
            function __construct(array $donnees = null)
            {
                if($donnees)
                {
                    $this->hydrater($donnees);
                }
                self::setConnexion();   
            }
    
            // ICI IL Y A LES SETTERS, ...
        }



    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      18 février 2017 à 0:13:24

      1: $this->$nomMethode($valeur); -> C'est une variable ou une fonction???

      2: $this->$nomMethode($valeur); -> La variable/fonction n'existe pas!

      • Partager sur Facebook
      • Partager sur Twitter
        18 février 2017 à 1:29:49

        Bonsoir sarah,

        Quel est l'intitulé et l'enoncé exacte de ton exercice ? 

        Je suis sur que tu penses bien faire mais cela et fort peu probable car l'exercice demande des compétences que tu ne dois pas encore avoir (tkt tu les auras petit a petit). Mettre du html dans des variable php c'est pas tout codé en php parce que c'est impossible au final tu as toujours du html, CSS, JS dans un fichier pour la bonne raison que coté client c'est les seuls langage que comprend ton navigateur et php lui agis coté serveur.

        Si je dis que ce n'est pas a ton niveau c'est que tu n'as fais aucune analyse UML et même la POO cela semble être le coté obscur de la force pour toi(fan de starwars on ne se refait pas xD)

        Si je te parle de chainage de methode de classe, tu vas croire que je dis n'importe quoi mais c'est le B.A. ba en POO au même titre que d'autre technique.

        Pareil est ce que tu connais le MVC et la temporisation de sortie ? Ou on peut inserer une vue dans un layout juste en stockant la vue dans une variable. On différe la sortie du code (temporisation) pour eviter les "header allReady  send"

        Tu demande un avis pro ? tu es loin de tous ca c 'est pour ca que j'aimerai connaitre ton énnoncé

        Pour te donner une idées de la différence entre nous ou plus exactement entre ton niveau actuel et ce qui deviendra bientot naturel pour toi

        ta classe de connexion

        <?php
        Class Connexion
            {
                // ICI IL Y A LES MEMBRES
         
                // CONSTRUCTEUR
                function __construct(array $donnees = null)
                {
                    if($donnees)
                    {
                        $this->hydrater($donnees);
                    }
                    self::setConnexion();  
                }
         
                // ICI IL Y A LES SETTERS, ...
            }

        la mienne dont je me sert souvent au debut de mes projets comme j'ai juste a copier collé le fichier

        <?php
        class PDOFactory {
        	private static $_instance;
        
        	public function __construct( ) {
        	}
        
        /* Singleton */
        	public static function getInstance() {
        		if (!isset(static::$_instance)) {
        			try {
        				static::$_instance = new PDO(SQL_DSN, SQL_USERNAME, SQL_PASSWORD,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
        			} catch (PDOException $e) {
        				echo $e;
        			}
        		}
        		return static::$_instance;
        	}
        }


        J'ai juste a definir des constantes et créer ma connexion dans mon controleur frontal

        <?php
        define('SQL_DSN', 'mysql:dbname=***;host=***');
        define('SQL_USERNAME', 'kets14');
        define('SQL_PASSWORD', '***');
        
        $pdo=pdoFactory::getInstance();





        • Partager sur Facebook
        • Partager sur Twitter
        "Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité"  A.E.
          18 février 2017 à 12:49:52

          Bonjour Kacy Luzzardi,

          Je te remercie pour ta réponse. La fonction hydrater() permet d'aller chercher le setter d'un membre automatiquement s'il existe. Donc, $nomMethode est bien une fonction. Dans un tableau associatif, j'envoie le membre ('id') et sa valeur ('accueil'). La fonction hydrater() va créer le setter (setId) et si la méthode existe, il va donner la valeur au membre. En tant normal, le constructeur contiendrait plus de lignes (voir code).

          Bonjour kets14,

          Je te remercie pour ta réponse. L'intitulé exact est gestion de formulaires avec un script PHP dans un seul fichier (plus simple pour la correction). Étant donné que la gestion d'un formulaire demande plus de classes et est plus complexe, j'ai décidé de commencer par la gestion d'un menu. Cela demande seulement deux classes et au niveau HTML, c'est plus simple.

          Avec un ancien professeur, on pouvait avoir du HTML au début d'un fichier puis ouvrir les balises PHP. Notre nouveau professeur nous l'a interdis. Il veut au final que tout soit séparer. Je pense qu'il voudrait que dans notre projet d'examen, on utilise un parseur via un script PHP. Le HTML contiendrait des tags à remplacer.

          J'ai bien fait une analyse UML sur papier. Cependant, ce n'est pas prévu au programme. La formation est BAC+2 (uniquement du Web). Les professeurs qui avaient participé à la création de cette formation aurait voulu mettre de l'analyse. Malheureusement, cela aurait fait passer la formation à BAC+3. Cela correspond plus à un bachelier en informatique avec du C, du C+, plus de théorie, ...).

          Comme c'était pour autre exercice (début), je ne devais pas encore tenir compte de la connexion à la base de données. Entre une analyse et la réalisation, il y a une marge. Surtout qu'on n'a pas vraiment un cours complet sur UML (juste quelques notions). On n'a pas non plus les programmes à disposition.

          Pour la classe Connexion, je me base sur un exemple qu'on avait vu avec un autre professeur. Il nous avait donné juste les bases de la POO. Il avait donné un exemple d'une classe réelle pour ceux ou celles qui voulaient aller plus loin. On avait l'hôte, l'utilisateur, le mot de passe, le nom de la base de données, la chaîne, les paramètres et la connexion. Ensuite, toutes les fonctionnalités étaient développées.

          Concernant ta méthode, c'est comme cela que l'on avait vu la connexion PDO au début sans la classe. Si je me souviens bien on avait une variable $connexion qui contenait une new PDO(). La variable était appelée dans les autres classes. Cependant, les développeurs et professeurs préfèrent avoir le plus possible tout en orienté objet (classes) pour la réutilisation, le travail en équipe, ...

          J'ai bien vu le MVC avec le modèle, le contrôleur et la vue ainsi que d'autres systèmes. Néanmoins, on a juste la théorie. Après, c'est débrouiller vous. Dans certains Framework, il y a aussi en plus un gestionnaire (Symfony 2 dont j'ai appris les bases y a trois ans). Cela remonte à loin.

          Le nouveau professeur principal n'est pas nécessairement pour l'utilisation d'un Framework. Il faut du temps pour l'apprendre, respecter des normes, ... De plus, un Framework évolue continuellement. Après quelques mois, des fonctionnalités deviennent obsolètes.

          Nous apprenons les bases du MVC tout séparé (juste la théorie) via des exercices. On aura un projet à réaliser avec notre MVC personnel (examen). Ensuite, on aura un plus projet réel avec un client. On devra aller beaucoup plus loin (sécurité, ...).

          Je ne pense pas avoir vu le chainage de méthode de classe ni la temporisation de sortie. En gros, on voit un peu de théorie chaque semaine. Après on doit apprendre par soi-même.

          Notre nouveau professeur principal est d'origine canadienne. Là-bas, ils utilisent beaucoup les classes inversées. Pour l'autonomie, c'est mieux. Malheureusement, on passe à côté des techniques que seule un professionnel dans le métier connaît.

          Je sais que je suis loin d'un niveau professionnel (création d'un mini-Framework). Par contre, je vais devoir faire un stage. Je ne sais pas les attentes exactes d'une entreprise concernant un ou une stagiaire. Je vis en Belgique. Je ne sais pas si c'est exactement comme en France.

          Normalement, je dois faire le stage avant juin 2017. Autrement, je serais obligée de refaire certains cours (évolution). Finalement, je ne sais pas si c'était une bonne idée de me lancer dans la programmation. La première année, c'était simple (le HTML, le CSS simple (pas le Responsive Design), les bases du JavaScript et le PHP procédural).

          J'ai dû interrompre la deuxième année en plein milieu. J'avais vu les bases de Symfony 2. Je devais être en repos d'accouchement. Ensuite, je me suis occupée de mes jumelles. Elles ont commencé l'école depuis janvier 2017. J'essaie de reprendre la formation en cours de route pour ne pas perdre encore un an.

          La façon de programmer s'est intensifiée avec la POO, le Responsive Design, le jQuery, le jQueryUI, le jQueryMobile, l'Ajax, ... avec une séparation de tout. Il n'est plus question de faire une ouverture et une fermeture des balises PHP pour aller chercher une information dans la base de données. Il faut aussi penser abstraction, généricité, héritage, récursivité, réutilisation, ...

          Je suis en retard sur une majorité d'exercices puisque j'ai recommencé en janvier 2017 et non en septembre 2016. Je ne m'en sors pas. Le nouveau professeur ne vient pas à côté de nous pour corriger nos erreurs. Il donne juste des pistes parfois ou continue d'avancer (beaucoup de matière à voir). C'est pourquoi, je me suis inscrite pour demander des conseils. Je précise que j'ai lu aussi une partie des tutoriels qui viennent d'ici (format PDF).

          Bonjour,

          Auriez-vous d'autres conseils?

          Je vous remercie énormément d'avance pour votre aide.

          Sarah

          <?php
          
              class Rubrique
              {
                  private $id;
                  private $nom;
                  private $destination;
                  private $classe;
                  private $tableauVerifications = array();
                  
                  function __construct($id, $nom, $destination, $classe, $tableauVerifications)
                  {
                      $this->id = $id;
                      $this->nom = $nom;
                      $this->destination = $destination;
                      $this->classe = $classe;
                      $this->tableauVerifications = $tableauVerifications;
                  }        
              }
          

          -
          Edité par DemandesInformations 18 février 2017 à 12:56:45

          • Partager sur Facebook
          • Partager sur Twitter
            18 février 2017 à 15:39:14

            C'est bien ce que je pensais tu es hors sujet on te demande de gerer un formulaire sur une page et toi tu veux créer un menu.

            Je comprend ta situation familiale qui t'a obligé a faire un pause mais pas tes profs. La modélisation de données et l'analyse c'est la base avant de taper la moindre ligne de code.

            J'ai un parcours aussi atypique que le tiens  même plus encore:) je vais pas raconter ma vie en publique mais j'ai un titre de niveau 3 de dev informatique option systeme internet/intranet ce qui correspnd a un bac plus 2 sauf que je l'ai eu en un an et je trouve abérant que tes prof juge que l'uml c'est optionel dans la réalisation d'un projet

            Je ne sais pas comment cela ce passe en belgique mais est ce que vous avez l'équivalent du CNAM(Conservatoire National des Arts et Métiers) Il propose de formation que l'on peux assimiler a des cours du soir pour se perfectionner dans certain domaine

            -
            Edité par kets14 18 février 2017 à 15:46:07

            • Partager sur Facebook
            • Partager sur Twitter
            "Il est hélas devenu évident aujourd’hui que notre technologie a dépassé notre humanité"  A.E.
              18 février 2017 à 19:17:38

              Bonsoir kets14,

              Je te remercie pour ta réponse. Je ne suis pas hors sujet! Je réalise simplement un exercice du même type mais plus simple. Avant de gérer un développement complexe, tu fais au plus simple. Le but revient au même (gérer une partie d'un site Web de manière totalement dynamique).

              Un menu demandent seulement deux classes sans de grandes difficultés. Un formulaire demandent au minium trois classes. Plus de paramètres complexes sont à gérer (vérifications sur chaque type de champ, ...).

              On a vu la structure d'une base de données avec le MLD (Modèle Logique de Données) si j'ai bien compris ma lecture sur le Web. Ce ne sont pas les professeurs qui sont contre l'analyse. C'est juste que plus haut (inspecteurs), ils ne l'ont pas prévu.

              Une formation compte entre x centaines ou parfois un plus d'un millier d'heures de cours. Les professeurs doivent suivre le programme. Il est déjà assez complexe de tout assimiler quand on commence comme débutant(e). Surtout avec l'évolution de l'informatique (Framework, ...) qui devient plus exigeante.

              Je peux suivre des cours d'analyse dans une autre formation (BAC+3 en informatique générale). Cependant, j'aurai du C, du C++, du Java et d'autres cours théoriques énormes (structure des ordinateurs, système d'exploitation, gestion des réseaux, ...) en plus du Web.

              Concernant les cours du soir, en Belgique, le promotion sociale existe. Cependant, généralement, tu as la même matière (enfin au niveau du titre du diplôme) avec moins d'heures.

              En journée, tu disposes de 8 + 8 + 5 + 8 + 8 soit environ 37 fois 50 minutes par semaine. Parfois un peu moins cela dépend du système de la formation (crédit d'heures (études supérieures traditionnelles), modules (promotion sociale), ...). En soirée, tu as maximum 5 fois 50 minutes par jour soit 25 fois 50 minutes par semaine.

              Personnellement, je préfère la journée. Je peux être plus présente pour les filles. Par contre, c'est difficile de se concentrer sur la programmation lorsqu'elles sont là. Lorsque j'avais commencé ma formation, j'étais dans un groupe qui s'entraidait. Le professeur prenait son temps pour réexpliquer une matière via des heures de rattrapage. Actuellement, c'est du chacun pour soi.

              Bonsoir,

              Auriez-vous d'autres conseils?

              Je vous remercie énormément d'avance pour votre aide.

              Sarah

              -
              Edité par DemandesInformations 18 février 2017 à 19:19:53

              • Partager sur Facebook
              • Partager sur Twitter
                21 février 2017 à 19:42:27

                Bonsoir DemandesInformations,

                Apparemment, on fait le même genre de formation. Je confirme qu'il n'y a pas de cours d'analyse UML. Par contre, c'est demandé en entreprise. Il est difficile en programmation de savoir si on a tous les acquis nécessaires pour faire un stage ou travailler dans ce domaine.

                On a discuté l'autre jour avec notre professeur principal. Les attentes entre les professeurs de la formation et celles des entreprises sont véritablement différentes. Une disait qu'elle avait dû travailler avec PERL. Une autre disait qu'on lui demandait de prendre des parties d'un Framework pour les réutiliser ailleurs. Une autre disait qu'elle devait apprendre JAVA. ETC

                Le fait de pouvoir créer son mini-Framework peut être bien vu. Cependant, il faut vraiment un bon niveau pour pouvoir le faire. On peut coder de 1.000 manières différentes (généricité (simple, moyenne et complexe), hachage des mots de passe (pareil), ...). Il y a aussi tous les gestionnaires (de formulaires, d'erreurs, ...).

                BON COURAGE

                BISOUS ET BONNE SOIRÉE

                Petite Développeuse

                • Partager sur Facebook
                • Partager sur Twitter
                D'avance, je vous envoie un énorme merci. BISOUS - Petite Développeuse
                  21 février 2017 à 21:14:35

                  Bonjour,

                  Je pense que l'erreur en capture d'écran est explicite, vous utilisez la fonction hydrate comme une static mais elle n’est pas static. Vous devriez passer une rubrique dans votre constructeur et faire un truc du genre $rubrique->hydrate(contenu).

                  Par contre je me permets d'intervenir sur le débats, en entreprise vous n’utiliserez surtout pas ça ! Les entreprises veulent de la productivité donc soient elles ont un framework maison soit elles utilisent un framework connu (le mieux à faire). Parce que demander à un/une novice de coder un framework c'est juste de l'hérésie.

                  Quand vous parlez de MVC je crois que ce n'est pas clair. Il n’y a aucune utilité à faire tout en php vraiment aucune, mais alors en plus ça va à l'encontre de MVC au niveau fonctionnel. Model View Controler, avoir vos contrôler et model en php ok ! Apres le mieux pour les View c'est html/twig, css et jquery/javascript. J’espère aussi que tout votre code n’est pas dans le même fichier, un fichier par classe et le code qui n’a rien à voir avec la classe doit être dans son fichier.

                  Je pense que ce que veut votre professeur c'est le pattern contrôleur et traitement/routage en php après on renvoi une vue mais non pas tout sans html.

                  Dans tous les cas prenez du temps pour voir Symfony2 ou Silex, au moins vous aurez une idée de comment coder un framework et de MVC. 

                  Allez voir ça : https://openclassrooms.com/courses/evoluez-vers-une-architecture-php-professionnelle 

                  Ou le cours Symfony2 sur OC.

                  Bon courage mais n’allez pas plus vite que la machine ou vous allez brasser de l’air.

                  -
                  Edité par Osush 21 février 2017 à 21:19:07

                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 février 2017 à 21:36:40

                    Moi en BTS SIO en France, on fait de l'UML qui nous aident beaucoup à développement sous symfony3
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Etudiant en deuxième année de BTS en développement. Accepté à la MIAGE de Rennes 2017

                    PHP objet - Site Web dynamique

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown