8311 sujets

Développement web côté serveur, CMS

Bonsoir a tous. Le libellé du sujet n'est pas très parlant mais bon....

Je suis entrain de créer un mini framework pour mes projets perso et j'aimerai mettre en place un système de capture de bloc comme sur cakephp
du genre

// Dans la vue
<?php $this->start('sidebar'); ?>
<h2>Ma sidebar</h2>
<ul><li>test</li><li>test 2</li></ul>
<?php $this->end(); ?>

// Dans le layout
<?= $this->fetch('sidebar'); ?>


J'ai essayé un truc bizarre mais j'aime pas trop l'approche

// Dans la vue j'ai...
<?php ob_start() ?>
#container {
    background: #76b4ee;
}
<?php Layout::block('css', ob_get_clean()); ?>

// Dans le layout
<?php Layout::show('css'); ?>

// Code de la classe Layout
<?php 
class Layout {
    private static $_blocks = [];
    
    public static function block($name, $content)
    {
        self::$_blocks[$name] = $content;
    }
    public static function show($name) 
    {
        echo self::$_blocks[$name] ?? null;
    }
}
?>


Utiliser les fonctions natives de PHP n'est pas très cool. J'aimerai bien une façade pour masquer l'utilisation de ob_start() et ob_get_clean() au niveau de la vue
Salut les gars... juste pour vous dire que je me suis un peu creuser les méninges et j'ai pu produire un truc intéressant

// Au niveau de la classe Layout
Class Layout
{
   private static $_blocks = [];

    public static function start(string $name) : void
    {
        $name = strtolower($name);
        ob_start(function ($buffer) use ($name) {
            if(isset(self::$_blocks[$name]))
            {
                self::$_blocks[$name] .= $buffer;
            }
            else
            {
                self::$_blocks[$name] = $buffer;
            }
        });
    }
    public static function end()
    {
        ob_end_clean();
    }
    public static function show(string $name)
    {
        $name = strtolower($name);
        if(!empty(self::$_blocks[$name]) AND $name == 'css')
        {
            echo "<style type=\"text/css\">\n".self::$_blocks[$name]."</style>\n";
        }
        else if(!empty(self::$_blocks[$name]) AND $name = 'js')
        {
            echo "<script type=\"text/javascript\">\n".self::$_blocks[$name]."</script>\n";
        }
        else
        {
            echo self::$_blocks[$name] ?? null;
        }
    }


La partie cliente n'utilise plus les fonctions natives de php

// Au niveau de la vue
<?php Layout::start('css') ?>
    html, body {
        margin: 0; paddding: 0;
        width: 100%; height: 100%;
    }
<?php Layout::end(); ?>

<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Commodi cumque delectus dolores expedita fugiat fugit harum in itaque libero, magni necessitatibus, neque omnis quaerat recusandae repellat rerum saepe similique vero.
</p>

<?php Layout::start('css') ?>
    body {
        background: red;
    }
    #container {
        display: flex; justify-content: space-between;
    }
<?php Layout::end(); ?>

// Au niveau du template
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>

    <?php Layout::show('css'); ?>
</head>
<body>

    <?php Layout::output(); ?>

    <?php Layout::show('js'); ?>
</body>
</html>


Moi sa me va... mais si vous avez une solution plus optimale ça me ferra plaisir Smiley cligne
Modifié par Dimtrovich (24 Oct 2019 - 21:54)
Salut Dimtrovich,

Je ne connais pas trop le but de la capture de blocks qui tu veux implémenter ici mais j'ai du mal à voir l'intérêt.
Tu ne veux pas utiliser un moteur de template comme Twig par exemple ? Tu as dû déjà l'utiliser et sais sans doute que c'est très puissant et complet.
J'ai l'impression que ça irait dans le sens de tes recherches.