Last error битрикс

Настройка и расширение стандартного rest api для инфоблоков Пошаговая инструкция, как работать с инфоблоками через rest api Битрикса. 1. Заполнить «Символьный код API» у нужного инфоблока. В данном примере это будет «apiNews» . Поставить рядом галочку «Включен доступ через REST» Инструкция с картинками . 2. Создать класс-контроллер путём наследования стандартного контроллера Битрикса для инфоблоков […]

Содержание

  1. Настройка и расширение стандартного rest api для инфоблоков
  2. Не удается создать сайт (Status: error; Last: play; Step: complete;)
  3. ThrowException
  4. Параметры
  5. Смотрите также
  6. Примеры использования
  7. Пользовательские комментарии
  8. Пользователь 1064429

Настройка и расширение стандартного rest api для инфоблоков

Пошаговая инструкция, как работать с инфоблоками через rest api Битрикса.

1. Заполнить «Символьный код API» у нужного инфоблока. В данном примере это будет «apiNews» . Поставить рядом галочку «Включен доступ через REST»
Инструкция с картинками .

2. Создать класс-контроллер путём наследования стандартного контроллера Битрикса для инфоблоков и переопределить в нём два метода.

Этот класс необходимо подключить в init.php любым удобным способом

3. Создать сервис-локатор и зарегистрировать в нём свой контроллер. Можно сделать в отдельном файле, который потом подключить в init.php.
Подробнее о сервис-локаторах и способах регистрации тут

Стоит обратить внимание на то, как формируется имя регистрируемого сервиса — » iblock.element.здесьAPIкодИнфоблока.rest.controller «.

Путь до » iblock.Element.get » будет в настройках вебхука.

5. Это пункт актуален, если нужно настроить rest api на БУС, где нет интерфейса для создания вебхуков.Чтобы выйти из данной ситуации, нужно создать в публичной части страницу с компонентом bitrix:rest.hook.
В примере ниже компонент размещен по адресу ‘/rest-hook/index.php’

В некоторых мануалах пишут, что это работает и с обычным прологом, но у меня при подключении » prolog_before.php » вебхук не сохранялся — при нажатии «Сохранить» просто перезагружалась страница.
При подключении » prolog_admin.php » всё работает норм. Также плюс в том, что доступ к странице автоматически закрыт от тех, кто не имеет доступа в админку.

Важный момент по ЧПУ:
После создания страницы нужно её пересохранить в html режиме, чтобы перезаписались настройки ЧПУ. Именно страницу, а не компонент, так как при сохранении компонента, по неизвестной причине, раздел параметров «SEF_URL_TEMPLATES» превращается в кашу и компонент перестаёт работать. Может это какой-то прикол именно моего сайта)
Также можно обновить настройки ЧПУ вручную через админку в разделе «Обработка адресов».
В файле urlrewrite.php должно появиться примерно следующее:

После вышеперечисленных манипуляций по адресу /rest-hook/ap/0/ будет доступна форма создания входящего вебхука.

6. Чтобы добавить к штатному REST свои методы, нужно подписаться на событие OnRestServiceBuildDescription и в обработчике указать параметры нового маршрута. Подробнее тут

Источник

Не удается создать сайт (Status: error; Last: play; Step: complete;)

Всем Привет, не удается создать сайт, после удаления, до этого сайт был в директории /home/bitrix/www
решил создать дополнительный сайт, чтобы был вид типа «/home/bitrix/ext_www/site1.ru» и /home/bitrix/ext_www/site1.ru, но не получилось, удалил текущий, перезагрузил машину, та же ситуация:

Подскажите пожалуйста в чем может быть причина ошибки

на последнем обновлении у меня тоже веселуха

Filter options:
select_type: not_filtered
select_status: not_filtered

Tasks found 268:
————————————————————————————
TaskID | Started at | Status | Last Step
————————————————————————————
restart_web_services_0784711575 | 12/09/2016 11:16 | interrupt |
site_delete_3377026228 | 12/09/2016 11:16 | interrupt |
site_create_2408733123 | 11/09/2016 18:06 | interrupt |
restart_web_services_0062130643 | 11/09/2016 18:02 | interrupt |
site_delete_2047432238 | 11/09/2016 18:01 | interrupt |
site_create_4103535575 | 11/09/2016 16:56 | interrupt |
monitor_3317225363 | 06/09/2016 10:52 | interrupt |
monitor_7032276613 | 06/09/2016 10:49 | interrupt |
monitor_7303608575 | 06/09/2016 10:07 | interrupt |
update_8648064487 | 06/09/2016 10:04 | interrupt |
————————————————————————————
Available actions:

Цитата
Александр Панишев написал:
на последнем обновлении у меня тоже веселуха

Filter options:
select_type: not_filtered
select_status: not_filtered

