Part 7 of J3.x:Developing an MVC Component/Usare il Database
From Joomla! Documentation
< J3.x:Developing an MVC Component
Articles in This Series
- Introduction
- Developing a Basic Component
- Adding a View to the Site Part
- Adding a Menu Type to the Site Part
- Adding a Model to the Site Part
- Adding a Variable Request in the Menu Type
- Using the Database
- Basic Backend
- Adding Language Management
- Adding Backend Actions
- Adding Decorations to the Backend
- Adding Verifications
- Adding Categories
- Adding Configuration
- Adding ACL
- Adding an Install/Uninstall/Update Script File
- Adding a Frontend Form
- Adding an Image
- Adding a Map
- Adding AJAX
- Adding an Alias
- Using the Language Filter Facility
- Adding a Modal
- Adding Associations
- Adding Checkout
- Adding Ordering
- Adding Levels
- Adding Versioning
- Adding Tags
- Adding Access
- Adding a Batch Process
- Adding Cache
- Adding a Feed
- Adding an Update Server
- Adding Custom Fields
- Upgrading to Joomla4
This is a multiple-article series of tutorials on how to develop a Model-View-Controller Component for Joomla! Version.
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 (the Articles in this series).
Introduzione
Questo tutorial fa parte di Sviluppo di un componente MVC per Joomla! 3.3 tutorial. Ti invitiamo a leggere le parti precedenti del tutorial prima di leggere questo. Inoltre, mentre fai questa parte sei anche incoraggiato a leggere di più sulle query del database, selezionando i dati da una tabella di database e recuperandoli in diversi formati herei.
Ci sono anche 3 video associati a questo passaggio nel tutorial, che coprono l'impostazione del database, rKEHDeFGlGM Visualizzazione del messaggio (usando JTable) e Selezione del messaggio di amministrazione (e JDatabase).
Utilizzo del database
I componenti di solito gestiscono i propri contenuti utilizzando il database. Durante la fase di installazione/disinstallazione/aggiornamento di un componente, è possibile eseguire query SQL tramite l'utilizzo di file di testo SQL.
Con il tuo file manager ed editor preferito crea due file chiamati admin/sql/install.mysql.utf8.sql e admin/sql/updates/mysql/0.0.6.sql . Dovrebbero avere entrambi lo stesso contenuto, come segue:
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,
`published` tinyint(4) NOT NULL DEFAULT '1',
PRIMARY KEY (`id`)
)
ENGINE =MyISAM
AUTO_INCREMENT =0
DEFAULT CHARSET =utf8;
INSERT INTO `#__helloworld` (`greeting`) VALUES
('Hello World!'),
('Good bye World!');
Nota. Oggi Joomla consiglia di specificare
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 DEFAULT COLLATE=utf8mb4_unicode_ci;
invece di quello che c'è sopra. InnoDB è il motore di database MySQL più moderno (e ora predefinito), che sostituisce MyISAM e utf8mb4 supporta una gamma più ampia di set di caratteri, inclusi gli emoji. Tuttavia, non ho testato tutti i passaggi del tutorial con questa impostazione, quindi se lo usi e segui la serie completa di tutorial e non trovi problemi, considera l'aggiornamento di questo file e dove si verifica in altri passaggi del tutorial.
Nota anche che se guardi un database Joomla molte delle tabelle chiave del database hanno un campo chiamato "titolo" per il tipo di informazioni che stiamo memorizzando nel nostro campo "saluto". In genere è consigliabile seguire il modello Joomla e utilizzare "titolo" come nome del campo, poiché quando proviamo a utilizzare funzionalità più complesse (come ACL e associazioni) alcune delle routine javascript principali di Joomla che vogliamo riutilizzare si aspettano un "titolo" ' campo per essere presente. (Qualcosa da considerare di cambiare al prossimo aggiornamento di questa serie di tutorial).
Spesso scoprirai che la tabella del database ha un campo per tenere traccia dello stato pubblicato/non pubblicato di un elemento. L'utilizzo del nome 'stato' all'interno di Joomla non è consigliato in quanto può portare a conflitti, viene invece utilizzato il nome 'pubblicato'.
Nota: come dire a Joomla di memorizzare il valore del campo modulo pubblicato in un campo del database dei nomi diverso? Lo facciamo usando il metodo setColumnAlias() (dal 3.4.0).
Il file install.mysql.utf8.sql verrà eseguito quando installi questo componente. Il file 0.0.6.sql viene eseguito quando si esegue un aggiornamento.
Questo è il file di installazione. Verrà eseguito se inserisci un ordine appropriato nel file helloworld.xml.
Nota importante: Quando si salvano i file SQL in utf8, assicurarsi di salvarli come utf8 NOT BOM o la query fallirà con l'errore MySQL #1064.
helloworld.xml
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="3.0" method="upgrade">
<name>Hello World!</name>
<!-- The following elements are optional and free of formatting constraints -->
<creationDate>January 2018</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 since J2.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 link='index.php?option=com_helloworld'>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>
Fai lo stesso per il file di disinstallazione:
Con il tuo file manager ed editor preferito inserisci un file admin/sql/uninstall.mysql.utf8.sql contenente:
admin/sql/uninstall.mysql.utf8.sql
DROP TABLE IF EXISTS `#__helloworld`;
Numerazione dello schema
Il tuo componente ha un numero di versione (che è specificato all'interno del tag <version> nel tuo file manifest helloword.xml) e lo schema del database del tuo componente ha il suo numero di versione (che si basa sui nomi dei file di i file di aggiornamento sql).
Joomla tiene traccia della versione dello schema del database del tuo componente attraverso un record nella sua tabella #__schemas. Quindi, quando installi per la prima volta un componente, se c'è un file chiamato, ad esempio, admin/sql/updates/mysql/0.0.6.sql, Joomla memorizzerà il valore 0.0.6< /tt> registra il suo schema.
La prossima volta che installi una versione più recente di questo componente - non deve essere la versione successiva, puoi saltare le versioni - Joomla farà quanto segue:
* recupererà l'ultima versione dello schema del database del componente dalla sua tabella #__schemas, quindi potrebbe trovare nel nostro esempio il valore 0,0.6. * otterrà i nomi di tutti i file nella directory admin/sql/updates/mysql/ e li organizzerà in ordine numerico crescente. * elaborerà in ordine i file di aggiornamento che hanno nomi di file numericamente successivi alla versione corrente dello schema, quindi potrebbe trovare file chiamati 0.0.7.sql, 0.0.9.sql e 0.0.10.sql ed elaborarli in ordine. * aggiornerà il record degli schemi per avere il numero dell'ultimo file di aggiornamento che ha elaborato - es. 0.0.10.
Se hai già rilasciato versioni del tuo componente quando introduci l'uso del database, come abbiamo simulato in questa serie di tutorial, il tuo primo file di aggiornamento deve avere esattamente lo stesso contenuto del file di installazione. In caso contrario, dovrebbe essere vuoto.
Sebbene possa essere una buona idea mantenere i due numeri di versione in ordine, non è necessario. Joomla prende la versione dello schema dal nome dell'ultimo file di aggiornamento numericamente. Ecco perché si consiglia di disporre di un file di aggiornamento iniziale, anche se vuoto. Se vuoi mantenere i tuoi numeri di schema al passo con i numeri di versione del componente quando aggiorni il tuo codice ma non lo schema del database, includi semplicemente un file di aggiornamento per andare con il nuovo numero di versione, e anche quel file di aggiornamento sarà vuoto .
Quando si effettuano versioni successive del componente, il file di installazione del database deve sempre contenere lo schema completo ei file di aggiornamento devono contenere solo le modifiche apportate allo schema dall'ultimo aggiornamento.
Aggiunta di un nuovo tipo di campo
Per il momento, abbiamo usato un tipo di campo hardcoded per i messaggi. Dobbiamo usare il nostro database per scegliere il messaggio, e per questo dobbiamo definire un tipo di campo personalizzato (che chiamiamo helloworld di seguito) come descritto here.
Modifica il file site/views/helloworld/tmpl/default.xml e inserisci queste righe
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 nuovo tipo di campo e dice a Joomla di cercare la definizione del campo nella cartella /administrator/components/com_helloworld/models/fields.
Per saperne di più sulle query del database, selezionando i dati da una tabella di database e recuperandoli in diversi formati clicca qui. Con il tuo file manager ed editor preferito inserisci un file admin/models/fields/helloworld.php contenente:
admin/models/fields/helloworld.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
JFormHelper::loadFieldClass('list');
/**
* HelloWorld Form Field class for the HelloWorld component
*
* @since 0.0.1
*/
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;
}
}
Il nuovo tipo di campo visualizza un elenco a discesa di messaggi tra cui scegliere. Puoi vedere il risultato di questa modifica nella sezione del menu manager per l'elemento helloworld.
Visualizza il messaggio scelto
Quando una voce di menu di questo componente viene creata/aggiornata, Joomla memorizza l'identificatore del messaggio. Il modello HelloWorldModelHelloWorld deve ora calcolare il messaggio in base a questo identificatore e ai dati memorizzati nel database. Per fare ciò si utilizza la funzionalità JTable, che è un'alternativa a JDatabase se sono richieste solo operazioni CRUD su singoli record.
Modifica il file site/models/helloworld.php:
site/models/helloworld.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
/**
* HelloWorld Model
*
* @since 0.0.1
*/
class HelloWorldModelHelloWorld extends JModelItem
{
/**
* @var array messages
*/
protected $messages;
/**
* Method to get a table object, load it if necessary.
*
* @param string $type The table name. Optional.
* @param string $prefix The class prefix. Optional.
* @param array $config Configuration array for model. Optional.
*
* @return JTable A JTable object
*
* @since 1.6
*/
public function getTable($type = 'HelloWorld', $prefix = 'HelloWorldTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
/**
* Get the message
*
* @param integer $id Greeting Id
*
* @return string Fetched String from Table for relevant Id
*/
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];
}
}
Il modello ora chiede a TableHelloWorld di ricevere il messaggio. Questa classe di tabella deve essere definita nel file admin/tables/helloworld.php
admin/tables/helloworld.php
<?php
/**
* @package Joomla.Administrator
* @subpackage com_helloworld
*
* @copyright Copyright (C) 2005 - 2018 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
// No direct access
defined('_JEXEC') or die('Restricted access');
/**
* Hello Table class
*
* @since 0.0.1
*/
class HelloWorldTableHelloWorld extends JTable
{
/**
* Constructor
*
* @param JDatabaseDriver &$db A database connector object
*/
function __construct(&$db)
{
parent::__construct('#__helloworld', 'id', $db);
}
}
Non dovresti vedere differenze, ma se accedi al database dovresti vedere una tabella chiamata jos_helloworld con due colonne: id e saluto. E due voci: Hello World! e Good bye World.
Assemblaggio del componente
Contenuto della directory del tuo codice
- helloworld.xml
- site/helloworld.php
- site/index.html
- 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
Crea un file compresso di questa directory o scarica direttamente l'archive e installalo utilizzando il gestore di estensioni di Joomla. Puoi aggiungere una voce di menu di questo componente utilizzando il menu manager nel backend.
Si prega di creare una richiesta pull o un problema su https://github.com/joomla/Joomla-3.2-Hello-World-Component per eventuali discrepanze di codice o se si modifica il codice sorgente in questa pagina.
Collaboratori