将php变量传递到Twig-文档抛出错误

时间:2018-09-07 01:21:23

标签: php twig opencart

更新:1

我正在DarkBee的帮助下使用此方法

$detect = new Mobile_Detect;
class Project_Twig_Extensions extends Twig_Extension{
    public function getFunctions(){
        return array(new Twig_SimpleFunction('detectDevice', function() use($detect){
            if($detect->isMobile()){
                return true;
            } else {
                return false;
            }
        }));
    }
}

我正在Twig中使用

{% if detectDevice %}

没有传递值并且没有满足条件,因此检查文档我写了另一种方法,以防万一 https://twig.symfony.com/doc/2.x/advanced.html#functions

$twig = new Twig_environment($loader);
$function = new Twig_Function('detectDevice', function() use($detect){
    if($detect->isMobile()){
         return true;
    } else {
         return false;
    }
});
$twig->addFunction($function);

虽然也没有传递任何值,但是由于DarkBee,我的500个服务器错误已愉快地停止了,但是我似乎仍然无法正确地将其传递给Twig。

原始问题

我在将出色的Mobile_Detect插件安装到我的Opencart 3.0项目(https://github.com/serbanghita/Mobile-Detect)时遇到了很大的麻烦,我已经将其插入并成功检查了该设备在php中是台式机还是移动设备。

我学会了将php检查传递到树枝,我可以将其添加到全局变量中

  $twig = new Twig_Environment($loader);
  $mobTwig->addGlobal('isMobile', true);

或创建扩展树枝的公共功能

require_once(DIR_SYSTEM . 'detect/mobiledetectlib/Mobile_Detect.php');
$detect = new Mobile_Detect;
$detectFunction = new function(){
    if($detect->isMobile()){
       return true;
    } else {
       return false;
    }
}

class Project_Twig_Extensions extends Twig_Extension{
    public function getFunctions(){
        return array(new Twig_SimpleFunction('detectDevice', '$detectFunction'));
    }
}

两个选项均返回500 Internal Server Error,并立即停止页面加载。在过去的几天里,我不知道为什么。没有多少谷歌搜索对我有帮助。有谁知道为什么会这样?

1 个答案:

答案 0 :(得分:0)

您发布的代码中存在很多问题:

  1. Anonmynous functions

fun zipAll(directory: String, zipFile: String) { val sourceFile = File(directory) ZipOutputStream(BufferedOutputStream(FileOutputStream(zipFile))).use { zipFiles(it, sourceFile) } } private fun zipFiles(zipOut: ZipOutputStream, directory: File) { val data = ByteArray(1024) zipOut.use { if (directory.isDirectory) { //Adding directory it.putNextEntry(ZipEntry(directory.name)) } else { zipFiles(zipOut, directory) } for (f in directory.listFiles()) { if (!f.name.contains(".zip") && f.exists()) { //Adding file FileInputStream(f).use { fi -> BufferedInputStream(fi).use { origin -> val entry = ZipEntry(f.name) it.putNextEntry(entry) while (true) { val readBytes = origin.read(data) if (readBytes == -1) { break } it.write(data, 0, readBytes) } } } } } } } 中,您无法实例化PHP,仅使用此语法即可定义一个统一的函数

new function()
  1. 将变量传递给统一函数

在函数$foo = function() { return 'foo'; } echo $foo(); //output: foo 中,您试图访问变量$detectMobile,但是该变量未在自动函数的scope中定义。

要在函数中正确使用$detect,您需要使用语言构造use

$detect

您还可以使用global语言构造,但不建议这样做

$detectFunction = new function() use($detect) {
    if ($detect->isMobile()) return true;
    else return false;
}   
  1. 传递自主功能

请勿使用quotes传递实例变量。

  • 使用$detectFunction = new function() { global $detect; if ($detect->isMobile()) return true; else return false; } 将告诉new Twig_SimpleFunction('detectDevice', '$detectFunction')运行全局函数twig

  • 使用$detectFunction将尝试将自动函数转换为字符串。不可能

传递匿名函数的唯一正确方法是传递引用:

new Twig_SimpleFunction('detectDevice', "$detectFunction")

现在,如果将所有内容组合在一起,您将可能会变成这样

new Twig_SimpleFunction('detectDevice', $detectFunction)

甚至更好

class Project_Twig_Extensions extends Twig_Extension{
    public function getFunctions() {
        $detect = new Mobile_Detect();

        return array(new Twig_SimpleFunction('detectDevice', function() use($detect) {
            if ($detect->isMobile()) return true;
            else return false;
        }));
    }
}

关于遗失的笔记,请确保在开发时show all errors