Tasks found 268:
————————————————————————————
TaskID | Started at | Status | Last Step
————————————————————————————
restart_web_services_0784711575 | 12/09/2016 11:16 | interrupt
site_delete_3377026228 | 12/09/2016 11:16 | interrupt
site_create_2408733123 | 11/09/2016 18:06 | interrupt
restart_web_services_0062130643 | 11/09/2016 18:02 | interrupt
site_delete_2047432238 | 11/09/2016 18:01 | interrupt
site_create_4103535575 | 11/09/2016 16:56 | interrupt
monitor_3317225363 | 06/09/2016 10:52 | interrupt
monitor_7032276613 | 06/09/2016 10:49 | interrupt
monitor_7303608575 | 06/09/2016 10:07 | interrupt
update_8648064487 | 06/09/2016 10:04 | interrupt
————————————————————————————
Available actions:

Пароль от root менял в базе mysql ?
если да, то здесь укажи его

Источник

ThrowException

Метод фиксирует исключение msg c кодом id. Получить последнее исключение можно методом $APPLICATION->GetException(). Нестатический метод.

Аналог в новом ядре D7: SystemException.

Параметры

Параметр Описание
msg Текст ошибки или объект класса, наследованного от CApplicationException.
id Идентификатор ошибки.

Смотрите также

Примеры использования

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.

Если нужно сделать 2 исключения одновременно — то нужно поступать следующим образом:

Так, если при добавлении элемента неверно заданы оба свойства, то в сообщении об ошибке появится 2 сообщения, а не одно.

Это работает как в админке, так и в визуальной части сайта.

Источник

Пользователь 1064429

Если возникает проблема с авторизацией и BITRIX SESSID ERROR

1. Если не используется многосайтовость, а поле «Доменное имя» очищено, то надо удалить куку с точкой в начале. Для этого впишите в любую строку файла dbconn.php следующий код:
setcookie(«PHPSESSID», «», 777, ‘/’, ‘.site.ru’);
где site.ru — имя вашего домена.

2. Если используется многосайтовость или не очищено поле «Доменное имя», то впишите код:
setcookie(«PHPSESSID», «», 777, ‘/’);
строго без имени домена.

Докукин Вячеслав написал:
Дублирование куки PHPSESSID

OnBeforeEventSend — замена данных для макроса в почтовом шаблоне

Что то я долго искал решение, а как оказалось проблема была в том что входные переменные нужно передавать по ссылке!

Если нужно подставить свое значение в макрос (к примеру #AUTHOR#) почтового шаблона, например компонента обратной связи bitrix:main.feedback
то делается это так:

AddEventHandler(‘main’, ‘OnBeforeEventSend’, «OnBeforeEventSendHandler»);
function OnBeforeEventSendHandler(&$arFields, &$arTemplate)
<
global $USER;

if($USER->IsAuthorized())
<
$arFields[«AUTHOR»] = ‘Юзер залогинен: ‘.$USER->GetID().’ (‘.$USER->GetLogin().’) ‘.$USER->GetFullName().’, поле формы: ‘.$arFields[«AUTHOR»];
>else <
$arFields[«AUTHOR»] = ‘Юзер не залогинен, поле формы: ‘.$arFields[«AUTHOR»];
>
>

//отладка отправляемых сообщений с сайта
if (!function_exists(‘custom_mail’))
<
function custom_mail($to, $subject, $body, $headers)
<
$f = fopen($_SERVER[«DOCUMENT_ROOT»] . «/__maillog.txt», «a+»);
fwrite($f, print_r(array(‘TO’ => $to, ‘SUBJECT’ => $subject, ‘BODY’ => $body, ‘HEADERS’ => $headers), 1) . «n========n»);
fclose($f);
return mail($to, $subject, $body, $headers);
>
>

AddEventHandler(‘main’, ‘OnBeforeEventAdd’, «OnBeforeEventAddHandler»);function OnBeforeEventAddHandler(&$event, &$lid, &$arFields, &$messageId, &$files, &$languageId)
<
global $USER;

if($USER->IsAuthorized())
<
$arFields[«AUTHOR»] = ‘Юзер залогинен: ‘.$USER->GetID().’ (‘.$USER->GetLogin().’) ‘.$USER->GetFullName().’, поле формы: ‘.$arFields[«AUTHOR»];
>else <
$arFields[«AUTHOR»] = ‘Юзер не залогинен, поле формы: ‘.$arFields[«AUTHOR»];
>

CEventLog::Add(array(
«SEVERITY» => ‘SECURITY’,
«AUDIT_TYPE_ID» => ‘FEEDBACK_FORM’,
«MODULE_ID» => ‘form’,
«ITEM_ID» => $messageId,
«DESCRIPTION» => ‘Замена данных в отсылаемом письме – ‘.$arFields[«AUTHOR»],
));
>

A cookie associated with a cross-site resource at

Сегодня заметил что сайт клиента в Google chrome Версия 79.0.3945.130 (Официальная сборка), (64 бит) работает не адекватно
— пункты меню не нажимаются
— формы не отправляются при клике на кнопку submit
— js события onchange для select не отрабатывают

в консоли ошибок нет, но было вот такое предупреждение:

Если у кого то такие же проблемы, то нужно зайти в настройки забив такой URL chrome://flags/ и поставить опцию

Cookie Deprecation messages => disabled

после этого все будет работать адекватно.

Сортировка товаров по наличию при вкл. опции «Разрешить покупку при отсутствии товара (включая разрешение отрицательного количества товара)»

ПРОБЛЕМА:
При установке в настройках модуля торгового каталога, флага «Разрешить покупку при отсутствии товара (включая разрешение отрицательного количества товара)»,
перестает работать настройка компонента каталога «Источник данных»-Товары, которых нет на складах: «показывать в конце» и «не отображать».

Поиски решения:
Поиски решения были начаты с самого компонента bitrix.catalog который собственно и выводить товары. По логике я ожидал найти в нем ту часть кода которая отвечала бы за выборку (какой то GetList допустим), и которую можно было бы изменить, полностью кастомизировав компонент вынеся его в пространство имен. Но не тут то было. Опять пресловутая «гибкость» сделала свое дело.

Ответ ТП Битрикс: ID 2669755
Выборка происходит в BitrixIblockComponentBase::getSeparateList.
Что касается сортировки в целом, то при включении настройки Разрешить покупку при отсутствии товара (включая разрешение отрицательного количества товара),
недоступных товаров нет в принципе и стандартная сортировка по доступности работать не будет.

РЕШЕНИЕ:
1) добавляем в ИБ товара св-во SORTAVAIL тип число, в него будет записываться сумма «CATALOG_QUANTITY» всех его ТП или в случае если их нет то значение из этого же поля товара (простой товар).
2) Пишем обработчик, на событие обновления элемента каталога «OnProductUpdate» (событие «OnAfterIBlockElementUpdate» не подходит!).
Который после изменения параметров товараего тп, получает товар и все его ТП, и в цикле суммирует все значения «CATALOG_QUANTITY» его ТП.
Если товар простой и у него нет ТП то берет его значение «CATALOG_QUANTITY» и также записывает в св-во SORTAVAIL товара

