【问题标题】:Breaking Smarty array into multiple tables based on a column基于列将 Smarty 数组拆分为多个表
【发布时间】:2014-01-13 17:31:33
【问题描述】:

我基于 PHP 中的一些操作创建了以下数组结构。

array
(
  [7] => array(
    [id] => 7
    [page] => dashboard
    [text] => Text 3
  )
  [1] => array(
    [id] => 1
    [page] => index
    [text] => Text 2
  )
  [3] => array(
    [id] => 3
    [page] => index
    [text] => Text 3
  )
}

我正在使用下面的 Smarty 模板来创建基于这个数组结构的表,它工作正常。

<table>
    <tr>
        <th>{text key='sitetour+page'}</th>
        <th>{text key='sitetour+text'}</th>
    </tr>

    {foreach from=$allSteps key='id' item='step'}
      <tr>
          <td>{$step.page}</td>
          <td>{$step.text}</td>
      </tr>
    {/foreach}

</table>

我正在寻找的是,基于“page”的值,我需要为“page”的每个唯一值创建表,而不是为所有值的单个表。

示例如下。

当前输出:(单表不考虑页值)

page      | text
---------------------
dashboard | text 3
index     | text 2
index     | text 3

预期输出:(根据页面值损坏的 2 个表)

dashboard 
---------------------
text 3

index
---------------------
text 2
text 3

我在这里搜索时找不到任何样本。提前致谢。

【问题讨论】:

    标签: php html smarty3


    【解决方案1】:

    无法检查。但是,请尝试:

    {foreach from=$allSteps key='id' item='step' name="loop" }
    
      {if $smarty.foreach.loop.first } 
        {assign var="current" value=$step.page }
        <table>
         <thead>
          <tr> <td>{$step.page}</td> </tr> 
         </thead>
          <tr> <td>{$step.text}</td> </tr>
      {else}
         {if $current == $step.page }
           <tr>
             <td>{$step.text}</td>
           </tr>           
         {else} 
          {assign var="current" value=$step.page }
          </table> <!-- Close prev. table -->
          <table>  <!-- Start next table -->
           <thead>
            <tr> <td>{$step.page}</td> </tr> 
           </thead>
            <tr> <td>{$step.text}</td> </tr>
         {/if}
      {/if}
    {/foreach}
    </table> <!-- close last table -->
    

    【讨论】:

    • 在这种情况下,如何为每个页面添加标题行。我发现没有办法跟踪新值的中断。
    • @Purus 你只能在表格中添加一个时间标签
    • 不。实际上,我需要多个表,每个唯一的页面值都有唯一的 Id,以便我可以进一步处理一些 jquery 函数。
    • 在查看此代码时,我知道它与我的代码版本没有什么不同。最终输出将与我的理解相同,因为您的版本不会跟踪页面更改为创建一个新表
    • 这仅在一个类别中有多个元素时才有效。例如,如果第一个类别只有 1 行,则不显示。我尝试了您更新的代码。
    【解决方案2】:

    您期望有两个表格,但您拥有的 html 仅输出一个表格。你应该做的是像这样格式化你的数据:

    array
    (
      ['dashboard'] => array(
            [7] => array(
            [id] => 7
            [text] => Text 3)
      )
      ['index'] => array(
        [1] => array(
        [id] => 1
        [text] => Text 2)
    
        [3] => array(
        [id] => 3
        [text] => Text 3)
      )
    }
    

    如果页面名称是您的 php 数组中的键,请将此数组称为 $pages 或其他名称,然后执行以下操作:

    {foreach $pages as $page}
    <table>
        <tr>
            <th>{$page@key}</th>
        </tr>
    
        {foreach $page as $text}
          <tr>
              <td>{$text['text']}</td>
          </tr>
        {/foreach}
    
    </table>
    {/foreach}
    

    【讨论】:

    • 实际上我对如何创建这个数组没有太多控制权。所以我试图根据当前的数组结构找出解决方案。
    • 在 php 中循环遍历数组并创建一个新数组,就像我提到的那样
    • 如前所述,我在 PHP 方面没有太多控制权。应该与客户一起通过一个过程来改变这些。 :(
    • 您也可以在 Smarty 模板中执行相同的数组操作/重新创建。它带有一些额外的大括号,但数组迭代和数组构造都有效。
    【解决方案3】:

    因为输出是线性的,所以你不能真正在表格之间来回走动。您需要做的是拥有多个 foreach 循环,并在循环内放置一个条件

    <table>
        <tr>
            <th>{text key='sitetour+page'}</th>
            <th>{text key='sitetour+text'}</th>
        </tr>
    
        {foreach $allsteps as $step}
          <tr>
              {if $step.page == "dashboard"}
                  <td>{$step.text}</td>
              {/if}
          </tr>
        {/foreach}
    
    </table>
    
    <table>
        <tr>
            <th>{text key='sitetour+page'}</th>
            <th>{text key='sitetour+text'}</th>
        </tr>
    
        {foreach $allsteps as $step}
          <tr>
              {if $step.page == "index"}
                  <td>{$step.text}</td>
              {/if}
          </tr>
        {/foreach}
    
    </table>
    

    编辑:另一种解决方案是在将结果发送到页面之前在 php 端解析结果

    【讨论】:

    • 对不起。这是不可能的,因为我不知道有多少页面可以检查,因为数据是动态的。
    • 那么我建议在 PHP 文件中解析出来,并将整个表放在 foreach 循环中
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签