【问题标题】:Smarty: unset an array index in templateSmarty:取消设置模板中的数组索引
【发布时间】:2011-11-20 01:34:00
【问题描述】:

我想将{unset($array['index'])} 加入 Smarty 3 模板中。

是否支持这样的语法(或类似的)?在谷歌搜索和文档阅读之后,我找不到令人满意的东西。

也许我应该向 Smarty 开发团队提出功能请求? :)

无论如何,考虑到当前可用的模板功能,您将如何做到这一点?

【问题讨论】:

  • 谢谢大家的回答。似乎问题确实出在控制器/视图分离中。但是原始代码中的处理方式让我“想在模板中取消设置数组索引”......

标签: php arrays templates smarty unset


【解决方案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)}

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-12-27
                • 2012-12-26
                • 2012-06-19
                • 2014-02-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2016-02-09
                相关资源
                最近更新 更多