PhamlP将PHP呈现为注释,不执行代码

时间:2010-12-16 03:45:21

标签: php haml

所以:

我非常喜欢在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'未被执行,它以某种方式作为注释传递给浏览器。

你怎么解决这个问题?

4 个答案:

答案 0 :(得分:3)

不知道,但明显的解决方法是将echo $page替换为:

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

我认为->parse只进行转换,输出通常应存储在新的.php输出/模板/缓存文件中。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

我发现让PHamlP将页面呈现为PHP文件,然后包含该文件最简单。这个例子假设你有一个目录&#39; cache&#39;那个被编织到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文件。

答案 3 :(得分:0)

很长而且几乎没有相关的答案,但这就是我所做的。这是受上面的devers回答的启发

我使用guard ruby​​ gem和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个文件,如果这些文件发生变化,则会将其转换为.php个文件