php - Symfony 3/4:通过 AJAX 完成的 KpnPaginator
问题描述
我目前正在提高我在 Symfony 4 上的技能。我遇到了一个小问题。
我有一个网站,这是一个列出文章的博客。
我想在上面添加分页,所以我检查了 KpnPaginator,它工作得非常好。
这是代码,
控制器:
/**
* @Route("/blog", name="blog")
* @param ArticleRepository $repo
* @param Request $request
* @param PaginatorInterface $paginator
* @return \Symfony\Component\HttpFoundation\Response
*/
public function index(ArticleRepository $repo, Request $request, PaginatorInterface $paginator)
{
/*
* $repo = $this->getDoctrine()->getRepository(Article::class);
*/
$articlesQuery = $repo->findAll();
// Paginate the results of the query
$articles = $paginator->paginate(
// Doctrine Query, not results
$articlesQuery,
// Define the page parameter
$request->query->getInt('page', 1),
// Items per page
5
);
return $this->render('blog/index.html.twig', [
'controller_name' => 'BlogController',
'articles' => $articles
]);
}
观点:
{% extends 'base.html.twig' %}
{% block title %}Hello {{ controller_name }}!{% endblock %}
{% block body %}
<section class="articles" id="">
{% for article in articles %}
<article>
<h2>{{ article.title }}</h2>
<div class="metadata">Written on {{ article.createdAt | date('d/m/Y') }}
at {{ article.createdAt | date('H:i') }}, in Politic Category
</div>
<div class="content"><img src="{{ article.image }}" alt="">{{ article.content | raw }}
<a href="{{ path('blog_show', {'id': article.id}) }}" class="btn btn-primary">Read moree</a>
</div>
</article>
{% endfor %}
</section>
<br>
{{ knp_pagination_render(articles) }}
{% endblock %}
我的问题是,
如何通过 ajax 请求使其工作?
就像,一旦我点击链接,它不会刷新页面,而是动态加载内容?
解决方案
您需要在 JavaScript 中设置一个 onclick 处理程序,该处理程序对您的 ArticleController 进行 AJAX 调用。
你可以使用这样的东西:
$(document).ready(function() {
var $div = $('.articles');
$.ajax({
method: 'GET',
url: '/api/articles' + window.location.search,
headers: {
'Accept':'application/json',
'Content-Type':'application/json'
},
dataType: 'json',
success: function(data){
$.each(data.items, function(key, article) {
var html = articleTemplate(article);
$div.append($.parseHTML(html));
});
}
});
});
const articleTemplate = (article) =>
`<article>
<h2>${ article.title }</h2>
<div class="metadata">Written on ${ article.createdAt }}
at ${ article.createdAt }, in Politic Category
</div>
<div class="content"><img src="${ article.image }" alt="">${ article.content }
<a href="{{ Routing.generate('blog_show', {'id': article.id}) }}" class="btn btn-primary">Read more</a>
</div>
</article>`;
这是使用 ES6 JavaScript 模板字符串来更新页面上的 HTML,因此您可以从 Twig 模板中删除此部分。如果您想在 JavaScript 中使用路由,您还需要安装 FOSJSRoutingBundle - https://symfony.com/doc/master/bundles/FOSJsRoutingBundle/index.html
您需要让 ArticleController 返回一个 JSON 响应,JavaScript 处理程序将使用该响应更新页面。
推荐阅读
- firebase - 我应该将数据加密到 Firestore 中吗?
- bash - 在此 jq 命令末尾计算值总和的最简单方法是什么?
- java - WebSphere 中的 JAX-WS 空响应,但 Tomcat 中没有
- database - 基于 Firebase 中的多个过滤器的查询
- javascript - 无法获取使用 SheetJS js-xlsx 库生成的可读 xlsx 文件
- sql - 从存储过程运行动态 SQL 查询以填充 GridView
- python - 不同窗口的滚动平均值(直到一个邮票超过另一个)
- python - 从列中提取值
- .net-core - 带有 Windows 身份验证的 PWA
- spring-kafka - Spring-kafka 支持只执行一次 SeekToTimestamp