Usando la base de datos
Los componentes, por lo general, gestionan sus contenidos mediante la base de datos. Durante la fase de instalación/desinstalación/actualización de un componente, puedes ejecutar consultas SQL mediante el uso de ficheros SQL.
Con tu gestor y editor de archivos favorito, crea dos archivos llamadosadmin/sql/install.mysql.utf8.sql y admin/sql/updates/mysql/0.0.6.sql. Ambos deberían tener el mismo contenido, como sigue:
admin/sql/install.mysql.utf8.sql
and admin/sql/updates/mysql/0.0.6.sql
DROP TABLE IF EXISTS `#__helloworld`; CREATE TABLE `#__helloworld` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `greeting` VARCHAR(25) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; INSERT INTO `#__helloworld` (`greeting`) VALUES ('Hello World!'), ('Good bye World!');
El archivo install.mysql.utf8.sql se ejecutará cuando instales este componente. El fichero 0.0.6.sql se ejecutará cuando hagas una actualización.
Nota importante: Cuando se instale el componente, los archivos en el directorio de actualizaciones SQL (por ejemplo, admin/sql/updates/mysql) serán leidos y el nombre del último fichero alfabeticamente será utilizando para rellenar el número de la versión del componente en la tabla #__schemas. Este valor debe estar en la tabla para que la actualización automática ejecute los archivos SQL en versiones futuras. Por esta razón, es una buena práctica crear un fichero de actualización SQL para cada versión. (aunque sea vacío o con un simple comentario). De esta forma la versión de #__schemas siempre coincidirá con la versión del componente.
Nota Importante: Cuando se guardan los archivos SQL en utf8, asegurate de guardarlos como utf8 NO BOM o la consulta fallará con error MySQL #1064.
Este es el fichero de instalación. Se ejecutará si pones la orden apropiada en el fichero helloworld.xml
helloworld.xml
<?xml version="1.0" encoding="utf-8"?> <extension type="component" version="2.5.0" method="upgrade"> <name>Hello World!</name> <!-- The following elements are optional and free of formatting constraints --> <creationDate>November 2009</creationDate> <author>John Doe</author> <authorEmail>john.doe@example.org</authorEmail> <authorUrl>http://www.example.org</authorUrl> <copyright>Copyright Info</copyright> <license>License Info</license> <!-- The version string is recorded in the components table --> <version>0.0.6</version> <!-- The description is optional and defaults to the name --> <description>Description of the Hello World component ...</description> <install> <!-- Runs on install --> <sql> <file driver="mysql" charset="utf8">sql/install.mysql.utf8.sql</file> </sql> </install> <uninstall> <!-- Runs on uninstall --> <sql> <file driver="mysql" charset="utf8">sql/uninstall.mysql.utf8.sql</file> </sql> </uninstall> <update> <!-- Runs on update; New in 2.5 --> <schemas> <schemapath type="mysql">sql/updates/mysql</schemapath> </schemas> </update> <!-- Site Main File Copy Section --> <!-- Note the folder attribute: This attribute describes the folder to copy FROM in the package to install therefore files copied in this section are copied from /site/ in the package --> <files folder="site"> <filename>index.html</filename> <filename>helloworld.php</filename> <filename>controller.php</filename> <folder>views</folder> <folder>models</folder> </files> <administration> <!-- Administration Menu Section --> <menu>Hello World!</menu> <!-- Administration Main File Copy Section --> <!-- Note the folder attribute: This attribute describes the folder to copy FROM in the package to install therefore files copied in this section are copied from /admin/ in the package --> <files folder="admin"> <!-- Admin Main File Copy Section --> <filename>index.html</filename> <filename>helloworld.php</filename> <!-- SQL files section --> <folder>sql</folder> <!-- tables files section --> <folder>tables</folder> <!-- models files section --> <folder>models</folder> </files> </administration> </extension>
Haz lo mismo para el fichero uninstall:
Crea el fichero admin/sql/uninstall.mysql.utf8.sql con el siguiente contenido:
admin/sql/uninstall.mysql.utf8.sql
DROP TABLE IF EXISTS `#__helloworld`;
Añadiendo un nuevo tipo de campo
Por el momento, hemos utilizado un campo hardcodeado para los mensajes. Necesitamos utilizar la base de datos para habilitar un campo de selección donde elegir el mensaje que queremos mostrar.
Modifica el fichero site/views/helloworld/tmpl/default.xml y añade estas lineas
site/views/helloworld/tmpl/default.xml
<?xml version="1.0" encoding="utf-8"?> <metadata> <layout title="COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_TITLE"> <message>COM_HELLOWORLD_HELLOWORLD_VIEW_DEFAULT_DESC</message> </layout> <fields name="request" addfieldpath="/administrator/components/com_helloworld/models/fields" > <fieldset name="request"> <field name="id" type="helloworld" label="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_LABEL" description="COM_HELLOWORLD_HELLOWORLD_FIELD_GREETING_DESC" /> </fieldset> </fields> </metadata>
Introduce un nuevo tipo de campo y le dice a Joomla que busque la definición del campo en el directorio /administrator/components/com_helloworld/models/fields folder.
Crea el fichero admin/models/fields/helloworld.php file con el siguiente contenido:
admin/models/fields/helloworld.php
<?php // No direct access to this file defined('_JEXEC') or die; // import the list field type jimport('joomla.form.helper'); JFormHelper::loadFieldClass('list'); /** * HelloWorld Form Field class for the HelloWorld component */ class JFormFieldHelloWorld extends JFormFieldList { /** * The field type. * * @var string */ protected $type = 'HelloWorld'; /** * Method to get a list of options for a list input. * * @return array An array of JHtml options. */ protected function getOptions() { $db = JFactory::getDBO(); $query = $db->getQuery(true); $query->select('id,greeting'); $query->from('#__helloworld'); $db->setQuery((string)$query); $messages = $db->loadObjectList(); $options = array(); if ($messages) { foreach($messages as $message) { $options[] = JHtml::_('select.option', $message->id, $message->greeting); } } $options = array_merge(parent::getOptions(), $options); return $options; } }
El nuevo tipo de campo muestra una lista de selección de donde elegir. Puedes ver el resultado de este cambio en la sección del gestor de menú para el elemento helloworld.
Muestra el mensaje seleccionado
Cuando un elemento de menú de este componente se crea o actualiza, Joomla guarda el identificador del mensaje. El modelo HelloWorldModelHelloWorld tiene que computar el mensaje de acuerdo a este identificador y la información se guarda en la base de datos.
Modifica el fichero site/models/helloworld.php:
site/models/helloworld.php
<?php // No direct access to this file defined('_JEXEC') or die('Restricted access'); // import Joomla modelitem library jimport('joomla.application.component.modelitem'); /** * HelloWorld Model */ class HelloWorldModelHelloWorld extends JModelItem { /** * @var array messages */ protected $messages; /** * Returns a reference to the a Table object, always creating it. * * @param type The table type to instantiate * @param string A prefix for the table class name. Optional. * @param array Configuration array for model. Optional. * @return JTable A database object * @since 2.5 */ public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array()) { return JTable::getInstance($type, $prefix, $config); } /** * Get the message * @param int The corresponding id of the message to be retrieved * @return string The message to be displayed to the user */ public function getMsg($id = 1) { if (!is_array($this->messages)) { $this->messages = array(); } if (!isset($this->messages[$id])) { //request the selected id $jinput = JFactory::getApplication()->input; $id = $jinput->get('id', 1, 'INT' ); // Get a TableHelloWorld instance $table = $this->getTable(); // Load the message $table->load($id); // Assign the message $this->messages[$id] = $table->greeting; } return $this->messages[$id]; } }
Este modelo ahora solicita a TableHelloWorld que recupere el mensaje. Eseta clase Table tiene que ser definida en el fichero admin/tables/helloworld.php
admin/tables/helloworld.php
<?php // No direct access defined('_JEXEC') or die('Restricted access'); // import Joomla table library jimport('joomla.database.table'); /** * Hello Table class */ class HelloWorldTableHelloWorld extends JTable { /** * Constructor * * @param object Database connector object */ function __construct(&$db) { parent::__construct('#__helloworld', 'id', $db); } }
No deberías ver ninguna diferencia, pero si accedes a la base de datos deberías ver una tabla llamada jos_helloworld con dos columnas: id y greeting. Y dos entradas: Hello World! y Good bye World
Empaquetando el componente
Contenido del directorio:
- helloworld.xml
- site/index.html
- site/helloworld.php
- site/controller.php
- site/views/index.html
- site/views/helloworld/index.html
- site/views/helloworld/view.html.php
- site/views/helloworld/tmpl/index.html
- site/views/helloworld/tmpl/default.xml
- site/views/helloworld/tmpl/default.php
- site/models/index.html
- site/models/helloworld.php
- admin/index.html
- admin/helloworld.php
- admin/sql/index.html
- admin/sql/install.mysql.utf8.sql
- admin/sql/uninstall.mysql.utf8.sql
- admin/sql/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
- admin/sql/updates/mysql/0.0.6.sql
- admin/models/index.html
- admin/models/fields/index.html
- admin/models/fields/helloworld.php
- admin/tables/index.html
- admin/tables/helloworld.php
Create a compressed file of this directory or directly download the archive and install it using the extension manager of Joomla. You can add a menu item of this component using the menu manager in the backend.
Note: site/models/helloworld.php is not up-to-date as mentioned on this page. You need to copy the code yourself.