RkBlog

Hardware, programming and astronomy tutorials and reviews.

Prosty Blog - Import Danych z CMSów

Teraz zajmiemy się sensacyjnym tematem w postaci Importu danych z innych skryptów/CMSów. Mamy skrypt newsów i można np. zaimportować newsy z różnych CMSów.

Plan Działania

- Zainstalowanie wybranego CMSa na naszym serwerze (lokalnym) korzystając z tej samej bazy danych (lecz z innym prefiksem dla porządku)
- Druga opcja: wrzucenie zrzutu bazy danych z istniejącej instalacji owego CMSa do bazy z tabelami naszego bloga
- Stworzenie "chwilowego" kontrolera przenoszącego dane
- Pochwalenie się nim na forum kursu :)

Wykonanie

Na potrzeby warsztatu wybrałem świeże PHP-Fusion, prosto z pieca. Po instalacji dodałem kilka newsów:
darmowy hosting obrazków
Następnie udałem się do phpMyAdmina by odszukać tabelę zawierającą newsy. Na szczęście tabela nazywała się "news" (a niektóre cmsy dziwacznie nazywają tabele):
darmowy hosting obrazków
Mając strukturę tabeli wraz z danymi przed oczami zabrałem się za tworzenie prostej metody w kontrolerze Blog, która przenosiłaby dane
NOTKA: zazwyczaj przy przenoszeniu danych nie uda się przenieść wszystkiego w 100%. Wynika to z różnic w funkcjonalnościach dwóch skryptów jak i ewentualnie od różnic w formatach danych
Oto wstępna wersja metody:
<?php
function convert_phpf()
           {
           $this->load->model('News');
           // pobieramy wszystko
           $query = $this->db->query("SELECT * FROM fusion_news");

           foreach($query->result() as $item)
                      {
                      echo 'Konwertuję '.$item->news_subject.'<BR />';
                      //$this->News->add_news(array('news_title' => , 'news_text' => , 'news_date' => , 'news_author' => 'Rychu'));
                      }
           echo '<h1>Przeniesione</h1>';
           }
Na początku ładuję model News, skorzystam z jego metody add_news. Następnie wykonuje własne zapytanie SQL pobierające wszystkie dane z tabeli newsów (fusion_news). Następnie pobrane dane przepuszczam przez pętlę. Wyniki są zwracane w postaci obiektu, tak więc by dostać wartość z określonego pola wystarczy: $item->nazwa_pola. Jak na razie nie określiłem jeszcze jakie dane zapisywać. Oglądając tabelę newsów PHP-Fusion w phpMyAdminie widzę że:
news_subject to tytuł newsa
news_news to treść newsa
news_extended to treść "rozszerzona"
news_datestamp to czas dodania, na szczęście znacznik czasu :)
A więc otrzymujemy:
<?php
function convert_phpf()
           {
           $this->load->model('News');
           $query = $this->db->query("SELECT * FROM fusion_news");
           
           foreach($query->result() as $item)
                      {
                      echo 'Konwertuję '.$item->news_subject.'<BR />';
                      $this->News->add_news(array('news_title' => $item->news_subject, 'news_text' => $item->news_news.'<BR />'.$item->news_extended, 'news_date' => $item->news_datestamp ,'news_author' => 'Rychu'));
                      }
           echo '<h1>Przeniesione</h1>';
           }
Jedyne niestandardowe zagranie to:
$item->news_news.'
'.$item->news_extended
Jako że nasz moduł newsów nie ma "rozszerzonej" treści postanowiłem oba pola z PHP-Fusion połączyć i dodać do "treści" naszego modułu. Konwerter działa ale efekt jest taki:
darmowy hosting obrazków

Kodowanie ISO-8859-2 do UTF-8

Jeżeli nasz CMS stosuje na stronie kodowanie ISO-8859-2 to i dane dodane za jego pomocą będą tak kodowane. By poprawnie przenieść takie dane na stronę kodowaną w UTF-8 trzeba skorzystać z konwertera kodowania :)
<?php
function convert_phpf()
           {
           $this->load->model('News');
           $query = $this->db->query("SELECT * FROM fusion_news");
           
           $this->load->script('utf8.class3.php');
           $utfConverter = new utf8(isoToUTF);
           
           foreach($query->result() as $item)
                      {
                      echo 'Konwertuję '.$item->news_subject.'<BR />';
                      $this->News->add_news(array('news_title' => $utfConverter->strToUtf8($item->news_subject), 'news_text' => $utfConverter->strToUtf8($item->news_news).'<BR />'.$utfConverter->strToUtf8($item->news_extended),'news_date' => $item->news_datestamp ,'news_author' => 'Rychu'));
                      }
           echo '<h1>Przeniesione</h1>';
           }
Zastosowałem tutaj trochę przerobioną klasę do kodowani chińskich krzaków z phpclasses.org (dałem mu inną tablicę mapowania - iso 8859-2 na utf8). Gotową klasę można pobrać stąd. Wystarczy umieścić oba pliki w katalogu system/application/scripts i można użyć konwertera.
$this->load->script('utf8.class3.php');
$utfConverter = new utf8(isoToUTF);
Powyższy kod ładuje nasz zewnętrzny skrypt,a w drugiej linijce tworzymy nowy obiekt (bo to jest klasa). Interesuje nas metoda:
$utfConverter->strToUtf8(łańcuch)
Która zwraca przekodowany z ISO na UTF łańcuch. Metodę tą wykorzystujemy przy dodawaniu danych do przekodowania treści i tytułu newsa. Efekt:
darmowy hosting obrazków

Podobnie można postępować z innymi skryptami. Jeżeli stosuje on kodowanie UTF-8 to nie potrzebny jest konwerter kodowania, jeżeli ISO 8859-2 to wiemy już jak sobie z tym poradzić.
Jeżeli mamy dużo danych do konwersji to można to robić stopniowo ustawiając w zapytaniu pobierającym dane limity.
RkBlog

Kurs Code Igniter, 14 July 2008, Piotr Maliński

Comment article