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 :

Composite view (MVC)


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 11
    Par défaut Composite view (MVC)
    Bonjour, à tous j'ai suivi le tutoriel suivant pour développer son propre Framework MVC.

    J'essaye actuellement de changer le pattern Template view par un composite view mais je ne comprend pas comment lier mon ActionController à celui-ci.

    Pour cela je dispose donc des classes CompositeView et SimpleView qui extends toute les deux une classe AbstractView.


    Merci beaucoup de votre aide

  2. #2
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Par défaut
    Bonjour,

    Ne faudrait-il pas ajouter du code ???

    Cdt,

    Mathieu

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Personnellement, j'ai créé un Singleton ViewManager capable d'appeler les vues, ça ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class FooController extends BaseController
    {
        public function index ()
        {
             $this->registry->addVar('foos', FooManager::getFoos());
             ViewManager::setRegistry($this->registry)->load('/path/template');
        }
    }

  4. #4
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Par défaut
    Tu es encore un peu avare en code source...

  5. #5
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 11
    Par défaut
    Toute mes excuses j'ai posté tard hier et j'ai oublié de donner les liens ^^

    Alors j'ai suivi ce tuto pour le framework MVC

    http://julien-pauli.developpez.com/t...vc-controleur/

    Pour mon composite pattern je me suis très fortement basé sur
    http://www.devshed.com/c/a/PHP/PHP-C...esign-Pattern/

    ma classe AbstractView
    Code php : 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
    <?php
    /* 
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    abstract class AbstractView
    {
        protected $_template = 'default';
        protected $_properties = array();
     
        public function __construct($template = '', array $data = array())
        {
            if ($template !== '') {
                $this->setTemplate($template);
            }
            if (!empty($data)) {
                foreach ($data as $name => $value) {
                    $this->$name = $value;
                }
            }
        }
        public function setTemplate($template)
        {
            $template = $template . '.php';
            if (!file_exists($template)) {
                throw new ViewException('The specified view template does not exist.');
            }
            $this->_template = $template;
        }
        public function getTemplate()
        {
            return $this->_template;
        }
     
        public function __set($name, $value)
        {
            $this->_properties[$name] = $value;
        }
     
        // get the specified property from the view
        public function __get($name)
        {
            if (!isset($this->_properties[$name])) {
                throw new ViewException('The requested property is not valid for this view.');
            }
            return $this->_properties[$name];
        }
     
        // remove the specified property from the view
        public function __unset($name)
        {
            if (isset($this->_properties[$name])) {
                unset($this->_properties[$name]);
            }
        }
     
        // add a new view (implemented by view subclasses)
        abstract public function addView(AbstractView $view);
     
        // remove a view (implemented by view subclasses)
        abstract public function removeView(AbstractView $view);
     
        // render the view template
        public function render()
        {
            if ($this->_template !== '') {
               extract($this->_properties);
               ob_start();
               require($this->_template);
               $str = ob_get_contents();
               ob_get_clean();
               return $str;
            }
        }
    }
    ?>
    Ma classe CompositeView
    Code php : 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
    <?php
     
    class CompositeView extends AbstractView
    {
        protected $_views = array();
     
        // factory method (chainable)
        public static function factory($view, array $data = array())
        {
            return new self($viewfile, $data);
        }
     
        // add a new view object
        public function addView(AbstractView $view)
        {
            if (!in_array($view, $this->_views, TRUE)) {
                $this->_views[] = $view;
            }
            return $this;
        }
     
        // remove an existing view object
        public function removeView(AbstractView $view)
        {
            if (in_array($view, $this->_views, TRUE)) {
                $views = array();
                foreach ($this->_views as $_view) {
                    if ($_view !== $view) {
                        $views[] = $_view;
                    }
                }
                $this->_views = $views;
            }
            return $this;
        }
     
        // render each partial view (leaf) and optionally the composite view
        public function render()
        {
            $innerView = '';
            if (!empty($this->_views)) {
                foreach ($this->_views as $view) {
                    $innerView .= $view->render();
                }
                $this->content = $innerView;
            }
            $compositeView = parent::render();
            return !empty($compositeView) ? $compositeView : $innerView;
        }
    }
    ?>

    Ma classe SimpleView

    Code php : 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
    <?php
    /* 
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
     
    class SimpleView
    {
     
        public function addView(AbstractView $view)
        {
            throw new ViewException('A simple view cannot add another view.');
        }
     
        public function removeView(AbstractView $view)
        {
            throw new ViewException('A simple view cannot remove another view.');
        }
     
    }
    ?>

    Dan le tuto MVC il s'agit d'un Template Pattern et la classe Response s'occupe des variables de la vue( __set(), __get() ), hors avec le composite View chaque vue s'occupe elle même de ses variables. Comment lier le ActionControlller au composite ? Car j'ai une CompositeView qui correspond à mon Layout principal puis les vues qui le compose.

    Merci beaucoup

  6. #6
    Membre chevronné
    Inscrit en
    Août 2007
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 360
    Par défaut
    Tu ne donnes toujours pas le code de ton BaseController ni de ta classe Response, j'ai vraiment du mal à cerner ton problème...

Discussions similaires

  1. Différence entre Master Page et MVC 2 View Master Page
    Par stefsas dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 11/09/2010, 23h35
  2. Réponses: 14
    Dernier message: 26/08/2010, 04h21
  3. Réponses: 7
    Dernier message: 10/03/2010, 19h45
  4. [ASP.NET MVC] Inherits des Views
    Par Leelith dans le forum ASP.NET
    Réponses: 3
    Dernier message: 06/10/2009, 02h07
  5. Réponses: 0
    Dernier message: 17/12/2008, 15h20

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