在分页时保留$ _POST变量

时间:2013-06-24 19:39:51

标签: php codeigniter

我有一个简单的订单列表,用户可以按状态(打开,调度,关闭)进行过滤。过滤器下拉列表会触发到服务器的帖子并通过过滤器值发送。对于任何大于10的结果,订单列在10页面上,页面带有分页链接。问题是当我点击分页链接查看结果的下一页时,帖子中的过滤器值将丢失。

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'));   
}

如何使分页和过滤器协同工作。我已经考虑过将一个查询字符串注入到分页链接中,但它似乎不是一个很好的解决方案。

5 个答案:

答案 0 :(得分:2)

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

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

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

也就是说, ALSO 可以在会话中存储过滤器,这样如果用户离开结果集然后返回,则不会重置所有内容。

答案 1 :(得分:1)

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

换句话说,检查POST数据(就像你已经做的那样)。如果您有POST数据,请将其存储在会话中。如果页面没有POST数据,请检查您是否有会话数据。如果这样做,请按照发布的方式继续操作。如果您同时使用POST,则使用POST覆盖会话。您需要使用用户发送给您的新数据来覆盖之前发送的旧数据。

答案 2 :(得分:1)

你要么把所有东西放在$ _GET中,要么数据是合理的,把它放在$ _SESSION中。然后它在页面之间传播。

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分: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 );
  }
?>