【问题标题】:Pagination (Previous | Next) with Smarty使用 Smarty 进行分页(上一个 | 下一个)
【发布时间】:2022-02-20 16:06:50
【问题描述】:

我正在制作一个俱乐部目录,例如,我想将每页限制为 10 个俱乐部,但我无法理解它。我试过 SmartyPaginate,但它不起作用(与开发人员交谈,告诉我不要使用它)。

clubs.php

<?php

include('configs/pdo.inc.php');
include('libs/Smarty.class.php');

// create object
$smarty = new Smarty;

// Clubs ophalen
try {
    $query = $oPDO->prepare("SELECT * FROM V_clubs WHERE Zichtbaar = 1 ORDER BY ID ASC LIMIT 10");
    $query->execute();

    $t = array();
    foreach ($query as $row) {
        $t[$row['ID']] = $row;
    }

    $smarty->assign('clubs', $t);

    // Categorieen ophalen
    $categorie = $oPDO->query("SELECT * FROM t_categorie ORDER BY D_categorie ASC");
    $smarty->assign('categorie', $categorie);
    // Provincies ophalen
    $prov = $oPDO->query("SELECT * FROM t_provincies ORDER BY D_provincie ASC");
    $smarty->assign('prov', $prov);
    // Clubteller
    $xclubs = $oPDO->prepare("SELECT ID from V_clubs");
    $xclubs->execute();
} catch (PDOException $e) {
    echo '<pre>';
    echo 'Regelnummer: ' . $e->getLine() . '<br>';
    echo 'Bestand: ' . $e->getFile() . '<br>';
    echo 'Foutmelding: ' . $e->getMessage() . '<br>';
    echo '</pre>';
}

// display it
$smarty->display('extends:layout.tpl|header.tpl|clubs.tpl|footer.tpl');
?>

clubs.tpl

{extends file="layout.tpl"}
{block name=title}Clubs{/block}
{block name=content}
<form name="clubsearch" method="POST" action="{$SCRIPT_NAME}">
    <div class="span-6">
        <p><label for="categorie">Categorie:</label><br />
            <select id="categorie" name="categorie">
                <option value="*">Alle disciplines</option>
        {foreach $categorie as $c}
                <option value="{$c.D_categorie}">{$c.D_categorienaam}</option>
        {/foreach}
            </select></p>
    </div>
    <div class="span-4">
        <p><label for="provincie" name="provincie">Provincie:</label><br />
            <select id="provincie" name="provincie">
                <option value="*">Alle provincies</option>
        {foreach $prov as $p}
                <option value="{$p.D_provincie}">{$p.D_provincienaam}</option>
        {/foreach}
            </select><p>
    </div>
    <div class="span-4">
        <p><label for="gemeente">Gemeente:</label><br />
            <select id="gemeente" name="gemeente">
                <option value="*">Alle gemeentes</option>
        {foreach $clubs as $c}
                <option value="{$c.Gemeente}">{$c.Gemeente}</option>
        {/foreach}
            </select></p>
    </div>
    <div class="span-2">
        <input type="submit" name="zoekclub" id="zoekclub" value="Zoeken">
    </div>
</form>
<hr>
{if isset($smarty.get.id)}
<div class="span-6 colborder">
    <table>
        <tr>
            <td style="font-weight: bold;">Club</td>
        </tr>
        <tr>
            <td>{$clubs[$smarty.get.id].Naam}</td>
        </tr>
        <tr>
            <td style="font-weight: bold;">Categorie</td>
        </tr>
        <tr>
            <td>{$clubs[$smarty.get.id].Categorie}</td>
        </tr>
        <tr>
            <td style="font-weight: bold;">Provincie</td>
        </tr>
        <tr>
            <td>{$clubs[$smarty.get.id].Provincie}</td>
        </tr>
        <tr>
            <td style="font-weight: bold;">Gemeente</td>
        </tr>
        <tr>
            <td>{$clubs[$smarty.get.id].Gemeente}</td>
        </tr>
        <tr>
            <td style="font-weight: bold;">Website</td>
        </tr>
        <tr>
            <td><a href="{$clubs[$smarty.get.id].Contact}" target="_blank">{$clubs[$smarty.get.id].Contact}</a></td>
        </tr>
    </table>
</div>
<div class="span-8 last">
    <table>
        <tr>
            <td style="font-weight: bold;">Info</td>
        </tr>
        <tr>
            <td>{$clubs[$smarty.get.id].Extra}</td>
        </tr>
    </table>
</div>
<div class="span-4 first"><p><a onClick="history.go(-1)"><< Terug</a></p></div>
{else}
<table>
    <tr>
        <th>Club</td>
        <th>Categorie</td>
        <th>Provincie</td>
        <th>Gemeente</td>
    </tr>
{foreach $clubs as $c}
    <tr>
        <td><a href="{$SCRIPT_NAME}?id={$c.ID}"><b>{$c.Naam}</b></a></td>
        <td>{$c.Categorie}</td>
        <td>{$c.Provincie}</td>
        <td>{$c.Gemeente}</td>
    </tr>
{/foreach}
</table>
{/if}
{/block}

我想获取 Next 和 Previous 并仅显示 X 条记录。我该怎么办?

【问题讨论】:

  • 您在尝试实现正常分页时遇到了什么问题?
  • @inium: 致命错误,真的不记得了,但是开发者告诉我不要使用它。

标签: php mysql pagination smarty


【解决方案1】:

在您当前的 TRY 语句中,首先您应该获取当前页面(假设来自查询字符串)

$page = empty($_GET['page']) ? 1 : (int)$_GET['page'];

然后定义要从数据库中获取的俱乐部

$start_from = $page == 1 ? 0 : (($page - 1) * 10 - 1);
$query = $oPDO->prepare("SELECT * FROM V_clubs WHERE Zichtbaar = 1 ORDER BY ID ASC LIMIT ".$start_from.", 10");

基本上你从第 1 页的第 0 条记录中获得 10 条记录,从第 2 页的第 9 条记录中获得 10 条记录,等等。

page 1 LIMIT 0,10
page 2 LIMIT 9,10
page 3 LIMIT 19,10

当然,将链接 PREV 和 NEXT 放在 smarty 模板中。提示在第 1 页隐藏 PREV,在最后一页隐藏 NEXT

<a href="your_url.php?page=$page-1">PREV</a>
<a href="your_url.php?page=$page+1">NEXT</a>

【讨论】:

  • 无法正常工作,我的代码如下所示: clubs.php pastebin.com/UM1d3pzs clubs.tpl pastebin.com/36p1Jvte 我故意将其限制为“1”以检查它是否有效,因为我还没有 10 条记录。我没有收到任何错误,但计数器不会超过 0 和 1,如果我手动转到 ?page=2,我什么也看不到。
  • 好吧,那是因为你还在用 $start_from = $page == 1 ? 0 : (($page - 1) * 10 - 1);使用 $start_from = $page == 1 ? 0 : (($page - 1) * 1 - 1);反而。 10 是在页面上显示的俱乐部数量,将其减少为 1 作为 SQL 查询中的 LIMIT
  • 我也不得不说我不喜欢你的 $page--; $页面++;我知道我们以原始的 $page 值结束,但是更改 $page 值是不正确的。我更愿意按照我的方式使用 ($page-1) 和 ($page+1)。 :)
  • $page+1 和 $page-1 由于某种原因无法工作:/ 没有错误,但它只是无法链接。
猜你喜欢
  • 2022-01-06
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多