173 × 240 SPINE: 15 FLAPS: 80
Diving in the code of Joomla K. Drougkas
<?php sheprved. e p r ? < s t h g i r reserved. l s l t A h r g o . i t c r a n r I l t l s , A i s r * n r o . * i e / ministrat ters, Inc t/** oomla.Adm urce Matt d t x J o A a t S . M . a E n l e S e m c N p o r E O o u C J o I 2 S L 1 e .txt 0 g E n e 2 a S e e N p s E O C ; 5 I 2 r 0 L 1 e e 0 0 t g 2 * @pack e 2 a a e l k ) s c C r a ( ; 5 o ht * @p or later t (C) 200 ersion in2 a deep CopyrigDiving 2 h v g n i e o t r s i h y n s g p e r i o c in the code of Joomla examines e r C i v y L p e o c t s c i h n @ * ubl the internal code of Joomla and @copyrig eral Pmanner blic Lice ndetailed * u e P G l U and a N r G e n e G U e GN * @licens its expansion abilities. It also provides the reader with * @license detailed examples in order to create his/her own Joomla */ */ add-ons (components, modules and plug-ins). Finally, e fil ent procedure it analyzes the for the setting of a parwhole a s i rent file a s p i h a t s t i a h s t i Konstantinos Drougkas was h g debugging environment. t a that g a // Set fl fl t e S / / born in Athens in 1969. He 1);This book describes ;step by step the execution of , ’ C E ; X ) E 1 J _ , ‘ ’ ( C e E n OR) its first to the last command. is a graduate of the Patras defi a Joomla EPARATfrom fine(‘_JEX R); Ssession, e O _ d T Y A R R O A T P C E E S R _ I Y D R O Institute of Technology , Joomla has seven phases which are analytically presented IRECT D , ’ S define(‘DS’ D ‘ ( e n { fi e d )) (University of Patras) in it. For the first time in a book can the .php’receive esreader )) { ncode ’ fi p e h d p / . ‘ s e . n fi ) e _ d B.Sc., Computer Engineering _ / such a detailed presentation of the execution. E .‘ _FIL ) _ _ ( _ ; e E ’ m L p a I h n F p r _ . i _ s d ( e ( ; e n s ’ m fi t (Grade 7,86/Distinction), and stage of the execution is explained . ‘/de in a clear and defines.php ists(dirna _a_)real / x E ‘ e L if (file_exis Every _ I . e F l _ ) fi _ _ ( ( _ e E f m L i a he is member of the Hellenic I n thorough way producing case study for one of F r e(__ m ce di a n n o r _ i e d d u e l c c n n o i _ Chamber of Technology the largest software packages (Content Management include (T.E.E.). Konstantinos System, Joomla). The most important parts of the code } } Drougkas is an experienced and the key commands of every phase are decoded in computer engineer and front of the reader. )) { ’ S E N { I F ) E ) D ’ J S _ E ‘ N ( ; teacher residing in the ) in the code of Joomla ,_acquire DEFI __a )comprehensive J E _ L ‘ I ( ; F d ) e ) _ n _ if (!definedviewDiveabout ( fi _ e e E m d L a ! I n ( F r _ i if historical city of Athens code and make n your hp’; dirname(_ s.pown _BASE’its, dinternal e H ; , T ’ ’ fi A p E e P h S d J p A / ‘ . B s ( s _ e e e H d n n T u fi fi A l e e in Greece. His passion for P c d d extensions ! des/ ne(‘J .’/in u fi E l e S c d A n B i _ / H ’ T . A E P S J A B e web development goes back e JPATH_ require_onc to 2007 when he starts his require_onc involvement with Joomla. } ; } ’ p h p . k r ; o ’ w He has made a significant p e h m rk.p /fra o s w e e d m u a l r c f n / i s / e ’ d . u E l number of Joomla sites, JPATH_BAS ASE.’/inc r.php’; B e _ ; p H ’ l T p e A h h P p / J . s r e e e d c and in the last two years he p u n l l o require_once e c es/h ’/in uire_ d . q u E e l S r c A n B ; i _ ’ / H p ’ T h . A p E P . S J r A has focused on the detailed a hp’; oolb ATH_B p t P . / J r s a e e b d c l u n o l o require_once o c _ t n e / i r s / i e ’ u study of the internal code req E.’/includ CODE OF JOOMLA PATH_BASE. S J A B e UNDERSTAND THE INTERNAL _ c H n T o A _ P e J r i e u of Joomla. The combination c q re require_on of his considerable teaching . r e l fi o r p MAKE YOUR OWN JOOMLA EXTENSIONS . r e e h experience, and his deep l t fi pro ; d in l e a l h o u t L n r n e : i t f ; ) d a l ’ a l d o k u a L r n o r a knowledge of the web, terL978-960-564-057-6 // M Mark afte rLoad’) : rk(‘afISBN e a / t m / f > a ‘ R ( E k L r I a F m O > guarantees a pedagogical R P ? $_ FILER O R P _ $ JDEBUoGcelotos ? G U B E approach. JD . n pplicatio a e h t lication. ator’); p e r p t t a a s kostasdrougkas@gmail.com i i e t n h n i t a m t d e s a t trator’); n ‘ a s I ( i i n t n o n i // i a m t t d a s a c n ‘ i I ( l n p / o p / i A t get ory210::6431108 Vatatzi 55 str., 114 73 Athens ac. t: +30 :getApplica F : J y r = o t p c p a a F $ J = : ekdoseis.ocelotos@gmail.com $app ocelotos www. ocelotos. gr . n PUBLISHING o i t a c i l p p a e h t plication. e p s a e h t e s i l a // Initiali // Initi .lang’) rray( n a o ( i e t s a i c l i a l i p t p i ion.lang’) e(array( a n t s ‘ i a i ( c l e i a t l i a p t t p i S $app-> a n r ‘ i e ( > s e U t p t $ap $app->ge etUserSta g > > = p ’ p e a g $ a u > g = n a ’ l e ‘ ‘languag
Diving in the code of
Joomla
Release 2.5
by Konstantinos Drougkas
PUBLISHING
TEL
cover_joomla.indd 1
ocelotos ocelotos PUBLISHING PUBLISHING
5/12/2013 2:30:50 PM
Release 2.5
by Konstantinos Drougkas
ocelotos PUBLISHING
Title Author Publisher’s sieries Editing Book design Copyright© 2013 First Published ISBN
Diving in the code of Joomla Konstantinos Drougkas Science Georgina Lavranou Myrtilo, graphic arts Konstantinos Drougkas Athens, May 2013 978-960-564-057-6
This publication is in copyright. Subject to statutory exception and to the provisions of relevant collective licensing agreements, no reproduction of any part may take place without the written permission of the author and of Ocelotos Publications.
o celotos publications
Vatatzi 55 str., 114 73 Athens Τel. : 210 6431108 e-mail: ekdoseis.ocelotos@gmail.com www. ocelotos. gr
Dedicated in loving memory of Antonis Drougkas and Zozo Zografou whose invaluable help and presence has always been a guiding light in my life.
INTRODUCTION I have been working in the field of computing for more than 17 years, 7 as system engineer and 10 as an information technology teacher in Greek High schools. All these years both for professional reasons, and as a hobby I have dealt with interesting technical issues like object oriented programming, ERPs, and in the last 3 years with CRMs like Joomla. In most of these cases I faced the same problem: After a level of depth there is either no or deficient documentation. If you want to be an expert you have to â&#x20AC;&#x153;diveâ&#x20AC;? in unknown areas without any external help. As a result, I decided to become a kind of software detective! And the software in this case is the open source Content Management System Joomla 2.5 .In the following chapters I will present you what Joomla is but the main purpose of the book is not that. The real target is to explain what is happens inside Joomla. So, this is not a book for people who just want to make a site using that CRM but it is mainly, aimed at people who wonder how the Joomla code works. As you may have guessed there are a lot of people who can build beautiful sites with Joomla but very few of them can understand its code and what happens inside it! This book is no more than my first attempt to share my experience of the Joomla platform. The first three chapters are a kind of appetizer before the main course which comes in chapters four and five. These are the core units of the book and their aim is to present and explain the sequence of commands in a complete Joomla execution cycle. Furthermore, there are three chapters with simple examples of Joomla extensions (you can download them freely from my personal site www.effectivesites.gr) and a final one with useful information. Finally, none of this would have been possible without the help and support of my loving wife Anastasia and the inspiration of our children Antonis-Ioannis and Eirini.
Contents INTRODUCTION...................................................................................................................................... 7 The Basic Concepts.............................................................................................................................11 Joomla things you have to know...............................................................................................13 1.1 What is Joomla.............................................................................................................................13 1.2 Setting a windows environment for Joomla..................................................................16 1.3 The installation of Joomla.......................................................................................................20 Setting the debugging environment......................................................................................27 2.1 What is a debugging environment?..................................................................................27 2.2 Eclipse...............................................................................................................................................27 2.3 Setting Eclipse for Joomla debugging..............................................................................28 2.4 Setting the php.ini file..............................................................................................................34 2.5 The PHP Debug Perspective..................................................................................................35 The architecture of Joomla............................................................................................................37 3.1 The structure of Joomla Files.................................................................................................37 3.2 A quick look to the MVC pattern of Joomla and its API (Application Programming Interface)................................................................................46 3.3 Joomla Database tables...........................................................................................................47 3.4 Joomla Extensions......................................................................................................................48 The Code of Joomla............................................................................................................................53 Examining the code part 1.............................................................................................................55 4.1 index.php the starting point..................................................................................................55 4.2 The definitions and the loading of the Joomla framework.....................................58 4.3 Instantiate the application......................................................................................................74 4.4 Initialise the application...........................................................................................................92 Examining the code part 2..........................................................................................................105 5.1 Route the application.............................................................................................................105 5.2 Dispatch (execute) the component.................................................................................129 5.3 Render the application..........................................................................................................153
5.4 Output the page.......................................................................................................................173 Programming in action.................................................................................................................181 The dbcon component..................................................................................................................183 6.1 What is the dbcon component? The dbcon installation........................................183 6.2 Using dbcon...............................................................................................................................184 6.3 Uninstall the dbcon component.......................................................................................190 6.4 The front-end code of dbcon.............................................................................................191 6.5 The back-end code of dbcon..............................................................................................206 The module givesuggestion......................................................................................................241 7.1 What is the givesuggestion module and its installation ......................................241 7.2 Using the givesuggestion ...................................................................................................243 7.3 The Uninstall procedure........................................................................................................245 7.4 The code of givesuggestion................................................................................................246 The plug-in addmytext..................................................................................................................255 8.1 What is the addmytext..........................................................................................................255 8.2 Install and uninstall the addmytext . ..............................................................................256 8.3 Use of addmytext ..................................................................................................................256 8.4 The code of addmytext.........................................................................................................258 Important information..................................................................................................................267 9.1 Create impressive user templates with the Artisteer software...........................267 9.2 The Joomla extensions directory......................................................................................270 9.3 The main configuration file.................................................................................................270 9.4 Transferring your site to a Web Hosting Provider ....................................................271 9.5 Site backup..................................................................................................................................274 9.6 Site restore...................................................................................................................................274 9.7 Make your site Search Engine Friendly - SEO..............................................................275
USEFUL ACTIONS FOR SEO ................................................................................................277
SEO, ACTIONS WE SHOULD NOT DO..............................................................................277
9.8 Web technologies....................................................................................................................278 Index..........................................................................................................................................................281
Part I
The Basic Concepts
Joomla things you have to know
13
chapter 1
Joomla things you have to know
1.1 What is Joomla Joomla (figure 1.1) is a Content Management System (CMS). Its code is open (open source) and distributed for free. As a CMS it gives us the opportunity to publish and modify content on the Internet. The Joomla administrator can inform the content of the CMS any time and every change becomes immediately visible to the visitors of the site.
Figure 1.1
Joomla also provides us with a powerful API platform (a software library with Application Programming Interfaces) which can be used directly in order to produce our own software applications. Joomla is written in PHP (a strong object-oriented programming language) which is very popular for web programming. It follows the MVC (modelâ&#x20AC;&#x201C;viewâ&#x20AC;&#x201C;controller) software pattern and stores its data in a MySQL database. Joomla supports a wide variable of features
13
14
Diving in the code of Joomla
like SEF (Search Engine Friendly), page caching, multi-language sites, RSS feeds, blogs, polls, search, forums e.t.c. It has been downloaded over 35 million times so far. There are thousands of both free and commercial extensions which can be downloaded directly from the official Joomla Extension Directory (figure 1.2) and other external resources. Notice that only the Joomla Extension Directory site has more than 6.000 extensions.
Figure 1.2
JOOMLA - ADVANTAGES • Easy and effective site creation • Open code software • Free software • Powerful API platform which gives us tremendous opportunities to create our own Joomla compatible applications • Compatibility with the majority of modern web technologies like: html, javascript, css, xml, flash, java.... • Effective content administration • Search Engine Friendly • Huge world community (thousands of sites and users) • Thousands of free extensions in a wide range of categories (expanded everyday) • Embedded abilities for multi-language sites • New security specifications from 2.5 release • Very flexible and scalable software
• •
Joomla things you have to know
Not demanding special hardware (it can be run in a simple laptop) Easy upgrade procedure from the last 2.5 release
15
This period (spring 2013) the stable (productive) version of Joomla is the 2.5.This release will be supported until the spring of 2014. But, there are still thousands of sites which run the previous version 1.5. As we have mentioned, Joomla is free software and can be downloaded easily from the official Joomla site http://www.joomla.org . In the same site you can find every relevant piece of information about the installation procedure and the technical requirements. Finally, Joomla has the second place in the world CMS Market Share (figure 1.3).
Figure 1.3
WordPress is currently number one but its abilities are not equivalent to Joomla’s. WordPress is mainly oriented to blog creation and this is the reason for its position. So, if we examine more general sites with more complicated functionality we may find that Joomla is the leader!
15
16
Diving in the code of Joomla
1.2 Setting a windows environment for Joomla The Joomla code is written in PHP language and uses MySQL databases. As a result, we need an environment which supports PHP and MySQL. So, before Joomla installation we have to ensure that our environment supports these two technologies.
1.2.1 XAMPP XAMPP is an Apache distribution (figure 1.4). A software package which provides the Apache server.
Figure 1.4
As you can see from the figure above it is not only the PHP language which is supported by xampp. Other software which is provided and is important for a Joomla installation is: • MySQL • phpMyAdmin • FileZilla FTP Server As you can guess the installation of XAMPP provides us with the entire environment for running a Joomla site (figure 1.5).
Joomla things you have to know
17
Figure 1.5
1.2.2 APACHE Obviously, this is not the famous Indian tribe. Apache is an open-source HTTP server (figure 1.6). It can be run in a variety of operating systems (Windows, Linux, Unix-Solaris and Mac OS X).
Figure 1.6
17
18
Diving in the code of Joomla
It supports the common languages PHP, Perl, Python. The Apache provides modules for authentication, a rewrite engine, secure sockets layer, a proxy extension, and ability for custom log files, web filtering and other useful features.
1.2.3 MySQL MySQL is a relational database management platform allows multiple users to access one or more databases at the same time (figure 1.7). It is written in C and C++ and works in many different operating systems, including Linux, Mac OS X, Microsoft Windows and Unix.
Figure 1.7
A large number of programming languages (like PHP) and CMS (Content Management Systems) provide APIs (Application Programming interfaces) for accessing MySQL databases. This gives us the opportunity to easily produce applications which can be based on the MySQL database. Joomla uses MySQL as its standard database system and uses specific APIs in order to interact with it.
1.2.4 phpMyAdmin phpMyAdmin is an application (figure 1.8) which provides support and management of MySQL databases.
Joomla things you have to know
19
Figure 1.8
It is free, user friendly and a very effective tool. The majority of MySQL operations like: the administration of whole databases, table field and index management, relations, and user rights, are supported by the phpMyAdmin. The user can still execute direct SQL commands, but the choice of the phpMyAdmin helps us to save time and to execute difficult queries without specific technical experience. It is installed by XAMPP so the installation is very easy. You can find more and detailed documentation in: http://www.phpmyadmin.net/documentation
1.2.5 FileZilla FTP client The common procedure if you want to install a Joomla site is first to create a local installation in a home computer. Only when you have finished your site and its customization, can you transfer it to a Web Server to be published. This means that you have to copy a huge tree of directories with thousands of files from your local computer to a remote server. If you try to do that manually you will quickly realize that it is a massive and very complicated procedure which will take tremendous time. At this stage you need a FTP (File Transfer Protocol) program like the FileZilla client (figure 1.9).
19
20
Diving in the code of Joomla
Figure 1.9
FileZilla client is a free FTP client software, very easy to use, which provides FTP, FTP over SSL/ TLS (FTPS) and SSH File Transfer Protocol (SFTP). It can automatically transfer all the (Joomla) file structure of a site, from the local server to the Web Server.
1.3 The installation of Joomla The installation procedure of Joomla is easy and simple. Firstly, we have to download Joomla and secondly, to extract the zip file and follow the installation instructions. We will present it in a few steps:
1st step:
Check the technical requirements of Joomla
The installation of Joomla must be completed in accordance with its official technical requirements (figure 1.10).
Joomla things you have to know
21
Figure 1.10
2nd step: Intall XAMPP XAMPP provides us with the Apache server which supports PHP. It also supports MySQL, phpMyAdmin and Filezilla. The XAMPP installation procedure is simple. Choose the XAMPP version which satisfies the previous technical requirements. Special attention is required if you run Skype in the same computer because both applications use the same network port 80.
3rd step:
Download Joomla
Download Joomla from its official site (figure 1.11) http://www.joomla.org/download. html
Important Recently there is the opportunity for automating installation in the note Windows Azure Cloud Platform. More info in: www.windowazure.com/en-us/home/scenarios/web-sites
21
22
Diving in the code of Joomla
Figure 1.11
4th step:
Install Joomla
Go to Apache root directory /xampp/htdocs and create a folder with the name of your site. Thereafter, extract the installation file to this directory.
5th step:
Run the installation procedure
Open a browser and go to url: http://localhost/mysite (figure 1.12). The http://localhost is the part of the url which refers to the base directory of the Apache server. Every site installation must be located under that path. The â&#x20AC;?mysiteâ&#x20AC;? is the folder name of the previous step.
Important You can have a variety of different installations under the directory tip /htdocs. We can also have different releases.
Joomla things you have to know
23
Figure 1.12
6th step:
Go to administrative (back-end) site and customize the global settings.
There are a number of customizing settings (figure 1.13) that must be set after the installation. It is not the role of this book to analyze this matter but just for exemplary reasons some of them are: the SEO settings, the Metadata settings, the default editor etc. We manage these settings from the Global Configuration menu.
Important If you are new in Joomla it is very useful to choose indicative content. tip This choice creates a demo site with the majority of its elements.
23
24
Diving in the code of Joomla
Figure 1.13
Now and after importing our data we are ready to use both the site part (figure 1.14) .
Figure 1.14
and the administrator part (figure 1.15).
Joomla things you have to know
25
Figure 1.15
25
173 × 240 SPINE: 15 FLAPS: 80
Diving in the code of Joomla K. Drougkas
<?php sheprved. e p r ? < s t h g i r reserved. l s l t A h r g o . i t c r a n r I l t l s , A i s r * n r o . * i e / ministrat ters, Inc t/** oomla.Adm urce Matt d t x J o A a t S . M . a E n l e S e m c N p o r E O o u C J o I 2 S L 1 e .txt 0 g E n e 2 a S e e N p s E O C ; 5 I 2 r 0 L 1 e e 0 0 t g 2 * @pack e 2 a a e l k ) s c C r a ( ; 5 o ht * @p or later t (C) 200 ersion in2 a deep CopyrigDiving 2 h v g n i e o t r s i h y n s g p e r i o c in the code of Joomla examines e r C i v y L p e o c t s c i h n @ * ubl the internal code of Joomla and @copyrig eral Pmanner blic Lice ndetailed * u e P G l U and a N r G e n e G U e GN * @licens its expansion abilities. It also provides the reader with * @license detailed examples in order to create his/her own Joomla */ */ add-ons (components, modules and plug-ins). Finally, e fil ent procedure it analyzes the for the setting of a parwhole a s i rent file a s p i h a t s t i a h s t i Konstantinos Drougkas was h g debugging environment. t a that g a // Set fl fl t e S / / born in Athens in 1969. He 1);This book describes ;step by step the execution of , ’ C E ; X ) E 1 J _ , ‘ ’ ( C e E n OR) its first to the last command. is a graduate of the Patras defi a Joomla EPARATfrom fine(‘_JEX R); Ssession, e O _ d T Y A R R O A T P C E E S R _ I Y D R O Institute of Technology , Joomla has seven phases which are analytically presented IRECT D , ’ S define(‘DS’ D ‘ ( e n { fi e d )) (University of Patras) in it. For the first time in a book can the .php’receive esreader )) { ncode ’ fi p e h d p / . ‘ s e . n fi ) e _ d B.Sc., Computer Engineering _ / such a detailed presentation of the execution. E .‘ _FIL ) _ _ ( _ ; e E ’ m L p a I h n F p r _ . i _ s d ( e ( ; e n s ’ m fi t (Grade 7,86/Distinction), and stage of the execution is explained . ‘/de in a clear and defines.php ists(dirna _a_)real / x E ‘ e L if (file_exis Every _ I . e F l _ ) fi _ _ ( ( _ e E f m L i a he is member of the Hellenic I n thorough way producing case study for one of F r e(__ m ce di a n n o r _ i e d d u e l c c n n o i _ Chamber of Technology the largest software packages (Content Management include (T.E.E.). Konstantinos System, Joomla). The most important parts of the code } } Drougkas is an experienced and the key commands of every phase are decoded in computer engineer and front of the reader. )) { ’ S E N { I F ) E ) D ’ J S _ E ‘ N ( ; teacher residing in the ) in the code of Joomla ,_acquire DEFI __a )comprehensive J E _ L ‘ I ( ; F d ) e ) _ n _ if (!definedviewDiveabout ( fi _ e e E m d L a ! I n ( F r _ i if historical city of Athens code and make n your hp’; dirname(_ s.pown _BASE’its, dinternal e H ; , T ’ ’ fi A p E e P h S d J p A / ‘ . B s ( s _ e e e H d n n T u fi fi A l e e in Greece. His passion for P c d d extensions ! des/ ne(‘J .’/in u fi E l e S c d A n B i _ / H ’ T . A E P S J A B e web development goes back e JPATH_ require_onc to 2007 when he starts his require_onc involvement with Joomla. } ; } ’ p h p . k r ; o ’ w He has made a significant p e h m rk.p /fra o s w e e d m u a l r c f n / i s / e ’ d . u E l number of Joomla sites, JPATH_BAS ASE.’/inc r.php’; B e _ ; p H ’ l T p e A h h P p / J . s r e e e d c and in the last two years he p u n l l o require_once e c es/h ’/in uire_ d . q u E e l S r c A n B ; i _ ’ / H p ’ T h . A p E P . S J r A has focused on the detailed a hp’; oolb ATH_B p t P . / J r s a e e b d c l u n o l o require_once o c _ t n e / i r s / i e ’ u study of the internal code req E.’/includ CODE OF JOOMLA PATH_BASE. S J A B e UNDERSTAND THE INTERNAL _ c H n T o A _ P e J r i e u of Joomla. The combination c q re require_on of his considerable teaching . r e l fi o r p MAKE YOUR OWN JOOMLA EXTENSIONS . r e e h experience, and his deep l t fi pro ; d in l e a l h o u t L n r n e : i t f ; ) d a l ’ a l d o k u a L r n o r a knowledge of the web, terL978-960-564-057-6 // M Mark afte rLoad’) : rk(‘afISBN e a / t m / f > a ‘ R ( E k L r I a F m O > guarantees a pedagogical R P ? $_ FILER O R P _ $ JDEBUoGcelotos ? G U B E approach. JD . n pplicatio a e h t lication. ator’); p e r p t t a a s kostasdrougkas@gmail.com i i e t n h n i t a m t d e s a t trator’); n ‘ a s I ( i i n t n o n i // i a m t t d a s a c n ‘ i I ( l n p / o p / i A t get ory210::6431108 Vatatzi 55 str., 114 73 Athens ac. t: +30 :getApplica F : J y r = o t p c p a a F $ J = : ekdoseis.ocelotos@gmail.com $app ocelotos www. ocelotos. gr . n PUBLISHING o i t a c i l p p a e h t plication. e p s a e h t e s i l a // Initiali // Initi .lang’) rray( n a o ( i e t s a i c l i a l i p t p i ion.lang’) e(array( a n t s ‘ i a i ( c l e i a t l i a p t t p i S $app-> a n r ‘ i e ( > s e U t p t $ap $app->ge etUserSta g > > = p ’ p e a g $ a u > g = n a ’ l e ‘ ‘languag
Diving in the code of
Joomla
Release 2.5
by Konstantinos Drougkas
PUBLISHING
TEL
cover_joomla.indd 1
ocelotos ocelotos PUBLISHING PUBLISHING
5/12/2013 2:30:50 PM