Model-View-Controller/it: Difference between revisions

From Joomla! Documentation

Created page with "Paradigma MVC"
 
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(58 intermediate revisions by one other user not shown)
Line 1: Line 1:
<noinclude><languages/></noinclude>
<noinclude><languages/></noinclude>
This page describes the [http://en.wikipedia.org/wiki/Model-view-controller Model-View-Controller] design pattern as implemented in Joomla.
<div class="mw-translate-fuzzy">
Questa pagina descrive il paradigma MVC per la progettazione Software [http://en.wikipedia.org/wiki/Model-view-controller Model-View-Controller] implementato in Joomla.
</div>


When Joomla is started to process a request from a user, such as a GET for a particular page, or a POST containing form data, one of the first things that Joomla does is to analyse the URL to determine which component will be responsible for processing the request, and hand control over to that component.
<div class="mw-translate-fuzzy">
Quando Joomla viene avviato per elaborare una richiesta da un utente, come un GET per una determinata pagina o un POST contenente i dati del modulo, una delle prime cose che fa Joomla è analizzare l'URL per determinare quale componente sarà responsabile dell'elaborazione la richiesta e trasferire il controllo a quel componente.
</div>


It will do this by running the entry point component PHP file for that component. So if the component is called com_example, then Joomla will run:
<div class="mw-translate-fuzzy">
* on the front-end site: components/com_example/example.php
Lo farà eseguendo il file PHP del componente nel punto di ingresso per quel componente. Quindi, se il componente si chiama com_esempio, Joomla verrà eseguito:
* on the back-end admin: administrator/components/com_example/example.php
* sul sito front-end: components/com_esempio/esempio.php
* nell'amministratore di back-end: administrator/components/com_esempio/esempio.php
</div>


If you are developing a component then you could actually put all of your component code into those 2 example.php files. However, an advantage of following the Joomla MVC pattern is that you can make full use the Joomla library MVC classes, which greatly reduces the amount of code you need to write.  
<div class="mw-translate-fuzzy">
Se stai sviluppando un componente, potresti effettivamente inserire tutto il codice del tuo componente in quei 2 file "esempio.php". Tuttavia, un vantaggio di seguire il modello Joomla MVC è che puoi sfruttare appieno le classi MVC della libreria Joomla, che riduce notevolmente la quantità di codice che devi scrivere.
</div>


== Joomla MVC Overview ==
== Panoramica Joomla MVC ==


[[File:mvc.jpg|400px|right|Joomla MVC]]
[[File:mvc.jpg|400px|right|Joomla MVC]]


=== Entry Point code ===
<div class="mw-translate-fuzzy">
The main role of the entry point PHP file (example.php for com_example) is to determine which controller to run. It does this based on the <tt>task</tt> parameter (described in more detail later) and involves:
=== Codice punto di ingresso ===
* determining what Controller class should be loaded
Il ruolo principale del file PHP del punto di ingresso (esempio.php per com_esempio) è determinare quale controller eseguire. Lo fa in base al parametro <tt>task</tt> (descritto più dettagliatamente in seguito) che comporta:
* determining where to find the code for that class
* determinare quale classe Controller deve essere caricata
* getting an instance of that class
* determinare dove trovare il codice per quella classe
* calling the appropriate method of that class.  
* ottenere un'istanza di quella classe
* chiamare il metodo appropriato di quella classe.
</div>


=== Controller ===
<div class="mw-translate-fuzzy">
The controller is responsible for analysing the user's request, checking that the user is allowed to perform that action and determining how to satisfy the request. The latter will involve:
=== Titolare ===
* determining which model (or models) will be needed to satisfy the request, and creating an instance of that model
Il responsabile del trattamento è responsabile dell'analisi della richiesta dell'utente, della verifica che l'utente sia autorizzato a eseguire tale azione e determina come soddisfare la richiesta. Quest'ultimo riguarderà:
* making calls to model methods to make any required database updates
* determinare quale modello (o modelli) sarà necessario per soddisfare la richiesta e creare un'istanza di quel modello
* determining which view should be used to present the web page to the user, and creating an instance of that view, or,
* effettuare chiamate ai metodi del modello per effettuare gli aggiornamenti del database richiesti
* if instead the user should receive a redirect to another URL, then determining that redirect URL.
* determinare quale visualizzazione deve essere utilizzata per presentare la pagina Web all'utente e creare un'istanza di tale visualizzazione, oppure,
* se invece l'utente dovesse ricevere un reindirizzamento a un altro URL, determinando quell'URL di reindirizzamento.
</div>


=== View ===
=== Vista ===
The view specifies what should appear on the web page, and collates all the data necessary for outputting the HTTP response.  
La vista specifica cosa dovrebbe apparire sulla pagina Web e raccoglie tutti i dati necessari per l'output della risposta HTTP.


After the controller creates the view instance it calls the view's <tt>setModel()</tt> method and passes the model instance. In this way the view knows which model to use, and calls the model's methods to obtain the data required for returning to the user.
<div class="mw-translate-fuzzy">
Dopo che il controller ha creato l'istanza della vista, chiama il metodo <tt>setModel()</tt> della vista e passa l'istanza del modello. In questo modo la vista sa quale modello utilizzare e chiama i metodi del modello per ottenere i dati necessari per tornare all'utente.
</div>


=== Layout ===
<div class="mw-translate-fuzzy">
The view doesn't output HTML but delegates this to the layout. The layout contains PHP code which runs within the context of the method (usually <tt>display()</tt>) of the view, which means that if the view holds the response data in, for example, <tt>$this->items</tt> then the layout can access that same <tt>$this->items</tt> when it is outputting the HTML.
=== Disposizione ===
La vista non restituisce HTML ma lo delega al layout. Il layout contiene codice PHP che viene eseguito nel contesto del metodo (di solito <tt>display()</tt>) della vista, il che significa che se la vista contiene i dati di risposta, ad esempio, in <tt>$this ->items</tt> quindi il layout può accedere agli stessi <tt>$this->items</tt> quando emette l'HTML.
</div>


Separating the view and layout like this enables another level of flexibility, as you can easily set up a layout override to output the view data using your own preferred HTML.
Separare la vista e il layout in questo modo consente un altro livello di flessibilità, poiché puoi facilmente impostare una sostituzione del layout per generare i dati della vista utilizzando il tuo HTML preferito.
=== Model ===
=== Model ===
The model encapsulates the data used by the component. In most cases this data will come from a database, either the Joomla database, or some external database, but it is also possible for the model to obtain data from other sources, such as via a web services API running on another server. The model is also responsible for updating the database where appropriate. The purpose of the model is to isolate the controller and view from the details of how data is obtained or amended.  
Il modello incapsula i dati utilizzati dal componente. Nella maggior parte dei casi questi dati proverranno da un database, il database Joomla o un database esterno, ma è anche possibile che il modello ottenga dati da altre fonti, ad esempio tramite un'API di servizi Web in esecuzione su un altro server. Il modello è anche responsabile dell'aggiornamento del database, se del caso. Lo scopo del modello è isolare il titolare del trattamento e visualizzare dal dettaglio come i dati vengono ottenuti o modificati.


If the component is displaying a form which is defined in XML using the Joomla Form approach, then the model handles the setting-up and configuration of the Form instance, ready for the layout to output fields using <tt>$form->renderField()</tt> etc.  
<div class="mw-translate-fuzzy">
Se il componente visualizza un modulo definito in XML utilizzando l'approccio Joomla Form, il modello gestisce l'impostazione e la configurazione dell'istanza Form, pronta per il layout per l'output dei campi utilizzando <tt>$form->renderField( )</tt> ecc.
</div>


=== Subsequent Processing ===
=== Elaborazione successiva ===
The output from the component (specifically the HTML output from the layout) is not directly output as the HTTP response, but rather is captured and buffered by Joomla. Once the layout has generated the output, the component hands control back to the Joomla framework which then loads and executes the template. The template combines the output from the component, and any modules that are active on the current page, so that it can be delivered to the browser as a single page.  
L'output del componente (in particolare l'output HTML del layout) non viene emesso direttamente come risposta HTTP, ma viene catturato e memorizzato nel buffer da Joomla. Una volta che il layout ha generato l'output, il componente restituisce il controllo al framework Joomla che quindi carica ed esegue il modello. Il modello combina l'output del componente e tutti i moduli attivi nella pagina corrente, in modo che possa essere consegnato al browser come una singola pagina.


== The HTTP Request <tt>task</tt> parameter ==
<div class="mw-translate-fuzzy">
== Il parametro <tt>task</tt> della richiesta HTTP ==
</div>


Joomla uses the HTTP Request <tt>task</tt> parameter to determine which controller should be used. The <tt>task</tt> parameter can be sent in an HTTP GET or an HTTP POST – in fact, Joomla doesn't really make a distinction between GET and POST parameters – but the <tt>task</tt> parameter is just an ordinary HTTP parameter, nothing special.  
<div class="mw-translate-fuzzy">
Joomla utilizza il parametro HTTP Request <tt>task</tt> per determinare quale controller deve essere utilizzato. Il parametro <tt>task</tt> può essere inviato in un HTTP GET o in un HTTP POST – infatti, Joomla non fa davvero distinzione tra i parametri GET e POST – ma il parametro <tt>task</tt> è solo un normale parametro HTTP, niente di speciale.
</div>


In the core Joomla entry point PHP files you'll almost always see something like:
<div class="mw-translate-fuzzy">
<source lang="php">
Nei file PHP del punto di ingresso principale di Joomla vedrai quasi sempre qualcosa come:
$controller = JControllerLegacy::getInstance('example');
<source lang="php">
$controller->execute(JFactory::getApplication()->input->get('task'));
$ controller = JControllerLegacy::getInstance('esempio');
</source>
$controller->execute(JFactory::getApplication()->input->get('task'));
with 'example' replaced by 'Contact', 'Content', 'Modules' etc.
</source>
con 'esempio' sostituito da 'Contatto', 'Contenuto', 'Moduli' ecc.
</div>


The <tt>getInstance()</tt> method of <tt>JControllerLegacy</tt> (or <tt>BaseController</tt>, as it is now known after Joomla 3.8) is where all the magic happens. It
<div class="mw-translate-fuzzy">
* examines the <tt>task</tt> parameter
Il metodo <tt>getInstance()</tt> di <tt>JControllerLegacy</tt> (o <tt>BaseController</tt>, come è ora noto dopo Joomla 3.8) è dove avviene tutta la magia. Esso
* based on this parameter it decides which controller class to load, and in which file it expects to find that class
* esamina il parametro <tt>task</tt>  
* creates an instance of this controller class (which gets returned from this function)
* in base a questo parametro decide quale classe di controller caricare e in quale file si aspetta di trovare quella classe
* resets the <tt>task</tt> parameter to be the method which should be called.
* crea un'istanza di questa classe controller (che viene restituita da questa funzione)
* reimposta il parametro <tt>task</tt> come metodo che dovrebbe essere chiamato.
</div>


The next line of code (<tt>$controller->execute(JFactory::getApplication()->input->get('task'));</tt>) then calls the execute() method of the controller instance with the parameter which is now the method to run, and the execute method basically runs the passed-in method.  
<div class="mw-translate-fuzzy">
La riga di codice successiva (<tt>$controller->execute(JFactory::getApplication()->input->get('task'));</tt>) quindi chiama il metodo execute() dell'istanza del controller con il parametro che ora è il metodo da eseguire, e il metodo execute esegue fondamentalmente il metodo passato.
</div>


The <tt>task</tt> parameter is of the form x.y, where x represents the controller type and y the method to call. The controller type may be absent in which case the method in controller.php is run. If the controller type is present then one of the controllers in the controllers folder is used. If the <tt>task</tt> parameter is not set at all then the display() method in controller.php is run. The table below lists the possibilities for a component called com_example.
<div class="mw-translate-fuzzy">
Il parametro <tt>task</tt> è della forma xy, dove x rappresenta il tipo di controller e y il metodo da chiamare. Il tipo di controller potrebbe essere assente, nel qual caso viene eseguito il metodo in controller.php. Se il tipo di controller è presente, viene utilizzato uno dei controller nella cartella controllers. Se il parametro <tt>task</tt> non è impostato affatto, viene eseguito il metodo display() in controller.php. La tabella seguente elenca le possibilità per un componente chiamato com_esempio.
</div>


<div class="mw-translate-fuzzy">
{|class="wikitable"
{|class="wikitable"
|'''Form of <tt>task</tt>'''
|'''Form of <tt>task</tt>'''
Line 92: Line 123:
|<tt>display</tt>
|<tt>display</tt>
|}
|}
</div>


The above is true both for the front-end site and the back-end administrator, except that for the administrator it all happens under the <tt>administrator</tt> folder.  
<div class="mw-translate-fuzzy">
Quanto sopra vale sia per il sito front-end che per l'amministratore back-end, tranne per il fatto che per l'amministratore tutto avviene nella cartella <tt>administrator</tt>.
</div>


== Post/Request/Get pattern ==
<div class="mw-translate-fuzzy">
== Pubblica/Richiesta/Richiedi modello ==
</div>


[[File:Post-request-get1.jpg|400px|left]]  
[[File:Post-request-get1.jpg|400px|left]]


Joomla follows the [https://en.wikipedia.org/wiki/Post/Redirect/Get Post/Redirect/Get] pattern, which means that when a user submits a form in an HTTP POST, then rather than Joomla responding to the POST with an HTML page it redirects to another page which the browser will access with an HTTP GET.  
<div class="mw-translate-fuzzy">
Joomla segue il modello [https://en.wikipedia.org/wiki/Post/Redirect/Get Post/Redirect/Get], il che significa che quando un utente invia un modulo in un HTTP POST, piuttosto che Joomla risponde al POST con una pagina HTML reindirizza a un'altra pagina a cui il browser accederà con un HTTP GET.
</div>


This is typified when the administrator displays the Content / Articles page, as shown in the first diagram. The action to be performed is indicated by the <tt>task</tt> parameter, and both it and related data are sent in the POST request. Once the action is performed the next web page to be displayed is defined in the HTTP Redirect.  
<div class="mw-translate-fuzzy">
Questo è caratterizzato quando l'amministratore visualizza la pagina Contenuto/Articoli, come mostrato nel primo diagramma. L'azione da eseguire è indicata dal parametro <tt>task</tt> e sia essa che i relativi dati vengono inviati nella richiesta POST. Una volta eseguita l'azione, la pagina Web successiva da visualizzare viene definita nel reindirizzamento HTTP.
</div>


[[File:Post-request-get2.jpg|400px|right]]  
[[File:Post-request-get2.jpg|400px|right]]


The second diagram depicts the pattern when an administrator edits an article. In this case there is the additional step of displaying the edit form, which again Joomla handles by sending an HTTP Redirect in response to the original request to edit an article. (At point 3 Joomla (in the BaseDatabaseModel) stores an "edit id" in the session and component controllers check this id at point 4, to ensure that user's can't just specify the URL of the form directly, without going through point 3).
<div class="mw-translate-fuzzy">
Il secondo diagramma illustra il modello quando un amministratore modifica un articolo. In questo caso c'è il passaggio aggiuntivo di visualizzare il modulo di modifica, che ancora una volta Joomla gestisce inviando un reindirizzamento HTTP in risposta alla richiesta originale di modificare un articolo. (Al punto 3 Joomla (in BaseDatabaseModel) memorizza un "ID di modifica" nella sessione e i controller dei componenti controllano questo ID al punto 4, per assicurarsi che gli utenti non possano semplicemente specificare l'URL del modulo direttamente, senza passare dal punto 3 ).
</div>


The red numbers in green circles in the diagram refer to the different types of HTTP request which Joomla is handling, and we'll see in the next section that different Joomla MVC classes have been defined to cater for these 5 cases.
<div class="mw-translate-fuzzy">
I numeri rossi nei cerchi verdi nel diagramma si riferiscono ai diversi tipi di richieste HTTP che Joomla sta gestendo, e vedremo nella prossima sezione che sono state definite diverse classi MVC di Joomla per soddisfare questi 5 casi.
</div>
 
<div class="mw-translate-fuzzy">
== Classi Joomla MVC ==
Ci sono diverse classi MVC della libreria Joomla in librerie/src/MVC e questa sezione mira a fornire una panoramica di queste classi e spiegare quando il tuo componente dovrebbe utilizzare ciascuna classe.  Non tenta di fornire una descrizione completa delle funzionalità di ciascuna classe.
=== Classi Base MVC ===
Le 3 classi base MVC sono BaseController (precedentemente chiamato JControllerLegacy), HtmlView (precedentemente chiamato JViewLegacy) e BaseDatabaseModel (precedentemente chiamato JModelLegacy).
La funzionalità all'interno di BaseController include:
* i metodi getInstance() ed execute() descritti sopra, che insieme trovano il controller del componente ed eseguono il metodo appropriato, il tutto basato sul valore del parametro <tt>task</tt>.
* funzioni per trovare la classe di visualizzazione appropriata da utilizzare (basata sull'impostazione del parametro <tt>view</tt> all'interno della richiesta HTTP) e dove cercare il file PHP che dovrebbe contenere questa classe.
* eseguendo il file PHP della classe e creando un'istanza della vista
* utilizzando il metodo <tt>BaseDatabaseModel::getInstance()</tt> per ottenere un'istanza del modello associata alla vista utilizzata
* il metodo display() predefinito, che ottiene le istanze delle classi view e model (incluso fornendo all'istanza view un collegamento all'istanza del modello), e quindi chiama il metodo display() della classe view.
La classe HtmlView include:
* il metodo <tt>display()</tt>, che esegue il file di layout
* codice per trovare il file di layout, tenendo conto di una sostituzione del layout che potrebbe essere stata inserita nella struttura della cartella del modello
* codice per impostare l'istanza del modello e successivamente recuperarla
* un metodo <tt>get()</tt> generico che quando chiamato come <tt>get("qualcosa")</tt> lo converte in una chiamata sul modello <tt>$model->getSomething() </tt>.
Il BaseDatabaseModel contiene:
* il metodo statico <tt>getInstance()</tt> che trova il file PHP contenente il codice per il modello, lo esegue e restituisce un'istanza della classe del modello.
* codice per ottenere un'istanza della classe Table che gestirà l'interfaccia alla tabella del database sottostante per questo componente.
* codice di base per la creazione di uno "stato" del modello.  Questa funzionalità è utile se il componente e/o più moduli visualizzati nella pagina Web utilizzano tutti gli stessi dati di base.  In questo caso possono condividere la stessa istanza del modello e lo "stato" del modello agisce come un contenitore per condividere i valori degli elementi nel componente e nei moduli.
In generale, l'utilizzo delle classi base è una buona opzione se il componente visualizza un singolo elemento su una pagina del sito.
</div>


== Joomla MVC Classes ==
There are several Joomla library MVC classes under libraries/src/MVC and this section aims to give an overview of these classes and explain when your own component should use each class. It doesn't attempt to provide a full description of each class's functionality.
=== MVC Base Classes ===
The 3 MVC base classes are BaseController (previously called JControllerLegacy), HtmlView (previously called JViewLegacy) and BaseDatabaseModel (previously called JModelLegacy).
The functionality within BaseController includes:
* the getInstance() and execute() methods described above, which together find the component controller and run the appropriate method, all based on the value of the <tt>task</tt> parameter.
* functions for finding the appropriate view class to use (based on the setting of the <tt>view</tt> parameter within the HTTP request), and where to look for the PHP file which should contain this class.
* running the class PHP file, and creating an instance of the view
* using the <tt>BaseDatabaseModel::getInstance()</tt> method to obtain an instance of the model which is associated with the view being used
* the default display() method, which gets instances of the view and model classes (including providing the view instance with a link to the model instance), and then calls the display() method of the view class.
The HtmlView class includes:
The HtmlView class includes:
* the <tt>display()</tt> method, which runs the layout file
* the ''display()'' method, which runs the layout file
* code for finding the layout file, taking into account a layout override which may have been put into the template folder structure
* code for finding the layout file, taking into account a layout override which may have been put into the template folder structure
* code for setting the model instance, and subsequently retrieving it
* code for setting the model instance, and subsequently retrieving it
* a general purpose <tt>get()</tt> method which when called like <tt>get("something")</tt> converts it into a call on the model <tt>$model->getSomething()</tt>.
* a general purpose ''get()'' method which when called like ''get("something")'' converts it into a call on the model ''$model->getSomething()''.
 
The BaseDatabaseModel contains:
The BaseDatabaseModel contains:
* the static <tt>getInstance()</tt> method which finds the PHP file containing the code for the model, runs it, and returns an instance of the model class.
* the static ''getInstance()'' method which finds the PHP file containing the code for the model, runs it, and returns an instance of the model class.
* code for getting an instance of the Table class which will handle the interface to the underlying database table for this component.
* code for getting an instance of the Table class which will handle the interface to the underlying database table for this component.
* base code for creating a model "state". This feature is useful if the component and/or several modules shown on the web page all use the same base data. In this case they may share the same model instance and the model "state" acts like a container for sharing the values of items across the component and modules.  
* base code for creating a model "state". This feature is useful if the component and/or several modules shown on the web page all use the same base data. In this case they may share the same model instance and the model "state" acts like a container for sharing the values of items across the component and modules.
In general, using the base classes is a good option if your component is displaying a single item on a site page.
 
In general, using base classes is a good option if your component is displaying a single item on a site page.


=== Higher-level View Classes ===
<div class="mw-translate-fuzzy">
There are 3 higher-level view classes, all of which inherit directly from the HtmlView base class. The name of the class (and so the name of the PHP file) gives a good indication of its use:
=== Classi di visualizzazione di livello superiore ===
* '''CategoryView''' – for displaying a category and its children
Sono disponibili 3 classi di visualizzazione di livello superiore, che ereditano tutte direttamente dalla classe base HtmlView. Il nome della classe (e quindi il nome del file PHP) dà una buona indicazione del suo utilizzo:
* '''CategoriesView''' – for displaying all the categories at a certain level in the category hierarchy, and the number of items associated with each category
* '''CategoryView''' – per visualizzare una categoria ei suoi figli
* '''CategoryFeedView''' – for generating a feed.  
* '''CategoriesView''' – per visualizzare tutte le categorie a un certo livello nella gerarchia delle categorie e il numero di elementi associati a ciascuna categoria
Using the CategoryView or CategoriesView classes could be useful if you're following the paradigm of how com_content outputs this information on the site, but otherwise probably not so useful.  
* '''CategoryFeedView''' – per generare un feed.  
L'uso delle classi CategoryView o CategoriesView potrebbe essere utile se stai seguendo il paradigma di come com_content restituisce queste informazioni sul sito, ma per il resto probabilmente non è così utile.
</div>


The CategoryFeedView class will help if you're providing a feed, as described in [[J3.x:Developing an MVC Component/Adding a Feed|Adding a Feed]].
Using the CategoryView or CategoriesView classes could be useful if you're following the paradigm of how ''com_content'' outputs this information on the site, but otherwise probably not so useful.


=== Higher-level Controller Classes ===
La classe CategoryFeedView ti aiuterà se stai fornendo un feed, come descritto in
There are 2 higher-level controller classes, each of which inherit from BaseController.  
[[J3.x:Developing an MVC Component/Adding a Feed|Adding a Feed]].


'''AdminController''' contains methods which handle the types of operations that can be performed on multiple items – eg
=== Classi di controllori di livello superiore ===
* delete
Esistono 2 classi di controller di livello superiore, ognuna delle quali eredita da BaseController.
* checking-in
* changing the publishing state
* changing the relative ordering of records
However, note that it doesn't support the operations enabled by the Batch button on eg the Content / Articles page.
The code generally calls the related model method to effect the operation, sets up the message based on the success of the model operation, and sets up the redirect back to the same page. For this reason it's very useful in case 2 shown in the diagrams above in [[Model-View-Controller#Post/Request/Get pattern|Post/Request/Get pattern]].  


The name AdminController suggests that this controller is to be used only on the back-end administrator functionality, however, this is not the case. It's appropriate to use it on the site front-end as well.
<div class="mw-translate-fuzzy">
'''AdminController''' contiene metodi che gestiscono i tipi di operazioni che possono essere eseguite su più elementi, ad es
* eliminare
* check-in
* modifica dello stato di pubblicazione
* modifica dell'ordinamento relativo dei record
Tuttavia, tieni presente che non supporta le operazioni abilitate dal pulsante Batch ad esempio nella pagina Contenuto/Articoli.
Il codice generalmente chiama il metodo del modello correlato per effettuare l'operazione, imposta il messaggio in base al successo dell'operazione del modello e imposta il reindirizzamento alla stessa pagina.  Per questo motivo è molto utile nel caso 2 mostrato nei diagrammi sopra in [[Model-View-Controller#Post/Request/Get pattern|Post/Request/Get pattern]].
</div>
 
However, note that it doesn't support the operations enabled by the Batch button on e.g. the Content/Articles page.
The code generally calls the related model method to effect the operation, sets up the message based on the success of the model operation, and sets up the redirect back to the same page. For this reason it's very useful in case 2 shown in the diagrams above in [[Model-View-Controller#Post/Request/Get pattern|Post/Request/Get pattern]].
 
<div class="mw-translate-fuzzy">
Il nome AdminController suggerisce che questo controller deve essere utilizzato solo sulla funzionalità dell'amministratore back-end, tuttavia non è così.  È opportuno utilizzarlo anche sul front-end del sito.
</div>
 
<div class="mw-translate-fuzzy">
'''FormController''' contiene metodi associati alla modifica di un singolo elemento
* gestione di una richiesta di modifica di un articolo – che implica la verifica che l'utente sia autorizzato a modificare l'articolo e che non sia già stato ritirato e se questi controlli vengono superati, l'articolo viene ritirato (se quel componente ha abilitato il checkout) e viene emesso un reindirizzamento per visualizzare il modulo di modifica
* gestione di una richiesta di aggiunta di un nuovo elemento, che implica la verifica che l'utente sia autorizzato a modificare l'elemento e si traduce in un reindirizzamento per visualizzare un modulo di modifica vuoto
* gestione del salvataggio di un elemento in fase di modifica o creato da nuovo: il codice verifica che l'utente sia autorizzato a eseguire l'operazione e chiama il metodo del modello appropriato per salvare l'elemento nuovo/modificato.
* gestire l'annullamento di una modifica, reindirizzando l'utente alla pagina appropriata (e archiviando il record se necessario).
* gestione delle operazioni avviate tramite il pulsante Batch
Il FormController è quindi adatto ai casi 3 e 5 mostrati nei diagrammi sopra in [[Model-View-Controller#Post/Request/Get pattern|Post/Request/Get pattern]].
</div>


'''FormController''' contains methods which are associated with editing an individual item
* handling a request to edit an item – which involves checking that the user is allowed to edit the item and that it isn't already checked out, and if these checks pass then the item is checked out (if that component has enabled checkout) and a redirect is issued to display the edit form
* handling a request to add a new item – which involves checking that the user is allowed to edit the item and results in a redirect to display a blank edit form
* handling the Save of an item being edited or created from new – the code checks that the user is allowed to perform the operation and calls the appropriate model method to save the new/edited item.
* handling the Cancel of an edit, redirecting the user back to the appropriate page (and checking-in the record if required).
* handling the operations initiated through the Batch button
The FormController is thus well suited to cases 3 and 5 shown in the diagrams above in [[Model-View-Controller#Post/Request/Get pattern|Post/Request/Get pattern]].
The FormController is thus well suited to cases 3 and 5 shown in the diagrams above in [[Model-View-Controller#Post/Request/Get pattern|Post/Request/Get pattern]].


=== Higher-level Model Classes ===
=== Classi di modelli di livello superiore ===
[[File:Model hierarchy.jpg|400px|right]]  
[[File:Model hierarchy.jpg|400px|right]]
 
Il diagramma mostra l'albero di ereditarietà dei modelli MVC della libreria Joomla.


The diagram shows the inheritance tree of the Joomla library MVC models.  
<div class="mw-translate-fuzzy">
'''ItemModel''' è quasi uguale a BaseDatabaseModel;  ha solo un metodo extra <tt>getStoreId()<tt> che è rilevante quando hai un componente e/o più moduli che condividono lo stesso modello e vuoi distinguere tra set di dati rilevanti per ciascuno.
</div>


'''ItemModel''' is almost the same as BaseDatabaseModel; it just has an extra <tt>getStoreId()<tt> method which is relevant when you have a component and/or several modules sharing the same model and you want to distinguish between data sets relevant to each.
<div class="mw-translate-fuzzy">
Oltre a <tt>getStoreId()<tt>, '''ListModel''' ha capacità relative all'ottenimento di una serie di record da visualizzare su una pagina web, incluso il supporto per l'impaginazione.  Si noti che la capacità di impaginazione potrebbe essere ancora leggermente diversa tra il front-end e il back-end – vedere [https://github.com/joomla/joomla-cms/issues/5349 this issue]. Il ListModel è utile per supportare il caso 1 nei diagrammi sopra.
</div>


In addition to <tt>getStoreId()<tt>, '''ListModel''' has capability relating to obtaining a set of records for display on a web page, including support for pagination. Note that the pagination capability may still be slightly different between the front and back ends – see [https://github.com/joomla/joomla-cms/issues/5349 this issue]. The ListModel is useful for supporting case 1 in the above diagrams.
'''FormModel''' include il supporto per i moduli Joomla, sia per impostare il modulo in modo che possa essere visualizzato, sia per convalidare i dati del modulo inviati nel POST. Inoltre, dispone di metodi per implementare il check-in e il check-out dei record del database. Quindi è adatto per gestire i casi 3 e 4 nei diagrammi sopra.


'''FormModel''' includes support for Joomla forms, both for setting up the form so that it can be displayed, and also so that the form data sent in the POST can be validated. In addition, it has methods for implementing checkin and checkout of database records. So it's suitable for handling cases 3 and 4 in the diagrams above.
<div class="mw-translate-fuzzy">
'''AdminModel''' estende FormModel, quindi ha tutte le capacità per la gestione dei moduli, ma ha anche metodi per la gestione degli aggiornamenti del database, inclusa la capacità di aggiungere, aggiornare ed eliminare record, nonché il supporto per la gestione delle operazioni in batch. Quindi è adatto per gestire i casi 2 e 5 nei diagrammi sopra.  Come con AdminController, questo modello non è solo appropriato per la funzionalità dell'amministratore, ma può essere utilizzato anche sul front-end.
</div>


'''AdminModel''' extends FormModel, so it has all the capability for handling forms, but in addition has methods for handling database updates – including capability for adding, updating and deleting records – as well as support for handling operations in batch. So it's suitable for handling cases 2 and 5 in the diagrams above. As with the AdminController, this model is not just appropriate for the administrator functionality, but can be used on the front end as well.
Tuttavia, sebbene FormModel e AdminModel supportino casi diversi nel flusso associati alla modifica di un record, in pratica è comune utilizzare lo stesso modello per tutti i diversi passaggi del flusso. Tutti i componenti principali di Joomla utilizzano lo stesso modello in questi passaggi, quindi estendono tutti AdminModel invece di FormModel.


However, although the FormModel and AdminModel support different cases in the flow associated with editing a record, in practice it's common to use the same model for all the different steps of the flow. All the Joomla core components use the same model across these steps, and so they all extend AdminModel instead of FormModel.
<div class="mw-translate-fuzzy">
Qualcosa da tenere presente se si utilizza lo stesso modello nel flusso di "modifica articolo" è che il codice del modello esegue 2 scopi:
# preparazione dei dati da mostrare su una pagina web
# preparazione di un modulo, da visualizzare su una pagina web o per la convalida dei dati POST
Quando si utilizza il modello perché si sta gestendo un POST (ovvero i casi 3 e 5 nel diagramma), ogni sforzo impiegato nella preparazione dei dati per una pagina Web sarà sprecato.  (Infatti, nella chiamata al metodo FormController <tt>getModel()</tt>, il parametro <tt>$config</tt> è impostato su <tt>array('ignore_request' => true)</tt> per impostazione predefinita, il che comporta che il metodo <tt>populateState</tt> del modello non venga eseguito, forse per risparmiare questo sforzo sprecato).
</div>


Something to be aware of if you are using the same model across the "edit item" flow is that your model code is performing 2 purposes:
When you're using the model because you're handling a POST (i.e. cases 3 and 5 in the diagram) then any effort expended in preparing the data for a web page is going to be wasted. (In fact, in the FormController ''getModel()'' method call, the parameter ''$config'' is set to  ''array('ignore_request' => true)'' by default, which results in the model's ''populateState'' method not being run, perhaps to save this wasted effort.)
# preparing data to be shown on a web page
# preparing a form, either for display on a web page or for validating POST data
When you're using the model because you're handling a POST (ie cases 3 and 5 in the diagram) then any effort expended in preparing the data for a web page is going to be wasted. (In fact, in the FormController <tt>getModel()</tt> method call, the parameter <tt>$config</tt> is set to  <tt>array('ignore_request' => true)</tt> by default, which results in the model's <tt>populateState</tt> method not being run, perhaps to save this wasted effort).


== Summary ==
<div class="mw-translate-fuzzy">
As we've seen Joomla:
== Riepilogo ==
* uses the <tt>task</tt> parameter for defining actions, generally resulting in some sort of database update, and always ending up with a redirect
Come abbiamo visto Joomla:
* doesn't set a  <tt>task</tt> parameter when a web page is to be displayed
* usa il parametro <tt>task</tt> per definire le azioni, che generalmente risultano in una sorta di aggiornamento del database e finiscono sempre con un reindirizzamento
* has rich functionality in higher level controller and model classes which can greatly simplify your code (all of which can be used on both the front end and back end).
* non imposta un parametro <tt>task</tt> quando deve essere visualizzata una pagina web
* ha funzionalità avanzate in controller di livello superiore e classi di modelli che possono semplificare notevolmente il codice (tutti possono essere utilizzati sia sul front-end che sul back-end).
</div>


The choice of which controller and model classes to extend is easier on the back end, because you just follow the pattern of the Joomla core components.
<div class="mw-translate-fuzzy">
La scelta di quali classi di controller e modelli estendere è più facile sul back-end, perché segui semplicemente lo schema dei componenti principali di Joomla.
</div>


For the front end here's a rough guide:
<div class="mw-translate-fuzzy">
Per il front-end ecco una guida approssimativa:
</div>


'''Simply displaying a record or a set of records, without providing the ability to change anything:'''
<div class="mw-translate-fuzzy">
* controller extends BaseController  
'''Semplicemente visualizzare un record o un set di record, senza fornire la possibilità di modificare nulla:'''
* model extends BaseDatabaseModel or (particularly if you're sharing a model between a component and modules) ItemModel if it's a single record, ListModel if it's multiple records.  
* il controller estende BaseController  
* model estende BaseDatabaseModel o (in particolare se stai condividendo un modello tra un componente e moduli) ItemModel se si tratta di un singolo record, ListModel se si tratta di più record.
</div>


'''Displaying a form with multiple records (but the form isn't defined in an XML file), including the providing the ability to select several records and apply some sort of operation to them (eg delete, publish):'''
<div class="mw-translate-fuzzy">
* controller extends BaseController  
'''Visualizzazione di un modulo con più record (ma il modulo non è definito in un file XML), inclusa la possibilità di selezionare più record e applicarvi una sorta di operazione (ad es. eliminazione, pubblicazione):'''
* model extends ListModel – except if you're using the same model for displaying the form and handling the updates, in which case use AdminModel  
* il controller estende BaseController  
* il modello estende ListModel, a meno che non si utilizzi lo stesso modello per visualizzare il modulo e gestire gli aggiornamenti, nel qual caso utilizzare AdminModel
</div>


'''Handling the HTTP POSTs from that form in subcontrollers:'''
<div class="mw-translate-fuzzy">
* controller extends AdminController  
'''Gestire i POST HTTP da quel modulo nei sottocontroller:'''
* model extends AdminModel  
* il controller estende AdminController  
* il modello estende AdminModel
</div>


'''Displaying a form with a single record, where the form is defined in an XML file, and allow the user to edit it, or a blank record and allowing the user to create a record:'''
<div class="mw-translate-fuzzy">
* controller extends BaseController  
'''Visualizzare un modulo con un singolo record, in cui il modulo è definito in un file XML e consentire all'utente di modificarlo, oppure un record vuoto e consentire all'utente di creare un record:'''
* model extends FormModel – except if you're using the same model for displaying the form and handling the updates (as is usually the case), in which case use AdminModel  
* il controller estende BaseController  
* il modello estende FormModel, a meno che tu non stia utilizzando lo stesso modello per visualizzare il modulo e gestire gli aggiornamenti (come di solito accade), nel qual caso usa AdminModel
</div>


'''Handling the HTTP POSTs from that form in subcontrollers:'''
<div class="mw-translate-fuzzy">
* controller extends FormController  
'''Gestire i POST HTTP da quel modulo nei sottocontroller:'''
* model extends AdminModel  
* il controller estende FormController  
* il modello estende AdminModel
</div>


==See Also==
==Vedi anche==
* [[S:MyLanguage/Understanding Output Overrides|Understanding Output Overrides]]
* [[S:MyLanguage/Understanding Output Overrides|Comprensione delle sostituzioni di output]]
* [[S:MyLanguage/Developers|Developers]]
* [[S:MyLanguage/Developers|Developers]]
* [http://api.joomla.org/11.4/Joomla-Platform/Application/JModel.html JModel]
* [https://api.joomla.org/11.4/Joomla-Platform/Application/JModel.html JModel]
* [https://api.joomla.org/cms-3/classes/JModelLegacy.html JModelLegacy {{JVer|2.5}} and newer]
* [https://api.joomla.org/cms-3/classes/JModelLegacy.html JModelLegacy {{JVer|2.5}} e più recente]
* [https://api.joomla.org/cms-3/classes/JModelAdmin.html JModelAdmin {{JVer|2.5}} and newer]
* [https://api.joomla.org/cms-3/classes/JModelAdmin.html JModelAdmin {{JVer|2.5}} e più recente]
* [https://api.joomla.org/cms-3/classes/JModelBase.html JModelBase {{JVer|3.x}}]
* [https://api.joomla.org/cms-3/classes/JModelBase.html JModelBase {{JVer|3.x}}]
* [http://api.joomla.org/11.4/Joomla-Platform/Application/JView.html JView]
* [https://api.joomla.org/11.4/Joomla-Platform/Application/JView.html JView]
* [https://api.joomla.org/cms-3/classes/JViewLegacy.html JViewLegacy {{JVer|2.5}} and newer]
* [https://api.joomla.org/cms-3/classes/JViewLegacy.html JViewLegacy {{JVer|2.5}} e più recente]
* [https://api.joomla.org/cms-3/classes/JViewBase.html JViewBase {{JVer|3.x}}]
* [https://api.joomla.org/cms-3/classes/JViewBase.html JViewBase {{JVer|3.x}}]
* [http://api.joomla.org/11.4/Joomla-Platform/Application/JController.html JController]
* [https://api.joomla.org/11.4/Joomla-Platform/Application/JController.html JController]
* [https://api.joomla.org/cms-3/classes/JControllerForm.html JControllerForm {{JVer|2.5}} and newer]
* [https://api.joomla.org/cms-3/classes/JControllerForm.html JControllerForm {{JVer|2.5}} e più recente]
* [https://api.joomla.org/cms-3/classes/JControllerAdmin.html JControllerAdmin {{JVer|2.5}} and newer]
* [https://api.joomla.org/cms-3/classes/JControllerAdmin.html JControllerAdmin {{JVer|2.5}} e più recente]
* [https://api.joomla.org/cms-3/classes/JControllerBase.html JControllerBase {{JVer|3.x}}]
* [https://api.joomla.org/cms-3/classes/JControllerBase.html JControllerBase {{JVer|3.x}}]


===Component development series===
<span class="mw-translate-fuzzy">===Serie di sviluppo componenti===</span>


[[S:MyLanguage/J4.x:Developing an MVC Component|Developing an MVC Component for Joomla! 4.x]]
[[S:MyLanguage/J4.x:Developing an MVC Component|Sviluppo di un componente MVC per Joomla! 4.x]]


[[S:MyLanguage/J3.x:Developing an MVC Component|Developing an MVC Component for Joomla! 3.x]]
[[S:MyLanguage/J3.x:Developing an MVC Component|Sviluppo di un componente MVC per Joomla! 3.x]]


<noinclude>
<noinclude>

Latest revision as of 12:28, 22 November 2023

Questa pagina descrive il paradigma MVC per la progettazione Software Model-View-Controller implementato in Joomla.

Quando Joomla viene avviato per elaborare una richiesta da un utente, come un GET per una determinata pagina o un POST contenente i dati del modulo, una delle prime cose che fa Joomla è analizzare l'URL per determinare quale componente sarà responsabile dell'elaborazione la richiesta e trasferire il controllo a quel componente.

Lo farà eseguendo il file PHP del componente nel punto di ingresso per quel componente. Quindi, se il componente si chiama com_esempio, Joomla verrà eseguito:

* sul sito front-end: components/com_esempio/esempio.php
* nell'amministratore di back-end: administrator/components/com_esempio/esempio.php

Se stai sviluppando un componente, potresti effettivamente inserire tutto il codice del tuo componente in quei 2 file "esempio.php". Tuttavia, un vantaggio di seguire il modello Joomla MVC è che puoi sfruttare appieno le classi MVC della libreria Joomla, che riduce notevolmente la quantità di codice che devi scrivere.

Panoramica Joomla MVC

Joomla MVC
Joomla MVC

Codice punto di ingresso

Il ruolo principale del file PHP del punto di ingresso (esempio.php per com_esempio) è determinare quale controller eseguire.  Lo fa in base al parametro task (descritto più dettagliatamente in seguito) che comporta:
* determinare quale classe Controller deve essere caricata
* determinare dove trovare il codice per quella classe
* ottenere un'istanza di quella classe
* chiamare il metodo appropriato di quella classe.

Titolare

Il responsabile del trattamento è responsabile dell'analisi della richiesta dell'utente, della verifica che l'utente sia autorizzato a eseguire tale azione e determina come soddisfare la richiesta.  Quest'ultimo riguarderà:
* determinare quale modello (o modelli) sarà necessario per soddisfare la richiesta e creare un'istanza di quel modello 
* effettuare chiamate ai metodi del modello per effettuare gli aggiornamenti del database richiesti
* determinare quale visualizzazione deve essere utilizzata per presentare la pagina Web all'utente e creare un'istanza di tale visualizzazione, oppure,
* se invece l'utente dovesse ricevere un reindirizzamento a un altro URL, determinando quell'URL di reindirizzamento.

Vista

La vista specifica cosa dovrebbe apparire sulla pagina Web e raccoglie tutti i dati necessari per l'output della risposta HTTP.

Dopo che il controller ha creato l'istanza della vista, chiama il metodo setModel() della vista e passa l'istanza del modello. In questo modo la vista sa quale modello utilizzare e chiama i metodi del modello per ottenere i dati necessari per tornare all'utente.

Disposizione

La vista non restituisce HTML ma lo delega al layout.  Il layout contiene codice PHP che viene eseguito nel contesto del metodo (di solito display()) della vista, il che significa che se la vista contiene i dati di risposta, ad esempio, in $this ->items quindi il layout può accedere agli stessi $this->items quando emette l'HTML.

Separare la vista e il layout in questo modo consente un altro livello di flessibilità, poiché puoi facilmente impostare una sostituzione del layout per generare i dati della vista utilizzando il tuo HTML preferito.

=== Model ===
Il modello incapsula i dati utilizzati dal componente.  Nella maggior parte dei casi questi dati proverranno da un database, il database Joomla o un database esterno, ma è anche possibile che il modello ottenga dati da altre fonti, ad esempio tramite un'API di servizi Web in esecuzione su un altro server.  Il modello è anche responsabile dell'aggiornamento del database, se del caso.  Lo scopo del modello è isolare il titolare del trattamento e visualizzare dal dettaglio come i dati vengono ottenuti o modificati.

Se il componente visualizza un modulo definito in XML utilizzando l'approccio Joomla Form, il modello gestisce l'impostazione e la configurazione dell'istanza Form, pronta per il layout per l'output dei campi utilizzando $form->renderField( ) ecc.

Elaborazione successiva

L'output del componente (in particolare l'output HTML del layout) non viene emesso direttamente come risposta HTTP, ma viene catturato e memorizzato nel buffer da Joomla.  Una volta che il layout ha generato l'output, il componente restituisce il controllo al framework Joomla che quindi carica ed esegue il modello.  Il modello combina l'output del componente e tutti i moduli attivi nella pagina corrente, in modo che possa essere consegnato al browser come una singola pagina.

Il parametro task della richiesta HTTP

Joomla utilizza il parametro HTTP Request task per determinare quale controller deve essere utilizzato. Il parametro task può essere inviato in un HTTP GET o in un HTTP POST – infatti, Joomla non fa davvero distinzione tra i parametri GET e POST – ma il parametro task è solo un normale parametro HTTP, niente di speciale.

Nei file PHP del punto di ingresso principale di Joomla vedrai quasi sempre qualcosa come:

 $ controller = JControllerLegacy::getInstance('esempio');
 $controller->execute(JFactory::getApplication()->input->get('task'));
con 'esempio' sostituito da 'Contatto', 'Contenuto', 'Moduli' ecc.

Il metodo getInstance() di JControllerLegacy (o BaseController, come è ora noto dopo Joomla 3.8) è dove avviene tutta la magia. Esso

* esamina il parametro task 
* in base a questo parametro decide quale classe di controller caricare e in quale file si aspetta di trovare quella classe
* crea un'istanza di questa classe controller (che viene restituita da questa funzione)
* reimposta il parametro task come metodo che dovrebbe essere chiamato.

La riga di codice successiva ($controller->execute(JFactory::getApplication()->input->get('task'));) quindi chiama il metodo execute() dell'istanza del controller con il parametro che ora è il metodo da eseguire, e il metodo execute esegue fondamentalmente il metodo passato.

Il parametro task è della forma xy, dove x rappresenta il tipo di controller e y il metodo da chiamare. Il tipo di controller potrebbe essere assente, nel qual caso viene eseguito il metodo in controller.php. Se il tipo di controller è presente, viene utilizzato uno dei controller nella cartella controllers. Se il parametro task non è impostato affatto, viene eseguito il metodo display() in controller.php. La tabella seguente elenca le possibilità per un componente chiamato com_esempio.

Form of task Controller file Controller class Controller method
controllerType.method controllers/controllerType.php ExampleControllerControllerType method
eg items.process controllers/items.php ExampleControllerItems process
method(no controllerType set) controller.php ExampleController method
(task not set) controller.php ExampleController display

Quanto sopra vale sia per il sito front-end che per l'amministratore back-end, tranne per il fatto che per l'amministratore tutto avviene nella cartella administrator.

Pubblica/Richiesta/Richiedi modello

Joomla segue il modello Post/Redirect/Get, il che significa che quando un utente invia un modulo in un HTTP POST, piuttosto che Joomla risponde al POST con una pagina HTML reindirizza a un'altra pagina a cui il browser accederà con un HTTP GET.

Questo è caratterizzato quando l'amministratore visualizza la pagina Contenuto/Articoli, come mostrato nel primo diagramma. L'azione da eseguire è indicata dal parametro task e sia essa che i relativi dati vengono inviati nella richiesta POST. Una volta eseguita l'azione, la pagina Web successiva da visualizzare viene definita nel reindirizzamento HTTP.

Il secondo diagramma illustra il modello quando un amministratore modifica un articolo. In questo caso c'è il passaggio aggiuntivo di visualizzare il modulo di modifica, che ancora una volta Joomla gestisce inviando un reindirizzamento HTTP in risposta alla richiesta originale di modificare un articolo. (Al punto 3 Joomla (in BaseDatabaseModel) memorizza un "ID di modifica" nella sessione e i controller dei componenti controllano questo ID al punto 4, per assicurarsi che gli utenti non possano semplicemente specificare l'URL del modulo direttamente, senza passare dal punto 3 ).

I numeri rossi nei cerchi verdi nel diagramma si riferiscono ai diversi tipi di richieste HTTP che Joomla sta gestendo, e vedremo nella prossima sezione che sono state definite diverse classi MVC di Joomla per soddisfare questi 5 casi.

Classi Joomla MVC

Ci sono diverse classi MVC della libreria Joomla in librerie/src/MVC e questa sezione mira a fornire una panoramica di queste classi e spiegare quando il tuo componente dovrebbe utilizzare ciascuna classe.  Non tenta di fornire una descrizione completa delle funzionalità di ciascuna classe.
=== Classi Base MVC ===
Le 3 classi base MVC sono BaseController (precedentemente chiamato JControllerLegacy), HtmlView (precedentemente chiamato JViewLegacy) e BaseDatabaseModel (precedentemente chiamato JModelLegacy).
La funzionalità all'interno di BaseController include:
* i metodi getInstance() ed execute() descritti sopra, che insieme trovano il controller del componente ed eseguono il metodo appropriato, il tutto basato sul valore del parametro task. 
* funzioni per trovare la classe di visualizzazione appropriata da utilizzare (basata sull'impostazione del parametro view all'interno della richiesta HTTP) e dove cercare il file PHP che dovrebbe contenere questa classe.
* eseguendo il file PHP della classe e creando un'istanza della vista
* utilizzando il metodo BaseDatabaseModel::getInstance() per ottenere un'istanza del modello associata alla vista utilizzata
* il metodo display() predefinito, che ottiene le istanze delle classi view e model (incluso fornendo all'istanza view un collegamento all'istanza del modello), e quindi chiama il metodo display() della classe view.
La classe HtmlView include:
* il metodo display(), che esegue il file di layout
* codice per trovare il file di layout, tenendo conto di una sostituzione del layout che potrebbe essere stata inserita nella struttura della cartella del modello
* codice per impostare l'istanza del modello e successivamente recuperarla
* un metodo get() generico che quando chiamato come get("qualcosa") lo converte in una chiamata sul modello $model->getSomething() .
Il BaseDatabaseModel contiene:
* il metodo statico getInstance() che trova il file PHP contenente il codice per il modello, lo esegue e restituisce un'istanza della classe del modello.
* codice per ottenere un'istanza della classe Table che gestirà l'interfaccia alla tabella del database sottostante per questo componente.
* codice di base per la creazione di uno "stato" del modello.  Questa funzionalità è utile se il componente e/o più moduli visualizzati nella pagina Web utilizzano tutti gli stessi dati di base.  In questo caso possono condividere la stessa istanza del modello e lo "stato" del modello agisce come un contenitore per condividere i valori degli elementi nel componente e nei moduli. 
In generale, l'utilizzo delle classi base è una buona opzione se il componente visualizza un singolo elemento su una pagina del sito.

The HtmlView class includes:

  • the display() method, which runs the layout file
  • code for finding the layout file, taking into account a layout override which may have been put into the template folder structure
  • code for setting the model instance, and subsequently retrieving it
  • a general purpose get() method which when called like get("something") converts it into a call on the model $model->getSomething().

The BaseDatabaseModel contains:

  • the static getInstance() method which finds the PHP file containing the code for the model, runs it, and returns an instance of the model class.
  • code for getting an instance of the Table class which will handle the interface to the underlying database table for this component.
  • base code for creating a model "state". This feature is useful if the component and/or several modules shown on the web page all use the same base data. In this case they may share the same model instance and the model "state" acts like a container for sharing the values of items across the component and modules.

In general, using base classes is a good option if your component is displaying a single item on a site page.

Classi di visualizzazione di livello superiore

Sono disponibili 3 classi di visualizzazione di livello superiore, che ereditano tutte direttamente dalla classe base HtmlView.  Il nome della classe (e quindi il nome del file PHP) dà una buona indicazione del suo utilizzo:
* CategoryView – per visualizzare una categoria ei suoi figli
* CategoriesView – per visualizzare tutte le categorie a un certo livello nella gerarchia delle categorie e il numero di elementi associati a ciascuna categoria
* CategoryFeedView – per generare un feed. 
L'uso delle classi CategoryView o CategoriesView potrebbe essere utile se stai seguendo il paradigma di come com_content restituisce queste informazioni sul sito, ma per il resto probabilmente non è così utile.

Using the CategoryView or CategoriesView classes could be useful if you're following the paradigm of how com_content outputs this information on the site, but otherwise probably not so useful.

La classe CategoryFeedView ti aiuterà se stai fornendo un feed, come descritto in Adding a Feed.

Classi di controllori di livello superiore

Esistono 2 classi di controller di livello superiore, ognuna delle quali eredita da BaseController.

AdminController contiene metodi che gestiscono i tipi di operazioni che possono essere eseguite su più elementi, ad es

* eliminare
* check-in 
* modifica dello stato di pubblicazione
* modifica dell'ordinamento relativo dei record
Tuttavia, tieni presente che non supporta le operazioni abilitate dal pulsante Batch ad esempio nella pagina Contenuto/Articoli. 
Il codice generalmente chiama il metodo del modello correlato per effettuare l'operazione, imposta il messaggio in base al successo dell'operazione del modello e imposta il reindirizzamento alla stessa pagina.  Per questo motivo è molto utile nel caso 2 mostrato nei diagrammi sopra in Post/Request/Get pattern.

However, note that it doesn't support the operations enabled by the Batch button on e.g. the Content/Articles page. The code generally calls the related model method to effect the operation, sets up the message based on the success of the model operation, and sets up the redirect back to the same page. For this reason it's very useful in case 2 shown in the diagrams above in Post/Request/Get pattern.

Il nome AdminController suggerisce che questo controller deve essere utilizzato solo sulla funzionalità dell'amministratore back-end, tuttavia non è così. È opportuno utilizzarlo anche sul front-end del sito.

FormController contiene metodi associati alla modifica di un singolo elemento

* gestione di una richiesta di modifica di un articolo – che implica la verifica che l'utente sia autorizzato a modificare l'articolo e che non sia già stato ritirato e se questi controlli vengono superati, l'articolo viene ritirato (se quel componente ha abilitato il checkout) e viene emesso un reindirizzamento per visualizzare il modulo di modifica
* gestione di una richiesta di aggiunta di un nuovo elemento, che implica la verifica che l'utente sia autorizzato a modificare l'elemento e si traduce in un reindirizzamento per visualizzare un modulo di modifica vuoto
* gestione del salvataggio di un elemento in fase di modifica o creato da nuovo: il codice verifica che l'utente sia autorizzato a eseguire l'operazione e chiama il metodo del modello appropriato per salvare l'elemento nuovo/modificato.
* gestire l'annullamento di una modifica, reindirizzando l'utente alla pagina appropriata (e archiviando il record se necessario).
* gestione delle operazioni avviate tramite il pulsante Batch
Il FormController è quindi adatto ai casi 3 e 5 mostrati nei diagrammi sopra in Post/Request/Get pattern.

The FormController is thus well suited to cases 3 and 5 shown in the diagrams above in Post/Request/Get pattern.

Classi di modelli di livello superiore

Il diagramma mostra l'albero di ereditarietà dei modelli MVC della libreria Joomla.

ItemModel è quasi uguale a BaseDatabaseModel; ha solo un metodo extra getStoreId() che è rilevante quando hai un componente e/o più moduli che condividono lo stesso modello e vuoi distinguere tra set di dati rilevanti per ciascuno.

Oltre a getStoreId(), ListModel ha capacità relative all'ottenimento di una serie di record da visualizzare su una pagina web, incluso il supporto per l'impaginazione. Si noti che la capacità di impaginazione potrebbe essere ancora leggermente diversa tra il front-end e il back-end – vedere this issue. Il ListModel è utile per supportare il caso 1 nei diagrammi sopra.

FormModel include il supporto per i moduli Joomla, sia per impostare il modulo in modo che possa essere visualizzato, sia per convalidare i dati del modulo inviati nel POST. Inoltre, dispone di metodi per implementare il check-in e il check-out dei record del database. Quindi è adatto per gestire i casi 3 e 4 nei diagrammi sopra.

AdminModel estende FormModel, quindi ha tutte le capacità per la gestione dei moduli, ma ha anche metodi per la gestione degli aggiornamenti del database, inclusa la capacità di aggiungere, aggiornare ed eliminare record, nonché il supporto per la gestione delle operazioni in batch. Quindi è adatto per gestire i casi 2 e 5 nei diagrammi sopra. Come con AdminController, questo modello non è solo appropriato per la funzionalità dell'amministratore, ma può essere utilizzato anche sul front-end.

Tuttavia, sebbene FormModel e AdminModel supportino casi diversi nel flusso associati alla modifica di un record, in pratica è comune utilizzare lo stesso modello per tutti i diversi passaggi del flusso. Tutti i componenti principali di Joomla utilizzano lo stesso modello in questi passaggi, quindi estendono tutti AdminModel invece di FormModel.

Qualcosa da tenere presente se si utilizza lo stesso modello nel flusso di "modifica articolo" è che il codice del modello esegue 2 scopi:

# preparazione dei dati da mostrare su una pagina web
# preparazione di un modulo, da visualizzare su una pagina web o per la convalida dei dati POST
Quando si utilizza il modello perché si sta gestendo un POST (ovvero i casi 3 e 5 nel diagramma), ogni sforzo impiegato nella preparazione dei dati per una pagina Web sarà sprecato.  (Infatti, nella chiamata al metodo FormController getModel(), il parametro $config è impostato su array('ignore_request' => true) per impostazione predefinita, il che comporta che il metodo populateState del modello non venga eseguito, forse per risparmiare questo sforzo sprecato).

When you're using the model because you're handling a POST (i.e. cases 3 and 5 in the diagram) then any effort expended in preparing the data for a web page is going to be wasted. (In fact, in the FormController getModel() method call, the parameter $config is set to array('ignore_request' => true) by default, which results in the model's populateState method not being run, perhaps to save this wasted effort.)

Come abbiamo visto Joomla:
* usa il parametro task per definire le azioni, che generalmente risultano in una sorta di aggiornamento del database e finiscono sempre con un reindirizzamento
* non imposta un parametro task quando deve essere visualizzata una pagina web
* ha funzionalità avanzate in controller di livello superiore e classi di modelli che possono semplificare notevolmente il codice (tutti possono essere utilizzati sia sul front-end che sul back-end).

La scelta di quali classi di controller e modelli estendere è più facile sul back-end, perché segui semplicemente lo schema dei componenti principali di Joomla.

Per il front-end ecco una guida approssimativa:

Semplicemente visualizzare un record o un set di record, senza fornire la possibilità di modificare nulla:

* il controller estende BaseController 
* model estende BaseDatabaseModel o (in particolare se stai condividendo un modello tra un componente e moduli) ItemModel se si tratta di un singolo record, ListModel se si tratta di più record.

Visualizzazione di un modulo con più record (ma il modulo non è definito in un file XML), inclusa la possibilità di selezionare più record e applicarvi una sorta di operazione (ad es. eliminazione, pubblicazione):

* il controller estende BaseController 
* il modello estende ListModel, a meno che non si utilizzi lo stesso modello per visualizzare il modulo e gestire gli aggiornamenti, nel qual caso utilizzare AdminModel

Gestire i POST HTTP da quel modulo nei sottocontroller:

* il controller estende AdminController 
* il modello estende AdminModel

Visualizzare un modulo con un singolo record, in cui il modulo è definito in un file XML e consentire all'utente di modificarlo, oppure un record vuoto e consentire all'utente di creare un record:

* il controller estende BaseController 
* il modello estende FormModel, a meno che tu non stia utilizzando lo stesso modello per visualizzare il modulo e gestire gli aggiornamenti (come di solito accade), nel qual caso usa AdminModel

Gestire i POST HTTP da quel modulo nei sottocontroller:

* il controller estende FormController 
* il modello estende AdminModel

Vedi anche

===Serie di sviluppo componenti===

Sviluppo di un componente MVC per Joomla! 4.x

Sviluppo di un componente MVC per Joomla! 3.x