• joomla mvc架构, 原理


    component基本结构与访问方式

    如访问: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方法,见下

    1
    $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:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?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,里面方法名都是setget打头的。

    在view里通过$this->get('组件名')调用相应的model下的代码,见下

    可见,调用model的方式

    view view调用 $this->get('Msg');
    model ...接下来model里对应的function将会被调用 getMsg()

    总结下:

    以下绿色是固定的,红色是变化的

    <Name>表示组件名

    controller

    controller的命名方式:<Name>Controller

    1
    class <Name>Controller extends JControllerLegacy{}

    controller的调用方式:

    1
    2
    3
    $controller = JControllerLegacy::getInstance('<Name>');
    $controller->execute(JFactory::getApplication()->input->getCmd('task'));
    $controller->redirect();

    view

    view不指定的话即为组件名,即为<Name>

    view的命名方式:<Name>View<Viewname>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    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>

    1
    class <Name>Model<Viewname> extends JModelLegacy{}

    所有get开头的函数在view里的调用方式为$this->get('xxx');

  • 相关阅读:
    Java 基本知识
    开源框架 Java
    Java 常用工具
    centos7设置静态IP
    VMnet1、VMnet8到底是什么?
    centos7修改主机名的方法
    防火墙阻止了虚拟机与主机之间互相ping通解决方案
    虚拟机centos与主机互相Ping通
    centos个性化命令行提示符
    更多的常用命令
  • 原文地址:https://www.cnblogs.com/houtaoliang/p/5207412.html
Copyright © 2020-2023  润新知