ProfiPHPProfiPHP
Категория: Поддержка OUR-CMS

Перенос сайта с Joomla на OUR-CMS

Недавно меня попросили перевести сайт с Joomla на OUR-CMS. Joomla для сохранения информации использует базу данных SQL, а OUR-CMS – текстовые файлы. Не будем разбирать вопрос для чего это нужно, в каждой CMS свои плюсы и свои недостатки и только со временем администратор понимает, что же лучше использовать. Но, если на сайте нет комментариев, авторизации пользователей и других ресурсозатратных функций, использование OUR-CMS более оправданное решение.

Для работы с базой данный я использовал Класс для работы с базой данных MySQL. В исполняемом файле подключил его:
require_once( $_SERVER['DOCUMENT_ROOT'].'/mysqli.php' );
Также вначале файла назначил константам конфигурационные настройки и создал объект базы данных:
define( "DBHOST", "localhost" );
define( "DBNAME", "prokovel_main" );
define( "DBUSER", "root" );
define( "DBPASS", "rhjirftyjn" );
define( "COLLATE", "utf8" );
$db = new db;
Сразу хочу заметить, что код перевода можно значительно оптимизировать, но для этого нет необходимости, поскольку операция выполняется один раз.

Находим в Joomla таблицу с категориями, которая называется category. Мы должны создать для каждой категории соответствующий блог. Нам нужны (из множества других) только 2 поля — заголовок (title) и URL страницы (alias). Перебираем все категории и параллельно создаем файлы базы данных для OUR-CMS:
function mf_encodestring( $string )
{
$string = mb_strtolower( $string );
$table = array(
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'ґ' => 'g',
'д' => 'd', 'е' => 'e', 'є' => 'e', 'ё' => 'yo', 'ж' => 'zh',
'з' => 'z', 'и' => 'i', 'і' => 'i', 'й' => 'j', 'ї' => 'i',
'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n', 'о' => 'o',
'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't', 'у' => 'u',
'ф' => 'f', 'х' => 'h', 'ц' => 'c', 'ч' => 'ch', 'ш' => 'sh',
'щ' => 'csh', 'ь' => '', 'ы' => 'y', 'ъ' => '', 'э' => 'e',
'ю' => 'yu', 'я' => 'ya');
$output = str_replace( array_keys( $table ), array_values( $table ), $string );
return $output;
}
$sql_result = $db->query( "SELECT * FROM `jos_categories`" );
while ( $row = $db->get_row( $sql_result ) )
{
$filename = mb_strtolower( trim( preg_replace( '/([^a-z0-9-_])/ui', '', str_replace( ' ', '_', mf_encodestring( $row['alias'] ) ) ) ) );
$data_mess = array( 'num_mess_user' => '10', 'num_mess_admin' => '10', 'url' => '1', 'date' => '1', 'view_full' => '1', 'rss' => '0', 'mess_exists' => '0' );
$fopendb = fopen( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$filename.'.dat', 'w+' );
flock( $fopendb, LOCK_EX );
fwrite( $fopendb, serialize( $data_mess )."\n" );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
@chmod( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$filename.'.dat', 0644 );

$data = "<!-- OUR_title -->\n{$row['title']}<!-- OUR_title -->\n";
$data .= "<!-- OUR_content -->\n<!-- OUR_content -->\n";
$data .= "<!-- OUR_type -->\nblog<!-- OUR_type -->\n";
$data .= "<!-- OUR_myinclude -->\n<!-- OUR_myinclude -->\n";
$data .= "<!-- OUR_description -->\n<!-- OUR_description -->\n";
$data .= "<!-- OUR_keywords -->\n<!-- OUR_keywords -->\n";
$data = stripslashes( $data );
$fopendb = fopen( $_SERVER['DOCUMENT_ROOT'].'/content/pagedb/'.$filename.'.dat', 'w+' );
flock( $fopendb, LOCK_EX );
fwrite( $fopendb, $data );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
@chmod( $_SERVER['DOCUMENT_ROOT'].'/content/pagedb/'.$filename.'.dat', 0644 );
}
Теперь у нас создана необходимая структура блогов. Остается добавить в их записи. Для этого перебираем таблицу content и заносим данные в базу:
$sql_result = $db->query( "SELECT * FROM `jos_content`" );
while ( $row = $db->get_row( $sql_result ) )
{
$sql_result_cat = $db->super_query( "SELECT * FROM `jos_categories` WHERE ( `id` = {$row['catid']} )" );
if ( ! empty( $sql_result_cat['alias'] ) )
{
$database = $sql_result_cat['alias'];
$data = array ( 'link' => mb_strtolower( trim( preg_replace( '/([^a-z0-9-_])/ui', '', str_replace( ' ', '_', mf_encodestring( $row['title'] ) ) ) ) ),
'head' => str_replace( array( "\r", "\n", "\r\n", "\\", "\"" ), array( '', '', '', "|slash|", "|quotes|" ), strval( @$row['title'] ) ),
'mess' => str_replace( array( "\r", "\n", "\r\n", "\\", "\"" ), array( '', '', '', "|slash|", "|quotes|" ), strval( @$row['introtext'] ) ),
'extra' => str_replace( array( "\r", "\n", "\r\n", "\\", "\"" ), array( '', '', '', "|slash|", "|quotes|" ), strval( @$row['fulltext'] ) ),
'description' => str_replace( array( "\r", "\n", "\r\n", "\\", "\"" ), array( '', '', '', "|slash|", "|quotes|" ), strval( @$row['metadesc'] ) ),
'keywords' => str_replace( array( "\r", "\n", "\r\n", "\\", "\"" ), array( '', '', '', "|slash|", "|quotes|" ), strval( @$row['metakey'] ) ),
'pubdate' => date( 'd-m-Y', strtotime( $row['created'] ) ),
'pubtime' => date( 'H:i:s', strtotime( $row['created'] ) ) );
@chmod( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$database.'.dat', 0777 );
$fopendb = fopen( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$database.'.dat', 'a+' );
flock( $fopendb, LOCK_EX );
fwrite( $fopendb, serialize( $data )."\n" );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
@chmod( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$database.'.dat', 0644 );

$array_filedb = file( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$database.'.dat' );
$mess_exists = 0;
foreach ( $array_filedb as $key => $value ) {
if ( trim( $array_filedb[$key] ) != '' && $key != 0 ) {
$mess_exists++;
}
}
$row = unserialize( $array_filedb[0] );
$row['mess_exists'] = $mess_exists;
$array_filedb[0] = serialize( $row )."\n" ;
@chmod( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$database.'.dat', 0777 );
$fopendb = fopen( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$database.'.dat', 'w+' );
flock( $fopendb, LOCK_EX );
fwrite( $fopendb, implode( '', $array_filedb ) );
flock( $fopendb, LOCK_UN );
fclose( $fopendb );
@chmod( $_SERVER['DOCUMENT_ROOT'].'/content/infopagedb/'.$database.'.dat', 0644 );
}
}
С базой данных мы разобрались. Теперь необходимо перенести все изображения. Для этого копируем из Joomla все изображения в директорию userfiles => image и создаем эскизы изображений Восстановление/добавление эскизов изображения в OUR-CMS.

