Добрый день! Пытаюсь прикрутить jQuery ajax к 1С Битрикс компоненту. В частности использую Jquery post . В шаблоне компонента выводится форма "Имя (input type text)" и кнопка "Добавить" по нажатию на кнопку добавить запускается вот такой JS скрипт:
Код
$(document).ready(function(){
$("#childAddButton" ;) .click(function(){
var dataSend = $("#childAdd" ;) .serialize();
$.post(
"<?php echo $_SERVER['REQUEST_URI'] ?>",
dataSend,
onAjaxSuccess
;) ;
function onAjaxSuccess(data)
{
// Здесь мы получаем данные, отправленные сервером и выводим их на экран.
var StringChild = $(".children_list" ;) .html();
$(".children_list" ;) .html(""+StringChild+" "+data+"" ;) ;
}
});
});
отправка данных из формы происходит на текущую страницу с компонентом
данные передаются без перезагрузки, но вот только вместо строки
Код
"<li>Ребёнок ".$_POST['childname']."</li>";
мне возвращается вся страница с добавленным туда по ajax-у пунктом [*] . Знакомые подсказали что нужно создать отдельный шаблон сайта в /bitrix/templates/ в котором подключаются файлы пролога и эпилога и выводжится один единственный мой компонент. Вот в чём вопрос, как программно заменить шаблон из компонента? Чтобы ajax не вываливал всю страницу целиком. Заранее спасибо!
код страницы сайта инклюд /ajax/ваш файл с компонентом остальной код страницы файла:
код страницы файла с вашим компонентом: if (!class_exists(CMain)) require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php" ; else подключение стилей и js-файлов компонента вручную
код вызова компонента
if (!class_exists(CMain)) require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_after.php" ;
You must have chaos within you to give birth to a dancing star. Friedrich Nietzsche
Но ведь тогда к моему файлу "/ajax/ваш файл с компонентом " можно будет обратиться напрямую так: "www.доменю.ru//ajax/ваш файл с компонентом". А если компонент там где положено, т.е. в директории /bitrix/components/namesapce/componentname/ то прямое обращение через адресную строку, а соответственно и угроза безопасности, будет исключено. Меня просто вопросы безопасности волнуют. )
maler1988, как сказал SmolinAA, пересылайте хэш и проверяйте его в аякс файле. И кстати скажите что в прямом обращении небезопасного? Что-то не могу додуматься как тут угроза.
You must have chaos within you to give birth to a dancing star. Friedrich Nietzsche
эм... прошу прощения... я делаю обычно папочку в корне сайта - php и в нее складываю все файлы, которые обрабатывают post запросы, если таковые имеются, а структура файла для обработки post-запроса такова:
Код
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");//ядро битрикса ?>
...код обработки запроса, танцы с бубном вокруг ядра битрикса, вызов шаманов и т.д. возращение данных...
как то так...
нет смысла грузить компонент еще и обработкой данных, отправленных постом, через пол года не вспомните как там и чего работает
maler1988 пишет: Но ведь тогда к моему файлу "/ajax/ваш файл с компонентом " можно будет обратиться напрямую так: "www.доменю.ru//ajax/ваш файл с компонентом". А если компонент там где положено, т.е. в директории /bitrix/components/namesapce/componentname/ то прямое обращение через адресную строку, а соответственно и угроза безопасности, будет исключено. Меня просто вопросы безопасности волнуют. )
шифруйте данные, а на странице расшифровывайте. свяжите запрос с базой.где у вас будет 1 переменная это ИД даннных в базе.
з.ы. посмотрите и почитайте как в битриксе сделан аякс. У них даже дока есть по аяксу отдельная
Чёта не работает. Сам ajax если без записи в инфоблок работает. А вот пытаюсь добавить элемент в инфоблок, вылетает 500 ошибка сервера.
Код
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");//ядро битрикса ?>
<?//тут обработка присланных ajax данных
if((isset($_POST["childname"]))&&(isset($_POST["yearsage"]))&&(isset($_POST["monthsage"])))
{
$Name = iconv("UTF-8","WINDOWS-1251",$_POST["childname"]);
$Yearsage = $_POST["yearsage"];
$Monthsage = $_POST["monthsage"];
$el = new CIBlockElement;
//Попытка записать всё в инфоблок
$PROP = array();
$PROP["YEARS_AGE"] = $Yearsage; // свойству с кодом YEARS_AGE присваиваем значение $Yearsage
$PROP["MONTHS_AGE"] = $Monthsage; // свойству с кодом MONTHS_AGE присваиваем значение $Monthsage
$PROP["BLOGER_PARENT"] = $_POST["userId"];
$arLoadProductArray = Array(
"MODIFIED_BY" => $USER->GetID(), // элемент изменен текущим пользователем
"IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела
"IBLOCK_ID" => 27,
"PROPERTY_VALUES"=> $PROP,
"NAME" => $Name,
"ACTIVE" => "Y" // активен
);
if($CHILDREN = $el->Add($arLoadProductArray))
echo "New ID: ".$CHILDREN;
else
echo "Error: ".$el->LAST_ERROR;
echo "<li>".$Name.", возраст ".$Yearsage." г. ".$Monthsage." мес. </li>";
}
?>
Пролог подключил. Эпилог не стал, т.к. если подключаю эпилог то ajax помимо того что должен возвращает всё что находится в foother.php в текущем шаблоне. Не понимаю почему он не добавляет в инфоблок.