我正在尝试转换一些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=''> </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;
}
答案 0 :(得分:2)
您正在执行静态方法而不是传递其坐标。
尝试使用PHP经典回调语法:
$function = new Twig_SimpleFunction('generateSchoolList', ['formTools', 'generateSchoolList']);
$twig->addFunction($function);