1C Bitrix - Запись инфоблока напрямую в БД

Блог нашего выдающегося, не побоюсь так сказать, политолога.

Модератор: Ramzes

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

1C Bitrix - Запись инфоблока напрямую в БД

Сообщение Ramzes » 17.04.2009 (Пт) 11:04

Так случилос-получилось, что я сделал сайт на двжке 1С bitrix (критику по поводу движка оставлять в трёпе).

Сайт сделал, но вот понадобилось мне еще и каталог в него заливать автоматом, сторонним приложением, и что бы это приложение инициировало выгрузку данных в БД Битрикса.

Сказано, сделано.

Если кому понадобится, я описываю добавление инфоблока-каталога в БД битрикса (кстати, на форуме битрикса, мне ответ дать не смогли (сказали пользовать API самого битрикса, и что все остальные методы полный сак, ибо после обновления моя схема может упасть, ну да это другая история).

Поехали.
Задача, добавить каталог на сайт. Каталог товаров в битриксе, это по сути инфоблок.
Создаем инфоблок руками (это одноразовая процедура, нечего запорачиватся, хотя это не сложно). Далее, говорим битриксу, что этот инфоблок будет каталогом товаров (это делается в настройках, и описано в справке).

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

Первое, что надо было сделать, добавить разделы и проивзодителей.

Sql запрос для добавления разделов выглядит так:
Код: Выделить всё
#добавление новой групы товаров
insert into b_iblock_section
   (`MODIFIED_BY`, `DATE_CREATE`, `CREATED_BY`, `IBLOCK_ID`, `ACTIVE`, `GLOBAL_ACTIVE`, `NAME`, `LEFT_MARGIN`, `RIGHT_MARGIN`, `DEPTH_LEVEL`, `DESCRIPTION`, `SEARCHABLE_CONTENT`, `XML_ID`)
values
   ('1', '@DATE_CREATE', '1', '@IBLOCK_ID', 'Y', 'Y', '@NAME', '@LEFT_MARGIN', '@RIGHT_MARGIN', '1', '', '@SEARCHABLE_CONTENT', '@XML_ID');


Дальше добавление производителей
Код: Выделить всё
#Добавление ногового брэнда
insert into b_iblock_property_enum
   (`PROPERTY_ID`, `VALUE`, `XML_ID`)
values
   ('69', '@VALUE', '@XML_ID');

PROPERTY_ID - это ссылка на свойство
VALUE - Собственно название группы
XML_ID - я использовал в своих целях (вставлял туда свой идентификатор)

Дальше самое интресеное, добавление элементов инфоблока. Вроде все казалось простым, добавляем данные в нужные таблицы, и все, но не тут-то было!!! Данные в некоторых таблицах нужно дублировать (я пока не понял, зачем это надо).

Добавляем две пустых строки в таблицу b_iblock_element
Код: Выделить всё
#--Добавление 2 новых элементов
INSERT INTO `b_iblock_element` (
`ID` ,
`TIMESTAMP_X` ,
`MODIFIED_BY` ,
`DATE_CREATE` ,
`CREATED_BY` ,
`IBLOCK_ID` ,
`IBLOCK_SECTION_ID` ,
`ACTIVE` ,
`ACTIVE_FROM` ,
`ACTIVE_TO` ,
`SORT` ,
`NAME` ,
`PREVIEW_PICTURE` ,
`PREVIEW_TEXT` ,
`PREVIEW_TEXT_TYPE` ,
`DETAIL_PICTURE` ,
`DETAIL_TEXT` ,
`DETAIL_TEXT_TYPE` ,
`SEARCHABLE_CONTENT` ,
`WF_STATUS_ID` ,
`WF_PARENT_ELEMENT_ID` ,
`WF_NEW` ,
`WF_LOCKED_BY` ,
`WF_DATE_LOCK` ,
`WF_COMMENTS` ,
`IN_SECTIONS` ,
`XML_ID` ,
`CODE` ,
`TAGS` ,
`TMP_ID` ,
`WF_LAST_HISTORY_ID` ,
`SHOW_COUNTER` ,
`SHOW_COUNTER_START`
)
VALUES (
NULL , NULL , NULL , NULL , NULL , '0', NULL , 'Y', NULL , NULL , '500', '', NULL , NULL , 'text', NULL , NULL , 'text', NULL , '1', NULL , NULL , NULL , NULL , NULL , 'N' , NULL , NULL , NULL, '@intCode' , NULL , NULL , NULL
);

INSERT INTO `b_iblock_element` (
`ID` ,
`TIMESTAMP_X` ,
`MODIFIED_BY` ,
`DATE_CREATE` ,
`CREATED_BY` ,
`IBLOCK_ID` ,
`IBLOCK_SECTION_ID` ,
`ACTIVE` ,
`ACTIVE_FROM` ,
`ACTIVE_TO` ,
`SORT` ,
`NAME` ,
`PREVIEW_PICTURE` ,
`PREVIEW_TEXT` ,
`PREVIEW_TEXT_TYPE` ,
`DETAIL_PICTURE` ,
`DETAIL_TEXT` ,
`DETAIL_TEXT_TYPE` ,
`SEARCHABLE_CONTENT` ,
`WF_STATUS_ID` ,
`WF_PARENT_ELEMENT_ID` ,
`WF_NEW` ,
`WF_LOCKED_BY` ,
`WF_DATE_LOCK` ,
`WF_COMMENTS` ,
`IN_SECTIONS` ,
`XML_ID` ,
`CODE` ,
`TAGS` ,
`TMP_ID` ,
`WF_LAST_HISTORY_ID` ,
`SHOW_COUNTER` ,
`SHOW_COUNTER_START`
)
VALUES (
NULL , NULL , NULL , NULL , NULL , '0', NULL , 'Y', NULL , NULL , '500', '', NULL , NULL , 'text', NULL , NULL , 'text', NULL , '1', NULL , NULL , NULL , NULL , NULL , 'N', NULL , NULL , NULL, '@2intCode' , NULL , NULL , NULL
);

@intCode и @2intCode - это мои идентификаторы, по ним в дальнейшем я смогу найти только-что добавленые артикулы.

После этого, эти строки надо обновить, записать в них нужные данные.
Код: Выделить всё
#--Обновление созданых элементов
UPDATE `qbox_test`.`b_iblock_element`
  SET
    `TIMESTAMP_X` = NOW(),
    `MODIFIED_BY` = '1',
    `DATE_CREATE` = NOW(),
    `CREATED_BY` = '1',
    `IBLOCK_ID` = '21',
    `IBLOCK_SECTION_ID` = '@IBLOCK_SECTION_ID',
    `NAME` = '@NAME',
    `DETAIL_TEXT` = '@DETAIL_TEXT',
    `DETAIL_TEXT_TYPE` = 'html',
    `SEARCHABLE_CONTENT` = '@SEARCHABLE_CONTENT',
    `IN_SECTIONS` = 'Y',
    `XML_ID` = '@ID'
WHERE `b_iblock_element`.`TMP_ID` = '@intCode';

UPDATE `qbox_test`.`b_iblock_element`
SET
    `TIMESTAMP_X` = NOW(),
    `MODIFIED_BY` = '1',
    `DATE_CREATE` = NOW(),
    `CREATED_BY` = '1',
    `IBLOCK_ID` = '21',
    `IBLOCK_SECTION_ID` = '@IBLOCK_SECTION_ID',
    `NAME` = '@NAME',
    `DETAIL_TEXT` = '@DETAIL_TEXT',
    `DETAIL_TEXT_TYPE` = 'html',
    `SEARCHABLE_CONTENT` = '@SEARCHABLE_CONTENT',
    `IN_SECTIONS` = 'Y',
    `XML_ID` = '@2ID',
    `WF_PARENT_ELEMENT_ID` = '@ID'
WHERE `b_iblock_element`.`TMP_ID` = '@2intCode';


Дальше прописываение нужных свойств

Код: Выделить всё
#Properties
#insert into b_iblock_element_property
#   (`IBLOCK_PROPERTY_ID`, `IBLOCK_ELEMENT_ID`, `VALUE`, `VALUE_ENUM`, `VALUE_NUM`)
#values
#   (IBLOCK_PROPERTY_ID, '@IBLOCK_ELEMENT_ID', VALUE, VALUE_ENUM, VALUE_NUM);

#Старая цена
insert into b_iblock_element_property
   (`IBLOCK_PROPERTY_ID`, `IBLOCK_ELEMENT_ID`, `VALUE`, `VALUE_NUM`)
values
   ('74', '@IBLOCK_ELEMENT_ID', '@OLD_PRICE', '@OLD_PRICE');

#Слудющая цена
insert into b_iblock_element_property
   (`IBLOCK_PROPERTY_ID`, `IBLOCK_ELEMENT_ID`, `VALUE`, `VALUE_NUM`)
values
   ('150', '@IBLOCK_ELEMENT_ID', '@NEXT_PRICE', '@NEXT_PRICE');
   
#Слудющая переоценка
insert into b_iblock_element_property
   (`IBLOCK_PROPERTY_ID`, `IBLOCK_ELEMENT_ID`, `VALUE`)
values
   ('149', '@IBLOCK_ELEMENT_ID', '@NEXT_REVALUATION');   

#Артикул
insert into b_iblock_element_property
   (`IBLOCK_PROPERTY_ID`, `IBLOCK_ELEMENT_ID`, `VALUE`, `VALUE_NUM`)
values
   ('70', '@IBLOCK_ELEMENT_ID', '@ARTICLE', '@ARTICLE');
   
#Гарантия
insert into b_iblock_element_property
   (`IBLOCK_PROPERTY_ID`, `IBLOCK_ELEMENT_ID`, `VALUE`, `VALUE_NUM`)
values
   ('68', '@IBLOCK_ELEMENT_ID', '@WARANTY', '@WARANTY');
   
#Производитель
insert into b_iblock_element_property
   (`IBLOCK_PROPERTY_ID`, `IBLOCK_ELEMENT_ID`, `VALUE`, `VALUE_ENUM`)
values
   ('69', '@IBLOCK_ELEMENT_ID', '@BRAND', '@BRAND');


Теперь надо посвязвать элементы с групами

Код: Выделить всё
insert into b_iblock_section_element
   (IBLOCK_SECTION_ID, IBLOCK_ELEMENT_ID)
values
   ('@IBLOCK_SECTION_ID', '@IBLOCK_ELEMENT_ID');


Добавление каталога и цен

Код: Выделить всё
insert into b_catalog_product
   (ID, QUANTITY, RECUR_SCHEME_LENGTH, RECUR_SCHEME_TYPE )
values
   ('@ID', '@QUANTITY', '0', 'D')
ON DUPLICATE KEY UPDATE QUANTITY = '@QUANTITY'


Код: Выделить всё
insert into b_catalog_price
   (PRODUCT_ID, CATALOG_GROUP_ID, PRICE, CURRENCY, TIMESTAMP_X)
values
   ('@PRODUCT_ID', '1', '@PRICE', 'UAH', NOW());
insert into b_catalog_price
   (PRODUCT_ID, CATALOG_GROUP_ID, PRICE, CURRENCY, TIMESTAMP_X)
values
   ('2@PRODUCT_ID', '1', '@PRICE', 'UAH', NOW());


Ну картинки, было бы неплохо. Сначала выгружаем их на FTP а потом прописываем записи в таблицы
Код: Выделить всё
INSERT INTO `b_file` (
`ID` ,
`TIMESTAMP_X` ,
`MODULE_ID` ,
`HEIGHT` ,
`WIDTH` ,
`FILE_SIZE` ,
`CONTENT_TYPE` ,
`SUBDIR` ,
`FILE_NAME` ,
`ORIGINAL_NAME` ,
`DESCRIPTION`
)
VALUES (
NULL , NOW( ) , 'iblock', '120', '160', '1000', 'image/jpeg', 'catalog_images', '@img', '@img', 'P'
), (
NULL , NOW( ) , 'iblock', '300', '300', '1000', 'image/jpeg', 'catalog_images', '@img', '@img', 'D'
);


Я добавляю две картинки, одна для предварительного просмотра, другая для детального.

ну и собственно привзяка картинок к элементам инфоблока

Код: Выделить всё
update b_iblock_element set PREVIEW_PICTURE = '@prev_pict', DETAIL_PICTURE = '@det_pict' where ID = '@ID';
update b_iblock_element set PREVIEW_PICTURE = '@prev_pict', DETAIL_PICTURE = '@det_pict' where ID = '@2ID';


Вроде, все, это draft вариант кода, оптимизаций займусь, завтра, но выкладывать не буду, сами додумаете :)

вот такими вот плясками с бубном, была одержана еще одна проблема над битриксом.

Вернуться в Ramzes

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

    TopList