AddEventHandler(«catalog», «OnProductUpdate», array(«IBlockHandler», «DoOnProductUpdateHandler»));
class IBlockHandler
<
protected static $handlerDisallow = false;

/* проверяем, что обработчик уже запущен */
if (self::$handlerDisallow)
return;
/* взводим флаг запуска */
self::$handlerDisallow = true;

//Updating PRODUCT prop SORTAVAIL
if($arFields[‘IBLOCK_ID’]==IBLOCK_ID_PRODUCTS_OFFERS) < //offer
self::updateProductSortAvail(IBLOCK_ID_PRODUCTS_OFFERS, $id);
>elseif ($arFields[‘IBLOCK_ID’]==IBLOCK_ID_PRODUCTS) < //product
self::updateProductSortAvail(IBLOCK_ID_PRODUCTS_OFFERS, null, $id);
>

/* вновь разрешаем запускать обработчик */
self::$handlerDisallow = false;

/**
* Update product property SORTAVAIL sort
* @param null $product_id
*/
function updateProductSortAvail($iblock_id, $offer_id=null, $product_id=null)
<
if(CModule::IncludeModule(«iblock») && CModule::IncludeModule(«catalog»))
<
$quantity_summ = 0;

if(!$product_id)
<
$product = CCatalogSku::GetProductInfo($offer_id, $iblock_id);
BitrixMainDiagDebug::writeToFile($product);
$product_id = $product[‘ID’];
>

//If isset offers
if(CCatalogSKU::IsExistOffers($product_id)) <

