You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Nette/Latte框架分页开发:n:href属性报错求助

问题分析

你遇到的Latte\CompileException: Unexpected attribute n:href错误,核心原因是**n:href是Nette Framework专属的Latte模板属性,它依赖Nette的路由系统生成URL,但你当前仅单独使用Latte Engine,未集成Nette的路由/应用组件,导致Latte无法识别该属性**。

解决方案

根据你的使用场景,提供两种可行方案:

方案一:手动生成分页URL(简单直接,适合单独用Latte的场景)

放弃n:href,改用普通href手动拼接分页参数,这是最快捷的解决方式。

修改Latte模板代码

{if !$paginator->isFirst()}
    <a href="?page=1">First</a>
    &nbsp;|&nbsp;
    <a href="?page={$paginator->getPage() - 1}">Previous</a>
    &nbsp;|&nbsp;
{/if}

Page {$paginator->getPage()} of {$paginator->getPageCount()}

{if !$paginator->isLast()}
    &nbsp;|&nbsp;
    <a href="?page={$paginator->getPage() + 1}">Next</a>
    &nbsp;|&nbsp;
    <a href="?page={$paginator->getPageCount()}">Last</a>
{/if}

修改PHP核心代码

添加获取当前页码的逻辑,动态设置分页器的当前页:

// ... 原有代码不变

// 获取URL中的page参数,默认显示第1页
$currentPage = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
$paginator->setPage($currentPage);

$items = $database->fetchAll('SELECT * FROM production.requests WHERE archived = "1" ORDER BY order_date ASC LIMIT ? OFFSET ?', $paginator->getLength(), $paginator->getOffset());

// ... 后续渲染代码不变

方案二:集成Nette路由系统(保留n:href的场景)

如果你坚持使用n:href,需要安装Nette Application组件并配置路由扩展,让Latte识别该属性。

1. 安装依赖

composer require nette/application

2. 修改PHP核心代码

use Latte\Engine;
use Nette\Bridges\ApplicationLatte\UIRuntimeExtension;
use Nette\Application\Routers\RouteList;
use Nette\Application\Request;

// 初始化路由规则,匹配当前脚本的分页参数
$router = new RouteList();
$router->addRoute('default', 'test.php?page=<page>'); // 替换test.php为你的实际脚本文件名

// 模拟Nette应用请求,传递当前页码
$currentPage = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
$request = new Request('default', 'GET', ['page' => $currentPage]);

// 初始化Latte并添加Nette扩展
$latte = new Engine;
$latte->setTempDirectory(__DIR__ . '/temp');
$latte->setAutoRefresh(true);
// 注册UIRuntimeExtension,让Latte支持n:href
$latte->addExtension(new UIRuntimeExtension($router, $request));

// ... 原有数据库、分页器代码不变
$paginator->setPage($currentPage);

// ... 后续渲染代码不变

3. 修正Latte模板的n:href语法

n:href需要传递键值对参数,而非直接传数值,修正后模板代码:

{if !$paginator->isFirst()}
    <a n:href="default, page => 1">First</a>
    &nbsp;|&nbsp;
    <a n:href="default, page => $paginator->getPage() - 1">Previous</a>
    &nbsp;|&nbsp;
{/if}

Page {$paginator->getPage()} of {$paginator->getPageCount()}

{if !$paginator->isLast()}
    &nbsp;|&nbsp;
    <a n:href="default, page => $paginator->getPage() + 1">Next</a>
    &nbsp;|&nbsp;
    <a n:href="default, page => $paginator->getPageCount()">Last</a>
{/if}

内容的提问来源于stack exchange,提问作者Jean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:05:11