2010-12-16 103 views
2

所以:PhamlP呈现PHP作为注释,代码不会执行

我很喜欢在Ruby项目中使用Haml,并在PHP中进行测试。我一直在尝试PhamlP,因为它看起来并没有死亡,而phpHaml和pHaml在近4年内还没有更新。

现在,我遇到的问题是PhamlP解析的php代码显示为HTML中的注释而不是执行。下面是测试文件,index.php文件:

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

这里的test.haml文件:

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

和这里的输出我在浏览器中得到,当我查看源代码:

<?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> 

因此,例如,行- $foo = 'bar'没有被执行,它以某种方式传递给浏览器作为注释。

你是怎么修好的?

回答

3

不知道它,但显而易见的解决办法是更换echo $page有:

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

我认为->parse不只是一个转换,输出应该被存放在一个新的.php输出/模板/缓存文件通常。

+0

是的,这固定它...似乎笨重,但它的作品。 – Andrew 2010-12-17 05:19:46

1

它的要点并不是要评估 - 因为它是准备PHP代码,模板和最小化php/html标记,同时保持D.R.Y.尽可能(这是我的反正)。

1

我觉得最简单的就是让PHamlP将页面呈现给PHP文件,然后包含文件。这个例子假设你有一个目录的“缓存”是chmoded为755:

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

这样,所有的PHP代码执行和你页面显示正常。每次页面加载时都会生成test.php文件,因此您需要删除代码以解析生产环境中的Haml文件。

0

很长和几乎没有相关的答案,但这是我所做的。这是灵感来自德弗斯回答上述

我使用保护红宝石的宝石,并phamlp我.haml文件自动转换成.php文件

我的后卫文件

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 

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]); ?> 

如果你现在运行guard它会跟踪你的.haml文件,如果它们改变了,它会将它们转换为t .php文件