我有一个简单的订单列表,用户可以按状态(打开,调度,关闭)进行过滤。过滤器下拉列表会触发到服务器的帖子并通过过滤器值发送。对于任何大于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'));
}
如何使分页和过滤器协同工作。我已经考虑过将一个查询字符串注入到分页链接中,但它似乎不是一个很好的解决方案。
答案 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中,但将它存储在查询字符串中也是有意义的。
长话短说:将它存储在两者中。
答案 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 );
}
?>