J3.x:Creating a simple module/Using the Database
Articles in this Series
This is a multiple article series on how to create a module for Joomla! Version . You can navigate the articles in this series by using the navigation drop down menu.
Begin with the Introduction, and navigate the articles in this series by using the navigation button at the bottom or the box to the right (Articles in this series).
Many modules in Joomla require using a database. It is assumed in this tutorial that you already understand the basics of using the JDatabase class. If you don't please read the documentation on accessing the database using JDatabase before continuing this tutorial.
Creating a table on install
To create the xml table on install we are going to add the following lines into mod_helloworld.xml:
<install> <sql> <file driver="mysql" charset="utf8">sql/mysql/install.mysql.utf8.sql</file> <file driver="sqlazure" charset="utf8">sql/sqlazure/install.sqlazure.utf8.sql</file> </sql> </install> <uninstall> <sql> <file driver="mysql" charset="utf8">sql/mysql/uninstall.mysql.utf8.sql</file> <file driver="sqlazure" charset="utf8">sql/sqlazure/uninstall.sqlazure.utf8.sql</file> </sql> </uninstall> <update> <schemas> <schemapath type="mysql">sql/mysql/updates</schemapath> <schemapath type="sqlazure">sql/sqlazure/updates</schemapath> </schemas> </update>
There are 3 sections to this code:
- The install tag adds the database table.
- The uninstall tag removes the database table if the module is uninstalled. Note that not all modules will want to use this feature (and it's not required).
- The update tag will update the databases if a database needs to be amended when updating the module.
Next you should specify the folder tag in the files section to ensure that the sql files are copied from your installation zip package:
Note that we have both schemas for MySQL and Microsoft SQL - again you can choose to tailor your module for one or both of these systems.
In this example we will just show the example files for the MySQL database. Creating the Microsoft SQL Server will be left as an exercise for the reader.
In our install.mysql.utf8.sql file we will create the table and place some hellos into it.
CREATE TABLE IF NOT EXISTS `#__helloworld` ( `id` int(10) NOT NULL AUTO_INCREMENT, `hello` text NOT NULL, `lang` varchar(25) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=INNODB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1; INSERT INTO `#__helloworld` (`hello`, `lang`) VALUES ('Hello World', 'en-GB'); INSERT INTO `#__helloworld` (`hello`, `lang`) VALUES ('Hola Mundo', 'es-ES'); INSERT INTO `#__helloworld` (`hello`, `lang`) VALUES ('Bonjour tout le monde', 'fr-FR');
In the uninstall file we'll just remove the table.
DROP TABLE IF EXISTS `#__helloworld`
Finally we'll just leave a placeholder in the updates file. There is an SQL file for each component version. Each file name must match the version string in the manifest file for that version. Joomla uses this string to determine which SQL files(s) to execute, and in what order they will be executed.
Important Note: These files are also used to set the version number in the #__schemas table. This version number must be present in the current version of the component in order for the new SQL files to be run during the update. For example, if you have version 1.0 and are updating to version 1.1, the 1.1.sql file will not be executed if there was no 1.0.sql file in the 1.0 release. For this reason, it is good practice to have a SQL update file for each version, even if there is no SQL change in that version.
# Placeholder file for database changes for version 1.0.0
Making the request in the helper file
Now on installing our module we should find that there is a helloworld database set up in our database schema with our hello's in. We must now retrieve this from the database to display to the user. We will now amend the getHello function we placed in the helper file in the last part.
For now we'll ignore using form fields to choose a hello and just retrieve the English shout.
// Obtain a database connection $db = JFactory::getDbo(); // Retrieve the shout $query = $db->getQuery(true) ->select($db->quoteName('hello')) ->from($db->quoteName('#__helloworld')) ->where('lang = ' . $db->Quote('en-GB')); // Prepare the query $db->setQuery($query); // Load the row. $result = $db->loadResult(); // Return the Hello return $result;
Using modules with database connections for Joomla! is a fairly simple, straightforward process. Using the techniques described in this tutorial, a lot of modules can be developed with little hassle, with updates easy to manage.