BitrixMainDiagDebug::writeToFile(‘Product #’ .$product_id.’ isset offers!’);

//Get offers
$obOffersList = CIBlockElement::GetList(
array(),
array(
‘IBLOCK_ID’ => $iblock_id,
«PROPERTY_CML2_LINK» => $product_id,
//’CATALOG_AVAILABLE’ => ‘Y’
),
false,
false,
array(«ID», «CATALOG_QUANTITY»)
);

while ($arOffers = $obOffersList->Fetch()) <
BitrixMainDiagDebug::writeToFile(array(«OFFER_ID»=>$arOffers[‘ID’], «CATALOG_QUANTITY»=>$arOffers[‘CATALOG_QUANTITY’]));
$quantity_summ += $arOffers[‘CATALOG_QUANTITY’];
>

BitrixMainDiagDebug::writeToFile(‘Product #’ .$product_id.’ is not offers!’);

//Get product
$obProductsList = CIBlockElement::GetList(
array(),
array(
‘IBLOCK_ID’ => IBLOCK_ID_PRODUCTS,
«ID» => $product_id,
),
false,
false,
array(«ID», «CATALOG_QUANTITY»)
);

while ($arProduct = $obProductsList->Fetch()) <
BitrixMainDiagDebug::writeToFile(array(«PRODUCT_ID»=>$arProduct[‘ID’], «CATALOG_QUANTITY»=>$arProduct[‘CATALOG_QUANTITY’]));
$quantity_summ += $arProduct[‘CATALOG_QUANTITY’];
>
>

CIBlockElement::SetPropertyValuesEx($product_id, false, array(‘SORTAVAIL’ => $quantity_summ));
BitrixMainDiagDebug::writeToFile([‘PRODUCT_ID’=>$product_id, ‘SORTAVAIL’=> $quantity_summ]);

IBLOCK_ID_PRODUCTS,
‘ACTIVE’ => ‘Y’,
//’=PROPERTY_SORTAVAIL_VALUE’ => false
//’ID’ => 34419 //38774 //простой 34419
);

$obProducts = CIBlockElement::GetList(
array(),
$arFilter,
false,
array(«nTopCount»=>100),
array(«ID», «PROPERTY_SORTAVAIL»)
);
while ($arProduct = $obProducts->Fetch()) <
$product_id = $arProduct[‘ID’];
$IBlockHandler = new IBlockHandler;
$IBlockHandler->updateProductSortAvail(IBLOCK_ID_PRODUCTS_OFFERS, null, $product_id);
>
>
?>

ТП был задан вопрос для чего нас лишили такой необходимой возможности (в крайнем случае, а этот случай именно такой. ) изменять выборку так как нужно клиенту, с просьбой создать обращение в отдел разработки.

Кто что думает по этому поводу отпишитесь плз!

Источник

Открытые члены

  __construct (Param $param)
 
  isExist ()
 
  add ()
 
  get (array $navData=[])
 
  update ()
 
  delete ()
 
  getErrors ()
 
  getErrorByCode ($code)
 

Поля данных

const  ERROR_ADD_IBLOCK = «ERROR_ADD_IBLOCK»
 
const  ERROR_UPDATE_IBLOCK = «ERROR_UPDATE_IBLOCK»
 
const  ERROR_IBLOCK_NOT_FOUND = «ERROR_IBLOCK_NOT_FOUND»
 
const  ERROR_IBLOCK_ALREADY_EXISTS = «ERROR_IBLOCK_ALREADY_EXISTS»
 

См. определение в файле iblock.php строка 11

◆ __construct()

__construct ( Param  $param )

См. определение в файле iblock.php строка 27

28 {

29 $this->param = $param;

30 $this->params = $param->getParams();

31

32 $this->fieldList = [«NAME», «ACTIVE», «DESCRIPTION», «SORT», «BIZPROC», «PICTURE»];

33 $this->messageList = [«ELEMENTS_NAME», «ELEMENT_NAME», «ELEMENT_ADD», «ELEMENT_EDIT», «ELEMENT_DELETE»,

34 «SECTIONS_NAME», «SECTION_ADD», «SECTION_EDIT», «SECTION_DELETE»];

35

37

38 $this->errorCollection = new ErrorCollection;

39 }

static getIblockId(array $params)

◆ add()

Adds an iblock.

Возвращает
int|bool
Исключения

BitrixMainLoaderException

Замещает Controllable.

См. определение в файле iblock.php строка 71

72 {

73 $this->param->checkRequiredInputParams([«IBLOCK_TYPE_ID», «IBLOCK_CODE», [«FIELDS» => [«NAME»]]]);

74 if ($this->param->hasErrors())

75 {

76 $this->errorCollection->add($this->param->getErrors());

77 return false;

78 }

79

80 $iblockObject = new CIBlock();

81 $result = $iblockObject->add($this->getFields());

82

83 if ($result)

84 {

85 if (!empty($this->params[«SOCNET_GROUP_ID»]) && Loader::includeModule(«socialnetwork»))

86 {

87 CSocNetGroup::setLastActivity($this->params[«SOCNET_GROUP_ID»]);

88 }

89 return (int)$result;

90 }

91 else

92 {

93 if ($iblockObject->LAST_ERROR)

94 {

95 $this->errorCollection->setError(new Error($iblockObject->LAST_ERROR, self::ERROR_ADD_IBLOCK));

96 }

97 else

98 {

99 $this->errorCollection->setError(new Error(«Unknown error», self::ERROR_ADD_IBLOCK));

100 }

101

102 return false;

103 }

104 }

◆ delete()

Deletes an iblock.

Возвращает
bool

Замещает Controllable.

См. определение в файле iblock.php строка 177

178 {

179 $this->param->checkRequiredInputParams([«IBLOCK_TYPE_ID», «IBLOCK_CODE», «IBLOCK_ID»]);

180 if ($this->param->hasErrors())

181 {

182 $this->errorCollection->add($this->param->getErrors());

183 return false;

184 }

185

186 return CIBlock::delete($this->iblockId);

187 }

◆ get()

get ( array  $navData = [] )

Returns a list of iblock data.

Аргументы
array $navData Navigation data.
Возвращает
array

Замещает Controllable.

См. определение в файле iblock.php строка 113

114 {

115 $this->param->checkRequiredInputParams([«IBLOCK_TYPE_ID»]);

116 if ($this->param->hasErrors())

117 {

118 $this->errorCollection->add($this->param->getErrors());

119 return [];

120 }

121

122 $iblocks = [];

123

124 $filter = $this->getFilter();

125

126 $order = $this->getOrder();

127

128 $queryObject = CIBlock::getList($order, $filter);

129 $queryObject->NavStart($navData);

130 while ($result = $queryObject->fetch())

131 {

132 $iblocks[] = $result;

133 }

134

135 return [$iblocks, $queryObject];

136 }

◆ getErrorByCode()

getErrorByCode (   $code )
inherited

◆ getErrors()

◆ isExist()

Checks whether an iblock exists.

Возвращает
bool

См. определение в файле iblock.php строка 46

47 {

48 $this->param->checkRequiredInputParams([«IBLOCK_TYPE_ID», «IBLOCK_CODE»]);

49 if ($this->param->hasErrors())

50 {

51 $this->errorCollection->add($this->param->getErrors());

52 return false;

53 }

54

55 $filter = [

56 «ID» => $this->params[«IBLOCK_ID»] ? $this->params[«IBLOCK_ID»] : «»,

57 «CODE» => $this->params[«IBLOCK_CODE»] ? $this->params[«IBLOCK_CODE»] : «»,

58 «CHECK_PERMISSIONS» => «N»,

59 ];

60 $queryObject = CIBlock::getList([], $filter);

61

62 return (bool) $queryObject->fetch();

63 }

◆ update()

Updates an iblock.

Возвращает
bool

Замещает Controllable.

См. определение в файле iblock.php строка 143

144 {

145 $this->param->checkRequiredInputParams([«IBLOCK_TYPE_ID», «IBLOCK_CODE», «IBLOCK_ID»]);

146 if ($this->param->hasErrors())

147 {

148 $this->errorCollection->add($this->param->getErrors());

149 return false;

150 }

151

152 $iblockObject = new CIBlock;

153 if ($iblockObject->update($this->iblockId, $this->getFields()))

154 {

155 return true;

156 }

157 else

158 {

159 if ($iblockObject->LAST_ERROR)

160 {

161 $this->errorCollection->setError(new Error($iblockObject->LAST_ERROR, self::ERROR_UPDATE_IBLOCK));

162 }

163 else

164 {

165 $this->errorCollection->setError(new Error(«Unknown error», self::ERROR_UPDATE_IBLOCK));

166 }

167

168 return false;

169 }

170 }

◆ ERROR_ADD_IBLOCK

const ERROR_ADD_IBLOCK = «ERROR_ADD_IBLOCK»

◆ ERROR_IBLOCK_ALREADY_EXISTS

const ERROR_IBLOCK_ALREADY_EXISTS = «ERROR_IBLOCK_ALREADY_EXISTS»

◆ ERROR_IBLOCK_NOT_FOUND

const ERROR_IBLOCK_NOT_FOUND = «ERROR_IBLOCK_NOT_FOUND»

◆ ERROR_UPDATE_IBLOCK

const ERROR_UPDATE_IBLOCK = «ERROR_UPDATE_IBLOCK»


Объявления и описания членов класса находятся в файле:

  • C:/Bitrix/modules/lists/lib/entity/iblock.php

Редактировать

Создание типа инфоблока

<?
function ibTypeAdd($ibTypeCode, $hasSections = 'Y', $sort = 500, $lang = 'ru') {
    $ibtCode = strtolower($ibTypeCode);
    $dbIbt = CIBlockType::GetByID($ibtCode);
    $arIbt = $dbIbt->GetNext();

    if($arIbt) {
        return false;
    }

    $arFields = [
        'ID' => $ibtCode,
        'SECTIONS' => $hasSections,
        'IN_RSS' => 'N',
        'SORT' => $sort,
        'LANG' => $lang,
    ];

    $obBlocktype = new CIBlockType();
    $db->StartTransaction();
    $res = $obBlocktype->Add($arFields);

    if(!$res) {
        $db->Rollback();
        
        return false;
    }
    
    $db->Commit();
    
    return true;
}

Удаление типа инфоблока

<?
function ibTypeDelete($ibTypeCode) {
    $dbIbt = CIBlockType::GetByID($ibTypeCode);
    $arIbt = $dbIbt->GetNext();

    if(!$arIbt) {
        return false;
    }

    $db->StartTransaction();
    if(!CIBlockType::Delete($ibTypeCode)) {
        $db->Rollback();
        return false;
    }
    
    $db->Commit();
        
    return true;
}

Создание инфоблока

<?
function ibAdd($ibName, $ibCode, $ibTypeCode, $arProps) {

	$ib = new CIBlock();
        $arFields = Array(
        "ACTIVE" => 'Y',
        "NAME" => $ibName,
        "CODE" => $ibCode,
        "IBLOCK_TYPE_ID" => $ibTypeCode,
        "SITE_ID" => [SITE_ID],
        "LID" => SITE_ID,
        "SORT" => 1000,
        "WORKFLOW" => 'N',
        //"GROUP_ID" => Array("2"=>"D", "3"=>"R")
    );

    $ibId = $ib->Add($arFields);

    if ($ibId <= 0) {
    	// BitrixMainDiagDebug::dump($ib->LAST_ERROR);
        // die();
    	return false;
    }
    
    // добавляем свойства
    foreach ($arProps as $arProp) {

        $dbProperties = CIBlockProperty::GetList([], ["IBLOCK_ID" => $ibId, 'CODE' => $arProp['CODE']]);
        if ($dbProperties->SelectedRowsCount() > 0) {
            continue;
        }

        $ibp = new CIBlockProperty;

        $arFields = Array(
            "NAME" => $arProp['NAME'],
            "ACTIVE" => "Y",
            "SORT" => 100, // Сортировка
            "CODE" => $arProp['CODE'],
            "PROPERTY_TYPE" => "S", // Строка
            "ROW_COUNT" => 1, // Количество строк
            "COL_COUNT" => 60, // Количество столбцов
            "IBLOCK_ID" => $ibId
        );
        $propId = $ibp->Add($arFields);

        if (!$propId) {
            // BitrixMainDiagDebug::dump($ibp->LAST_ERROR);
            // die();
            continue;
        }
    }

    return false;

}

Удаление инфоблока

<?
function ibDelete($ibCode, $ibTypeCode) {
    $arOrder = [];
    $arFilter = ['TYPE' => $ibTypeCode, 'CODE' => $ibCode];
    $dbIBList = CIBlock::GetList($arOrder, $arFilter);

    if ($dbIBList->SelectedRowsCount() != 1) {
        return false;
    }
    
    $arIBList = $dbIBList->GetNext();

    $db->StartTransaction();
    if (!CIBlock::Delete($arIBList['ID'])) {
        $db->Rollback();
        return false;
    }
    
    $db->Commit();
    
    return true;
}

Проверка наличия свойства в инфоблоке

<?
function isPropExists($ibId, $propCode) {
    $dbProperties = CIBlockProperty::GetList([], ["IBLOCK_ID" => $ibId, 'CODE' => $propCode]);

    if ($dbProperties->SelectedRowsCount() > 0) {
        return true;
    }

    return false;
}

Добавление свойства в инфоблок

<?
function addIBlockProp($ibId, $propCode) {
    
    $ibp = new CIBlockProperty();

    $arFields = Array(
        "NAME" => $propCode,
        "ACTIVE" => "Y",
        "SORT" => 100, // Сортировка
        "CODE" => $propCode,
        "PROPERTY_TYPE" => "S", // Строка
        "ROW_COUNT" => 1, // Количество строк
        "COL_COUNT" => 60, // Количество столбцов
        "IBLOCK_ID" => $ibId
    );
    $propId = $ibp->Add($arFields);

    if (!$propId) {
        return false;
        //BitrixMainDiagDebug::dump($ibp->LAST_ERROR);
        //die();
    }

    return true;
}

Добавление данных в инфоблок

<?
function ibRowAdd($ibId, $arField, $arProps) {

    $el = new CIBlockElement();

    $arItem = [
        "IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела
        "IBLOCK_ID" => $ibId,
        "PROPERTY_VALUES" => $arProps,
        "ACTIVE" => "Y", // активен
    ];

    $arItem = array_merge($arItem, $arField);

    // создаем элемент
    if ( !($ITEM_ID = $el->Add($arItem)) ) {
        return false;
    }

    return true;

}

Обновление данных в инфоблоке

<?
function ibRowUpdate($ibItemId, $arField, $arProps) {

    $el = new CIBlockElement();

    $arItem = [
        "IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела
        "PROPERTY_VALUES" => $arProps,
        "ACTIVE" => "Y", // активен
    ];

    $arItem = array_merge($arItem, $arField);

    // обновляем элемент
    if ( !($ITEM_ID = $el->Update($ibItemId, $arItem)) ) {
        return false;
    }

    return true;

}

Удаление данных из инфоблока

<?
function ibRowDelete($ibItemId) {

    return CIBlockElement::Delete($ibItemId);

}

Элементы

08.09.2013

Здесь приведены примеры использования основных функций класса
CIBlockElement.
Примеры бессмысленны, служат как образец для вставки в код. Скопируй и удали лишнее.
А также, даны ссылки на подробное описание в документации битрикса.

Подключаем функции модуля iblock

 
CModule::IncludeModule('iblock');

Получение элементов, функция GetList


$arResult['ITEMS'] = array();
$arFilter = array(		
    'ACTIVE' => 'Y',
    'SECTION_ACTIVE' => 'Y',
    'SECTION_GLOBAL_ACTIVE' => 'Y',
    'IBLOCK_ID' => $arParams['IBLOCK_ID'],
    'SECTION_ID' => $arParams['SECTION_ID'],
    'INCLUDE_SUBSECTIONS' => 'Y',
);
$arSelect = array('IBLOCK_ID','ID','NAME','DETAIL_PAGE_URL','PREVIEW_TEXT','DATE_ACTIVE_FROM');
$arOrder = array('SORT'=>'ASC','DATE_ACTIVE_FROM' => 'DESC');
$arGroupBy = array('ID'); //default = false
$arNavStartParams = array(//default = false
    'nTopCount' => 10,
    'iNumPage' => $arParams['PAGE'],
    'nPageSize' => $arParams['COUNT_ON_PAGE'], 
    'nElementID' => $arResult['ELEMENT']['ID'], 
);
$rsElement = CIBlockElement::GetList($arOrder, $arFilter, $arGroupBy, $arNavStartParams, $arSelect);
while($obElement = $rsElement->GetNextElement()){
        $arItem = $obElement->GetFields();
        $arItem['PROP'] = $obElement->GetProperties(); //Получение свойств
        $arResult['ITEMS'][] = $arItem;		
}
$arResult['NAV_STRING'] = $rsElement->GetPageNavString('');

Функция GetList в документации битрикса

Модификаторы фильтров $arFilter:
Число,
Дата,
Маска,
Строка

Фильтр со сложной логикой:

Вложенность фильтров теоретически не ограничена.


$arFilter = array(
    "IBLOCK_ID" => $IBLOCK_ID,
    array(
        "LOGIC" => "OR",//"AND" по умолчанию
        array("PROPERTY_RADIUS" => 50, "=PROPERTY_CONDITION" => "Y"),
        array(">=PROPERTY_RADIUS" => 50, "!=PROPERTY_CONDITION" => "Y"),
    ),
);

Фильтр с подзапросом:

К полю ID применим подзапрос:

CIBlockElement::SubQuery(string strField, array arFilter), где
strField — Название поля, по которому будет осуществляться фильтрация. (ID | PROPERTY_#PROPERTY_CODE# — привязка к элементам);
arFilter — Фильтр, аналогичный фильтру основному запросу;
Функция SubQuery в документации битрикса


$arFilter = array(
      "ID" => CIBlockElement::SubQuery("PROPERTY_AUTHOR", array(
        "IBLOCK_ID" => $BOOK_IBLOCK,
        ">=PROPERTY_PRINT_DATE" => "2000-01-01 00:00:00",
      )),
);

Функция GetPageNavString($navigationTitle, $templateName = «», $showAlways=false);

Функция возвращает html блок с постраничкой, где

$navigationTitle — заголовок;
$templateName — шаблон комнонента system.pagenavigation;
$showAlways — выводить всегда(Y|N);

Поля элементов инфоблока

ID PREVIEW_PICTURE MODIFIED_BY
CODE PREVIEW_TEXT USER_NAME
XML_ID PREVIEW_TEXT_TYPE LANG_DIR
NAME DETAIL_PICTURE LIST_PAGE_URL
IBLOCK_ID DETAIL_TEXT DETAIL_PAGE_URL
IBLOCK_SECTION_ID DETAIL_TEXT_TYPE SHOW_COUNTER
IBLOCK_CODE SEARCHABLE_CONTENT SHOW_COUNTER_START
ACTIVE DATE_CREATE WF_COMMENTS
DATE_ACTIVE_FROM CREATED_BY WF_STATUS_ID
DATE_ACTIVE_TO CREATED_USER_NAME LOCK_STATUS
SORT TIMESTAMP_X TAGS

Добавление / обновление элементов


$el = new CIBlockElement;

$PROP = array();
$PROP['AUTHOR'] = "Михаил"; 
$PROP['LINK'] = 38;      

$arLoadProductArray = Array(
  'IBLOCK_ID'      => 18,
  'PROPERTY_VALUES'=> $PROP,//Должны быть указаны ВСЕ свойства, не указаные БУДУТ ЗАТЕРТЫ.
  'NAME'           => 'Элемент',
  'ACTIVE'         => 'Y',     
  'DATE_ACTIVE_FROM'    => ConvertTimeStamp($linuxTimeStamp,'FULL'),       
  'PREVIEW_TEXT'   => 'текст для списка элементов',
  'PREVIEW_TEXT_TYPE'   => 'html', 
  'DETAIL_PICTURE' => CFile::MakeFileArray($_SERVER['DOCUMENT_ROOT'].'/image.gif'),
  );

if ($PRODUCT_ID) { //Обновим элемент
    if (!$res = $el->Update($PRODUCT_ID, $arLoadProductArray)){
        echo "Error: ".$el->LAST_ERROR;
    }
} else { //Добавим элемент
    if (!$PRODUCT_ID = $el->Add($arLoadProductArray)){
        echo "Error: ".$el->LAST_ERROR;
    }
}

Функция Add в документации битрикса,
Функция Update в документации битрикса,

Обновление свойств элемента

Неуказанные свойства НЕ будут затерты


$ELEMENT_ID = 18;  // код элемента
$PROP = array();
$PROP['AUTHOR'] = "Михаил"; 
$PROP['LINK'] = 38;  
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $IBLOCK_ID, $PROP);

Функция SetPropertyValuesEx в документации битрикса

Данная запись является шпаргалкой по работе с пользовательскими полями. В записи представлены конструкции кода для работы с полями пользователя, условиями для проверки типа пользователя и примерами запросов для изменения данных пользователя через API

Получаем пользователя по ID

Для получения информации о пользователе вы можете написать следующий запрос.

Для получения всех стандартных полей укажите в select -> ‘*’

Для получения всех дополнительных полей укажите в select -> ‘UF*’

$dbUser = BitrixMainUserTable::getList(array(
     'select' => array('ID', 'NAME', 'PERSONAL_PHOTO', 'PERSONAL_WWW'),
     'filter' => array('ID' => $USER->GetID())
));
if ($arUser = $dbUser->fetch()){
    var_dump($arUser);
}

Получаем пользователя по ID

//D7
use BitrixMainUserTable;

$user = UserTable::getList([
    'select' => array('ID'),
    'filter' => array('EMAIL' => 'user@mail')
])->fetch();

echo $user['ID'];

//old
$cUser = $USER::GetList(
    $by="ID",
    $order="desc",
    array(
        'EMAIL' => 'user@mail'
    ),
    array(
        'SELECT' => array('ID')
    )
)->fetch();

echo $cUser['ID'];

Создание нового пользователя

// создадим массив описывающий изображение 
// находящееся в файле на сервере
$arIMAGE = CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/images/photo.gif");
$arIMAGE["MODULE_ID"] = "main";

$user = new CUser;
$arFields = Array(
  "NAME"              => "Сергей",
  "LAST_NAME"         => "Иванов",
  "EMAIL"             => "ivanov@microsoft.com",
  "LOGIN"             => "ivan",
  "LID"               => "ru",
  "ACTIVE"            => "Y",
  "GROUP_ID"          => array(10,11),
  "PASSWORD"          => "123456",
  "CONFIRM_PASSWORD"  => "123456",
  "PERSONAL_PHOTO"    => $arIMAGE
);

$ID = $user->Add($arFields);
if (intval($ID) > 0) {

    echo "Пользователь успешно добавлен.";
}
else {
    echo $user->LAST_ERROR;
}

Изменение полей пользователя

$user = new CUser;
$fields = Array(
    "NAME" => "Сергей",
    "LAST_NAME" => "Иванов",
    "EMAIL" => "ivanov@microsoft.com",
    "UF_PROD_NAME" => "Тестовый товар"
);
$user->Update($USER->GetID(), $fields);
$strError .= $user->LAST_ERROR;

Для обновления пользовательского поля, вида «список» (где 11,12,13 — это ID значений списка.):

$user = new CUser;
$fields = Array( 
    "UF_SHOP" => array(11,12,13), 
); 
$user->Update($ID, $fields);

Авторизовать пользователя по ID

$USER->Authorize($user['ID']);

Получаем список групп

$result = BitrixMainGroupTable::getList(array(
    'select'  => array('NAME','ID','STRING_ID','C_SORT'),
    'filter'  => array('!ID'=>'1') //все кроме группы администраторов
));

while ($arGroup = $result->fetch()) {
	//Обрабатываем результат
}

Перенос пользователя в другую группу

BitrixMainUserGroupTable::add(array(
    "USER_ID" => $USER_ID,
    "GROUP_ID" => 10,
));

Получаем список активных пользователей в группе

$result = BitrixMainUserGroupTable::getList(array(
    'filter' => array('GROUP_ID'=>5,'USER.ACTIVE'=>'Y'),
    'select' => array(
        'USER_ID',
        'NAME'=>'USER.NAME',
        'LAST_NAME'=>'USER.LAST_NAME'
    ),
    'order' => array(
        'USER.ID'=>'DESC'
    ),
));

while ($arGroup = $result->fetch()) {
    //Обрабатываем результат
}

Удалить пользователя из группы

BitrixMainUserGroupTable::delete(array(		 
	"USER_ID" => $REQUEST['USER_ID'], 
	"GROUP_ID" => 5, 
));

Получить ID текущего авторизованного пользователя

BitrixMainEngineCurrentUser::get()->getId()

Проверить, авторизован ли пользователь

if(BitrixMainEngineCurrentUser::get()->getId()) {
    // выполняем код
}

Проверить, является ли пользователь админом

BitrixMainEngineCurrentUser::get()->isAdmin()

Получить логин текущего пользователя

BitrixMainEngineCurrentUser::get()->getLogin()

Получить массив групп текущего пользователя

BitrixMainEngineCurrentUser::get()->getUserGroups()

Получить полное имя текущего пользователя

BitrixMainEngineCurrentUser::get()->getFullName()

Получить имя текущего пользователя

BitrixMainEngineCurrentUser::get()->getName()

Получить фамилию текущего пользователя

BitrixMainEngineCurrentUser::get()->getLastName()

Получить отчество текущего пользователя

BitrixMainEngineCurrentUser::get()->getSecondName()

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Last error cease juniper
  • Last error 193
  • Last error 126
  • Last error 10054
  • Last day on earth survival как изменить ник

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии