首页 > 解决方案 > 如何通过单击 Twig 中的链接(或按钮)来更改 _$GET[] 中的一个值而不更改其他值?

问题描述

我还有其他搜索查询,例如来自搜索的查询、来自标签的查询等。我不想更改它们。pageno 值将用于分页。

所以我想改变'pageno'而不改变或取消其他。

这就是我在 Twig 中所做的:

<a href=?{{ request.server.get('QUERY_STRING')|replace({"&pageno=" : ""}) }}&pageno={{ page }}>{{ page }}</a>

但它给出的结果如下: ?query=&from-date=&to-date=&search=search413&pageno=5

当您从一个页面导航到另一个页面时收集以前的页码“413”,它总是添加一个“&”。

我尝试的另一种方法是在 php 中创建一个字符串,并将其传递给 Twig 模板:

$queryStr = $request->server->get('QUERY_STRING');
$queryStr = preg_replace("/pageno=\\w+/", "", $queryStr); // Remove pageno=???
$queryStr = $queryStr == "" ? "" : ($queryStr . "&");  // ad a & if there's already other $_GET values
$queryStr = str_replace("&&","&", $queryStr); // replace && so it doesn't look bad

在树枝中:

<a href=?{{ queryStr }}pageno={{ page }}>{{ page }}</a>

这看起来太棘手了,完成了太多的工作,我正在向 Twig 传递很多值。

有没有一种更简单的方法来做到这一点,而不必将这么多的值传递给 Twig?

标签: phptwigquery-string

解决方案


Just create a twig function like this:

$twig->addFunction(new \Twig\TwigFunction('get_page_url', function($query = [], $append = true) {
    $tmp = $append ? $_GET : [];
    foreach($query as $key => $value) $tmp[$key] = $value;

    return '?' . http_build_query($tmp);
});

Use it in twig like

<a href="{{ get_page_url({ 'pageno': 42, }) }}">next</a>

推荐阅读