在Twig中创建函数不起作用

时间:2015-06-29 23:37:42

标签: php twig

我正在尝试转换一些PHP代码,以便它使用Twig作为其模板引擎。

我之前开发的代码以这样的方式工作:生成HTML下拉列表涉及调用静态方法(formTools :: generateSchoolList()),该方法查询数据库,然后将结果回显到HTML(意大利面条代码)。 / p>

我一直在创建一些问题,然后显示功能的结果,我希望有人可以帮我解决我收到的错误。在formTools.class.php中,我指的是这个例子的单个静态方法,尽管Twig Docs建议使用匿名方法(我在匿名函数中调用了上面的静态函数),但我无法将其转换为work,所以我直接将Twig_SimpleFunction可调参数作为静态方法。

如果我这样做,我得到(在静态方法中使用return):

  

解析错误:语法错误,意外'<'在/Path_To_Vendor/vendor/twig/twig/lib/Twig/Environment.php(332):第46行的eval()代码

     

致命错误:第346行的/Path_To_Vendor/vendor/twig/twig/lib/Twig/Environment.php中找不到类'__TwigTemplate_96fa0bd50202e1016defd78dc63d0ee7f8c3432728ffb0946f67a6a1e5c89437'

如果我在静态函数中回显,我得到:

  

致命错误:在第27行的/path_to_vendor/vendor/twig/twig/lib/Twig/Node/Expression/Call.php中调用未定义的方法Twig_SimpleFunction :: compile()

formTools.class.php

/**
 * Generates a list of all available schools in a dropdown box
 *
 * @throws Exception
 */
static function generateSchoolList() {
    $db = new database(databaseHost, databaseUser, databasePass, databaseName);
    $query = "SELECT * FROM `schoolCodes`";
    $codes = $db->query($query);

    if (isset($codes)) {
        $result = "<select name='schoolCode'>";
        $result .= "<option class='dropdown' value=''>&nbsp;&nbsp;&nbsp;&nbsp;</option>";
        $result .= "<option class='dropdown' disabled>----</option>";
        foreach ($codes as $code) {
            $result .= "<option class='dropdown' value='{$code['codeID']}'>{$code['schoolName']} ({$code['code']})</option>";
        }
        $result .= "</select>";
        **echo/return** $result;
    } else {
        throw new Exception("The schoolCodes table is empty.");
    }
}

formviewer.php

require_once('../vendor/autoload.php');
$ft = new formTools();
$it = new ingestTasks();

Twig_Autoloader::register();
$loader = new Twig_Loader_Filesystem('../templates');
$twig = new Twig_Environment($loader);

$function = new Twig_SimpleFunction('generateSchoolList',
    formTools::generateSchoolList()
);
$twig->addFunction($function);

$template = $twig->loadTemplate('viewPlayersByRoster.twig');
echo $twig->render($template);

viewPlayersByRoster.twig

{% extends "base.twig" %}

{% block title %}View Players by Roster{% endblock %}

{% block content %}
<p class="formDesc">This form is for viewing all players on a given roster.</p>
<form action="formviewer.php?action=viewPlayersByRoster" target="_self" method="post">
    <input hidden="hidden" value="viewPlayersByRoster" name="action"  title="action"/>
    <table>
        <tr>
            <td class="rightAlignText"><label for="schoolCode">School:</label></td>
            <td>{{ generateSchoolList() }}</td>
        </tr>
    </table>
</form>
{% endblock %}

编辑: 使用PHP 5.5.24(无法通过此更新),Twig 1.18.2并使用Composer。

composer.json

"require": {
    "twig/twig": "v1.18.2"
  },
      "autoload": {
    "classmap": ["libs/"]
}

编辑2:

改为tacone所说的并得到了这个:

  

可捕获的致命错误:第211行的/path_to_vendor/vendor/twig/twig/lib/Twig/Loader/Filesystem.php中无法将类__TwigTemplate_96fa0bd50202e1016defd78dc63d0677具有的对象无法转换为字符串

/Filesystem.php

protected function normalizeName($name)
{
    return preg_replace('#/{2,}#', '/', strtr((string) $name, '\\', '/'));
}

formTools.class.php

public function __toString() {
    return $this->formTools;
}

1 个答案:

答案 0 :(得分:2)

您正在执行静态方法而不是传递其坐标。

尝试使用PHP经典回调语法:

$function = new Twig_SimpleFunction('generateSchoolList', ['formTools', 'generateSchoolList']);
$twig->addFunction($function);

另见https://stackoverflow.com/a/29629460/358813