Bonjour à tous,

je suis en train d'ajouter une partie plugins sur mon MVC qui est basé sur celui de Grafikart et je cherche à pouvoir appeler un fichier (genre css) depuis le plugin et qu'il soit afficher directement dans mon layout.

Je sais pas si j'ai bien expliqué mais je vais vous le montrer ce sera plus simple^^ :

Page du thème :

<?=$this->fetch('css'); ?>

Controller.php :

public function fetch($type, $more = NULL){
        if($type=="css") {
            $this->css.= '<link rel="stylesheet" href="http://'.$_SERVER'HTTP_HOST'].BASE_URL.'app'.DS.'webroot'.DS.'css'.DS.'bootstrap.min.css" type="text/css"/>';
            if(isset($more)) {
                ob_start(); 
                $this->css.= $more;
            }
            return $this->css;
        } else {
            return false;
        }
    }
    function loadPlugin($name){
        if(!isset($this->$name)){
            if(WYSIWYG_EDITOR == $name) { $name.='Wysiwyg';}
            if(file_exists(PLUGINS.DS.ucfirst($name).DS.'config.php')) {
                $file = PLUGINS.DS.ucfirst($name).DS.'config.php';
            } else {
                $file = APP.DS.'view'.DS.'plugins'.DS.$name.DS.'config.php';
            }
            $newname=explode('/',$name);
            require_once($file);
            $name=$newname[count($newname)-1];
            $this->$name = new $name(); 
        }
    }

PostsController :

<?php
function admin_edit($id = null){
        $this->loadPlugin('ckeditor');

Plugins config.php (ckeditor)

class CKEditorWysiwyg extends Controller{
    public function __construct(){
        $this->fetch('css','<script type="text/javascript" src="http://'.$_SERVER'HTTP_HOST'].BASE_URL.'app'.DS.'view'.DS.'plugins'.DS.'CKEditorWysiwyg'.DS.'webroot'.DS.'js'.DS.'ckeditor.js"></script>');
    }

Le soucis actuel c'est que le layout est appelé avant le plugin (qui lui est appelé dans le controller). Donc il ne m'affiche pas mes fichiers css

Savez-vous comment faire pour les afficher sur le layout en ayant un appel de plugin après ?

Merci d'avance

6 réponses


matthieuy
Réponse acceptée

Comme pour un système de template, utilise une variable que tu remplace à la fin
Exemple dans ton code HTML

<!-- ##INSERT_JS## -->
</body></html>

Puis dans ton PHP, un truc du genre :

<?php
// Afficher le rendu de la page
$codeHTML = str_replace('<!-- ##INSERT_JS## -->', $this->fetch('js'), $codeHTML);
echo $codeHTML;

Salut,

Au lieu d'afficher ton code HTML, tu peux le mettre dans une variable à l'aide de temporisation de sortie.
Ensuite, tu n'as plus qu'a parser ton code pour insérer les balises CSS et/ou JS.
Une fois fait, tu affiches ton code HTML modifié

C'est clair ou tu veux un peu plus de détail ?

shinix
Auteur

Hello,

Merci pour ta réponse. J'ai pensé à faire comme ça mais je trouvais cela contraignant. J'ai réussi à le faire mais le script s'affiche avant le doctype. Enfin pour le moment ça marche, ce n'est pas l'idéal mais c'est toujours ça.

shinix
Auteur

Effectivement je voyais pas la chose comme ça. je vais essayer d'ici peu cette méthode. merci :)

Arf Même en remplacant comme ça, ça me l'affiche avant le <doctype>

Surement un problème de temporisation de la sortie.
Normalement si tu temporises bien la sortie et met en commentaire le "echo $codeHTML;" finale : tu devrais avoir une page blanche car tout est mis dans une variable qui n'est jamais affichée.

Ton "ob_start()" dans la méthode "fetch()" est-il toujours vraiment nécessaire à cet endroit ?
Ou alors il te manque un "ob_get_contents()" quelque part pour récupérer le code HTML avant de remplacer la balise "<!-- ##INSERT_JS## -->" ?

Après je sais pas comment tu récupères le code HTML donc peut pas trop t'aider mais cette méthode fonctionne (je m'en sers avec Assetic sur mon framework maison)

shinix
Auteur

En faite ce qui est marrant c'est que ça m'affiche mes scripts visible dans le fetch au bon endroit mais par contre le plugin lui est affiché en haut.

Je vais regarder plus en détail le pourquoi du comment car je l'ai fait un peu à l'arrache. Je vais utiliser ta méthode qui me semble le plus simple.

Je te remercie :)