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

Related content


Commentaires

Hate de voir çà! (par Nico O)

Dommage que cela ne sorte qu'en septembre, j'en aurai bien eu besoin. Heureusement data_import n'est pas trop mal et on peut quand même s'en sortir avec. C'était bien plus dur sans.


cool :D (par Yannick Komotir)

Bravo ! jusque là data_import m'aller très bien, j'attends donc avec impatience tester ta nouvelle extension. Coup de chapeau également pour l'API simplifiée


XMLinstaller (par gnoMii)

Bonjour,

On utilise plutot XML installer, qui est plutot pas mal, il suffit de lui fournir un XML bien formatté comme il se doit et c'est parti.

Mais à voir ton code, cela me plait.

Bien à vous.


Pourquoi le sujet n'est pas repris auto ? (par Nicolas Steinmetz)

Est-ce que son pendant au niveau des exports est prévu pour envisager des exports de contenus eZ depuis un environnement de VABF vers des envts de PPR/PROD ?

PS : le formulaire vide pour avoir oublié de remplir le sujet, pas glop


Yes (par Maxime T)

Pareil, dommage que ça soit pas déjà sorti, j'en aurai eu besoin. Je vais donc me contenter de data_import.


Re: Pourquoi le sujet n'est pas repris auto ? (par Jérôme Vieilledent)

Tu peux déjà exporter avec eZXMLExport, mais on ne peut pour l'instant n'exporter qu'une langue à la fois et il n'y a pas de notion d'arborescence (j'y travaille )
En revanche, je compte proposer un handler d'import de base afin de réimporter du contenu exporté par eZXMLExport


Bravo (par Gandbox)

Bravo, c'est bien pensé et très pragmatique.
Il serait intéressant de mutualiser des retours d'expériences concernant certains aspects sensibles :
- L'optimisation des temps de réponses (sur de gros volumes d'ajouts)
- La gestion des relation(s) d'objet(s)
- L'ajouts de médias

A discuter lors des prochaines rencontres


RDV à l'espace Kiron (par Jérôme Vieilledent)

Avec plaisir
RDV le 21/09 prochain à l'espace Kiron


Excellent job ! (par Abdelkader Rhouati)

Un message un peu en retard, j'ai pas eu tester l'extension qu'aujourd'hui .

J'ai utilisé à plusieurs reprise l'extension data_import, elle me parait bien mais trop limitée quand il s'agit d'import de structure assez complexe (arborescences; création d'objet en cours de création d'autres, gestion de langue ...).

Avec SQLiImport, j'aime bien la méthode process, ça permet de définir rester ouvert à toute les possibilités et les fonctionnalités, donc pas de limitation avec de cette nouvelle extension.

Aussi j'aime bien l'API simplifié (Dommage, avec la sortie de la nouvelle API ez, ça risque de ne plus être utilisé )

Bravo Jérôme, tu nous facilite la vie ...


SQLi Import and Oracle (par Simone Tellini)

Hello,

I've been playing with your extension in the past days, using Oracle. I've just published the required schema at http://tellini.info/2010/12/using-sqli-import-with-oracle/ - I thought I'd mention it, in case you want to add it to the project distribution (btw, you might want to add some contact information in the README.txt that comes with the extension


Re: SQLi Import and Oracle (par Jérôme Vieilledent)

Thanks Simone for sharing it ! I just added your contribution to the trunk of the extension


Félicitations et questions (par loic)

Super article et surtout très bonne API. Je l'ai utilisée et j'en suis content. Je voulais savoir si vous aviez une doc fr pour le système d'importation. Je ne comprends pas très bien comment, à partir du backend, l'admin peut importer des csv. J'ai bien suivi quelques articles (en créant un fichier xximporthandler.php et modifié le fichier de conf, mais rien n'y fait).
Merci d'avance pour votre réponse.


SQLIRSSImportHandler (par Gaspard)

Bonjour,

j'airais besoin d'aide sur la configuration de sqliimport et pour installation.
j'ai besoin d'exporter tout le contenu d'un site de worpress vers ezpublish.
Quel est la procédure à suite afin de migrer mes données.
Si avais une procédure ou un tu tutoriel pouvez me le communiquer.
Je vous remercie d'avance.


psoriasis (par psoriasis)

I really like the dear information you offer in your articles. I’m able to bookmark your site and show the others peaple check out up here generally.


Bigo Live ios (par Bigo Live ios)

here i will provide you download guide on bigo live for windows pc using bigo live apk file.


sexting (par kik sexting)

If you need someone to talk for what ever you need.


media dot net (par bigo live for pc)

nice post


share it for pc (par paaps)

BMI CALCULATOR (par BMI CALCULATOR)

Very interesting set out the theme!!learned a lot for myself! thank you!
http://calculatorbmi.org


Login (par 192.168.1.1)

Thanks for very detailed post.


shareitfor pc (par paaps)

bigo (par bigo for pc)

<a href="http://ibigolivepc.com/">bigo live connector</a>


tutuapp (par pokemon go)

tutuapp app android
tutuapp helper
tutuapp free download
http://tutuapppokemongo.com
tutuapp pokemon go hack
tutuapp regular
tutuapp spotify
tutuapp ios
tutuapp download ios


AVG antivirus (par AVG antivirus for download)

Download and install AVG Antivirus for Windows 10 32/64 bit for free. It is always good to be safe online and offline using AVG Antivirus for ...


SQL (par product animation videos)

Configuration alternative incorporate sell overseas to a development folder or self-sufficient SQL file, optionally deposit stored custom and procedures, or skip table statistics.


sGVrbv (par website)

That is my first time visit here. From the tons of comments on your articles, I suppose I am not only one having all the enjoyment here http://nopsoriasis.net/scalp-psoriasis/


gbg (par website)

This is a decent post. This post gives genuinely quality data. I'm unquestionably going to investigate it. http://nopsoriasis.net/types-of-psoriasis/


rgrgrg (par website)

Truly exceptionally helpful tips are given here. Much thanks to you to such an extent. http://nopsoriasis.net/plaque-psoriasis/


VVB (par website)

This article gives the light in which we may see the reality. This is very nice one and gives indepth information. http://nopsoriasis.net/


svfbv (par WEBSITE)

Interesting stuff. I really amazed to see the well written article and the unique posting style. You have shared the best material http://eyebrowthreadinginfo.com/


sprint corporate (par sprint corporate)

Hello! Very interesting topic, thank you raised it


tnks (par تور تایلند)

Thank you for your efforts, Excellent site..


Nereida Torset (par Leonardo Lucksom)

http://bit.ly/1P41Awa undangan pernikahan klub bola
http://www.sentrabesibaja.com/wel...d-beam-queen-king-cross-beam-t-beam/ Agen Welded Beam T beam King Queen Cross Castellated Beam
http://bit.ly/1P41Awa undangan pernikahan cetak
http://www.jualbesibajamurah.com/...-distributor-toko-jual-produsen-agen Pabrik besi cnp baja
http://www.sentrabesibaja.com/plat-besi-baja-hitam/ Agen Plat Besi Hitam
https://goo.gl/XZ6zpY undangan pernikahan
http://www.sentrabesibaja.com/besi-siku-baja/ Agen Jual Besi Siku Baja
http://www.sentrabesibaja.com/bondek-cor-sni/ Agen Bondek Cor
http://www.sentrabesibaja.com/atap-spandek/ Agen Atap Spandek Sni
http://www.jualbesibetonhargapabr.../category/besi-beton-psi-ulir-polos/ Toko besi beton psi Ulir Polos
http://www.pusatbesibaja.co.id/ha...gen-pabrik-jual-supplier-distributor Distributor besi cnp baja
http://www.pusatbesibaja.com/harg...dusen-jual-agen-supplier-distributor Distributor besi cnp baja
http://bit.ly/1P41Awa undangan pernikahan klasik
http://www.jualbesibajamurah.com/...plier-distributor-produsen-jual-toko Distributor besi h beam baja
http://www.sentrabesibaja.com/plat-kapal-marine/ Agen Plat Kapal Bki Krakatau Steel
http://www.undangancinta.com undangan pernikahan amplop surat
http://www.sentrabesibaja.com/besi-unp-baja-kanal-u/ Agen Besi Unp Baja Profil Kanal
http://ironsteelcenter.com/stainl...upplier-pabrik-besi-agen-distributor Distributor Stainless steel
http://www.sentrabesibaja.com/plat-bordes-kembang/ Agen Plat Bordes Kembang
http://www.jualbesibetonhargapabr...egory/besi-beton-perwira-ulir-polos/ Toko besi beton perwira
http://www.pusatbesibaja.co.id/ha...gen-pabrik-jual-supplier-distributor Harga besi cnp baja
http://www.pusatbesibaja.com/harg...dusen-jual-agen-supplier-distributor Harga besi cnp baja
http://bit.ly/1P41Awa undangan pernikahan cantik elegan
https://goo.gl/FEppdU jual laptop asus <a/> https://goo.gl/FEppdU jual laptop asus <a/>
https://goo.gl/QD6q3C jual laptop asus murah<a/> https://goo.gl/QD6q3C jual laptop asus murah<a/>
http://www.jualbesibajamurah.com/...plier-distributor-produsen-jual-toko Harga besi h beam baja
http://www.fabrikasikonstruksi.com jasa konstruksi baja
http://www.undangancinta.com undangan pernikahan simple
http://www.sentrabesibaja.com/besi-cnp-baja-kanal-c-gording/ Agen Besi Cnp Profil Baja Gording
http://ironsteelcenter.com/stainl...upplier-pabrik-besi-agen-distributor Supplier Stainless steel
http://www.jualbesibajamurah.com/...-distributor-toko-jual-produsen-agen Distributor besi cnp baja
http://www.jualbesibetonhargapabr.../category/besi-beton-pas-ulir-polos/ Toko besi beton PAS
http://www.pusatbesibaja.co.id/ha...gen-pabrik-jual-supplier-distributor Jual besi cnp baja
http://www.pusatbesibaja.com/harg...dusen-jual-agen-supplier-distributor Jual besi cnp baja
http://bit.ly/1P41Awa undangan pernikahan custom
http://www.jualbesibajamurah.com/...plier-distributor-produsen-jual-toko Jual besi h beam baja
http://www.pusatbesibaja.co.id www.pusatbesibaja.co.id
http://www.undangancinta.com undangan pernikahan murah
http://www.sentrabesibaja.com/besi-hollow-hitam-galvaniz/ Agen Besi Hollow
http://ironsteelcenter.com/stainl...upplier-pabrik-besi-agen-distributor Agen Stainless steel
http://www.jualbesibajamurah.com/...-distributor-toko-jual-produsen-agen Harga besi cnp baja
http://www.jualbesibetonhargapabr...si-beton-master-steel-ms-ulir-polos/ Toko besi beton master steel ms
http://www.pusatbesibaja.co.id/ha...gen-pabrik-jual-supplier-distributor Supplier besi cnp baja
http://www.pusatbesibaja.com/harg...dusen-jual-agen-supplier-distributor Supplier besi cnp baja
http://bit.ly/1P41Awa undangan pernikahan cute
http://www.jualbesibajamurah.com/...plier-distributor-produsen-jual-toko Supplier besi h beam baja
http://www.pusatbesibaja.com www.pusatbesibaja.com
http://www.undangancinta.com undangan pernikahan unik
http://www.sentrabesibaja.com/besi-wiremesh/ Agen Wiremesh
http://ironsteelcenter.com/stainl...upplier-pabrik-besi-agen-distributor Toko Stainless steel
http://www.jualbesibajamurah.com/...-distributor-toko-jual-produsen-agen Jual besi cnp baja
http://www.jualbesibetonhargapabr...category/besi-beton-ksty-ulir-polos/ Toko besi beton ksty
http://www.pusatbesibaja.co.id/ha...gen-pabrik-jual-supplier-distributor Toko besi cnp baja
http://www.pusatbesibaja.com/harg...dusen-jual-agen-supplier-distributor Toko besi cnp baja
http://bit.ly/1P41Awa undangan pernikahan coklat
http://www.jualbesibajamurah.com/...plier-distributor-produsen-jual-toko Toko besi h beam baja
http://www.jualbesibajamurah.com www.jualbesibajamurah.com
http://bit.ly/1P41Awa undangan pernikahan biasa
http://www.sentrabesibaja.com/pipa-besi-baja-sch-80-schedule/ Agen Besi Pipa Baja Schedule 80
http://ironsteelcenter.com/stainl...upplier-pabrik-besi-agen-distributor Jual Stainless steel
http://www.jualbesibajamurah.com/...-distributor-toko-jual-produsen-agen Supplier besi cnp baja
http://www.jualbesibetonhargapabr...esi-beton-krakatau-steel-ulir-polos/ Toko besi beton krakatau steel
http://www.pusatbesibaja.co.id/ha...gen-pabrik-jual-supplier-distributor Agen besi cnp baja
http://www.pusatbesibaja.com/harg...dusen-jual-agen-supplier-distributor Agen besi cnp baja
http://bit.ly/1P41Awa undangan pernikahan cantik dan murah
http://www.jualbesibajamurah.com/...plier-distributor-produsen-jual-toko Agen besi h beam baja
http://www.jualbesibetonhargapabr.../category/besi-beton-sni-ulir-polos/ Agen besi beton Sni Ulir Polos polos ulir
http://bit.ly/1P41Awa undangan pernikahan bunga
http://www.sentrabesibaja.com/pipa-besi-baja-sch-40-schedule/ Agen Besi Pipa Baja Schedule 40
http://ironsteelcenter.com/stainl...upplier-pabrik-besi-agen-distributor Harga Stainless steel
http://www.jualbesibajamurah.com/...-distributor-toko-jual-produsen-agen Toko besi cnp baja
http://www.jualbesibetonhargapabr...category/besi-beton-jcac-ulir-polos/ Toko besi beton jcac
http://www.pusatbesibaja.co.id/ha...gen-pabrik-jual-supplier-distributor Pabrik besi cnp baja
http://www.pusatbesibaja.com/harg...dusen-jual-agen-supplier-distributor Pabrik besi cnp baja
http://bit.ly/1P41Awa undangan pernikahan casual
http://www.jualbesibajamurah.com/...plier-distributor-produsen-jual-toko Pabrik besi h beam baja
http://www.jualbesibetonhargapabr.../category/besi-beton-sii-ulir-polos/ Agen besi beton sii
http://www.undangancinta.com undangan pernikahan artis
http://www.sentrabesibaja.com/pipa-besi-hitam-medium-galvaniz/ Agen Pipa Besi Hitam Medium
http://ironsteelcenter.com/stainl...upplier-pabrik-besi-agen-distributor Pabrik Stainless steel
http://www.jualbesibajamurah.com/...-distributor-toko-jual-produsen-agen Agen besi cnp baja
http://www.jualbesibetonhargapabr...eton-interworld-steel-is-ulir-polos/ Toko besi beton interworld steel is
http://www.pusatbesibaja.co.id/ha...butor-supplier-jual-agen-toko-pabrik Distributor besi h beam baja
http://www.pusatbesibaja.com/harg...dusen-agen-jual-distributor-supplier Distributor besi h beam baja
http://bit.ly/1P41Awa undangan pernikahan contoh
http://www.jualbesibajamurah.com/...er-agen-pabrik-distributor-jual-toko Distributor plat besi hitam
http://www.jualbesibetonhargapabr.../category/besi-beton-psi-ulir-polos/ Agen besi beton psi Ulir Polos
http://www.undangancinta.com undangan pernikahan modern
http://www.sentrabesibaja.com/besi-baja-i-wf-profil/ Agen Besi Wf
http://ironsteelcenter.com/baja-r...upplier-pabrik-besi-agen-distributor Distributor Baja Ringan
http://www.gudangbesibaja.com/harga-wiremesh-sni-jual-distributor-pabrik Distributor Wiremesh Besi
http://www.jualbesibetonhargapabr...besi-beton-gunung-garuda-ulir-polos/ Toko besi beton gunung garuda
http://www.pusatbesibaja.co.id/ha...butor-supplier-jual-agen-toko-pabrik Harga besi h beam baja
http://www.pusatbesibaja.com/harg...dusen-agen-jual-distributor-supplier Harga besi h beam baja
http://bit.ly/1P41Awa undangan pernikahan chinese
http://www.jualbesibajamurah.com/...er-agen-pabrik-distributor-jual-toko Harga plat besi hitam
http://www.jualbesibetonhargapabr...egory/besi-beton-perwira-ulir-polos/ Agen besi beton perwira
http://www.undangancinta.com undangan pernikahan artis
http://www.sentrabesibaja.com/besi-baja-hbeam-profil/ Agen Besi H beam
http://ironsteelcenter.com/baja-r...upplier-pabrik-besi-agen-distributor Supplier Baja Ringan
http://www.gudangbesibaja.com/harga-wiremesh-sni-jual-distributor-pabrik Harga Wiremesh Besi
http://www.jualbesibetonhargapabr...esi-beton-delco-prima-dp-ulir-polos/ Toko besi beton delcoprima
http://www.pusatbesibaja.co.id/ha...butor-supplier-jual-agen-toko-pabrik Jual besi h beam baja
http://www.pusatbesibaja.com/harg...dusen-agen-jual-distributor-supplier Jual besi h beam baja
http://bit.ly/1P41Awa undangan pernikahan cantik
http://www.jualbesibajamurah.com/...er-agen-pabrik-distributor-jual-toko Jual plat besi hitam
http://www.jualbesibetonhargapabr.../category/besi-beton-pas-ulir-polos/ Agen besi beton PAS
https://goo.gl/XZ6zpY undangan pernikahan casual
http://www.sentrabesibaja.com/besi-beton-ulir-polos-sni/ Agen Besi Beton
http://ironsteelcenter.com/baja-r...upplier-pabrik-besi-agen-distributor Agen Baja Ringan
http://www.gudangbesibaja.com/harga-wiremesh-sni-jual-distributor-pabrik Jual Wiremesh Besi
http://www.jualbesibetonhargapabr...esi-beton-cakra-steel-cs-ulir-polos/ Toko besi beton cakra steel cs
http://www.pusatbesibaja.co.id/ha...butor-supplier-jual-agen-toko-pabrik Supplier besi h beam baja
http://www.pusatbesibaja.com/harg...dusen-agen-jual-distributor-supplier Supplier besi h beam baja
http://bit.ly/1P41Awa undangan pernikahan bunga
http://www.jualbesibajamurah.com/...er-agen-pabrik-distributor-jual-toko Supplier plat besi hitam
http://www.jualbesibetonhargapabr...si-beton-master-steel-ms-ulir-polos/ Agen besi beton master steel ms
https://goo.gl/XZ6zpY undangan pernikahan animasi
http://www.sentrabesibaja.com/ www.sentrabesibaja.com
http://ironsteelcenter.com/baja-r...upplier-pabrik-besi-agen-distributor Toko Baja Ringan
http://www.undangancinta.com undangan pernikahan simple
http://www.undangancinta.com undangan pernikahan murah
http://www.gudangbesibaja.com/harga-wiremesh-sni-jual-distributor-pabrik Supplier Wiremesh Besi
http://www.jualbesibetonhargapabr...category/besi-beton-bjku-ulir-polos/ Toko besi beton bjku
http://www.pusatbesibaja.co.id/ha...butor-supplier-jual-agen-toko-pabrik Toko besi h beam baja
http://www.pusatbesibaja.com/harg...dusen-agen-jual-distributor-supplier Toko besi h beam baja
http://bit.ly/1P41Awa undangan pernikahan bentuk dompet
http://www.jualbesibajamurah.com/...er-agen-pabrik-distributor-jual-toko Toko plat besi hitam
http://www.jualbesibetonhargapabr...category/besi-beton-ksty-ulir-polos/ Agen besi beton ksty
https://goo.gl/XZ6zpY undangan pernikahan murah
http://www.sentrabesibaja.com/wel...d-beam-queen-king-cross-beam-t-beam/ Toko Welded Beam T beam King Queen Cross Castellated Beam
http://ironsteelcenter.com/baja-r...upplier-pabrik-besi-agen-distributor Jual Baja Ringan
http://www.gudangbesibaja.com/harga-wiremesh-sni-jual-distributor-pabrik Toko Wiremesh Besi
http://www.jualbesibetonhargapabr...ategory/besi-beton-banci-ulir-polos/ Toko besi beton Sni Ulir Polos
http://www.pusatbesibaja.co.id/ha...butor-supplier-jual-agen-toko-pabrik Agen besi h beam baja
http://www.pusatbesibaja.com/harg...dusen-agen-jual-distributor-supplier Agen besi h beam baja
http://bit.ly/1P41Awa undangan pernikahan buatan sendiri
http://www.jualbesibajamurah.com/...er-agen-pabrik-distributor-jual-toko Agen plat besi hitam
http://www.jualbesibetonhargapabr...esi-beton-krakatau-steel-ulir-polos/ Agen besi beton krakatau steel
http://bit.ly/1P41Awa undangan pernikahan biru
http://www.sentrabesibaja.com/bondek-cor-sni/ Toko Bondek Cor
http://ironsteelcenter.com/baja-r...upplier-pabrik-besi-agen-distributor Harga Baja Ringan
http://www.gudangbesibaja.com/harga-wiremesh-sni-jual-distributor-pabrik Agen Wiremesh Besi
http://www.jualbesibetonhargapabr.../category/besi-beton-ais-ulir-polos/ Toko besi beton ais
http://www.pusatbesibaja.co.id/ha...butor-supplier-jual-agen-toko-pabrik Pabrik besi h beam baja
http://www.pusatbesibaja.com/harg...dusen-agen-jual-distributor-supplier Pabrik besi h beam baja
http://bit.ly/1P41Awa undangan pernikahan batik
http://www.jualbesibajamurah.com/...er-agen-pabrik-distributor-jual-toko Pabrik plat besi hitam
http://www.jualbesibetonhargapabr...category/besi-beton-jcac-ulir-polos/ Agen besi beton jcac
http://www.undangancinta.com undangan pernikahan arab
http://www.sentrabesibaja.com/atap-spandek/ Toko Atap Spandek Sni
http://ironsteelcenter.com/baja-r...upplier-pabrik-besi-agen-distributor Pabrik Baja Ringan
http://www.gudangbesibaja.com/harga-wiremesh-sni-jual-distributor-pabrik Pabrik Wiremesh Besi
http://www.jualbesibetonhargapabrikmurah.com/ Toko besi beton

link10


Indianapolis 500 Live (par Indianapolis 500)

Indianapolis 500