User

Difference between revisions of "Rvsjoen/tutorial/Developing an MVC Component/Part 02"

From Joomla! Documentation

< User:Rvsjoen‎ | tutorial/Developing an MVC Component
 
(24 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 
= Adding a view to the frontend =
 
= Adding a view to the frontend =
  
In order to create a basic view for the frontend, we first need to have some logic in our previously created entry point <tt>site/helloworld.php</tt> that decides how to handle requests which are passed to the component. We will manage this my having the entry point load up a controller and execute it, so the first order of business is telling the entry point what to do, and then creating a controller.
+
In order to create a basic view for the frontend, we first need to have some logic in our previously created entry point <tt>site/helloworld.php</tt> that decides how to handle requests which are passed to the component. We will manage this by having the entry point load up a controller and execute it, so the first order of business is telling the entry point what to do, and then creating a controller.
  
 
== Creating a controller ==
 
== Creating a controller ==
 
In the core code of Joomla, the class that implements a controller is named ''JController''. In order to save ourselves a lot of work, and prevent having to reinvent the wheel, this class can be extended to be used in our component.  
 
In the core code of Joomla, the class that implements a controller is named ''JController''. In order to save ourselves a lot of work, and prevent having to reinvent the wheel, this class can be extended to be used in our component.  
  
In the file <tt>site/helloworld.php</tt> put the following code
+
With your favorite editor, create the following file
  
 
<span id="site/helloworld.php">
 
<span id="site/helloworld.php">
Line 25: Line 25:
 
// Redirect if set by the controller
 
// Redirect if set by the controller
 
$controller->redirect();
 
$controller->redirect();
 +
?>
 +
 
</source>
 
</source>
 
</span>
 
</span>
  
The static ''getInstance'' method of the ''JController'' class will create a controller. In the code above, it will create a controller named ''HelloWorldController'' using the ''controller.php'' file in the same location as the entry point. This means that we have to create this controller so that it has something to load.
+
The static ''getInstance'' method of the ''JController'' class will create a controller. In the code above, it will create a controller named ''HelloWorldController'' using the <tt>controller.php</tt> file in the same location as the entry point. This means that we have to create this controller so that it has something to load. The call to ''redirect()'' on the controller instance will check if the task executed at some point set an url to redirect to after finishing execution, and if so, redirect to this url. This is useful for redirecting to a different view after executing a task.
  
 
With your favorite editor, create the following file
 
With your favorite editor, create the following file
Line 45: Line 47:
  
 
}
 
}
 +
?>
 +
 
</source>
 
</source>
 
</span>
 
</span>
  
Yes really, that is it. We do not have to provide any code in our controller except for this. This is because the default behavior of JController is to call the '''display''' task if not other task is given, and the '''display''' task will look for the name of the view to load in the '''view''' request variable. If no view name is given, it will load the view with the same name as the component, namely '''helloworld'''.
+
Yes really, that is it. We do not have to provide any code in our controller except for this. This is because the default behavior of JController is to call the '''display''' task if no other task is given, and the '''display''' task will look for the name of the view to load in the '''view''' request variable. If no view name is given, it will load the view with the same name as the component, namely '''helloworld'''.
  
 
== Creating a view ==
 
== Creating a view ==
Line 70: Line 74:
 
{
 
{
 
// Assign data to the view
 
// Assign data to the view
$this->msg = 'Hello World';
+
$this->item = 'Hello World';
  
 
// Display the view
 
// Display the view
Line 76: Line 80:
 
}
 
}
 
}
 
}
 +
?>
 +
 
</source>
 
</source>
 
</span>
 
</span>
  
Now, the most important two bits of this file are line 12, in which we assign a string to the member variable '''msg''', this variable will then be available in the view template (which we will create in a minute). On line 15 there is a call to the parent display function, now this is in fact where a lot of the logic happens as that is the '''display''' function of '''JView''', we will not go into detail on this except to tell you that it is responsible for loading up and displaying the view template.
+
First of all, pay close attention to the naming of the class since that may be slightly confusing at first. The class is named '''HelloWorldViewHelloWorld''' and the reason '''HelloWorld''' appears twice is because it just happens to be the name of both our component and our view. A slightly better example would be for example '''FooViewBar''' where '''Foo''' would be the name of the component (like '''com_foo''') and '''Bar''' would be the name of the view.
 +
 
 +
Now, the most important two bits of this file are line 12, in which we assign a string to the member variable '''item''', this variable will then be available in the view template (which we will create in a minute). On line 15 there is a call to the <code>parent::display()</code> function, now this is in fact where a lot of the logic happens as that is the <code>display()</code> function of '''JView''', we will not go into detail on this except to tell you that it is responsible for loading up and displaying the view template.
  
 
The view templates are stored in the <tt>tmpl</tt> folder inside each view, so let us go ahead and create a view template for our view (View templates are also called layouts).  
 
The view templates are stored in the <tt>tmpl</tt> folder inside each view, so let us go ahead and create a view template for our view (View templates are also called layouts).  
Line 94: Line 102:
 
