Smarty:取消设置模板中的数组索引
Posted
技术标签:
【中文标题】Smarty:取消设置模板中的数组索引【英文标题】:Smarty: unset an array index in template 【发布时间】:2011-11-20 01:34:00 【问题描述】:我想将unset($array['index'])
加入 Smarty 3 模板中。
是否支持这样的语法(或类似的)?在谷歌搜索和文档阅读之后,我找不到令人满意的东西。
也许我应该向 Smarty 开发团队提出功能请求? :)
无论如何,考虑到当前可用的模板功能,您将如何做到这一点?
【问题讨论】:
谢谢大家的回答。似乎问题确实出在控制器/视图分离中。但是原始代码中的处理方式让我“想在模板中取消设置数组索引”...... 【参考方案1】:我不认为 smarty 对此有直接的支持。你总是可以使用 smarty 的php
标签来做到这一点,但是我强烈反对你这样做。逻辑不属于演示级模板。
【讨论】:
如果“逻辑不属于演示文稿”,您不需要 Smarty,只需strtr()
:-P 但是,为了使此评论有用,您是否认为您可能不需要做你的建议,因为你可以循环这个东西并使用if
和continue
来跳过你不需要的密钥?如example 7.42
@artfulrobot 使用if
和continue
是根本不同的,因为它们不会修改数据。数据修改不属于表现层。
@AleksG 想要“修改”数据以进行展示是非常合理的,这可能需要一个新变量,例如数据子集的排序视图。也许在这里提问者认为与其在第二个变量中复制模板输入数据,修改输入数据可能更有效,如果稍后在模板中不需要进一步呈现,这可能是可以接受的。扭转你的论点:你不希望控制器中的表示逻辑。【参考方案2】:
虽然有办法:-)
$array=$array|array_diff_key:(['index']|array_flip)
尽管在模板中这样做不是一个好主意,但有时它可能会节省您的时间。
【讨论】:
【参考方案3】:试试这个
$array.index = null
【讨论】:
感谢您的想法,但不幸的是它并没有完全符合我的要求:从Array ( [a] => 1 [b] => 2 )
开始,在执行$array.a = null
之后,我得到Array ( [a] => [b] => 2 )
而不是Array ( [b] => 2 )
【参考方案4】:
模板引擎背后的主要思想是,您可以在解析视图之前完成所有加载、逻辑、取消设置等操作。话虽如此,您不应该在模板中取消设置数据,而且我很确定他们不会实现该功能请求。
我也不明白你为什么要取消设置 smarty 变量:只是不要使用它,它不会被显示。
【讨论】:
【参考方案5】:两步:
$array.index = null
$array = $array|array_filter
它在 Smarty3 中工作。
动态索引示例:
foreach $array as $item
if $item.foo == 'bar'
<h1>$item.text nofilter</h1>
* unset item from array *
$array[$item@key] = null
$array = $array|array_filter
break
/if
/foreach
if $array
<ul>
foreach $array as $item
<li>$item.text nofilter</li>
/foreach
</ul>
/if
【讨论】:
【参考方案6】:我认为,您不应该这样,因为所有逻辑都必须在代码中而不是在模板中。
但你可以编写自己的修饰符http://www.smarty.net/docs/en/plugins.modifiers.tpl
【讨论】:
【参考方案7】:你不覆盖这个值吗?
assign var="array" value=array()
$array['index']='1'
$array['index2']='2'
$array['index']=''
$array|print_r
这在 smarty
【讨论】:
【参考方案8】:$array=$links.lists|array_diff_key:(['10']|array_flip)
$array|print_r
这里10
是一个数组索引。
【讨论】:
【参考方案9】:试试
assign var=$array.index value=null)
【讨论】:
以上是关于Smarty:取消设置模板中的数组索引的主要内容,如果未能解决你的问题,请参考以下文章
PHP数组中可否存放对象?如果可以,那么在smarty的模板中应当如何获取对象的属性值?