Как добавить записи в базу SOBI2

Коротко о том, как загнать в базу джумловског компонента SigSiu Online Business Directory 2 ( SOBI2 ) много записей. По крайней мере закачать 10К позиций в каталог получилось без проблем =)

(Direct mass-import to SOBI2 database without plugins.  How-to. )

Сама структура на самом деле устроена не сложно. Всё соби находится в таблицах датабазы, начинающихся на jos_sobi2_ (это настройки по умолчанию). Если категории уже созданы, а платных услуг мы не касаемся, нас буду интересовать всего три таблицы. Вот собственно и они:

jos_sobi2_item – здесь лежат аттрибуты записей, дата создания, тайтл, автор, айпишник и т.п. Здесь же данные счётчика просмотров и маркеры публикации и одобрения записей. Есть параметр принадлежности к категории и содержимое мета-тегов страницы. Одна строчка в таблице соответствует одной записи в каталоге SOBI2.

jos_sobi2_fields_data – всё остальное мясо, кроме тайтла и тегов находится тут. Значимых столбцов всего два, каждая строчка содержит содержимое какого-то поля.

jos_sobi2_cat_items_relations – в этой таблице находятся только связи между директориями и записями. Сделано, видимо, для того, чтобы не лезть в основную таблицу с итемсами при открытии категории с фронта сайта. По сути, информация дублируется.

Теперь боле подробно о том, что куда вставлять. Как уже ясно из описанного выше, для того, чтобы разместить в каталоге SOBI2 новую запись, нам нужно добавить информацию в три таблицы. Т.е. сделать три запроса к базе. Дабы всё было по порядку начинаем с подключения:

set_time_limit(0);
ignore_user_abort(TRUE);
setlocale(LC_CTYPE ,”ru_RU.UTF8″);
if (!mysql_connect( $dbserver , $dbuser, $dbpass ))
{
echo “mysql connect: error”;
die();
}  else echo ‘mysql connect: ok’;
mysql_select_db( $dbname );
mysql_query ( “SET NAMES utf8;” );

Чтобы исключить гиморы с кодировками, лучше всего везде явно задать ту, с которой работаем. Функция setlocale по большому счёту нужна для корректной работы только некоторых функций php, типа strtolower.

Формируем и отправляем запрос к базе:

$sql = ‘INSERT INTO `jos_sobi2_item` ‘.
‘(`title`, `hits`, `visits`, `published`, `confirm`, `approved`, `archived`, `publish_up`,  `publish_down`, `checked_out`,’.
‘ `checked_out_time`, `ordering`, `owner`, `icon`, `image`, `background`, `options`, `params`, `ip`, `last_update`,’.
‘ `updating_user`, `updating_ip`, `metakey`, `metadesc`)’.
‘VALUES (\” . $pin[1] . ‘\’, \’0\’, NULL, \’1\’, \’0\’, \’1\’, \’0\’, NOW(),’.
‘ \’0000-00-00 00:00:00\’, \’0\’, \’0000-00-00 00:00:00\’, \’0\’, \’0\’, \’\', \’\', \’\', NULL,’.
‘ \’def_cid = ‘ . $CategoryId . ‘\’, \’77.66.55.44\’, NOW(), \’62\’, \’77.66.55.44\’, \” . $metaKeys . ‘\’, \” . $metaDescription . ‘\’);’;
mysql_query( $sql  ); $lastid = mysql_insert_id();

Суть значения выделенных переменных ясна из их имён. Адрес ip ( 77.66.55.44 ) взятот балды, в нашем случае он нам не важен. Одна из нулевых дат в запросе означает отсутствие временного лимита размещения записи. Запись публикуется на сайте немедленно. Это не всё. Теперь мясо.

$sql = ‘INSERT INTO `jos_sobi2_fields_data` ‘ .
‘( `fieldid`, `data_txt`, `data_bool`, `data_int`, `data_float`, `data_char`, `itemid`,   `expiration`)’ .
‘VALUES ( \”  . $itemField_id . ‘\’,\” .  $maso . ‘\’, NULL, \’0\’, \’0\’, \’\', \” . $lastid. ‘\’, NULL); ‘;
mysql_query( $sql  );

Этот запрос нужно открутить столько раз, сколько полей ( кроме тайтла и мета-тегов ) есть в каталоге. Здесь $itemField_id – это переменная, в которой лежит id поля, а $maso – соответственно его содержимое. Каждая строчка в этой таблице содержит также указатель записи, к кторой она относится. Этот указатель равен содержимому самой первой ячейки в базе jos_sobi2_item, она автоинкрементная, называется ‘itemid’, мы получаем её номер после добавления записи в эту таблицу и кладём его в переменную $lastid.

Всё, осталось только внести запись в таблицу связей с категориями. Единственный нюанс: эта таблица содержит кроме самих связей ещё столбец сортировки по умолчанию и для каждой записи необходимо указать уникальный для данной категории “номер в списке”. Сделал немного проще – там все номера будут уникальные, просто выясняем максимальное значение и прибавляем 1:

$res = mysql_query ( ‘SELECT MAX(ordering) FROM jos_sobi2_cat_items_relations;’ );
$order = mysql_result ( $res , 0 ) + 1;
$sql = ‘INSERT INTO `jos_sobi2_cat_items_relations` (`catid`, `itemid`, `ordering`)’.
‘ VALUES (\” . $CategoryId . ‘\’, ‘ . $lastid . ‘, \” . $order . ‘\’);’;
mysql_query( $sql  );

Сайт разработчика компонента SOBI2: http://sigsiu.net

Это бесплатный компонент для Joomla CMS, но плугин, выполняющий резервное копирование и импорт – платный, 30 евро. Он называется SOBI2 Import and Backup Plugin и он сохраняет и импортирует информацию из файлов CSV.

Всё описанное выше частично выполняет его работу.

Использованная конфигурация: Joomla 1.5.9 + SOBI2 2.9.0

Tags: ,

This entry was posted on Thursday, March 19th, 2009 at 15:14 and is filed under SEO. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

12 Responses to “Как добавить записи в базу SOBI2”

Danuta May 16th, 2009 at 07:44

Автор выйди к напроду, вопросы есть!

admin May 18th, 2009 at 20:17

Автор здесь =)

Макс August 3rd, 2009 at 09:55

в таблице соби2итем есть поле чекед_аут чо эт такое и чо оно мутит ?

admin August 5th, 2009 at 23:00

Макс, это означает что запись типа проверена модератором, там дата вроде, да? Опыт показал, что это поле ни на что не влияет.

grabilka December 3rd, 2009 at 13:39

Если у вас есть каталог на sobi2, и вам его нужно срочно наполнить тысячами тематических страниц – предлагаю свои услуги.

Детали предложения по адресу http://grabilka.ru/integrator/sobi2-joomla

Igor December 30th, 2009 at 17:07

чекед_аут – это не поле, это, так сказать, ячейка проверки ‘занятости’ этой записи в настоящий момент… в нее и записывается временная дата(с мин. и сек.) когда кто-то начал редактировать… ушел – дата ‘вытирается’… ну типа что-б двое одновременно не могли редактировать эту запись… верней не редактировать, а сохранять изменения. ‘прав’ больше у того, кто первый начал редактировать…

Igor December 30th, 2009 at 17:09

ой, забыл… предыдущий пост для Макс-а…

Маким May 21st, 2010 at 17:08

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

Leave a Reply