Опишу некоторый свой опыт переноса данных с joomla 1.0.13. В моем случае надо было перенести базу новостей, пользователей, ссылок и файлового хранилища (сделан на Remository).
Данные в джумле хранились у меня в windows-1251, в MODx же я решил хранить данные в UTF.
Написал такие скрипты:
Здесь я старался вставить новости с таким же ID который был в joomla чтобы потом сделать правило в htaccess по которому можно было бы попадать по старым ссылкам из интернета в те же самые новости.
// перенос новостей
$a=array();
$i=0;
mysql_select_db(’joomla’,$OnConnectServer);
$query="SELECT * from jos_content order by id";
$res = mysql_query($query);
while ($row=mysql_fetch_array($res)){
$a[$i][’id’]=$row[’id’];
$a[$i][’pagetitle’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’title’]));
$a[$i][’introtext’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’introtext’]));
$a[$i][’content’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’fulltext’]));
$a[$i][’createdon’]=strtotime($row[’created’]);
$i++;
}
mysql_select_db(’modx’,$OnConnectServer);
foreach ($a as $v){
// проверяем - нет ли еще такого ид
$query="SELECT * from modx_site_content where id=’$v[id]’";
$res = mysql_query($query);
if (mysql_num_rows($res) != 0){
continue;
}
$query="INSERT INTO modx_site_content
(id, type, contentType, pagetitle, published, parent, isfolder, introtext, content, richtext, template, menuindex, searchable, cacheable, createdby, createdon, editedby, editedon, deleted, deletedon, deletedby, publishedon, publishedby, donthit, haskeywords, hasmetatags, privateweb, privatemgr, content_dispo, hidemenu) VALUES
($v[id],’document’,’text/html’,’$v[pagetitle]’,1,26,0,’$v[introtext]’,’$v[content]’,1,4,7,1,0,1,$v[createdon],1,$v[createdon],0,0,0,$v[createdon],1,0,0,0,0,0,0,0)";
mysql_query($query);
$query="insert into modx_site_tmplvar_contentvalues (tmplvarid,contentid,value) VALUES (1,$v[id],’news’)";
mysql_query($query);
}
// перенос линков
$a=array();
$i=0;
mysql_select_db(’joomla’,$OnConnectServer);
$query="SELECT * from jos_weblinks order by id";
$res = mysql_query($query);
while ($row=mysql_fetch_array($res)){
$a[$i][’pagetitle’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’title’]));
$a[$i][’url’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’url’]));
$a[$i][’longtitle’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’description’]));
$i++;
}
mysql_select_db(’modx’,$OnConnectServer);
foreach ($a as $v){
$query="INSERT INTO modx_site_content
(type, contentType, content, pagetitle, longtitle,published, parent, isfolder, richtext, template, menuindex, searchable, cacheable, createdby, editedby, deleted, deletedon, deletedby, publishedby, donthit, haskeywords, hasmetatags, privateweb, privatemgr, content_dispo, hidemenu) VALUES
(’reference’,’text/html’,’$v[url]’,’$v[pagetitle]’,’$v[longtitle]’,1,5,0,1,4,7,1,1,1,1,0,0,0,1,0,0,0,0,0,0,1)";
mysql_query($query);
}
Дальше про перенос пользователей.
Собственно там вся фишка в том, что joomla формирует хэш пароля так: md5(password+salt)
где salt - случайная "соль". Эта "соль" записывается в поле password просто через двоеточие от самого хэша - результата.
А MODx просто делает MD5 от введенного пользователем пароля при регистрации.
И чтобы перенести пользователей я добавил в modx в таблицу web_users поле salt куда перенес "соль" из joomla и немного поправил webloginpe.class.php (я использую WebLoginPE 1.3.0) чтобы и старые пользователи и новые (созданные уже в modx) могли заходить.
// check user password - local authentication
if ($this->User[’password’] != md5($this->Password)and($this->User[’password’] != md5($this->Password.$this->User[’salt’])))
/// перенос пользователей
$a=array();
$i=0;
mysql_select_db(’joomla’,$OnConnectServer);
$query="SELECT * from jos_users where username!=’admin’ and username!=’webmaster’ order by id";
$res = mysql_query($query);
while ($row=mysql_fetch_array($res)){
$a[$i][’username’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’username’]));
$a[$i][’email’]=mysql_real_escape_string($row[’email’]);
$a[$i][’fullname’]=mysql_real_escape_string(iconv("cp1251","UTF-8",$row[’name’]));
$a[$i][’lastlogin’]=strtotime($row[’lastvisitDate’]);
$password_temp=explode(’:’,$row[’password’]);
if (!isset($password_temp[1])) $password_temp[1]=’’;
$a[$i][’password’]=$password_temp[0];
$a[$i][’salt’]=$password_temp[1];
$i++;
}
mysql_select_db(’modx’,$OnConnectServer);
foreach ($a as $v){
$query="INSERT INTO modx_web_users (`username`,`password`,`salt`) VALUES (’$v[username]’,’$v[password]’,’$v[salt]’)";
mysql_query($query);
$internalKey=mysql_insert_id();
$query="INSERT INTO modx_web_user_attributes (fullname,internalKey,email,photo,lastlogin) VALUES (’$v[fullname]’,’$internalKey’,’$v[email]’,’
http://site.ru/assets/snippets/webloginpe/userimages/default_user.jpg’,’$v[lastlogin]’)";
mysql_query($query);
$query="INSERT INTO modx_web_groups (webgroup,webuser) VALUES (1,’$internalKey’)";
mysql_query($query);
}