Проверка на наличие элементов, текущего пользователя, в заданном инфоблоке.

Просмотров: 7321

Если стоит задача, определить наличие элементов созданных пользователем на сайте. Можно воспользоваться API: CUser и CIBlockElement

Вывести форму редактирования с автоматическим редиректом.

Итак, задача на конкретном сайте:

  • Зарегистрированные пользователи могут добавить 1 элемент в инфоблок "Анкета"
  • Если у пользователя еще нет элемента, открываем ему пустую форму добавления элемента
  • Если у пользователя уже есть элемент, открываем форму редактирования этого элемента. По сути, просто передаем параметр в url "?edit=Y&CODE=XXXX", где XXXX - это ID элемента

Форма добавления / редактирования это штатный компонент битрикс bitrix:iblock.element.add.form. Его просто выводим на странице персонального раздела, например /personal/form/add.php

На эту страницу, пользователь попадает автоматически, и может добавить элемент в инфоблок "Анкета"- у которого ID = 5. Компонент уже настроена так, что бы пользователь не смог добавить больше одного элемента.

Созадем еще одну страницу, на которой вызываем тот же самый компонент /personal/form/edit.php. На эту страницу, пользователь попадет, если у него уже есть элемент. Для возможности редактирования, мы должны передать дополнительный параметр в url /personal/form/edit.php?edit=Y&CODE=XXXX где XXXX - это ID элемента созданного пользователем

На странице добавления элемента /personal/form/add.php, добавляем код (пояснения ниже)


if (CModule::IncludeModule("iblock")) {
    global $USER;
    $curUserId = $USER->GetID();
    $iblockId = 5;
    $elementsByCurUser = CIBlockElement::GetList(
        Array("ID" => "ASC"),
        Array(
        	"IBLOCK_ID" => $iblockId, 
        	"CREATED_USER_ID" => $curUserId
        ),
        false,
        false,
        Array(
            'ID'
        )
    );
    while ($ar_fields = $elementsByCurUser->GetNext()) {
        $elByCurUser = $ar_fields['ID'];
    }
}

if (isset($elByCurUser)) {
        $editPage = '/personal/form/edit.php?edit=Y&CODE=';
        $redirectToElEdit = $editPage.$elByCurUser;
        header('Location: '.$redirectToElEdit);
}
  • $curUserId = $USER->GetID() - в переменную $curUserId передали ID текущего авторизованного пользователя.
  • $iblockId = 5 - в переменную $iblockId передали ID инфоблока "Анкеты".
  • $elementsByCurUser = CIBlockElement::GetList - GetList-om получили элементы 5-го инфоблока.
  • "CREATED_USER_ID" => $curUserId - отфильтровали из всех элементов, элемент созданный этим пользователем, и получили его (элемента) ID.
  • $elByCurUser = $ar_fields['ID'] - в переменную $elByCurUser передали ID элемента, текущего пользователя.
  • if (isset($elByCurUser)) - проверили, установлена ли переменная $elByCurUser. По факту, проверили, есть ли у текущего пользователя элемент (создавал ли он его)
  • $redirectToElEdit = $editPage.$elByCurUser - конкатинацией собрали url на форму редактирования и в параметр передали ID элемента.
  • header('Location: '.$redirectToElEdit) - отправили пользователя на форму редактирования

В общем-то и все. Если у пользователя еще нет элемента, он останется на этой странице, если элемент уже есть он отправится на форму редактирования.

Тоже самое, делаем на странице /personal/form/edit.php- если у пользователя еще нет элемента, отправляем его на форму создания/personal/form/add.php


if (isset($elByCurUser)) { //Если у пользователя еще нет анкеты он отправляется на создание

} else {
    $editPage = '/personal/form/';
    header('Location: '.$editPage);
}
Александр Силуянов 29.07.2019
Михаил, а вот такой вопрос.
Есть инфоблок с дисконтными картами. Там их примерно 450к.
Пользователь, методом выше отправляет данные, а форма должна узнать, существует ли карта, которую он ввел.
Грубо говоря при отправке формы она должна сверить введенные данные со списком карт и если такая карта есть в базе, то гуд, а если нет, то соответствующее сообщение.
Не подскажите как такую штуку реализовать?