Présentation de SQLIImport
L'import de contenu est une question récurrente lorsque l'on développe des sites web stratégiques. C'est simple, je ne me rappelle pas avoir travaillé sur un seul projet qui n'aie pas besoin d'une fonctionnalité d'import. Le problème réside souvent dans le développement d'un module d'import solide, stable et suffisamment souple.
Bien sûr, il existe des extensions pour eZ Publish (notamment data_import ), j'en ai même développé une (NovenImportXMLStream) que je n'ai pas eu l'occasion de libérer. Seulement voilà, aucune de ces extensions ne me satisfaisait totalement, j'ai donc entrepris d'en développer une nouvelle (oui encore ! :)) : SQLIImport.
Petit tour du propriétaire...
Encore une extension d'import ???
Oui, encore une ! Mais pourquoi ? Il existe bien data_import... Mais voilà, autant cette extension contient de bonnes idées, autant je la trouve beaucoup trop rigide pour une utilisation industrielle (si j'ose dire). Elle permet de gérer différentes sources de données, notamment XML et CSV. Cependant, si elle conviendra à des structures simples, elle se rendra beaucoup moins flexible lorsque vous devrez aborder des structures plus complexes, notamment si vous devez créer plusieurs objets de contenu par élément XML ou CSV. Bien sûr vous pouvez surcharger le import handler de data_import, mais cela revient quasiment à réécrire une nouvelle extension !
Nous y voilà...
SQLIImport : Le cahier des charges
Il fallait donc écrire une extension qui soit suffisamment flexible pour gérer des imports one-shot et réguliers et qui soit également facile à prendre en main pour le développeur chargé de faire le parallèle entre la source de données externe (XML ou CSV principalement) et les contenus eZ Publish :
- Gestion de handlers. Chaque source de données doit être gérée par un handler écrit en PHP
- Facilité de configuration
- Interface PHP permettant d'encadrer le handler
- Gestion d'erreurs
- Gestion d'options à la volée (hors configuration)
- API simplifiée pour la manipulation d'objets de contenu
Par ailleurs, cette extension doit également permettre une exploitation aisée depuis le back-office, à savoir :
- Programmer des imports, avec gestion de récurrence
- Lancer des imports ponctuels
- Connaître le pourcentage de progression d'un import en cours
- Pouvoir interrompre un import en cours
Ça fait beaucoup, mais il n'en fallait pas moins pour obtenir quelque chose de réellement exploitable dans le temps.
Fonctionnalités mises en place
Finalement, toutes les fonctionnalités citées ont pu être implémentées dans SQLIImport (et ça n'a pas été une mince affaire !). Voici donc le mode de fonctionnement :
- Les imports sont lancés par un cronjob programmé toutes les 5 minutes
- Un seul import à la fois
- Le cronjob vérifie si des imports immédiats sont demandés et les traite, puis s'occupe des imports programmés
- Une factory est instanciée. Elle est chargée de charger tous les handlers d'import disponibles et déclarés dans la configuration de l'extension (via sqliimport.ini)
-
Tous les handlers d'import doivent implémenter l'interface ISQLIImportHandler et hériter de la classe SQLIImportAbstractHandler
Cela permet de s'assurer que toutes les méthodes attendues par la factory sont bien implémentées -
Des parseurs XML et CSV sont mis à disposition
Le parseur XML n'en est pas vraiment un car il s'appuie sur SimpleXML ou DOM. Il est principalement chargé d'attraper les éventuelles erreurs XML et de les transformer en exception. - Un jeu de classes est fourni pour gérer les structures CSV aussi facilement qu'avec SimpleXML
Exemple CSV :
$csvFile = 'extension/sqliimport/stubs/example.csv'; $cli->notice( 'Processing CSV test file '.$csvFile ); $options = new SQLICSVOptions( array( 'csv_path' => $csvFile, 'enclosure' => '~' // Default is ". Mandatory to change if CSV file contains unescaped " chars ) ); $csvDoc = new SQLICSVDoc( $options ); $csvDoc->parse(); $rowCount = count( $csvDoc->rows ); $cli->notice( "There are $rowCount rows in CSV file" ); // Cleant headers, camel case $headers = $csvDoc->rows->getHeaders(); $cli->warning( 'Cleant headers : ', false ); $cli->notice( implode( ', ', $headers ) ); // Raw headers, as provided in CSV file $rawHeaders = $csvDoc->rows->getRawHeaders(); $cli->warning( 'Raw headers : ', false ); $cli->notice( implode( ', ', $rawHeaders ) ); $cli->notice( $csvDoc->rows[0]->myFirstField ); // array access foreach($csvDoc->rows as $row) // Iteration { $cli->notice( $row->myFirstField ); $cli->notice( $row->otherField ); $cli->notice( $row->andAnotherOne ); $cli->notice(); }
API simplifiée
A la eZ Conference de juin, Ole Marius Smestad nous a parlé dans sa présentation d'une nouvelle API de haut niveau en préparation pour les prochaines versions d'eZ Publish. Je me suis basé sur les éléments présentés et sur quelques échanges pour anticiper et fournir une API simplifiée pour la manipulation de contenu eZ Publish. J'avoue que ça a été la partie la plus difficile, mais ça en valait la peine.
Un petit exemple :
$cli->notice( 'Creation of a new "comment" object' ); $options = new SQLIContentOptions( array( 'class_identifier' => 'comment', 'remote_id' => 'my_ubber_cool_remote_id', 'language' => 'fre-FR' ) ); $comment = SQLIContent::create( $options ); $cli->notice( 'Current version : '.$comment->current_version ); $comment->fields->subject = 'Mon super sujet'; $comment->fields->author = 'Moi !'; $comment->fields->message = 'Le commentaire de la mort'; $comment->addTranslation( 'eng-MS' ); $comment->fields['eng-US']->subject = 'My great subject'; $comment->fields['eng-US']->author = 'Batman'; $comment->fields['eng-US']->message = 'Death comment'; $comment->addLocation( SQLILocation::fromNodeID( 2 ) ); $comment->addLocation( SQLILocation::fromNodeID( 43 ) ); $publisher = SQLIContentPublisher::getInstance(); $publisher->publish( $comment ); $cli->notice( 'Current version : '.$comment->current_version ); // Loop against locations foreach( $comment->locations as $nodeID => $location ) { $cli->notice( $nodeID.' => '.$location->path_string.' ('.$comment->locations[$nodeID]->path_identification_string.')' ); } // Now free memory. // unset() on SQLIContent triggers eZContentObject::clearCache() // and eZContentObject::resetDataMap() unset( $comment );
Exemple de handler et screenshots
Pour finir, voici en à quoi devra ressembler un handler d'import :
Ainsi que le module back-office :
J'espère pouvoir publier cette extension courant septembre :)
Commentaires
Hate de voir çà! (par Nico O)
cool :D (par Yannick Komotir)
XMLinstaller (par gnoMii)
Pourquoi le sujet n'est pas repris auto ? (par Nicolas Steinmetz)
Yes (par Maxime T)
Re: Pourquoi le sujet n'est pas repris auto ? (par Jérôme Vieilledent)
Bravo (par Gandbox)
RDV à l'espace Kiron (par Jérôme Vieilledent)
Excellent job ! (par Abdelkader Rhouati)
SQLi Import and Oracle (par Simone Tellini)
Re: SQLi Import and Oracle (par Jérôme Vieilledent)
Félicitations et questions (par loic)
SQLIRSSImportHandler (par Gaspard)
psoriasis (par psoriasis)
Bigo Live ios (par Bigo Live ios)
sexting (par kik sexting)
media dot net (par bigo live for pc)
share it for pc (par paaps)
BMI CALCULATOR (par BMI CALCULATOR)
Login (par 192.168.1.1)
shareitfor pc (par paaps)
bigo (par bigo for pc)
tutuapp (par pokemon go)
AVG antivirus (par AVG antivirus for download)
SQL (par product animation videos)
sGVrbv (par website)
gbg (par website)
rgrgrg (par website)
VVB (par website)
svfbv (par WEBSITE)
sprint corporate (par sprint corporate)
tnks (par تور تایلند)
Nereida Torset (par Leonardo Lucksom)
Indianapolis 500 Live (par Indianapolis 500)
Very pleased! (par Anna)
Belmont Stakes (par Belmont Stakes 2017 Live Stream)
sqliimport overview (par sanchal)
Notary Seals,Notary Stamps and Notary Supplies (par prestodirect)
zootopia 2 (par zootopia 2)
Make My Python Programming Project (par Make My Python Programming Project)
T-test Assignment Help (par T-test Assignment Help)
Online Class Help (par Online Class Help)
online stopwatch (par online stopwatch )
Online timer (par Online timer)
Technical Support (par Jason borne)
Office (par Office Com Setup)
Case Analysis (par Case Analysis)
ertg (par egfd)
Jonestown Homes For Sale (par tusharupwork05@gmail.com)
relojes imitacion (par relojes imitacion)
Good night messages (par Rohit)
Park Benches (par tusharhossain4200@gmail.com)
Spinner Fidget Toy (par Spinner Fidget Toy)
autocad assignment (par autocad assignment)
how to write case study (par how to write case study)
youtube to mp3 converter (par youtube to mp3 converter)
instagram online viewer (par instagram online viewer)
instagram online web viewer (par instagram online web viewer)
tutu helper ios free (par tutu helper)
free standing pull up bar (par Anh Kim Bui)
Ecommerce development company (par Ecommerce development company)
sbionline (par sbionline)
bobibanking login (par bobibanking login)
pf balance check (par pf balance check)
boi online (par boi online)
login gst (par login gst)
sbi online net banking (par sbi online net banking)
passport seva kendra login (par passport seva kendra login)
pnb net banking registration online (par pnb net banking registration online)
pnb net banking registration online (par pnb net banking registration online)
epfo member login (par epfo member login)
aadhar card update (par aadhar card update)
online idbi net banking (par online idbi net banking)
up online scholarship (par up online scholarship)
sol demand letter (par sol demand letter)
Medical Specialties Training and Specialist salary in Australia (par Dr Brendan )
blutzuckersenken (par johncena@gmail.com)
I think this is (par blutzuckersenken)
mybestwestern.com (par mybestwestern.com)
Watch Dragon Ball Super (par Watch Dragon Ball Super)
bigo live (par bigo live pc)
rr (par rsd)
eee (par e)
theappgods (par theappgods)
Nordictrack Treadmills Review (par Nordictrack Treadmills Review)
192.168.1.254 (par 192.168.1.254)
sdf (par sfsd)
cheat engine android (par cheat engine android)
sa (par sa)
https://contentcomandroidbrowserhome.co/ (par https://contentcomandroidbrowserhome.co/)
Excellently written (par www.fernglaskaufen.eu)
Essay Help (par Essay Help)
GoAssignmentHelp (par Assignment Master)
newone2 (par zakir95)
Kristin (par gta 5 hack)
Adam (par download gta 5)
Amy (par generate money gta 5)
Michelle (par download gta 5)
Drew (par gta 5 hack)
Kristen (par download gta 5)
Mandy (par gta 5 money hacks)
Holly (par gta 5 hack)
Webtraffic Best Digital Marketing Services Company (par SEO Company in Mumbai)
Hosting Recipe - Web Hosting Services (par Web Hosting Services in Pune)
Chris (par gta 5 money generator)
Ryan (par generate money gta 5)
Lindsey (par gta 5 money cheat)
Michael (par gta 5 money generator)
Tracy (par gta 5 money generator)
Micheal (par more info about gta 5 hack here)
Tiffany (par gta 5 rp hack)
Kristen (par gta 5 money hack)
Get technical support (par Smith)
Leigh (par gta 5 money hack)
Megan (par gta 5 money cheat)
Mohamed (par gta 5 money cheat)
Jessica (par gta 5 rp hack)
Mark (par gta 5 generate money)
<a href="https://192168ll.mobi/192-168-l-254/">192.168.l.254</a> (par 192.168.l.254" target="_blank">192.168.l.254)
Do Checkout this as well (par RehmaanMalik)
McAfee Activation Support (par abcc@gmail.com)
dogsfeed.tk (par dogsfeed.tk)
Mark (par Gta V Money Generator)
Tiffany (par gta 5 generator)
happy new year wallpaper (par shubham)
thanksgiving message (par hanksgiving message for facebook)
christmas background images (par christmas Clipart)
pumpkin carving ideas (par halloween pumpkin images)
mcafee-card-activate (par John Jackson)
Web designing service provider (par Arjun Chahal)
Judith (par gta 5 online hack)
Samantha (par 420 clothing uk)
Kaspersky Customer Service (par Kaspersky Customer Service)
Reginald (par 420 clothing)
Eddie (par 420 clothing)
Emmanuel (par 420 clothing store)
Shawn (par gta 5 money generator)
Heather (par gta 5 rp hack)
Johnna (par gta 5 money generator)
Tracy (par gta 5 money cheat)
Phillip (par gta 5 rp hack)
Darrell (par download gta 5)
Jason (par generate money gta 5)
Gregory (par kush cloting)
wa (par waqar)
sfsd (par sdfsd)
kah buan (par sahsaj@shajh.com)
Bonne annee 2018 (par Image bonne annee 2018)
Konveksi Tas Workshop (par Konveksi Tas Workshop)
haiwon (par cara memperbesar penis)
tubemate (par tubemate for ios)
Bigcommerce Web Design (par Bigcommerce Web Design)
Assignment Help UK (par Assignment Help UK)
tubemate (par tubemate 2.2.9)
instagram for pc (par instagram)
1234 (par erfwe)
ccleaner free 2018 (par psam456@gmail.com)
office.com/setup (par office.com/setup)
Update Kodi on Android (par Update Kodi on Android)
manfaat qnc jelly gamat untuk kesehatan (par sefe@tsdf.com)
ylq (par ylq)
ylq (par ylq)
Nishith (par Market Muni)
Christms (par Christmas Wishes)
Custom Ear plugs (par Custom Ear plugs)
Motorcycle Ear Plugs (par Motorcycle Ear Plugs)
hgdfgbdgh (par fgvgdfgdf@fgd.com)
SASA (par SNKASA)
bathroom renovation nyc (par bathroom renovation nyc)
manfaat qnc (par hgcfhgffg@fgdc.com)
yogi metropolitan (par yogimetropolitan2017@gmail.com)
isftcollege (par adroit.amol@gmail.com)
Led High Bay (par Led High Bay)
Electrical Engineering Assignment Help (par Electrical Engineering Assignment Help)
fgdgdf (par gfg@dfx.com)
aa (par aa)
HP Technical Support (par 1-877-645-7494)
black panther (par barry)
Thanks (par Yayab)
aol customer support (par aol customer support)
dissertation writing services (par dissertation writing services)
google support (par google support)
8 ball pool unlimited coins apk (par 8 ball pool unlimited coins apk)
Epson Printer Support (par Epson Printer Support)
yeti sale (par abigailcook916@yahoo.com)
yeti sale (par abigailcook916@yahoo.com)
ggdb (par bakerada985@yahoo.com)
ggdb (par bakerada985@yahoo.com)
Happy Valentines day 2018 (par Example@gmail.com)
Obat Aborsi Penggugur Kandungan (par yunita2)
revayanti01@gmail.com (par reva)
yueqin (par yueqin)
bagus sekali (par pil biru asli)
blue waffles (par blue waffles disease)
rikismith (par vishal.amj93@gmail.com)
assigment help online (par assigment help online)
Buy Assignment Australia (par Buy Assignment Australia)
epson printer support number (par epson printer support)
www.mcafee.com/activate | McAfee activate (par www.mcafee.com/activate)
How to activate McAfee from McAfee.com/activate? (par McAfee activate)
happy chick (par happy chick apk)
chenyingying (par chenyingying)
C (par CC)
coach outlet (par online)
comment (par Web Design Sydney)
great (par Custom Ear plugs)
reader (par mitchell)
RRB (par RRB Bhopal)
RRB (par RRB Bilaspur)
michael kors factory outlet (par jinyizhixia)
cricket (par anurag)
cricket (par crickspo)
cricket (par crickspo)
Helpful information by professionals writers (par David Sina)
vidmate online (par nithi)
Mumbai escort (par Escort service in Mumbai)
cipto junaedy (par ciptoedy@gmail.com)
fgzsdfgzsd (par dfgdfgdfgdfg@jhgh.com)
Web Designing Company Bangalore (par monikarawat8585@gmail.com)
Web Designing company Bangalore (par monikarawat8585@gmail.com)
Ciri Ciri Titan Gel Asli Rusia (par ernawaticantik14@gmail.com)
pasutri (par maju mundur)
mcafee.com/activate (par man)
Xmodgames (par Julian David)
Hidup Sehat (par makanan penambah napsu makan)