2017-03-01 145 views
0

我想按照这个文档页面上的说明,但我似乎失去了一些东西: https://docs.joomla.org/Supporting_SEF_URLs_in_your_component的Joomla组件路由器

需要纠正的URI是:的index.php com_component &视图=合法& page = customermasteragreement

看起来路由功能应该很简单,但页面只显示默认值而不是子视图。

这里是我当前的代码:

function ComponentBuildRoute(&$query) 
{ 
    $segments = array(); 
     if (isset($query['view'])) { 
      $segments[] = $query['view']; 
      unset($query['view']); 
     } 
     if (isset($query['page'])) { 
      $segments[] = $query['page']; 
      unset($query['page']); 
    } 

    return $segments; 
} 

function ComponentParseRoute($segments) 
{ 
     $vars = array(); 
     switch($segments[0]) 
     { 
       case 'legal': 
         $vars['view'] = 'legal'; 
         break; 
       case 'customermasteragreement': 
         $vars['page'] = 'customermasteragreement'; 
         break; 

     } 

     return $vars; 
} 

更新 此代码显示子页面,但它给了我一个URI,如:?法律,协定/法律页面= customermasteragreement

class ComponentRouter extends JComponentRouterBase { 

    public function build(&$query) { 
     $segments = array(); 
     $view = null; 

     if (isset($query['view'])) { 
      $segments[] = $query['view']; 
      $view = $query['view']; 

      unset($query['view']); 
     } 

     if (isset($query['id'])) { 
      if ($view !== null) { 
       $segments[] = $query['id']; 
      } else { 
       $segments[] = $query['id']; 
      } 

      unset($query['id']); 
     } 

     return $segments; 
    } 


    public function parse(&$segments) { 

     $vars = array(); 

     // View is always the first element of the array 
     $vars['view'] = array_shift($segments); 

     return $vars; 
    } 
} 

编辑2

如果它有帮助,这里是我的模型和视图

型号/ legal.php

// import Joomla modelitem library 
jimport('joomla.application.component.modelitem'); 

class ComponentModelLegal extends JModelItem { 
    public function __construct($config = array()) 
      { 
     JLoader::register('ComponentHelper', JPATH_COMPONENT_ADMINISTRATOR . '/helpers/component.php'); 
     parent::__construct($config); 
      } 

    /** 
    * 
    * @return string 
    */ 
    public function getLegal() { 
     $app = JFactory::getApplication(); 
     $page = $app->input->get('page', '', 'STRING'); 

     if ($page) { 
      ComponentHelper::add('type', $page); //This is an API request to an external service, returning JSON formatted data 
      $legal = ComponentHelper::getData('commons/legal-agreements.json', TRUE); 


      if (isset($legal[0]['status'])) { 
       JError::raiseError(400, $legal[0]['ERROR']); 
       return false; 
      } else { 
       if (!isset($this->legal)) { 
        $this->legal = $legal; 
       } 
       return $this->legal; 
      } 
     } 
    } 

} 

的意见/法律/ view.html.php

class ComponentViewLegal extends JViewLegacy { 
    function display($tpl = null) { 
     // Assign data to the view 
     $this->legal = $this->get('legal'); 

     // Check for errors. 
     if (count($errors = $this->get('Errors'))) { 
      JLog::add(implode('<br />', $errors), JLog::WARNING, 'jerror'); 
      return false; 
     } 

     // Display the view 
     parent::display($tpl); 
    } 
} 

的意见/法律/ TMPL /如default.php

$page = JRequest::getVar('page'); 
$pages = array(
    'resellermasteragreement', 
    'customermasteragreement', 
    'resellerdomainagreement', 
    'customerdomainagreement', 
    'resellerwebserviceagreement', 
    'customerwebserviceagreement', 
    'resellerdigicertagreement', 
    'customerdigicertagreement', 
    'registraragreement', 
    'customerhostingproductagreement', 
    'resellerhostingproductagreement' 
); 

    ?> 
    <div class="col-lg-12"> 
     <?php 
     echo in_array($page, $pages) ? $this->loadTemplate('legal') : $this->loadTemplate('home'); 
     ?> 
    </div> 

