2010-12-16 102 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文件