1

我有一个我在 Twig 中编写的电视指南脚本,它可以正常工作 - 数据从 PDO/MySQL 正确显示,但它是我遇到问题的 CSS 的循环函数。

这是我的代码:

index.html(来自相关部分的片段)

<table id="show-time-results"><tbody><tr>
{% for d in data %}
{%  i in 0..10 %}
{% set guide = ['odd', 'even'] %}
<td class="{{ cycle(guide, i) }}-item name"><a href="http://localhost/twigtest/">{{d.programme}}</a><br><em class="episode">{{ d.episode }}. </em></td><td class="info {{ cycle(guide, i) }}-item" nowrap="1" width="1%">{{d.airdate|date("F jS, Y")}} at {{d.airdate|date("g:ia")}}<br><a href="http://localhost/twigtest/">{{ d.channel }}</a></td></tr><tr><td colspan="2" class="
{{ cycle(guide, i) }}-item description"><p>{{ d.epinfo }} <a href="http://localhost/twigtest/">read more</a></p></td></tr>
     {% endfor %}
     {% endfor %}
</tbody></table>

和 index.php:

    <?php
// include and register Twig auto-loader
include 'Twig/Autoloader.php';
Twig_Autoloader::register();

// attempt a connection
try {
  $dbh = new PDO('mysql:dbname=tvguidetest;host=localhost', 'test', 'test');
} catch (PDOException $e) {
  echo "Error: Could not connect. " . $e->getMessage();
}

// set error mode
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// attempt some queries
try {
  // execute SELECT query
  // store each row as an object
  $sql = "SELECT programme, channel, episode, epinfo, airdate FROM coronationst where airdate > NOW() ORDER BY expiration ASC LIMIT 20 OFFSET 0";
  $sth = $dbh->query($sql);
  while ($row = $sth->fetchObject()) {
    $data[] = $row;
  }

  // close connection, clean up
  unset($dbh); 

  // define template directory location
  $loader = new Twig_Loader_Filesystem('templates');

  // initialize Twig environment
  $twig = new Twig_Environment($loader, array('debug' => true, 'autoescape' => false));
  $twig->addExtension(new Twig_Extension_Text());

  // load template
  $template = $twig->loadTemplate('index.html');


  // set template variables
  // render template
  echo $template->render(array (
    'data' => $data
  ));

} catch (Exception $e) {
  die ('ERROR: ' . $e->getMessage());
}
?>

数据显示正确....除了由于我的代码中的 {% for i in 0..10 %} 而重复自身,那么我怎样才能让它显示一次呢?

这些是我的记录(注意表名在上面 index.html 的 d.TABLENAME 中):

1 加冕街频道 1 晚上 10:00 第 550 集 这是信息 2 加冕街频道 2 上午 6:45 第 549 集 信息在这里,还有 8 条类似的记录。

当没有重复记录时,如何修复它重复记录?(即每条记录都是不同的,没有内容是相同的,至少,对于剧集/描述/频道字段)?

4

2 回答 2

2

在 for 循环中,您可以访问当前索引 - 从 0 或 1 开始。因此,在您的示例中,您可以省略第二个 for 循环,并用下面的示例替换变量“i”。

文件说_

在 for 循环块中,您可以访问一些特殊变量:

loop.index 循环的当前迭代。(1 个索引)

loop.index0 循环的当前迭代。(0 索引)

还给出了一个例子

{% for user in users %}
    {{ loop.index }} - {{ user.username }}
{% endfor %}

很抱歉,您的 HTML/twig 标记有点烦人。我试着把它清理一下。

<table id="show-time-results">
    <tbody>
        <tr>
            {% for d in data %}
                {% set guide = ['odd', 'even'] %}
                <td class="{{ cycle(guide, i) }}-item name">
                    <a href="http://localhost/twigtest/">{{ d.programme }}</a>
                    <br>
                    <em class="episode">{{ d.episode }}.</em>
                </td>
                <td class="info {{ cycle(guide, {{ loop.index0 }} ) }}-item" nowrap="1" width="1%">
                    {{ d.airdate|date("F jS, Y") }} at {{ d.airdate|date("g:ia") }}
                    <br>
                    <a href="http://localhost/twigtest/">{{ d.channel }}</a>
                </td>
        </tr>
              <tr>
                   <td colspan="2" class="{{ cycle(guide, {{ loop.index0 }} ) }}-item description">
                       <p>{{ d.epinfo }} 
                           <a href="http://localhost/twigtest/">read more</a>
                       </p>
                   </td>
              </tr>
           {% endfor %}
    </tbody>
</table>

注意缺少的第二个for loop,它{{ cycle(guide, i) }}被替换为{{ cycle(guide, {{ loop.index0 }} ) }}

现在我无法测试它,所以如果它不起作用,请在投反对票之前通知我^^

编辑

这应该是工作示例。{{ ... }}loop.index0这种情况下,你不需要。

{{ cycle(guide, loop.index0) }}
于 2013-04-29T15:53:38.790 回答
0

您可以{% for %}使用索引调用以避免第二个循环:

{% for i, d in data %}
   <td class="{{ cycle(['odd', 'even'], i) }}-item name">
     (...)
   </td>
{% endfor %}

这当然假设您的data数组有数字键。

您可以查看文档了解详细信息。

如果您的数组没有数字键,您可以使用 counter 模拟数字键:

{% set i = 0 %}
{% for d in data %}
   <td class="{{ cycle(['odd', 'even'], i) }}-item name">
     (...)
   </td>
   {% set i = i + 1 %}
{% endfor %}
于 2013-04-29T16:22:48.070 回答