的意见/法律/ TMPL/default_legal.php

$page = JRequest::getVar('page'); 

echo nl2br(htmlspecialchars($this->legal[$page]['defaultagreement'], ENT_NOQUOTES, "UTF-8")); 
?> 
<a type="button" class="btn btn-primary" href="<?php echo JROUTE::_("index.php?option=com_component&view=legal"); ?>">Back</a> 

编辑3 这是有效的,因为我没有直接从菜单项导航到页面。有一个顶级菜单,然后是一个链接到协议的页面。每个项目都有一个隐藏的菜单,但那不是我所遵循的链接。

$app = JFactory::getApplication()->getMenu(); 
$customermaster = $app->getItems('link', 'index.php?option=com_component&view=legal&page=customermasteragreement', true); 
JRoute::_('index.php?Itemid='.$customermaster->id); 

回答

1

你有一个view,但你实际上并不正确设置参数page当你抓到一个view的说法,但你把page作为另一种观点的一些国王。能否请您试试这个,并检查是否正常工作:

function [componentname]ParseRoute($segments) 
{ 
    $vars = array(); 
    switch($segments[0]) 
    { 
     case 'legal': 
      $vars['view'] = 'legal'; 
      $vars['page'] = $segments[1]; 
      break; 
    } 

    return $vars; 
} 

而且功能ComponentBuildRouteComponentParseRoute必须在成分名称,而不是Component开头。

编辑

[componentname]BuildRoute[componentname]ParseRoute已被弃用,你应该坚持的扩展JComponentRouterBase如您在更新第二个例子有它的类。这里试试这个,看看它的工作原理:

class ComponentRouter extends JComponentRouterBase { 

    public function build(&$query) { 
     $segments = array(); 
     $view = null; 

     if (isset($query['view'])) { 
      $segments[] = $query['view']; 
      $view = $query['view']; 

      unset($query['view']); 
     } 

     if (isset($query['page'])) { 
      $segments[] = $query['page']; 
      unset($query['page']); 
     } 

     return $segments; 
    } 

    public function parse(&$segments) { 

     $vars = array(); 

     // View is always the first element of the array 
     $vars['view'] = array_shift($segments); 
     if(count($segments) > 0) 
      $vars['page'] = array_shift($segments); 

     return $vars; 
    } 
} 

EDIT 2

我有一个测试的Joomla 3个网站,一个名为Ola一个简单的组件。

非SEO部件URL:http://j3.dev.lytrax.net/index.php/component/ola/?page=test_page&view=ola

SEO URL通过JRoute::_('index.php?option=com_ola&page=test_page&view=ola');返回创建router.php后和使用上述Router类:http://j3.dev.lytrax.net/index.php/component/ola/ola/test_page

之前加入路由器类router.phpJRoute产生http://j3.dev.lytrax.net/index.php?option=com_ola&page=test_page&view=ola

URL如果你访问链接,你会看到所有的工作,你甚至可以看到page,viewJRoute调用组件Ola的结果。

+0

除非我的组件的名称是“组件”。 :) –

+0

@JamesShaver当然。我只是写了这个来澄清,正确的名字需要在类/函数的开头。请尝试我的更新课程,看看它是否按你的想法工作。 –

+0

现在它给了一个404错误:查找未找到[名称,类型,前缀]:视图,html,componentView。 –

-1

除非我完全误解的Joomla(我一直在用它开发再过4五年),没有“子视图”的概念来实现。试图使用这个想法是什么让你陷入麻烦,我想。

我很惊讶,使用可视化调试器的想法是如此不受欢迎。让自己像Netbeans(也有其他人),建立一个本地Web和数据库服务器,并观察代码运行。很快(很好,相对很快)你会开始理解结构如何挂在一起。

您可以在您的视图中放入代码,以获取您设置并显示或隐藏相应内容的额外参数,但不存在“子视图”。

+0

其实我使用NetBeans,以及PHPStorm和Visual Studio代码。在这种情况下,子视图只是在JRequest :: getVar('page')上开关的普通视图。从那里加载另一个文件只需将它作为$ this-> loadTemplate('legal') –

+0

查看com_content或com_newsfeeds。他们都有相同的概念。 –