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> | <a href="?page={$paginator->getPage() - 1}">Previous</a> | {/if} Page {$paginator->getPage()} of {$paginator->getPageCount()} {if !$paginator->isLast()} | <a href="?page={$paginator->getPage() + 1}">Next</a> | <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> | <a n:href="default, page => $paginator->getPage() - 1">Previous</a> | {/if} Page {$paginator->getPage()} of {$paginator->getPageCount()} {if !$paginator->isLast()} | <a n:href="default, page => $paginator->getPage() + 1">Next</a> | <a n:href="default, page => $paginator->getPageCount()">Last</a> {/if}
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

