我有一个我在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 Coronation Street Channel1 10:00 pm Episode 550这是信息 2 Coronation Street Channel2 6:45 am Episode 549信息在这里 还有8个与此类似的记录。
如果没有重复项,我如何修复重复记录? (即每个记录都不同,没有内容是相同的,至少,对于剧集/描述/频道字段)?
答案 0 :(得分: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) }}
答案 1 :(得分:0)
您可以使用索引调用{% for %}
以避免第二个循环:
{% for i, d in data %}
<td class="{{ cycle(['odd', 'even'], i) }}-item name">
(...)
</td>
{% endfor %}
这当然假设您的data
数组有数字键。
您可以查看documentation了解详情。
如果您的数组没有数字键,您可以使用计数器模拟数字键:
{% set i = 0 %}
{% for d in data %}
<td class="{{ cycle(['odd', 'even'], i) }}-item name">
(...)
</td>
{% set i = i + 1 %}
{% endfor %}