$controller = JControllerLegacy::getInstance('HelloWorld');
$controller->redirect();
该控制器可以重定向页面,通常在一个任务像“拯救”已经完成。最后这句话需要照顾的实际重定向。
主要切入点,helloworld.php,本质上是将控制权传递给控制器,负责执行任务,被指定的要求。我们的特定组件的控制器不做任何事情比父类已经这样做了,这就是为什么我们的控制器类是空的。
controller.php
class HelloWorldController extends JControllerLegacy {}
当没有任务请求中的变量,默认的任务将被执行。这是默认的显示任务。的jcontrollerlegacy类有这样一个任务。在我们的例子中,它会显示一个视图命名为HelloWorld。
view.html.php
class HelloWorldViewHelloWorld extends JViewLegacy { function display($tpl = null) { // Assign data to the view $this->msg = 'Hello World'; // Display the view parent::display($tpl); }}
视图设置输出的文本,然后调用基显示类。jviewlegacy是一个Joomla的基类!意见在我们的案例中,这种方法将使用说明书/ default.php文件显示数据。
default.php
<h1><?php echo $this->msg; ?></h1>
这个模板文件将由jviewlegacy类包括。因此,在这里,美元指helloworldviewhelloworld类。
helloworld.xml
<version>0.0.2</version>
更新的版本号
<filename>controller.php</filename><folder>views</folder>
如访问:http://example.com/index.php?option=com_helloworld
Joomla将定位到:/components/com_helloworld,并且加载里面的helloworld.php
helloworld.php的工作就是加载相应的controller,继而调用相应的view
含view, task的访问方式
如访问:http://domain.com/index.php?option=com_helloworld&view=helloworld&task=display&layout=default
joomla将定位到:看下面标红的,其实是先定位到helloworld.php,然后调实例化HelloWorldController,并调用指定的task方法,此处为display,在display里再去实例化HelloWorldViewHelloWorld类,继而调用其display方法。所以此处可以说直接定位到components/com_helloworld/views/helloworld/view.html.php
注意这里的view和task不是必须的,但按以下默认规则:
task 默认值:display
通过HelloWorldController里display方法调用到view.html.php里display方法.
view 默认值:component's name
此处component名称为helloworld,故默认的view helloworld将被调用
layout 默认值:default
layout指调用相应view下哪个模板,此处为components/com_helloworld/views/helloworld/tmpl/default.php
如layout指定值,则调用相应的<layout>.php
注意:要使用layout参数,在view类里必须调用 'parent::display($tpl);'此处$tpl极值
上图说明:
HelloWorldController为空类,但其继承了JControllerLegacy,其父类里有display方法,里面将实例化给定view,并调用view下display方法,见下
$view->display();
相应view的获取方式为:components/com_helloworld/views/helloworld/view.html.php
default.php里$this指HelloWorldViewHelloWorld对象,故$this->msg可直接使用
返回json,xml等格式
joomla还有个format参数,默认值是html,将调用view.html.php来输出,如想返回json,xml等,则增加以下php
举个返回xml的例子 view.xml.php:
<?php// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla view libraryjimport('joomla.application.component.view');
/**
* XML View class for the HelloWorld Component
*/class HelloWorldViewHelloWorld extends JViewLegacy{
// Overwriting JView display method
function display($tpl = null)
{
echo "<?xml version='1.0' encoding='UTF-8'?><article>
<title>How to create a Joomla Component</title>
<alias>create-component</alias></article>";
}
}
则访问
http://example.com/index.php?option=com_helloworld&format=xml
返回
component里model访问方式
MVC结构还少了M,此处给出解释
model定义在components/com_helloworld/models文件夹里,名称为helloworld.php
model类名为HelloWorldModelHelloWorld,里面方法名都是set,get打头的。
在view里通过$this->get('组件名')调用相应的model下的代码,见下
可见,调用model的方式
view当view调用
$this->get('Msg');model...接下来model里对应的function将会被调用
getMsg()
总结下:
以下绿色是固定的,红色是变化的
<Name>表示组件名
controller
controller的命名方式:<Name>Controller
class <Name>Controller extends JControllerLegacy{}
controller的调用方式:
$controller = JControllerLegacy::getInstance('<Name>');
$controller->execute(JFactory::getApplication()->input->getCmd('task'));
$controller->redirect();
view
view不指定的话即为组件名,即为<Name>
view的命名方式:<Name>View<Viewname>
class <Name>View<Viewname> extends JViewLegacy{
function display($tpl=null)
{
// Prepare the data
$data1 = ....
$data2 = ....
$moredata[] = array....
// Inject the data
$this->variablename = $data1;
$this->variablename2 = $data2;
$this->variablename3 = $moredata;
// Call the layout template. If no tpl value is set Joomla! will look for a default.php file
$tpl = 'myTemplate';
parent::display($tpl); //此处指定$tpl的话,则调用相应的tmpl下<$tpl>.php,默认值为default
}}
model
model的命名方式:<Name>Model<Modelname>
class <Name>Model<Viewname> extends JModelLegacy{}