Импорт контента из ЛастоБлога.

Конвертирование постов и комментариев в формат Наны.

Перенос данных несложен, и сводится к дополнению кода постов информацией о причастности их к той или иной категории (раньше эта информация хранилась в другом месте).

Также меняются все URL-ы в HTML коде постов и комментариев в соответствии с новыми реалиями.

Последовательность действий такая:

  1. Возьмите себе код этого документа:

    <?php /* Выше этой строки в файле ничего не должно быть */

       
    $title='Конвертор контента ЛастоБлога в формат Наны Блоговой.';

       
    $file=array(
          
    'url'  => 'http://nanocms.name/blog/index_',
          
    'img'  => 'http://nanocms.name/i/blog/main/',
          
    'ext'  => '.htm',
          
          
    'nano' => array(
             
    'com' => './data/tmp/comments/',
             
    'pst' => './data/tmp/posts/',
          ),
          
          
    'blog' => array(
             
    'com' => './data/comments/',
             
    'pst' => './data/posts/',
             
    'all' => 'index.php',
             
          ),
       );

       
    setpoint('iconv');

       if (!
    $_s['admin']) finita(panel_h1('Конвертор работает только под авторизацией в админке.'));
       
       foreach (
    $file['nano'] as $k => $folder) {
          if (!
    file_exists($folder))
             if (!
    mkdir($folder,0777))  finita(panel_h1('Создайте фолдер '.$folder.' с правами доступа на запись.'));
             if (!
    is_writable($folder)) finita(panel_h1('Фолдер '.$folder.' недоступен на запись! Исправьте.'));
       }

       
    $db=array(
          
    'name' => array(
             
    'blog' => $file['blog']['pst'].$file['blog']['all'],
             
    'nano' => $file['nano']['pst'].$file['blog']['all'],
          ),
       );

       
    $db['cont']['blog']=disk2arr($db['name']['blog']);
       
    $db['cont']['nano']=disk2arr($db['name']['nano']);
       
    ksort($db['cont']['blog'],SORT_STRING);
       
    ksort($db['cont']['nano'],SORT_STRING);

       
    $db['cont']['blog']=array_diff(array_keys($db['cont']['blog']),array_keys($db['cont']['nano']));

       
    $url=parse_url($_s['base_url']);
       
    $url='https?\:\/\/'.$url['host'].$url['path'];
       
    $aut=str_replace(
          
    '===complete===',
          
    '(.+)',
          
    lang('blog','tpl_comment_complete_pattern')
       );

       foreach (
    $db['cont']['blog'] as $id) {
          
    $pst=get_post_info($id); # [created,lastmodified,cat,title,text,comments[k=>[title,comment,user,email,ip]]]
          
    $pst['com']='';
          
    $arr=array(
             
    'cat'   => $pst['cat'],
             
    'title' => $pst['title'],
          );
          
    ksort($pst['comments'],SORT_STRING);
          foreach (
    $pst['comments'] as $k => $v) { # title,comment,user,email,ip

             
    if (preg_match_all('~'.$aut.'~Usi',$v['comment'],$n)) {
                foreach (
    $n[1] as $i => $t) {
                   
    $v['comment']=str_replace(
                      
    $n[0][$i],
                      
    '<div class="autor"><img class="userpic">'.$t.'</div>',
                   
    $v['comment']);
                }
             }
             
             
    $v['status']=strlen($v['comment']) < 10 'del''ok';
          
             
    $pst['com'].=
                
    implode('¦¦',
                   array(
    $k,$v['title'],$v['comment'],$v['user'],$v['email'],$v['ip'],$v['status'],$oslen)
                );
          }
          
    $db['cont']['nano'][$id]=$arr;
          
    $db['cont']['nano']=arr2disk($db['cont']['nano'],$db['name']['nano']);

          foreach (array(
    'com','text') as $w) {
             if (
    preg_match_all(
                
    '~'.$url.'i\/([s|p|userpic|docs|'.$_s['design']['worktemplate'].']+\/[^.]+\.[jpg|gif|png|bmp|zip|pdf|htm]{3})~Usi',
                
    $pst[$w],$n))
             {
                foreach (
    $n[1] as $i => $v) {
                   
    $n[1][$i]=$file['img'].$v;
                }
                
    $pst[$w]=str_replace($n[0],$n[1],$pst[$w]);
             }
             if (
    preg_match_all('~'.$url.'([a-z0-9A-Z\-\_]+)\.html~Usi',$pst[$w],$n)) {
                foreach (
    $n[1] as $i => $v) {
                   
    $n[1][$i]=$file['url'].$v.$file['ext'];
                }
                
    $pst[$w]=str_replace($n[0],$n[1],$pst[$w]);
             }
          }

          
    $pst['text']=safe_html_comments($pst['text'],'meta');
          
    $meta=$null
          if (isset(
    $_s['html_comments']['meta'])) {
             
    $_s['html_comments']['meta']=implode(' ',$_s['html_comments']['meta']);
             
    $arr=array(
                
    'Content-Language',
                
    'Description',
                
    'Language',
                
    'Abstract',
                
    'Author',
                
    'Copyright',
                
    'Designer',
                
    'Keywords',
                
    'Distribution',
                
    'Generator',
                
    'Publisher',
                
    'Reply-To',
                
    'Resource-Type',
                
    'Revisit-After',
                
    'Robots',
                
    'Subject',
             );
             foreach (
    $arr as $v) {
                if (
    preg_match_all('~'.strtolower($v).'=\"(.+)\"~Usi',$_s['html_comments']['meta'],$n)) {
                   
    $meta[]='   <meta name="'.$v.'" content="'.trim($n[1][0]).'">';
                }
             }
             if (
    count($meta) > 0$pst['text']=implode($oslen,
                array(
                   
    '<!-- Meta Section Start -->',
                   
    implode($oslen,$meta),
                   
    '<!-- Meta Section Stop -->','',
                   
    $pst['text']
                )
             );
          }

          
    $pst['text']=safe_html_comments($pst['text'],'comment_time_limit');
          
    $meta=array(
          
    '   <!-- last_modified:'.$pst['lastmodified'].' -->',
          
    '   <!-- cat:'.$pst['cat'].' -->',
          );
          if (
    count($_s['html_comments']['comment_time_limit']) > 0) {
             
    $meta[]='   <!-- comment_time_limit:'.$_s['html_comments']['comment_time_limit'][0].' -->';
          }
          
    $pst['text']=implode($oslen,
                array(
                   
    '<!-- Special Features of Post Start -->',
                   
    implode($oslen,$meta),
                   
    '<!-- Special Features of Post Stop -->','',
                   
    $pst['text']
                )
             );

          
    fw($pst['com'],$file['nano']['com'].$id);
          
    fw($pst['title'].$oslen.$oslen.trim($pst['text']),$file['nano']['pst'].$id);

          if (
    10 <= getpoint('iconv')) redirect($_s['base_url'].$action.$_s['extension'],302);
       }
       
    unlink($db['name']['nano']);
       
    $echo=
          
    panel_h1('Конвертирование контента завершено.').'
          <p>Перенесите FTP клиентом папки из Блога в Нану:</p>
          <ol>
             <li>'
    .$file['nano']['pst'].'</li>
             <li>'
    .$file['nano']['com'].'</li>
          </ol>'
    ;
       
    finita();

    /* Ниже этой строки в файле ничего не должно быть. */ ?>

    Сохраните этот код в файл под именем blog-to-nano-converter.php

  2. Теперь подумайте, в каком URL-е теперь будет жить Ваш блог.
    Задаётся он строкой (её следует отредактировать):

          'url'  => 'http://nanocms.name/blog/index_',

    Замена домена на собственный обязательна.

  3. Ниже этой строки задаётся место размещения графики, и расширение документов Наны. Будем считать, что они оставлены дефолтовыми, тогда эти строчки трогать не нужно. Но если это не так, указанные параметры можно переназначить.

  4. Отредактированный документ размещается в ЛастоБлоге по стандартному пути для исполняемых скриптов - это папка PHP страниц ./data/php_pages/

    Одновременно Вам необходимо создать в ЛастоБлоге папку ./data/tmp/ с правами на запись. Именно в неё будут выгружаться фолдеры с постами и комментариями в формате Блоговой Наны, с одновременной заменой в их тексте всех абсолютных ссылок на видоизменённые.

    Строго говоря, в настройках рассматриваемого тут конвертера не запрещено сразу прописать импорт контента из ЛастоБлога прямо в фолдер данных Блоговой Наны, если оба этих скрипта живут на одном сервере. Если Вы умеете прописывать относительные пути по серверу, то бога ради. Но обычно пользователи этому не обучены, так что для выгрузки данных мы пользуемся промежуточной временной папкой.

  5. Далее Вам надо авторизоваться админом в ЛастоБлоге, и зайти под авторизацией в документ blog-to-nano-converter.html относительно адреса морды блога.

    Через некоторое время, зависящее от количества постов и комментариев, конвертер рапортует о завершении процесса копирования данных:

    Конвертирование контента завершено.

    Перенесите FTP клиентом папки из Блога в Нану:

    1. ./data/tmp/posts/
    2. ./data/tmp/comments/

    Действительно, по указанным адресам создадутся папки постов и комментариев, внутри которых находятся только файлы данных, под цифровыми именами. Никаких файлов индексов или баз к ним не прилагается.

  6. Теперь давайте вспомним внутреннюю иерархию документов Блоговой Наны на примере только что созданного и активированного блога. В данном мануале мы оперировали именем инсталляции main, поэтому её данные будут организованы так:

    Корневая папка скрипта 755
    data 755
    modules 755
    blog 777
    main 777
    comments 777
    posts 777
    settings 777
    trailer 777

    Папки на голубом фоне надо удалить, и заменить теми, что создал конвертор во временной папке ЛастоБлога. При этом самим папкам надо назначить права на запись 777, а их содержимому - права 666

  7. Не забываем сделать то же самое для файлов графики.
    В ЛастоБлоге вся графика расположена в директории ./i/p/

    Блоговая Нана для инсталляции main ожидает увидеть графику к постам в папке ./i/blog/main/p/ - вот туда и копируйте всё содержимое указанной выше папки с графикой ЛастоБлога.

    Естественно, указанная папка должна иметь права на запись.
    Всем графическим файлам в ней надо назначить права доступа 666.

  8. После заливки данных, если обратиться к морде блога, он построит индекс постов и комментариев, но не покажет ничего на морде блога. Всё правильно, в настройках этого блога сперва надо разрешить работу с категориями, что делается согласно мануала. Все обнаруженные в постах категории там будут перечислены.

    После того, как нужные категории разрешены к отображению через настройки блога, их посты появятся в блоге. Со всей графикой, какая полагается.

Если в процессе переноса контента из ЛастоБлога в Блоговую Нану Вы не очень тщательно продумаете, в каком именно URL-е будет в итоге жить блог, и впоследствии переселите его в другой URL или иную папку, но в пределах этого же домена, никаких корректив в код постов и комментариев вносить не придётся. Все абсолютные адреса в HTML коде документов будут корректироваться Блоговой Наной динамически.