Теперь следует изменить пути к изображениям.

После того, как сайт полностью заработал, необходимо назначить редиректы. Более детально в статье Переадресация с одного домена на другой с помощью 301 редиректа.

В Joomla существует таблица базы данных sefurls, которая отвечает за ЧПУ, а если быть точнее - переводит URL адрес с нечитаемого вида, в котором множество параметров, в человекопонятный. Для этого выполняем код:
$sql_result = $db->query( "SELECT * FROM `jos_content`" );
while ( $row = $db->get_row( $sql_result ) )
{
$num = ! isset( $num ) ? 1 : $num + 1;
$link = mb_strtolower( trim( preg_replace( '/([^a-z0-9-_])/ui', '', str_replace( ' ', '_', mf_encodestring( $row['title'] ) ) ) ) );
$sql_result_url = $db->query( "SELECT * FROM `jos_sefurls`" );
while ( $row_url = $db->get_row( $sql_result_url ) )
{
if ( preg_match( "/&catid=(\d+)&id=(\d+)&/", $row_url['origurl'], $output_array ) ) {
if ( isset( $output_array[2] ) && $output_array[2] == $row['id'] ) {
echo 'Redirect 301 /'.$row_url['sefurl'].' /news/'.$num.'-'.$link.'.html'.'<br />';
break;
}
}
}
}
И результат добавляем в файл .htaccess. Теперь пользователи, которые будут заходить на сайт по старым ссылкам будут попадать на правильную страницу, на которую перенаправит 301 редирект.

Добавить комментарий

Имя:
Текст комментария: