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.
- 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 :)
Na potrzeby warsztatu wybrałem świeże PHP-Fusion, prosto z pieca. Po instalacji dodałem kilka newsó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):

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:
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:
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:
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 :)
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:
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.