0

I have a simple list of orders which a user can filter by status (open,dispatched,closed). The filter dropdown triggers a post to the server and sends the filter value through. Orders are listed out 10 to a page with pagination links for any results greater than 10. Problem is when I click the pagination links to view the next page of results the filter value in the post is lost.

public function filter_orders() {
    $page = ($this->uri->segment(4)) ? $this->uri->segment(4) : 0;
    $filter = $this->input->post('order_status_filter');
    $config = array();
    $config["base_url"] = base_url() . "control/orders/filter_orders";
    $config["per_page"] = 10;
    $config['next_link'] = 'Next';
    $config["uri_segment"] = 4;
    $config['total_rows'] = $this->model_order->get_all_orders_count($this->input->post('order_status_filter'));   
}

How can I make the pagination and filter work together. I've thought about injecting a query string in to the pagination links but it doesn't seem like a great solution.

4

5 回答 5

2

答案很简单,使用$_GET. 您还可以使用 URI 段。

IE,index.php/cars/list/5/name-asc/price-desc'

您想要使用的主要原因$_GET是您可以链接其他用户,以便他们看到与您看到的相同的结果集。如果您可以想象他们将内容相互链接,我相信您的网络应用程序的用户会想要此功能。

也就是说,也可以将过滤存储在会话中,这样如果用户离开结果集然后返回,一切都不会重置。

于 2013-06-24T19:41:37.647 回答
1

最好的办法是启动会话并将 POST 数据存储在会话中。在代码中检查用户是否发送 POST 数据的地方,您可以检查会话数据(如果 POST 为空)。

换句话说,检查 POST 数据(就像你已经做的那样)。如果您有 POST 数据,请将其存储在会话中。如果页面没有 POST 数据,请检查您是否有会话数据。如果你这样做了,就如同它已发布一样继续。如果两者都有,请使用 POST 覆盖会话。您需要使用用户发送给您的新数据来覆盖他们之前发送的旧数据。

于 2013-06-24T19:42:34.527 回答
1

您可以将所有内容都放在 $_GET 中,或者如果数据合理,则将其放在 $_SESSION 中。然后它在页面之间移动。

在您的情况下,似乎没有理由将您的过滤器数据放在 $_GET 之外的任何地方。

于 2013-06-24T19:43:15.890 回答
1

查询字符串似乎是最好的解决方案。您也可以将其存储在会话或 cookie 中,但也可以将其存储在查询字符串中。

  • 如果您想记住用户的选择,请将其存储在 cookie 或会话中。这似乎是一个友好的解决方案。它允许用户为下次访问或另一个页面保留他们的设置。
  • 将其存储在查询字符串中,因为如果您不了解过滤器、页面大小或排序,转到“第 2 页”不会告诉您任何信息。因此,如果用户想要为第 2 页添加书签或通过电子邮件发送,让他们能够发送包含此元信息的完整链接。

长话短说:将其存储在两者中。

于 2013-06-24T19:43:23.687 回答
1

也许它不是一个正确的答案,但是,试一试

<?php
  // example url
  $url  = "index.php?page=6&filter1=value1&filter2=value2";

  // to get the current url
  //$url  = "http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];

  // change the page to 3 without changing any other values
  echo url_change_index( $url, "page", 3 );
  // will output "index.php?page=3&filter1=value1&filter2=value2"

  // remove page index from url
  echo url_change_index( $url, "page" );
  // will output "index.php?filter1=value1&filter2=value2"

  // the function
  function url_change_index( $url, $name = null, $value = null ) {
    $query  = parse_url( $url, PHP_URL_QUERY );
    $filter = str_replace( $query, "", $url );
    parse_str( $query, $parsed );
    $parsed = ( !isset( $parsed ) || !is_array( $parsed ) ) ? array() : $parsed;
    if ( empty( $value ) ) {
      unset( $parsed[$name] );
    }
    else {
      $parsed[$name]  = $value;
    }
    return $filter.http_build_query( $parsed );
  }
?>
于 2013-06-24T19:50:17.073 回答