
A történet ott kezdődött, hogy egy könyvtár cégtől, nevezetesen a HGYVK-tól kapunk havi szinten 50-100-150 vagy még több könyvet egy docx dokumentumban
táblázatosan elrendezve, amit nekünk kell egyesével feltölteni a weboldalra az Ordasoft Booklibrary komponensébe.
Már kezdetek kezdetén elgondolkoztam rajta, hogy ezt vajon nem lehetne automatizálni valahogy. Elmélkedtünk kollégával, hogy egyszerűbb lenne, ha megkérnénk a táblázat készítőjét,
hogy xls/xlsx-be készítse el, és azt már könnyű csv-be konvertálni, amit már könnyebb átalakítani. Aztán ez valahogy annyiba maradt, de én később úgy döntöttem megpróbálom kinyerni
az adatokat a docx táblázataiból, beolvastatni xml-be, és onnan már jöhet az import és kész is.
Elég is ennyi a történetből...
Mivel nem nagyon volt ötletem merre érdemesebb elindulni az AI-hoz fordultam, leírtam neki a helyzetet, és egyből is adta a kis
python kódot, ami szépen beolvasta a docx-et, végigjárta a táblázatokat, kinyerte az adatokat, és már csak finomítgatni kellett.
Eljutottam odáig, hogy kiszedte a megfelelő adatokat, és legenerálta az első értelmesnek tűnő xml fájlt. Meg is próbáltam a booklibrary-ban importálni, és itt jöttek a
buktatók. A Booklibrary import/export menüpontja inkább csak arra van kihegyezve, ha egyik weboldalról a másikra akarjuk átvinni az adatokat, vagy költöztetni akarjuk
a könyv/szerző... adatainkat. Vagyis a kiexportált pl kategóriához minden adatot lement xml/csv fileba, és vissza import-nál szépen ott is van a könyv, a szerző, a kapcsolati adatok
így minden szuper, csak nekem pont nem ez kellett, hanem nekem az xml feltöltésekor kellett volna a "<authors>"-ből kiszedni a szerzőt, leellenőrizni, hogy van-e
már ilyen az adatbázisban, ha van kinyerni az ID-ját, ha nincs felvenni újként, és kivonni az azonosítóját, majd feltölteni a könyvet, kinyerni annak is az ID-ját
és ezt felvinni a kapcsolati táblázatba, ami ugye összekapcsolja a könyveket a szerzőkkel. De sajnos ezt az ordasoft nem oldotta meg. Így hát nyomoztam, debugoltam, kutakodtam
vajon melyik fájljuk végzi az import/export-ot és abban mi mit csinál. Mire rátaláltam, hogy a "/administrator/components/com_booklibrary" mappában található a "admin.booklibrary.class.impexp.php"
nevű php fájl, azon belül is a 443. sor környékén található "importBooksXML" függvény végzi az import műveletet, így azt kellett szerkesztenem. Itt nem nagyon értem miért van ez
a verzió ellenőrzés, de én hozzátettem hogy ha nagyobb mint 3.6, akkor is lefusson, nekem csak az a lényeg, hogy ez fusson le, így kiszedi a szerőmet az xml-ből.
MAjd jött az adatbázis művelet, amihez nem használtam a booklibrary saját függvényeit, mert az feldarabolja "," karakterenként a stringet, nekem arra nincs szükségem (habár lehet
a későbbiekben belerakom még ezt is), elég ha megnézi megvan-e a szerző, ha nincs felveszi és elmenti az ID-ját. Majd az alap könyv feltöltése jön, amit nem bántottam, és utána
nekem még kellett a szersző és a könyv összekötése az "authors_connect" táblába. Itt is volt egy függvény, ami lefut, ha a J verzió kisebb mint 3.6, aminek még mindig nem tudom
mi a jelentősége, de hagytam, és egy else ágba beleraktam a sakát kódomat, ami a kapott szerő ID-t és a könyv ID-t összekapcsolja, és lám, minden szuper is.
Sokat teszteltem, küszködtem még a képek hozzárendelésével is. Ugye abban szerencsénk van, hogy próbálják a képeket úgy elnevezni, ami a könyv címe, ami már egy nagyon jó kiindulópont, de feltöltéskor ugye a Joomla ékezettelenít, akkor ezt nekem is már úgy kellett az xml-be raknom. Illetve volt több tesztem a "-", "_", "." és a " " karakterek miatt, de talán most már azt is jól elvégzi. Így ha feltöltöm az xml-t már csak a képeket kell felraknom a "/components/com_booklibrary/covers/" mappába, egy ellenőrzés, javítás, ha mégis valami rossz, és lehet örülni, hogy ezt a sok "unalmas/altató" munkát pár kattintással elintézhetjük.
Frissítés: 0.1 Az ISBN szám ellenőrzést is beletettem, így ha valahol hiányzik ez a szám, ami ugye kötelező a feltöltéshez, akkor azonnal leáll a script és
figyelmeztet, hogy melyik "sorban", melyik könyvnél hiányzik ez a szám.
Továbbá a könyv képének meglétét is ellenőrzöm. Habár elégé hamar megtalálja a képet, a tesztek alapján, ha egy könyv címe pl.: "Bosszú" akkor már a "valami boss valami.jpg"
nevű képet hozzárendeli, ami lehet fog problémát okozni a későbbikben, ha eléggé azonos nevű könyvekről lesz szó, de ezt majd akkor a későbbiekben javítom.
Csatolok képeket a programról, plusz a programot is felrakom letölthető formában. A konkrét python kódot nem rakom fel, de ha valakit esetleg mégis érdekelne, vegye fel velem a kapcsolatot és megbeszéljük...
Képernyőkép a linuxon futó programról!
<?php
static function importBooksXML($catid, &$dom, &$new_categories,&$new_authrs,&$numversion){
global $database;
$retVal = array();
$book_list = $dom->getElementsByTagName('book');
for ($i = 0;$i < $book_list->length;$i++) {
$book_xml = $book_list->item($i);
//echo mosBooklibraryImportExport::getXMLItemValue($book_xml,'bookid');
$book = new mosBooklibrary($database);
//get BookID
$book->bookid = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'bookid');
//get ISBN
$book->isbn = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'isbn');
//get Title(book)
$book->title = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'title');
//XENO SETTING PLUSZ EGY || FELTETEL HOGY AKKOR IS LEFUSSON EZ A KÓD, HA A VERSION NAGYOBB MINT 3.6,
// MERT EZ KELL HOGY KIOLVASSA AZ AUTHOR/SZERŐ NEVET
if ($numversion[0] < 3.6 || $numversion[0] > 3.6) {
//get Authors
$book->authors = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'authors');
}
//get Manufacturer
$book->manufacturer = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'manufacturer');
//get releasedate
$book->release_Date = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'releaseDate');
//get language
$book->language = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'language');
$book->langshow = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'langshow');
if ($book->langshow == "") $book->langshow = "*";
//get hits
$book->hits = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'hits');
$book->user_name = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'user_name');
//get featured_clicks
$book->featured_clicks = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'featured_clicks');
//get featured_shows
$book->featured_shows = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'featured_shows');
//get rating
$book->rating = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'rating');
//get price
$book->price = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'price');
//get priceunit
$book->priceunit = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'priceunit');
//get URL
$book->URL = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'url');
//get imageURL
$book->imageURL = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'imageURL');
//get edition
$book->edition = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'edition');
//get ebookURL
$book->ebookURL = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'ebookURL');
//get informationFrom
$book->informationFrom = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'informationFrom');
if ($numversion[0] == 3.5) {
//get author id
$book->fk_authors = mosBooklibraryImportExport::checkid($book->authors);
}
//get date
$book->date = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'date');
//get fk_lendid
// $book->fk_lendid = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'fk_lendid');
//get published
$book->published = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'published');
//get comment
$book->comment = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'comment');
//get numberOfPages
$book->numberOfPages = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'numberOfPages');
$book->comment = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'comment');
//get email owner book
$book->owneremail = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'owneremail');
//get owner_id owner book
$book->owner_id = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'owner_id');
$book->vm_id_product = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'vm_id_product');
if($book->vm_id_product == "" ) $book->vm_id_product = 0 ;
$book->metadata = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'metadata');
$book->publish_up = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'publish_up');
$book->publish_down = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'publish_down');
if ($catid === null) {
//get associate_book
$book->associate_book = mosBooklibraryImportExport::getXMLItemValue($book_xml, 'associate_book');
}
//get Categories
if ($catid != "0" && $catid != "") {
$book->categs = array($catid);
} else {
$categ = $book_xml->getElementsByTagName('categ');
$arrcatid = array();
foreach($categ as $cattemp) {
$category_book_old_id = $cattemp->nodeValue;
foreach($new_categories as $new_category) {
if ($new_category->old_id == $category_book_old_id) {
$arrcatid[] = $new_category->id;
}
}
}
$book->categs = $arrcatid;
}
//get Authors
//XENO: ITT MEGKAPOM A SZERZŐ NEVÉT AZ XML BŐL
$authors_names = $book->authors;
if ($numversion[0] >= 3.6)
{
$authors_id = $book_xml->getElementsByTagName('author_id');
$arrauthorid = array();
$result = null;
foreach($authors_id as $avtor1) {
$author_book_old_id = $avtor1->nodeValue;
foreach($new_authrs as $new_authr) {
if ($new_authr->old_id == $author_book_old_id) {
$database->setQuery("SELECT id FROM #__booklibrary_authors
WHERE authors_name = '$new_authr->authors_name'");
$result = $database->loadResult();
if ($result) {
if( !in_array( $result ,$arrauthorid) ) $arrauthorid[] = $result;
} else {
if( !in_array( $new_authr->id ,$arrauthorid) ) $arrauthorid[] = $new_authr->id;
if($authors_names == "") $authors_names = $new_authr->authors_name ;
else $authors_names .= ", " . $new_authr->authors_name ;
}
}
}
}
$book->authors = $arrauthorid;
}
//XENO: AUTHOR STORE
global $database;
$my_author_id = 0; //XENO: Ebbe a változóba kerül az Author ID
$authorNameForDb = trim($authors_names); //XENO: A korábban kinyert név
if (!empty($authorNameForDb)) {
//XENO: Biztonságos stringgé alakítjuk az SQL-hez
$escapedName = $database->escape($authorNameForDb);
//XENO: Ellenőrizzük, létezik-e már pontosan ez a szerző
$database->setQuery("SELECT id FROM #__booklibrary_authors WHERE authors_name = '$escapedName'");
$my_author_id = $database->loadResult();
//XENO: Ha nem létezik, felvesszük az adatbázisba
if (!$my_author_id) {
$database->setQuery("INSERT INTO #__booklibrary_authors (authors_name) VALUES ('$escapedName')");
$database->execute();
$my_author_id = $database->insertid(); //XENO: Visszakapjuk a friss ID-t
}
}
$book_ID = $book->bookid = 1 + $book->getMaxBookid();
$tmp[] = $i;
$tmp[] = $book_ID;
$tmp[] = $book->isbn;
$tmp[] = $book->title;
$tmp[] = $my_author_id; //XENO: ITT MÁR MEGVAN AZ ADATBÁZISBÓL A MEGLÉVŐ/ÚJ SZERŐ ID
$tmp[] = $book->manufacturer;
if (!$book->check()) {
$tmp[] = $book->getError();
$retVal[$i] = $tmp;
unset($tmp);
unset($book);
continue;
}
if (!$book->store()) {
$tmp[] = $book->getError();
$retVal[$i] = $tmp;
unset($tmp);
unset($book);
continue;
} else {
$book->saveCategs();
if ($numversion[0] >= 3.6)
{
$book->saveAuthors();
}
$tmp[] = "OK";
//save categs
$book->checkin();
$retVal[$i] = $tmp;
$fk_bookid = $book->id;
if($numversion[0] < 3.6) //for old version - XENO: Ez nem fut le
{
$query = "INSERT INTO #__booklibrary_authors_connect (fk_bookid,fk_authorid) VALUES ('$fk_bookid','{$new_authrs[$i]->id}')";
$database->setQuery($query);
$database->execute();
}
else { //XENO: Ez a lényegi rész, a könyvet összekapcsoljuk a szerőnk ID-jával
$query = "INSERT INTO #__booklibrary_authors_connect (fk_bookid,fk_authorid) VALUES ('$fk_bookid','{$my_author_id}')";
$database->setQuery($query);
$database->execute();
}
mosBooklibraryImportExport::importReviewXML($fk_bookid, $book_xml);
mosBooklibraryImportExport::importRentsXML($fk_bookid, $book_xml);
mosBooklibraryImportExport::importRentRequestsXML($fk_bookid, $book_xml);
mosBooklibraryImportExport::importEfilesXML($fk_bookid, $book_xml);
mosBooklibraryImportExport::importVideoXML($fk_bookid, $book_xml);
mosBooklibraryImportExport::importAudioXML($fk_bookid, $book_xml);
mosBooklibraryImportExport::importTrackXML($fk_bookid, $book_xml);
}
unset($tmp);
unset($book);
continue;
}
return $retVal;
}
?>