nanny_ogg
@nanny_ogg
My name is Masha. I'm from Russia

Как реализовать голосование за отдельный элемент с помощью инфоблоков в битрикс?

Добрый день. Есть элементы инфоблока, которые списком выводятся на странице. Нужно для каждого сделать кнопку голосовать, и как-то учитывать голоса с привязкой к ip и временному интервалу. Попыталась сделать это вручную, создала собственные таблицы в базе данных, создала отдельный файл voting.php в шаблоне компонента, в аяксе при нажатии на кнопку голосовать обработчиком идет этот файл, он подключается, отрабатывает, все хорошо. Проблема с соединением с базой данных. Попробовала подключить global $DB - не работает, var_dump($DB) возвращает NULL, запросы не отправляются. Попробовала mysql_query, тоже проблема - "mysql_query(): Access denied for user ''@'localhost'".
Как можно решить данную проблему? Вариант любой, стандартными средствами с использованием инфоблоков, либо в ручную, с использованием своих таблиц в базе данных. Если инфоблоками, то подскажите, хотя бы в какую сторону копать, с битриксом я дружу не очень.
  • Вопрос задан
  • 795 просмотров
Решения вопроса 1
gromdron
@gromdron
Работаю с Bitrix24
Штатный механизм голосования за элемент инфоблоков не подразумевают запись времени и ip, только факт голосования. Если Вы хотите делать сделать такое голосование, Вам нужно либо создавать опросы, либо использовать свою таблицу.

Давайте разберемся с Вашей ситуацией:
создала отдельный файл voting.php в шаблоне компонента

Скорее всего Вы просто создали файл. И в нем соответственно НЕ подключили служебную часть.
Я бы рекомендовал Вам использовать ORM Битрикса для такой ситуации (очен....
Но как быстрое решение, можно и прямой запрос в базу (хотя это будет менее элегантное решение).
В таком случае код будет выглядеть как-то так:

<?
require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php";

/**
 * Тут можете проверить, что все переменные пришли
 * Я для себя буду использовать переменные:
 * - ELEMENT_ID 
 * - USER_ID
 * 
 * Просто писать факт голосования.
 * В таблицу project_element_vote ( ID, ELEMENT_ID, USER_ID )
 */

global $USER;

/* @var object Объект приложения */
$oApplication = \Bitrix\Main\Application::getInstance();

/* @var object Объект соединения с БД */
$oConnection = $oApplication->getConnection();

/* @var object Хелпер для безопасной записи в БД*/
$oHelper = $oConnection->getSqlHelper();

/* @var object Объект для работы с входящими переменными */
$oRequest = $oApplication->getContext()->getRequest();


if ( $oRequest->isAjaxRequest() && !empty( $oRequest->get('ELEMENT_ID') ) )
{
	$iUser    = $USER->GetId();
	$iElement = $oHelper->forSql( $oRequest->get('ELEMENT_ID') );

	$sql = "INSERT INTO project_element_vote('ELEMENT_ID','USER_ID') VALUES ('{$iElement}','{$iUser}')";
	$res = $oConnection->query($sql);

	if ( $res )
	{
		echo 'ok';
		die();
	}
}
echo 'bad';
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
nanny_ogg
@nanny_ogg Автор вопроса
My name is Masha. I'm from Russia
да, спасибо большое) мне нужно было это - require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php";
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы