2010-12-16 117 views
2

donc:PhamlP rend PHP sous forme de commentaires, le code est exécuté ne

je tout à fait comme l'utilisation Haml dans des projets de rubis, et a été le tester en PHP. J'ai essayé PhamlP parce qu'il semble que ce n'est pas mort, alors que phpHaml et pHaml n'ont pas été mis à jour en près de 4 ans.

Maintenant, le problème que j'ai est le code PHP que PhamlP est en train d'analyser apparaît comme des commentaires en HTML au lieu d'être exécuté. Voici le fichier de test, index.php:

include_once('haml/HamlParser.php'); 
$haml = new HamlParser(array('ugly'=>'false')); 
$page = $haml->parse('test.haml'); 
echo $page; 

Voici le fichier test.haml:

!!! 
- $foo = 'bar' 
%h1 Foo this 
.test= $foo 

et voici la sortie que je reçois dans le navigateur quand je voir la source:

<?php 
require_once '/Users/Andrew/Sites/eighty-b/_app/haml/HamlHelpers.php'; 
?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<?php $foo = 'bar'; ?><h1>Foo this</h1><div class="bar">This better fooacross multiple lines butstill in the bar div!</div><div class="test"><?php echo $foo; ?></div> 

Ainsi, par exemple, la ligne - $foo = 'bar' n'est pas exécutée, elle passe en quelque sorte au navigateur en tant que commentaire.

Comment diable corrigez-vous cela?

Répondre

3

Je ne sais pas, mais la solution de contournement évidente serait de remplacer le echo $page avec:

eval("?".">".$page); // oh nooooes, eval is evil!!!!! 

Je suppose ->parse juste une conversion ne fait, et la sortie est censé être stocké dans une nouvelle Fichier .php de sortie/modèle/cache généralement.

+0

Oui, cela l'a corrigé ... semble maladroit mais cela fonctionne. – Andrew

1

Le point de ce n'est pas tant d'être évalué - que c'est de préparer du code PHP, des modèles et de minimiser le balisage php/html, tout en gardant les choses comme D.R.Y. possible (c'est mon avis de toute façon).

1

Je trouve qu'il est plus simple d'avoir PHamlP rendre la page au fichier PHP, puis inclure le fichier. Cet exemple suppose que vous disposez d'un répertoire « cache » qui est chmod à 755:

include_once('haml/HamlParser.php'); 
$haml = new HamlParser(array('ugly'=>'false')); 
$page = $haml->parse('test.haml', 'cache'); 
require_once 'cache/test.php'; 

De cette façon, tout le code PHP exécute et vous affiche correctement la page. Le fichier test.php sera généré chaque fois que la page est chargée, donc vous devrez supprimer le code pour analyser le fichier Haml dans un environnement de production.

0

Réponse longue et à peine liée, mais c'est ce que je fais. Cela a été inspiré par Devers réponse ci-dessus

J'utilise la pierre précieuse rubis de garde, et phamlp convertir automatiquement mes fichiers .haml en fichiers .php

Mon fichier garde

require 'guard/plugin' 
module ::Guard 
    class Phamlp < ::Guard::Plugin 
    def run_all 
    end 

    def run_on_changes(paths) 
     paths.each do |path| 
      puts path 
      puts File.dirname path 
      system "php hamlconverter.php #{path} #{File.dirname path}" 
     end 
    end 
    end 
end 

guard :phamlp do 
    watch(/^.+(\.haml)$/) 
end 

et haml converter.php

<?php require_once 'phamlp/haml/HamlParser.php'; 
$haml = new HamlParser(array('style'=>'nested', 'ugly'=>'compressed', 'debug'=>true)); 
$haml->parse($argv[1], $argv[2]); ?> 

Si vous exécutez maintenant guard il suivra vos fichiers .haml et s'ils changent, il les convertira o .php fichiers