О web-разработке
и даже немного больше...

Многомерные массивы и произвольные URI в GetCurPageParam (v.2)

Спецификация протокола 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&param2[subparam1]=a1&param2[subparam2]=a2&param2[subparam3]=a3&param3[]=b1&param3[]=b2

Чтобы удалить из него $_GET[‘param2’][‘subparam2’] и весь $_GET[‘param3’]надо написать

 
nfGetCurPageParam( '', array( array( 'param2', 'subparam2' ), 'param3' ), NULL, '/page.php?param1=a&param2[subparam1]=a1&param2[subparam2]=a2&param2[subparam3]=a3&param3[]=b1&param3[]=b2' )

На выходе:

/page.php?param1=a&param2[subparam1]=a1&param2[subparam3]=a3

p.s. Выражаю благодарность Алексею Майдокину.

Опубликован: 17.09.2013 г.

См. также:

«Не удалось установить соединение с сервером. Проверьте …».
Получение Email-адреса покупателя в заказе (Bitrix D7)
Работа с URL-адресами в Bitrix D7
Работа с купонами в Bitrix API
Добавляем пункт меню для списков в админке Битрикс
Диалоговые окна в Bitrix API
Создание инфоблока при установке модуля
Создание копии корзины из заказа на Bitrix D7

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта