JInput - получение и фильтрация переменных запроса
Общая информация
Группа классов Input
абстрагирует внешние данные (переменные запроса), которые находятся в суперглобальных массивах (таких как $_POST
, $_GET
, $_COOKIE
, $_FILES
) и является составляющей не только Joomla! CMS, но и Joomla! Framework.
В CMS эта группа классов расположена в /libraries/joomla/input и состоит из главного класса JInput
и четырех дочерних классов, которые его расширяют:
JInput
– базовый класс, предназначен для работы с$_REQUEST
($_POST
,$_GET
и$_COOKIE
), предоставляет удобный доступ ко всем дочерним классам и суперглобальным массивам;JInputСli
– класс предназначен для работы с командной строкой;JInputCookie
– класс предназначен для работы$_COOKIE
;JInputFiles
– класс предназначен для работы с$_FILES
;JInputJson
– класс предназначен для работы с JSON-данными.
Для эффективной фильтрации переменных запроса при их получении они используют класс JFilterInput
. Класс JFilterInput
расположен в файле /libraries/joomla/filter/input.php.
На практике чаще всего используется класс JInput
. В Joomla 2.5 этот класс пришел на замену JRequest
. Экземпляр класса (объект) JInput
является публичным свойством, которое доступно из Приложения (Application). Для использования JInput
необходимо вызвать следующий код:
$jinput = JFactory::getApplication()->input;
Начиная с Joomla 3 при разработке компонента к объекту JInput
можно обращаться не из Приложения, а как к свойству input
объекта контроллера класса JControllerLegacy
(если ваши контроллеры расширяют класс JControllerLegacy
, а это обычная практика). То есть вместо JFactory::getApplication()->input
в контроллере можно использовать просто $this->input
.
Получение значения
Получить значение из JInput
можно с помощью метода get()
:
$source = $jinput->get('varname', 'default_value', 'filter');
Первый параметр – это имя переменной в запросе, второй параметр – это значение по умолчанию, а третий параметр – это тип фильтра, который будет применен к получаемому значению переменной. По умолчанию фильтр настроен на тип cmd
.
Предположим, что мы получаем из запроса следующую строку:
..-123 AaBb ДдГг = [] () + ^ * _ . % - <meta content="Joomla" name="generator" /> Ниже представлены все доступные типы фильтров и отфильтрованная с их помощью строка:
- INT, INTEGER – первое целое число
int(-123)
- UINT - первое беззнаковое целое число
int(123)
- FLOAT, DOUBLE - первое число с плавающей точкой
float(-123)
- BOOL, BOOLEAN – конвертирует значение в булев тип
bool(true)
- WORD – только латинские буквы и нижнее подчеркивание
string(35) "AaBb_metacontentJoomlanamegenerator"
- ALNUM - только латинские буквы и цифры
string(37) "123AaBbmetacontentJoomlanamegenerator"
- CMD - только латинские буквы, нижнее подчеркивание, тире и точка. Убирает ведущие точки.
string(41) "-123AaBb_.-metacontentJoomlanamegenerator"
- BASE64 - только латинские буквы, косая черта, знак плюса и знак равно
string(42) "123AaBb=+metacontent=Joomlaname=generator/"
- STRING – конвертирует в чистую строку, убирает все теги и атрибуты
string(43) "..-123 AaBb ДдГг = [] () + ^ * _ . % - "
- HTML – конвертирует в строку, убирает все HTML теги и атрибуты. Во время обработки проверяет наличие разрешенных тегов/атрибутов. Если они есть, то их не убирает.
string(43) "..-123 AaBb ДдГг = [] () + ^ * _ . % - "
- ARRAY – конвертирует в массив без применения фильтрации
array(1) { [0]=> string(85) " ..-123 AaBb ДдГг = [] () + ^ * _ . % - <meta content="Joomla" name="generator" />" }
- PATH – конвертирует в строку и валидирует как путь до папки или файла (например path/to/file.png или path/to/dir). Не принимает абсолютный путь или путь, который заканчивается косой чертой.
string(0) ""
- USERNAME – удаляет все невалидные для имени пользователя символы (\x00, -, \x1F, \x7F, <, >, ", ', %, &)
string(78) "..-123 AaBb ДдГг = [] () + ^ * _ . - meta content=Joomla name=generator /"
- RAW – фильтрация не применяется. Доступен начиная с Joomla 3.
string(85) " ..-123 AaBb ДдГг = [] () + ^ * _ . % - <meta content="Joomla" name="generator" />"
Примеры получения значения
// Получаем переменную "view" $view = $jinput->get('view'); // Если переменная "view" недоступна, используем значение по умолчанию $view = $jinput->get('view', 'display'); // Получаем значение и явно применяем фильтр $id = $jinput->get('id', null, 'int'); $text = $jinput->get('text', null, 'RAW');
Обратите внимание, что при указании типа фильтра вы можете использовать любой регистр букв. Дополнительно доступны магические геттеры, которые являются быстрым доступом к типам фильтров:
// Применяем тип фильтра "INT" $id = $jinput->getInt('id'); // Применяем тип фильтра "WORD" $folder = $jinput->getWord('folder', 'images'); // Применяем тип фильтра "USERNAME" $login = $jinput->getUsername('login');
Получение нескольких значений
Для получения сразу нескольких значений вы можете использовать метод getArray()
:
$source = $jinput->getArray(array( 'var1' => '', 'var2' => '', 'var3' => '' ));
Вы также можете задать разные фильтры для каждой из переменных:
$source = $jinput->getArray(array( 'var1' => 'int', 'var2' => 'float', 'var3' => 'word' ));
И можете вкладывать массивы для получения более сложных иерархий значений:
$source = $jinput->getArray(array( 'jform' => array( 'title' => 'string', 'quantity' => 'int', 'state' => 'int' ) ));
Получение значений из конкретного суперглобального массива
Класс JInput
также поддерживает магический get-метод, который позволяет получить удобный доступ к суперглобальным массивам:
// Получаем доступ к $_POST $post = $jinput->post; // Получаем переменные из суперглобальных массивов $source = $jinput->get->get('varname', 'default_value', 'filter'); $source = $jinput->post->get('varname', 'default_value', 'filter'); $source = $jinput->server->get('varname', 'default_value', 'filter');
Получение данных о файлах
Формат, в котором PHP возвращает данные о файлах, мягко говоря, ужасен. Все становится еще хуже, когда приходится иметь дело с массивом файлов. Класс JInputFiles
предоставляет более удобный интерфейс для упрощения работы с файлами, группируя данные по каждому отдельному файлу.
Предположим, что у вас есть следующая форма:
<form action="<?php echo JRoute::_('index.php?option=com_test&task=file.submit'); ?>" enctype="multipart/form-data" method="post"> <inputtype="file"name="jform[test][]" /> <inputtype="file"name="jform[test][]" /> <inputtype="submit"value="submit" /> </form>
PHP передаст эти данные в глобальный массив $_FILES
, который будет выглядеть вот так:
Array ( [jform] => Array ( [name] => Array ( [test] => Array ( [0] => picture_1.png [1] => picture_2.jpg ) ) [type] => Array ( [test] => Array ( [0] => image/png [1] => image/jpeg ) ) [tmp_name] => Array ( [test] => Array ( [0] => /tmp/phpXoIpSD [1] => /tmp/phpWDE7ye ) ) [error] => Array ( [test] => Array ( [0] => 0 [1] => 0 ) ) [size] => Array ( [test] => Array ( [0] => 34409 [1] => 99529 ) ) ) )
А теперь попробуем получить эти же данные с помощью JInputFiles
:
$files = $jinput->files->get('jform');
Мы получим более понятный и удобный для работы результат:
Array ( [test] => Array ( [0] => Array ( [name] => picture_1.png [type] => image/png [tmp_name] => /tmp/phpXoIpSD [error] => 0 [size] => 34409 ) [1] => Array ( [name] => picture_2.jpg [type] => image/jpeg [tmp_name] => /tmp/phpWDE7ye [error] => 0 [size] => 99529 ) ) )
Установка значений
Для установки значения через JInput
вы можете использовать метод set()
:
$jinput->set('varname', $value);
Первый параметр – это имя переменной, а второй – значение. Наверное, самый популярный пример установки значения в Joomla CMS – это блокировка меню в панели управления:
$jinput->set('hidemainmenu', true);