Joomla 3.0一个具有多个视图的组件

时间:2013-07-18 09:04:15

标签: components joomla3.0

我是Joomla的新手,我正在尝试构建一个显示项目类别的组件,当点击某个类别时,它会显示列出相关项目的第二个视图。现在,我只能让第一个视图工作。我不知道如何处理基本文件,控制器和视图文件以使第二个视图正常工作。我试着寻找几天的答案,但找不到任何相关的东西。

我希望将其保存在单个控制器中,并根据请求的任务选择正确的视图。现在,我有

的请求
index.php?option=com_products&task=listing&cat=

总共只有3个任务,总共3个视图。因此,我不想打扰多个控制器。

  1. 是否可以让一个控制器在3个不同的视图之间进行选择?如果是,怎么样?
  2. 有多个视图需要多个控制器,以保持一切MVC风格?如果是,我该怎么做?
  3. 结构:

    com_categories
    ---categories.php
    ---controller.php
    ---models\categories.php
    ---models\listing.php
    ---views\categories\view.html.php
    ---views\categories\tmpl\default.php
    ---views\listing\view.html.php
    ---views\listing\tmpl\default.php
    

    categories.php

    $controller = JControllerLegacy::getInstance('categories');
    
    $controller->execute(JRequest::getCmd('task'));
    
    $controller->redirect();
    

    Controller.php这样

    class categoriesController extends JControllerLegacy
    {
       /*
       *  Main controller: Shows categories
       *  This is chosen by default.
       */
       function display()
       {
          $view = $this->getView( 'categories', 'html' );
          $view->setModel($this->getModel('categories'), true );
          $view->setLayout( 'default' );
          $view->display();
       }
    
       /*
       *  Listing controller: Shows list of items after a category is clicked
       */
       function listing()
       {
          // This passes the category id to the model
          $cat = JRequest::getVar( 'cat', '1' );
          $model = $this->getModel('listing');
          $model->setState('cat', $cat);
    
          $view = $this->getView( 'listing', 'html' );
          $view->setModel($model, true );
          $view->setLayout( 'default' );
          $view->display();
    
       }
    }
    

    列表\ view.html.php

    class categoriesViewlisting extends JViewLegacy
    {
        function display($tpl = null) 
        {
            $doc =& JFactory::getDocument();
    
            // Assign data to the view
            $this->item = $this->get('Products');
            $this->title = $this->get('Category');
    
            // Display the view
            parent::display($tpl);
        }
    }
    

3 个答案:

答案 0 :(得分:0)

如果您只需要视图,则无需使用子控制器。而不是使用task = taskname只需使用view = viewname,然后在/ components / com_name / views中添加一个视图文件夹(复制现有的一个)。

或者只是跳过所有这些并使用component creator构建它。

答案 1 :(得分:0)

您无需为不同的视图创建新的控制器文件。只需要复制组件的一个视图文件夹并为其提供新的视图名称。还要为该视图创建模型文件。

com_categories
---categories.php
---controller.php
---models\categories.php
---models\listing.php
---views\categories\view.html.php
---views\categories\tmpl\default.php
---views\listing\view.html.php
---views\listing\tmpl\default.php

只需输入您的链接名称,例如index.php?option = com_categories& view = listing

答案 2 :(得分:0)

您可以通过向控制器添加以下功能来加载多个视图:

public function openView( $viewName ) {
        $document = \JFactory::getDocument();
        $viewType = $document->getType();
        $viewLayout = $this->input->get('layout', 'default', 'string');
        $view = $this->getView($viewName, $viewType, '', array('base_path' => $this->basePath, 'layout' => $viewLayout));

        // Get/Create the model
        if ($model = $this->getModel($viewName))
        {
            // Push the model into the view (as default)
            $view->setModel($model, true);
        }

        $view->document = $document;

        // call $view->display() to render

        return $view;
    }

然后在您的视图中,您可以加载其他视图,例如

$this->view1 = $controller->openView('view1');
$this->view2 = $controller->openView('view2');

并通过

将其显示在模板中
<?php $this->view1->display(); ?>
<?php $this->view1->display(); ?>