Une classe de vue / frame / calque

Eléphant du PHP | 79 Messages

28 juin 2013, 23:09

Bonjour,

Je viens exposer ma petite classe qui me serre à traiter des fichiers de vue (phtml) dans mon pseudo framework. Histoire de savoir si vous la trouver fonctionnelle ?

class view
{
    private $filename ;
    
    private $vars ;
    
    public function __construct( $vars = array() )
    {
        $this-> vars = $vars ;
    }
    
    public function __set( $name, $value )
    {
        $this-> vars[$name] = $value ;
    }
    
    public function __get( $name )
    {
        $result = null ;
        
        if( array_key_exists( $name, $this-> vars ) )
        {
            $result = $this-> vars[$name];
        }
        
        return $result ;
    }
    
    public function __isset( $name )
    {
        return isset( $this-> vars[$name] );
    }
    
    public function __unset( $name )
    {
        if( array_key_exists( $name, $this-> vars ) )
        {
            unset( $this-> vars[$name] );
        }
    }
    
    public function __toString()
    {
        return $this-> render();
    }
    
    public function open( $filename )
    {
        if( file_exists( $filename ) )
        {
            $this-> filename = $filename ;
        }
        else
        {
            $this-> filename = null ;
            
            trigger_error( "View \"$filename\" not found." );
        }
    }
    
    public function render()
    {
        $result = '' ;
        
        if( !is_null( $this-> filename ) )
        {
            ob_start();
            
            require $this-> filename ;
            
            $result = ob_get_contents();
            
            ob_end_clean();
        }
        
        return $result ;
    }
}

Vue main :

<!DOCTYPE html>
<html>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title><?php echo $this-> title ?></title>
</head>

<body>
<div id="main">
<?php echo $this-> content ?>
</div>
</body>

</html>

vue content :

<div id="main">
<h1><?php echo $this-> message ?></h1>
</div>

Exploitation PHP :

// CONTENU :

$pageContent = new view();

$pageContent-> open( './view/contenu.phtml' );

$pageContent-> message = "Ceci est un message" ;

// MAIN :

$pageMain = new view();

$pageMain-> open( './view/main.phtml' );

$pageMain-> title = "Titre du site"

$pageMain-> content = $pageContent ;

echo $pageMain ;

En espérant aider certain.

Ciao

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 juin 2013, 23:56

Modération :
Afin d'obtenir plus de réponses, le sujet a été déplacé dans un forum plus approprié.


salut,

quitte à utiliser un système de template autant utiliser un système avec des "$variable" (plutôt des token) dans le code html.

ensuite parse du fichier et remplacement des variables pour le rendu.

sinon perso je suis plus fan du tableau d'argument.
et l'utilisation du buffer de sortie j'suis pas fan non plus ;)

le type de système que je trouve le plus pratique c'est le framework JSF2 pour java :)

un système d'include dans les fichier afin de pouvoir créer un vrai squelette aux pages et éviter de devoir recopier la partie "immuable" du site (entête, pieds de pages, menu etc).


mais c'est un bon début.

Merci de ta contribution, je déplace dans la partie contribution c'est plus sa place :D

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 79 Messages

29 juin 2013, 14:41

A l'inverse de ce que tu penses, ce système et bien plus pratique. Dans un système de template, la gestion de boucle et très ennuyeuse a mettre en place, avec un système de balisage.

La rien de compliquer un simple "foreach" d'une variable que tu as configuré en amont suffi.

Exemple :

<?php

// $result étant un connection PDO
// sur laquel on a prepare/execute/fetchall une requête en PDO::FETCH_OBJ

$pageContent = new view();

$pageContent-> open( './view/contenu.phtml' );

$pageContent-> result = $result ;

?>

// la vue rataché :

<div id="result">
<?php if( !is_null( $this-> result ): ?>
<table>
<thead>
<tr>
<th>id</th>
<th>nom</th>
<th>prénom</th>
</tr>
</thead>
<tbody>
<?php foreach( $this-> result as $item ): ?>
<tr>
<td><?php $item -> id ?></td>
<td><?php $item -> nom ?></td>
<td><?php $item -> prenom ?></td>
</tr>
<?php endforeach ?>
</tbody>
</table>
<?php else: ?>
<span>Aucun résultat trouvé.</span>
<?php endif ?> 
</div>

De la même manière, cette classe permet de géré une arborescence de vue, c' est à dire une vue dans une vue...

Exemple :

<?php

// Entête (header) ;

$pageHeader = new view();

$pageHeader-> open( PATH_ROOT.'/apps/main/view/header.phtml' );

// Pied de page (footer) ;

$pageFooter = new view();

$pageFooter-> open( PATH_ROOT.'/apps/main/view/footer.phtml' );

// page de fond comprenant tous les éléments de base (header/content/footer) ;

$pageMain = new view();

$pageMain-> open( PATH_ROOT.'/apps/main/view/main.phtml' );

$pageMain-> title = "Titre du site" ;

// liste des css nécéssaire à la page principale ;

$pageMain-> css = array(
    "/data/main/css/main.css",
    "/data/bootstrap/css/bootstrap.css"
);

$pageMain-> header = $pageHeader ;

$pageMain-> content = $pageContent ; // resultat de la requête

$pageMain-> footer = $pageFooter ;

echo $pageMain ;

?>

// La vue main :

<!DOCTYPE html>
<html>
    
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title><?php echo $this-> title ?></title>

<?php foreach( $this-> css as $css ): ?>
<link rel="stylesheet" type="text/css" href="<?php echo $css ?>" />
<?php endforeach ?>

</head>

<body>

<div id="main">
<div id="global" >
<div id="header">
<?php echo $this-> header ?>
</div>
<div id="content">
<?php echo $this-> content ?>
</div>
</div>
<div id="footer">
<?php echo $this-> footer ?>
</div>
</div>
    
</body>

</html>

// la vue header:

<div id="header-content">
le contenu du header
</div>

// la vue footer :

<div id="footer-content">
le contenu du footer
</div>

Ciao

Eléphant du PHP | 77 Messages

09 nov. 2013, 20:23

Personnellement, je préfère travailler avec un moteur de template existant et notamment SMARTY.

Ils s'intègre très facilement dans n'importe quel framework existant et permet de faire tous les traitements dans les vues sans souci.

Ok c'est une surcouche, il faut apprivoiser la syntaxe, mais quand on a l'habitude c'est vraiment nickel notamment la possibilité de créer des plugins qui est réellement un plus (par exemple le dernier que j'ai fait permet en mettant en entrée un tableau clé/valeurs de restituer une liste à option avec en value la clé et en title la valeur).
Développeur PHP/Javascript/HTML

Mes sites perso :
construire une piscine => http://www.construire-sa-piscine.com
Le cadre végétal => http://www.cadre-vegetal.org

Mammouth du PHP | 790 Messages

09 nov. 2013, 21:27

Salut,
bien moi je vais tester juste pour voire si non perso j'utilise Twig, j'ai un dossier template qui contient une base html, les js, css et autre, dans chaque module, j'ai les vues qui correspondent a chaque page et c'est Twig que se charge de rassembler tous ça, j'en suis bien content mais j'ai rien essayer d'autre enfin juste survoler Smarty avec Arfooo...
Les fautes de grammaire et d'orthographe contenu dans mes postes sont sous copyright, vous pouvez les utiliser pour un usage personnelle mais vous ne devrez en aucun cas les utiliser a des fins commercial sans une autorisation écrite de ma part.