Difference between revisions of "Developing a MVC Component/Adding a model to the site part"
From Joomla! Documentation
< Archived:Developing a MVC Component
m (→Contributors) |
|||
(34 intermediate revisions by 12 users not shown) | |||
Line 1: | Line 1: | ||
− | {{ | + | {{version/tutor|2.5}} |
− | + | {{Chunk:Developing a Model-View-Controller (MVC) Component for Joomla!2.5 - Contents}} | |
− | |||
− | |||
− | {{Chunk:Developing a Model-View-Controller (MVC) Component for Joomla! | ||
== Introduction == | == Introduction == | ||
− | This tutorial is part of the [[Developing a Model-View-Controller (MVC) Component for Joomla! | + | This tutorial is part of the [[Developing a Model-View-Controller (MVC) Component for Joomla!2.5]] tutorial. You are encouraged to read the previous parts of the tutorial before reading this. |
== Adding a model == | == Adding a model == | ||
− | In the Joomla | + | In the Joomla framework, models are responsible for managing the data. The first function that has to be written for a model is a ''get'' function. It returns data to the caller. In our case, the caller will be the ''HelloWorldViewHelloWorld'' view. By default, the model named ''HelloWorldModelHelloWorld'' residing in ''site/models/helloworld.php'' is the main model associated to this view. |
+ | |||
+ | |||
+ | So let's have a quick look at the naming conventions with an example, since the naming convention are the actual magic, that make everything work: | ||
+ | |||
+ | The class ''HelloWorldView'''HelloWorld''''' resides in ''site/views/'''helloworld'''/view.html.php'' and will make use of the class ''HelloWorldModel'''HelloWorld''''' in the file ''site/models/'''helloworld'''.php'' | ||
+ | |||
+ | |||
+ | So let's just assume we want to use an imaginary view ''fluffy'', you would have to have: | ||
+ | |||
+ | The class ''HelloWorldView'''Fluffy''''' which resides in ''site/views/'''fluffy'''/view.html.php''. The view will make use of ''HelloWorldModel'''Fluffy''''' in the file ''site/models/'''fluffy'''.php''. Note: the actual screen of the view: ''site/views/'''fluffy'''/tmpl/default.php'' is required as well to make this example work. | ||
+ | |||
+ | |||
+ | Breaking any of these bold conventions will lead to errors or a blank page. | ||
+ | |||
+ | |||
+ | |||
+ | So back to the actual implementation of the single classes: | ||
+ | |||
+ | With your favorite file manager and editor put a ''site/models/helloworld.php'' file containing: | ||
<span id="site/models/helloworld.php"> | <span id="site/models/helloworld.php"> | ||
Line 17: | Line 33: | ||
// No direct access to this file | // No direct access to this file | ||
defined('_JEXEC') or die('Restricted access'); | defined('_JEXEC') or die('Restricted access'); | ||
+ | |||
// import Joomla modelitem library | // import Joomla modelitem library | ||
jimport('joomla.application.component.modelitem'); | jimport('joomla.application.component.modelitem'); | ||
− | // | + | |
+ | /** | ||
+ | * HelloWorld Model | ||
+ | */ | ||
class HelloWorldModelHelloWorld extends JModelItem | class HelloWorldModelHelloWorld extends JModelItem | ||
{ | { | ||
Line 26: | Line 46: | ||
*/ | */ | ||
protected $msg; | protected $msg; | ||
+ | |||
/** | /** | ||
* Get the message | * Get the message | ||
Line 49: | Line 70: | ||
<?php | <?php | ||
// No direct access to this file | // No direct access to this file | ||
− | defined( '_JEXEC' ) or die( 'Restricted access' ); | + | defined('_JEXEC') or die('Restricted access'); |
+ | |||
// import Joomla view library | // import Joomla view library | ||
jimport('joomla.application.component.view'); | jimport('joomla.application.component.view'); | ||
− | // | + | |
− | class HelloWorldViewHelloWorld extends JView { | + | /** |
− | + | * HTML View class for the HelloWorld Component | |
+ | */ | ||
+ | class HelloWorldViewHelloWorld extends JView | ||
+ | { | ||
// Overwriting JView display method | // Overwriting JView display method | ||
− | function display($tpl = null) { | + | function display($tpl = null) |
+ | { | ||
// Assign data to the view | // Assign data to the view | ||
$this->msg = $this->get('Msg'); | $this->msg = $this->get('Msg'); | ||
+ | |||
+ | // Check for errors. | ||
+ | if (count($errors = $this->get('Errors'))) | ||
+ | { | ||
+ | JLog::add(implode('<br />', $errors), JLog::WARNING, 'jerror'); | ||
+ | return false; | ||
+ | } | ||
// Display the view | // Display the view | ||
parent::display($tpl); | parent::display($tpl); | ||
Line 65: | Line 98: | ||
</source> | </source> | ||
</span> | </span> | ||
+ | |||
+ | Note: $this->get() is a member of JView::get which is a proxy to get* methods of the default model where * is populated with the value of the first parameter passed to get() | ||
Also modify your ''helloworld.xml'' file to indicate use of models and the new version: | Also modify your ''helloworld.xml'' file to indicate use of models and the new version: | ||
Line 72: | Line 107: | ||
<source lang="xml"> | <source lang="xml"> | ||
<?xml version="1.0" encoding="utf-8"?> | <?xml version="1.0" encoding="utf-8"?> | ||
− | <extension type="component" version=" | + | <extension type="component" version="2.5.0" method="upgrade"> |
+ | |||
<name>Hello World!</name> | <name>Hello World!</name> | ||
+ | <!-- The following elements are optional and free of formatting constraints --> | ||
<creationDate>November 2009</creationDate> | <creationDate>November 2009</creationDate> | ||
<author>John Doe</author> | <author>John Doe</author> | ||
Line 80: | Line 117: | ||
<copyright>Copyright Info</copyright> | <copyright>Copyright Info</copyright> | ||
<license>License Info</license> | <license>License Info</license> | ||
+ | <!-- The version string is recorded in the components table --> | ||
<version>0.0.4</version> | <version>0.0.4</version> | ||
+ | <!-- The description is optional and defaults to the name --> | ||
<description>Description of the Hello World component ...</description> | <description>Description of the Hello World component ...</description> | ||
+ | <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"> | <files folder="site"> | ||
<filename>index.html</filename> | <filename>index.html</filename> | ||
Line 88: | Line 137: | ||
<filename>controller.php</filename> | <filename>controller.php</filename> | ||
<folder>views</folder> | <folder>views</folder> | ||
− | |||
<folder>models</folder> | <folder>models</folder> | ||
</files> | </files> | ||
<administration> | <administration> | ||
+ | <!-- Administration Menu Section --> | ||
<menu>Hello World!</menu> | <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"> | <files folder="admin"> | ||
+ | <!-- Admin Main File Copy Section --> | ||
<filename>index.html</filename> | <filename>index.html</filename> | ||
<filename>helloworld.php</filename> | <filename>helloworld.php</filename> | ||
− | </files> | + | <!-- SQL files section --> |
+ | <folder>sql</folder> | ||
+ | </files> | ||
</administration> | </administration> | ||
+ | |||
</extension> | </extension> | ||
</source> | </source> | ||
Line 107: | Line 164: | ||
Content of your code directory | Content of your code directory | ||
* ''[[#helloworld.xml|helloworld.xml]]'' | * ''[[#helloworld.xml|helloworld.xml]]'' | ||
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/index.html]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_02#site/helloworld.php|site/helloworld.php]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_02#site/controller.php|site/controller.php]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/views/index.html]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/views/helloworld/index.html]]'' |
* ''[[#site/views/helloworld/view.html.php|site/views/helloworld/view.html.php]]'' | * ''[[#site/views/helloworld/view.html.php|site/views/helloworld/view.html.php]]'' | ||
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/views/helloworld/tmpl/index.html]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_03#site/views/helloworld/tmpl/default.xml|site/views/helloworld/tmpl/default.xml]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_02#site/views/helloworld/tmpl/default.php|site/views/helloworld/tmpl/default.php]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|site/models/index.html]]'' |
* ''[[#site/models/helloworld.php|site/models/helloworld.php]]'' | * ''[[#site/models/helloworld.php|site/models/helloworld.php]]'' | ||
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/index.html]]'' |
− | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla! | + | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#admin/helloworld.php|admin/helloworld.php]]'' |
+ | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/sql/index.html]]'' | ||
+ | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/sql/updates/index.html]]'' | ||
+ | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#index.html|admin/sql/updates/mysql/index.html]]'' | ||
+ | * ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!2.5_-_Part_01#admin/sql/updates/mysql/0.0.1.sql|admin/sql/updates/mysql/0.0.1.sql]]'' | ||
+ | |||
+ | Create a compressed file of this directory or directly download the [http://joomlacode.org/gf/download/frsrelease/11394/58228/com_helloworld-1.6-part04.zip 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. | ||
+ | |||
+ | == Navigate == | ||
− | + | [[Developing a Model-View-Controller (MVC) Component for Joomla!2.5 - Part 03|Prev: Adding a menu type to the site part]] | |
+ | [[Developing a Model-View-Controller (MVC) Component for Joomla!2.5 - Part 05|Next: Adding a variable request in the menu type]] | ||
== Contributors == | == Contributors == | ||
*[[User:cdemko|Christophe Demko]] | *[[User:cdemko|Christophe Demko]] | ||
+ | *[[User:oaksu|Ozgur Aksu]] | ||
+ | *[[User:Jossnaz|Lukas Meier]] | ||
[[Category:Development]] | [[Category:Development]] | ||
− | [[ | + | [[Category:Joomla! 1.6]] |
− | [[ | + | [[Category:Joomla! 1.7]] |
+ | [[Category:Joomla! 2.5]] |
Revision as of 18:13, 31 December 2013
This page has been archived. This page contains information for an unsupported Joomla! version or is no longer relevant. It exists only as a historical reference, it will not be improved and its content may be incomplete and/or contain broken links.
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
- Using the language filter facility
- Adding an update server
- Example of a Frontend Update Function
- Example of Menu Parameters & Stylesheets
Introduction[edit]
This tutorial is part of the Developing a Model-View-Controller (MVC) Component for Joomla!2.5 tutorial. You are encouraged to read the previous parts of the tutorial before reading this.
Adding a model[edit]
In the Joomla framework, models are responsible for managing the data. The first function that has to be written for a model is a get function. It returns data to the caller. In our case, the caller will be the HelloWorldViewHelloWorld view. By default, the model named HelloWorldModelHelloWorld residing in site/models/helloworld.php is the main model associated to this view.
So let's have a quick look at the naming conventions with an example, since the naming convention are the actual magic, that make everything work:
The class HelloWorldViewHelloWorld resides in site/views/helloworld/view.html.php and will make use of the class HelloWorldModelHelloWorld in the file site/models/helloworld.php
So let's just assume we want to use an imaginary view fluffy, you would have to have:
The class HelloWorldViewFluffy which resides in site/views/fluffy/view.html.php. The view will make use of HelloWorldModelFluffy in the file site/models/fluffy.php. Note: the actual screen of the view: site/views/fluffy/tmpl/default.php is required as well to make this example work.
Breaking any of these bold conventions will lead to errors or a blank page.
So back to the actual implementation of the single classes:
With your favorite file manager and editor put a site/models/helloworld.php file containing:
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 string msg
*/
protected $msg;
/**
* Get the message
* @return string The message to be displayed to the user
*/
public function getMsg()
{
if (!isset($this->msg))
{
$this->msg = 'Hello World!';
}
return $this->msg;
}
}
The HelloWorldViewHelloWorld class asks the model for data using the get method of the JView class:
site/views/helloworld/view.html.php
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla view library
jimport('joomla.application.component.view');
/**
* HTML View class for the HelloWorld Component
*/
class HelloWorldViewHelloWorld extends JView
{
// Overwriting JView display method
function display($tpl = null)
{
// Assign data to the view
$this->msg = $this->get('Msg');
// Check for errors.
if (count($errors = $this->get('Errors')))
{
JLog::add(implode('<br />', $errors), JLog::WARNING, 'jerror');
return false;
}
// Display the view
parent::display($tpl);
}
}
Note: $this->get() is a member of JView::get which is a proxy to get* methods of the default model where * is populated with the value of the first parameter passed to get()
Also modify your helloworld.xml file to indicate use of models and the new version:
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.4</version>
<!-- The description is optional and defaults to the name -->
<description>Description of the Hello World component ...</description>
<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>
</files>
</administration>
</extension>
Packaging the component[edit]
Content of your code directory
- 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/updates/index.html
- admin/sql/updates/mysql/index.html
- admin/sql/updates/mysql/0.0.1.sql
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.
[edit]
Prev: Adding a menu type to the site part Next: Adding a variable request in the menu type