Joomla模型视图控制器(MVC)是如何工作的?

15

我是 Joomla 的新手,想知道 Joomla 控制器如何将数据传递给模型,模型如何将数据传递给控制器,以及控制器如何将数据传递给视图。虽然这可能是一个愚蠢的问题,但我真的试图找到答案。我希望可以从 Stack Overflow 社区得到一些帮助。


顺便提一下,MVC代表模型视图控制器。 - Martin
3个回答

33
控制器从URL中获取视图变量,并使用它们确定需要使用哪个视图。然后设置要使用的视图。视图接着调用模型来获取所需数据,然后将其传递给模板进行显示。
以下是这一流程的简单设置:
components/com_test/controller.php
class TestController extends JController
{

  // default view
  function display() {
    // gets the variable some_var if it was posted or passed view GET.
    $var = JRequest::getVar( 'some_var' );
    // sets the view to someview.html.php
    $view = & $this->getView( 'someview', 'html' );
    // sets the template to someview.php
    $viewLayout  = JRequest::getVar( 'tmpl', 'someviewtmpl' );
    // assigns the right model (someview.php) to the view
    if ($model = & $this->getModel( 'someview' )) $view->setModel( $model, true );
    // tell the view which tmpl to use 
    $view->setLayout( $viewLayout );
    // go off to the view and call the displaySomeView() method, also pass in $var variable
    $view->displaySomeView( $var );
  }

}

组件/com_test/views/someview/view.html.php

class EatViewSomeView extends JView
{

  function displaySomeView($var)  {
    // fetch the model assigned to this view by the controller
    $model = $this->getModel();
    // use the model to get the data we want to use on the frontend tmpl
    $data = $model->getSomeInfo($var);
    // assign model results to view tmpl
    $this->assignRef( 'data', $data );
    // call the parent class constructor in order to display the tmpl
    parent::display();
  }

}

组件/com_test/models/someview.php

class EatModelSomeView extends JModel 
{

  // fetch the info from the database
  function getSomeInfo($var) {
    // get the database object
    $db = $this->getDBO();
    // run this query
    $db->setQuery("
      SELECT 
        *
      FROM #__some_table
      WHERE column=$var
    ");
    // return the results as an array of objects which represent each row in the results set from mysql select
    return $db->loadObjectList(); 
  }

}

组件/com_test/views/someview/tmpl/someviewtmpl.php

// loop through the results passed to us in the tmpl
foreach($this->data as $data) {
  // each step here is a row and we can access the data in this row for each column by 
  // using $data->[col_name] where [col_name] is the name of the column you have in your db
  echo $data->column_name;
}

controller.php $var = JRequest::getVar( 'some_var' );,它从哪里获取'some_var'?是从编码的URL中获取吗? - Plummer
1
index.php?option=com_test&view=someview&some_var=1234 - Martin
1
那么,在Joomla中,视图是与模型交互以获取数据的吗? - Nobita
1
@MathiasLykkegaardLorenzen 这不是真的。在Rails中,控制器与模型交互,并将数据传递给视图。显然,视图也可以与模型交互,但这是一种不好的做法。 - Nobita
1
@Nobita 这取决于你所说的“交互”是什么意思。视图向用户呈现UI界面。它使用控制器传递的模型数据来决定UI的外观,就像上面Joomla的情况一样。视图可以轻松地从模型中读取数据并执行基本的与视图相关的操作,但不允许改变模型。然而,在Web意义上,GET和POST表单请求也可以被视为视图向控制器发送模型。在这种情况下,它通常被称为视图模型,例如MVVM(Model View ViewModel),它是基于MVC的强大框架。 - Mathias Lykkegaard Lorenzen
显示剩余3条评论

2

1
链接失效了...可能在您发布时还没有失效,所以不会被点踩。 - araisbec
3
每次链接到其他页面时,请同时发布该链接的摘要。 - Mathias Lykkegaard Lorenzen

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接