【问题标题】:PhamlP renders PHP as comments, code isn't executedPhamlP 将 PHP 呈现为注释,代码未执行
【发布时间】:2011-05-26 07:52:37
【问题描述】:

所以:

我非常喜欢在 ruby​​ 项目中使用 Haml,并且正在 PHP 中对其进行测试。我一直在尝试PhamlP,因为它看起来还没有死,而 phpHaml 和 pHaml 已经将近 4 年没有更新了。

现在,我遇到的问题是 PhamlP 正在解析的 php 代码在 HTML 中显示为 cmets 而不是执行。这是测试文件,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' 行没有被执行,它以某种方式作为注释传递到浏览器。

你是怎么解决这个问题的?

【问题讨论】:

    标签: php haml


    【解决方案1】:

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

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

    我假设-&gt;parse 只是进行转换,并且输出通常应该存储在一个新的 .php 输出/模板/缓存文件中。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        我发现最简单的方法是让 PHamlP 将页面呈现为 PHP 文件,然后包含该文件。此示例假设您有一个 chmod 为 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 文件。

        【讨论】:

          【解决方案4】:

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

          我使用保护 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 文件

          【讨论】:

            猜你喜欢
            • 2015-07-21
            • 1970-01-01
            • 1970-01-01
            • 2011-08-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-21
            相关资源
            最近更新 更多