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

Posted

技术标签:

【中文标题】Joomla 3.0 一个具有多个视图的组件【英文标题】:Joomla 3.0 One component with multiple views 【发布时间】:2013-07-17 03:27:45 【问题描述】:

我是 Joomla 的新手,我正在尝试构建一个显示项目类别的单个组件,当单击一个类别时,它会导致列出相关项目的第二个视图。目前,我只能让第一个视图正常工作。我不确定如何处理基本文件、控制器和视图文件以使第二个视图正常工作。我尝试了几天寻找答案,但找不到任何相关内容。

我想将它保存在单个控制器中,并根据请求的任务选择正确的视图。目前,我的请求为

index.php?option=com_products&task=listing&cat=

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

    是否可以让一个控制器在 3 个不同的视图之间进行选择?如果是,怎么做? 拥有多个视图是否需要多个控制器才能保持 MVC 风格?如果是,我该怎么做?

结构:

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();

   

listing\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);
    

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

好吧,我需要将类别 ID 从一个视图传递到另一个视图,以便正确生成第二个视图。我认为 URL 请求中的任何类型的信息都应该由控制器处理,而不是由视图处理。不过非常感谢!下次我用静态视图制作组件时会记住这一点。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

您可以通过将以下函数添加到控制器来加载多个视图:

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(); ?>

【讨论】:

以上是关于Joomla 3.0 一个具有多个视图的组件的主要内容,如果未能解决你的问题,请参考以下文章

将搜索 DIV 添加到 Joomla 3.0 组件视图时 CSS 丢失

joomla 3.0 站点组件访问控制

Joomla 组件多视图

Joomla 3.0 组件参数存储在哪里?

在 joomla 3.0 中使用单个模型从表单写入多个表

在根 URL 端点公开 Joomla 组件视图