Php phalcon:volt从数组中获取值,该数组的键取自变量

Php phalcon:volt从数组中获取值,该数组的键取自变量,php,phalcon,volt,Php,Phalcon,Volt,在phalcon模板引擎volt(类似于twig)中,您可以通过以下方式获取所有记录: {% for product in products %} Name: {{ product.name }} Description: {{ product.description }} price: {{ product.price}} {% endfor %} 因此,在我的场景中,我正在构建一个crud模板,用于不同类型的模型。我想在这个模板中实现的是,这个视图中的每一列都不是

在phalcon模板引擎volt(类似于twig)中,您可以通过以下方式获取所有记录:

{% for product in products %}
    Name: {{ product.name }}
    Description: {{ product.description }}
    price: {{ product.price}}
{% endfor  %}
因此,在我的场景中,我正在构建一个crud模板,用于不同类型的模型。我想在这个模板中实现的是,这个视图中的每一列都不是硬编码的。因此,我将要显示的列存储到一个数组中(在控制器中定义,传递给视图):

在视图中,要使其显示所有列,请执行以下操作:

{% for product in products %}
   {% for col in cols %}
       {{ col }}: {{ product.col }}
   {% endfor  %}
{% endfor  %}
显然,这将导致错误,因为产品中没有“col”


是否有任何解决方案或替代方案

在对volt extension进行修补时,我发现了一个更简单的解决方案:

  • 将模型对象转换为数组。在控制器中:
    $products->toArray()

  • 简单地说,在视图中,要显示数组中特定键的特定值:
    {{{product[key]}}


  • 问题解决了,但因为它现在不是对象的形式,我无法使用类似点的
    {{product.some_field}
    ,而不是
    {product['some_field']}

    访问对象属性。您应该使用readAttribute()函数:


    另一种解决方案:

    app/config/service.php
    中:

    $di->set('volt', function($view, $di) {
        $volt = new VoltEngine($view, $di);
        $volt->setOptions(array(
            'compiledPath' => APP_PATH . 'cache/volt/'
        ));
        $compiler = $volt->getCompiler();
        // Add this filter
        $compiler->addFilter('getAttribute', function ($resolvedArgs, $exprArgs) {
            return vsprintf('%s->{%s}', explode(', ', $resolvedArgs));
        });
    
        return $volt;
    }, true);
    
    现在,您可以在volt中获得如下属性:

    product|getAttribute(key)
    

    我认为那是不可能的。但幸运的是,你可以扩展Volt,我相信这会有所帮助。我没有测试,所以没有发布答案。创建一个函数并传递如下参数:
    {%funcName({{product}},{{col}})%}
    谢谢,我查阅了文档,仍然不知道从哪里开始。我知道我必须创建一个函数,第一个参数接受数组,第二个参数作为它的键,返回键在数组中匹配的值。但是,我应该把代码放在哪里,我是否必须为自定义代码创建单独的文件,我真的不知道。文档显示了不同的示例,但没有对细节进行任何澄清……看看这个。基本上你需要改变你的引导文件,服务注册的地方(比如这里)你不能使用通用的字段名吗?由于您使用的是CRUD,而且您的模板看起来是相同的,所以感觉您可以在所有模型中使用相同的字段名。根本不起作用。错误消息:
    致命错误:调用未定义的方法stdClass::readAttribute()
    。如果错误为
    stdClass
    ,这显然意味着您没有提供模型对象,就像在Phalcon中一样,所有对象都继承自Phalcon\Mvc\model构造函数。最初的问题清楚地暗示了这一点:
    获取所有记录
    。我从
    Phalcon\Mvc\model
    继承了model类。我正在使用Phalcon 2.0。我真的怀疑:=>该方法是否存在,并且您的错误描述中有«stdClass»,这意味着您正在转储一个默认类,而不是Phalcon对象。试试volt中的
    {{dump(product)}}
    ,你会发现那不是Phalcon对象。是的,你是对的。因为我使用
    {%set i18nCategoryName=courseCategory['courseCategoryName']| json_decode%}
    获取对象。我想得到
    i18nCategoryName
    的属性
    {language}
    (是一个变量)。所以这个方法不适合我。
    $di->set('volt', function($view, $di) {
        $volt = new VoltEngine($view, $di);
        $volt->setOptions(array(
            'compiledPath' => APP_PATH . 'cache/volt/'
        ));
        $compiler = $volt->getCompiler();
        // Add this filter
        $compiler->addFilter('getAttribute', function ($resolvedArgs, $exprArgs) {
            return vsprintf('%s->{%s}', explode(', ', $resolvedArgs));
        });
    
        return $volt;
    }, true);
    
    product|getAttribute(key)