?>
 
?>
  
<h1><?php echo $this->msg; ?></h1>
+
<h1><?php echo $this->item; ?></h1>
  
 
</source>
 
</source>
  
== Updating the manifest ==
+
== Installation manifest ==
  
In our manifest, as you can see, we have added the newly created files and folders in the site files section on line 23 and 24. We have also updated the component version number on line 13.
+
In our manifest, as you can see, we have added the newly created files and folders in the site files section on line 23 and 24. We have also updated the component version number.
  
 
<span id="helloworld.xml">
 
<span id="helloworld.xml">
Line 106: Line 114:
 
<source lang="xml" line>
 
<source lang="xml" line>
 
<?xml version="1.0" encoding="utf-8"?>
 
<?xml version="1.0" encoding="utf-8"?>
<extension type="component" version="1.6.0" method="upgrade">
+
<extension type="component" version="2.5.0" method="upgrade">
  
 
<name>Hello World!</name>
 
<name>Hello World!</name>
Line 146: Line 154:
 
</span>
 
</span>
  
== Packaging the component ==
+
== Testing your component ==
 
 
Content of your code directory
 
* ''[[#helloworld.xml|helloworld.xml]]''
 
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01#index.html|site/index.html]]''
 
* ''[[#site/helloworld.php|site/helloworld.php]]''
 
* ''[[#site/controller.php|site/controller.php]]''
 
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01#index.html|site/views/index.html]]''
 
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01#index.html|site/views/helloworld/index.html]]''
 
* ''[[#site/views/helloworld/view.html.php|site/views/helloworld/view.html.php]]''
 
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01#index.html|site/views/helloworld/tmpl/index.html]]''
 
* ''[[#site/views/helloworld/tmpl/default.php|site/views/helloworld/tmpl/default.php]]''
 
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01#index.html|admin/index.html]]''
 
* ''[[Developing_a_Model-View-Controller_(MVC)_Component_for_Joomla!1.6_-_Part_01#admin/helloworld.php|admin/helloworld.php]]''
 
 
 
Create a compressed file of this directory or directly download the [http://joomlacode.org/gf/download/frsrelease/11394/58226/com_helloworld-1.6-part02.zip archive] and install it using the extension manager of Joomla!1.6. You can test this basic component by putting ''index.php?option=com_helloworld'' in your browser address.
 
 
 
<span id="helloworld.xml">
 
''helloworld.xml''
 
<source lang="xml">
 
<?xml version="1.0" encoding="utf-8"?>
 
<extension type="component" version="1.6.0" method="upgrade">
 
 
 
<name>Hello World!</name>
 
<!-- The following elements are optional and free of formatting constraints -->
 
<creationDate>June 2011</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 stored in the components table -->
 
<version>0.0.2</version>
 
<!-- The description is optional and defaults to the name -->
 
<description>Description of the Hello World component ...</description>
 
 
 
<!-- 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>
 
</files>
 
  
<administration>
+
For details on how to install the component into your Joomla! site, refer to the information provided in
<menu>Hello World!</menu>
+
[[User:Rvsjoen/tutorial/Developing_an_MVC_Component/Part_01#Testing_your_component|Part 01]].
<!-- 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">
 
<filename>index.html</filename>
 
<filename>helloworld.php</filename>
 
</files>
 
</administration>
 
 
 
</extension>
 
</source>
 
</span>
 
  
'''Result:'''
+
In order to test this component, open up '''index.php?option=com_helloworld''' in your browser, and see that the text displayed will be the same text that you assigned to <code>$this->item</code> in your view.
You will see by default the message contained in the variable ''$this->msg'' in the ''view.html.php'' file.
 
  
 
== File listing ==  
 
== File listing ==  
  
 
* <tt>[[#helloworld.xml|helloworld.xml]]</tt>
 
* <tt>[[#helloworld.xml|helloworld.xml]]</tt>
 +
* <tt>[[User:Rvsjoen/tutorial/Developing_an_MVC_Component/Part_01#index.html|site/index.html]]</tt>
 
* <tt>[[#site/helloworld.php|site/helloworld.php]]</tt>
 
* <tt>[[#site/helloworld.php|site/helloworld.php]]</tt>
* <tt>[[#index.html|site/index.html]]</tt>
+
* <tt>[[#site/controller.php|site/controller.php]]</tt>
* <tt>[[#index.html|admin/index.html]]</tt>
+
* <tt>[[User:Rvsjoen/tutorial/Developing_an_MVC_Component/Part_01#index.html|site/views/index.html]]</tt>
* <tt>[[#admin/helloworld.php|admin/helloworld.php]]</tt>
+
* <tt>[[User:Rvsjoen/tutorial/Developing_an_MVC_Component/Part_01#index.html|site/views/helloworld/index.html]]</tt>
 +
* <tt>[[#site/views/helloworld/view.html.php|site/views/helloworld/view.html.php]]</tt>
 +
* <tt>[[User:Rvsjoen/tutorial/Developing_an_MVC_Component/Part_01#index.html|site/views/helloworld/tmpl/index.html]]</tt>
 +
* <tt>[[#site/views/helloworld/tmpl/default.php|site/views/helloworld/tmpl/default.php]]</tt>
 +
* <tt>[[User:Rvsjoen/tutorial/Developing_an_MVC_Component/Part_01#index.html|admin/index.html]]</tt>
 +
* <tt>[[User:Rvsjoen/tutorial/Developing_an_MVC_Component/Part_01#admin/helloworld.php|admin/helloworld.php]]</tt>
  
 
== Download this part ==
 
== Download this part ==
  
[http://www.leyar.com/joomlaorg/part01.zip com_helloworld-part01.zip]
+
[https://github.com/downloads/rvsjoen/joomla-tutorials/com_helloworld-part02.zip Download example package]
  
 
== Articles in this series ==
 
== Articles in this series ==

Latest revision as of 10:06, 13 May 2012

Adding a view to the frontend[edit]

In order to create a basic view for the frontend, we first need to have some logic in our previously created entry point site/helloworld.php that decides how to handle requests which are passed to the component. We will manage this by having the entry point load up a controller and execute it, so the first order of business is telling the entry point what to do, and then creating a controller.

Creating a controller[edit]

In the core code of Joomla, the class that implements a controller is named JController. In order to save ourselves a lot of work, and prevent having to reinvent the wheel, this class can be extended to be used in our component.

With your favorite editor, create the following file

site/helloworld.php

<?php
// No direct access to this file
defined('_JEXEC') or die;

jimport('joomla.application.component.controller');

// Get an instance of the controller prefixed by HelloWorld
$controller = JController::getInstance('HelloWorld');

// Perform the Request task
$controller->execute(JRequest::getCmd('task'));

// Redirect if set by the controller
$controller->redirect();
?>

The static getInstance method of the JController class will create a controller. In the code above, it will create a controller named HelloWorldController using the controller.php file in the same location as the entry point. This means that we have to create this controller so that it has something to load. The call to redirect() on the controller instance will check if the task executed at some point set an url to redirect to after finishing execution, and if so, redirect to this url. This is useful for redirecting to a different view after executing a task.

With your favorite editor, create the following file

site/controller.php

<?php
// No direct access to this file
defined('_JEXEC') or die;

jimport('joomla.application.component.controller');

class HelloWorldController extends JController
{

}
?>

Yes really, that is it. We do not have to provide any code in our controller except for this. This is because the default behavior of JController is to call the display task if no other task is given, and the display task will look for the name of the view to load in the view request variable. If no view name is given, it will load the view with the same name as the component, namely helloworld.

Creating a view[edit]

Now that we have a controller that will load and display our views, we need to give it a view to display.

With your favorite editor, create the following file

site/views/helloworld/view.html.php

<?php
// No direct access to this file
defined('_JEXEC') or die;

jimport('joomla.application.component.view');

class HelloWorldViewHelloWorld extends JView
{
	function display($tpl = null) 
	{
		// Assign data to the view
		$this->item = 'Hello World';

		// Display the view
		parent::display($tpl);
	}
}
?>

First of all, pay close attention to the naming of the class since that may be slightly confusing at first. The class is named HelloWorldViewHelloWorld and the reason HelloWorld appears twice is because it just happens to be the name of both our component and our view. A slightly better example would be for example FooViewBar where Foo would be the name of the component (like com_foo) and Bar would be the name of the view.

Now, the most important two bits of this file are line 12, in which we assign a string to the member variable item, this variable will then be available in the view template (which we will create in a minute). On line 15 there is a call to the parent::display() function, now this is in fact where a lot of the logic happens as that is the display() function of JView, we will not go into detail on this except to tell you that it is responsible for loading up and displaying the view template.

The view templates are stored in the tmpl folder inside each view, so let us go ahead and create a view template for our view (View templates are also called layouts).

With your favorite editor, create the following file

site/views/helloworld/tmpl/default.php

<?php
// No direct access to this file
defined('_JEXEC') or die;

?>

<h1><?php echo $this->item; ?></h1>

Installation manifest[edit]

In our manifest, as you can see, we have added the newly created files and folders in the site files section on line 23 and 24. We have also updated the component version number.

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>June 2011</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 stored in the components table -->
	<version>0.0.2</version>
	<!-- The description is optional and defaults to the name -->
	<description>Description of the Hello World component ...</description>

	<!-- 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>
	</files>

	<administration>
		<menu>Hello World!</menu>
		<!-- 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">
			<filename>index.html</filename>
			<filename>helloworld.php</filename>
		</files>
	</administration>

</extension>

Testing your component[edit]

For details on how to install the component into your Joomla! site, refer to the information provided in Part 01.

In order to test this component, open up index.php?option=com_helloworld in your browser, and see that the text displayed will be the same text that you assigned to $this->item in your view.

File listing[edit]

Download this part[edit]

Download example package

Articles in this series[edit]

This tutorial is supported by the following versions of Joomla!

Joomla 2.5