Есть таблица со списком заказов вида
Номер заказа | ФИО заказчика | Название товара | Дата |
Эту таблицу к примеру выводит bitrix компонент, из БД или через REST API, не важно.
<div id="#orders-block">
$APPLICATION->IncludeComponent(
"d6core:custom.order.list",
"orders_list",
Array(
'PARAMS' => $date,
),
);
</div>
Справа от таблицы располагается фильтр, с полями фио, дата и тд для фильтрации. Это может быть обычная форма + jquery c serialize и ajax запросом. Или это реактивный компонент, которые написан на React, Vue или Svelte, которые тоже собирает данные и делает post запрос.
На стороне js всегда что то примерно такое (обработчик фильтра, котрый справа от таблицы)
$("#orders-filter-form").submit(function (e) {
e.preventDefault();
var form = $(this);
var url = form.attr('action');
$.ajax({
type: 'POST',
url: url,
dataType: 'json',
data: form.serialize(),
beforeSend: function () {
$('#orders-block').html('Прелоадер....');
},
}).done(function (response) {
$("#orders-block").html(response);
}).fail(function (jqXHR, textStatus) {
console.log(jqXHR, textStatus);
});
});
Далее создается файлик в папке ajax, например orders_list, где идет подключение компонента.
<?php require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php");
use Bitrix\Main\Context;
$request = Context::getCurrent()->getRequest();
if ($request->isPost() && $request->isAjaxRequest() && $GLOBALS['USER']->IsAuthorized()) {
$data = json_decode($request['data'] ,true);
$date = Helper::clean($data['date']);
ob_start();
$APPLICATION->IncludeComponent(
"d6core:custom.order.list",
"orders_list",
Array(
'PARAMS' => $date,
),
);
$view = ob_get_contents();
ob_end_clean();
Helper::jsonResponse([
'view' =>$view,
'type' => 'ok'
]);
}
Хелпер
class Helper {
//json ответ
static function jsonResponse(array $result)
{
$response = new \Bitrix\Main\Engine\Response\Json($result);
$response->send();
}
//фильтрует данные
static function clean($value = "")
{
$value = trim($value);
$value = stripslashes($value);
$value = strip_tags($value);
$value = htmlspecialchars($value);
return $value;
}
}
Такое решение работает, НО меня интересует ряд вопросов:
На сколько такое решение приемлимо?
Есть ли какие то более правильные, гибкие архитектурные решения? Если да то какие, чем больше вариантов, тем лучше:)
Конечно интересует здесь и вопросы ИБ. Здесь я использовал свой хелпер, где тупо функции фильтрации данных и ответа JSON в рамках BitrixFW. Просто замечал в коде даже вроде бы опытных разрабов, что никакой фильтрации данных нет...
Также есть вопросы и по самому BitrixFW. Опять же, когда работаешь в рамках какого то фреймворка, то по идее желательно использовать то, что у него под капотом, может тогда и никаких function clean не нужно писать. Есть же методы вроде $request->getPost('data');.
Я немного покопался в ядре, но не нашел фильтрации из коробки в getPost. Тогда вопрос, зачем делать такую обертку если я могу тупо тянуть данные из $_POST напрямую?