Содержание
- Настройка и расширение стандартного rest api для инфоблоков
- Не удается создать сайт (Status: error; Last: play; Step: complete;)
- ThrowException
- Параметры
- Смотрите также
- Примеры использования
- Пользовательские комментарии
- Пользователь 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()
|
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()
