Php phalcon:volt从数组中获取值,该数组的键取自变量
在phalcon模板引擎volt(类似于twig)中,您可以通过以下方式获取所有记录: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模板,用于不同类型的模型。我想在这个模板中实现的是,这个视图中的每一列都不是
{% 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)