Как добавить записи в базу 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
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.


admin May 18th, 2009 at 20:17
Автор здесь =)