Спецификация протокола HTTP включает в себя несколько разновидностей запросов. Один из самых распространенных запросов является GET запрос. GET запрос позволяет запросить файл на сервере, а так же передать серверу некие параметры, при этом строка запроса легко просматривается в адресной строке браузера.
При формировании ссылок иногда возникает необходимость добавлять/удалять параметры из строки GET запроса. Чтобы передать множество значений параметров на сервер в GET – запросе удобно использовать многомерные массивы. В Bitrix API существует метод CMain::GetCurPageParam, который позволяет работать с параметрами текущего запроса. Однако, когда дело доходит до многомерных массивов, данный метод имеет существенные ограничения.
В одном из блогов на сайте битрикса была описана функция, которая является альтернативной заменой штатного функционала. Автором функции является Алексей Майдокин, с его согласия публикую весьма полезный код в этом блоге.
Отличительной особенностью функции стала возможность справляться с многомерными массивами в GET-параметрах, а так же работать с произвольными URI. Это может пригодиться, например, при генерации ссылок на странице, которая подгружается AJAX’ом.
$strParam — Строка с параметрами, которые нужно добавить к возвращаемому значению.
$arParamKill — Массив параметров, которые необходимо удалить из строки запроса.
$get_index_page — Параметр указывает, нужно ли для индексной страницы раздела возвращать путь, заканчивающийся на «index.php»
$uri – Строка GET-запроса (по умолчанию путь к текущей странице).
Код:
function nfGetCurPageParam( $strParam = '', $arParamKill = array(), $get_index_page = NULL, $uri = FALSE ){ if( NULL === $get_index_page ){ if( defined( 'BX_DISABLE_INDEX_PAGE' ) ) $get_index_page = !BX_DISABLE_INDEX_PAGE; else $get_index_page = TRUE; } $sUrlPath = GetPagePath( $uri, $get_index_page ); $strNavQueryString = nfDeleteParam( $arParamKill, $uri ); if( $strNavQueryString != '' && $strParam != '' ) $strNavQueryString = '&'.$strNavQueryString; if( $strNavQueryString == '' && $strParam == '' ) return $sUrlPath; else return $sUrlPath.'?'.$strParam.$strNavQueryString; } func tion nfDeleteParam( $arParam, $uri = FALSE ){ $get = array(); if( $uri && ( $qPos = strpos( $uri, '?' ) ) !== FALSE ){ $queryString = substr( $uri, $qPos + 1 ); parse_str( $queryString, $get ); unset( $queryString ); } if( sizeof( $get ) < 1 ) $get = $_GET; if( sizeof( $get ) < 1 ) return ''; if( sizeof( $arParam ) > 0 ){ foreach( $arParam as $param ){ $search = &$get; $param = (array)$param; $lastIndex = sizeof( $param ) - 1; foreach( $param as $c => $key ){ if( array_key_exists( $key, $search ) ){ if( $c == $lastIndex ) unset( $search[$key] ); else $search = &$search[$key]; } } } } return str_r eplace( array( '%5B', '%5D' ), array( '[', ']' ), http_build_query( $get ) ); }
Пусть адрес текущей страницы
/index.php
А нам надо изменить другой адрес:
/page.php?param1=a¶m2[subparam1]=a1¶m2[subparam2]=a2¶m2[subparam3]=a3¶m3[]=b1¶m3[]=b2
Чтобы удалить из него $_GET[‘param2’][‘subparam2’] и весь $_GET[‘param3’]надо написать
nfGetCurPageParam( '', array( array( 'param2', 'subparam2' ), 'param3' ), NULL, '/page.php?param1=a¶m2[subparam1]=a1¶m2[subparam2]=a2¶m2[subparam3]=a3¶m3[]=b1¶m3[]=b2' )
На выходе:
/page.php?param1=a¶m2[subparam1]=a1¶m2[subparam3]=a3
p.s. Выражаю благодарность Алексею Майдокину.