Joomla组件路由器



我正在尝试按照此文档页面上的说明进行操作,但是我似乎缺少某些内容:https://docs.joomla.org/supporting_sef_urls_in_your_component

需要纠正的URI是:index.php?com_component& view = Legal& 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,例如:法律统治/法律?page = 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); 

您有一个view,但是当您捕获view参数时,您实际上并未正确设置page参数,但是您将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;
    }
}

编辑2

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

non SEO组件URL:http://j3.dev.lytrax.net/index.php?option=com_ola&amp;page=test_page&amp; page&amp; view = ola

JRoute生成的URL在路由器类添加到router.php之前生成

SEO URL由JRoute::_('index.php?option=com_ola&page=test_page&view=ola');返回后,在创建router.php之后并使用了路由器类以上:http://j3.dev.lytrax.net/index.php/componet/ola/ola/ola/ola/ola/test_page

如果您访问链接,您会发现所有链接都在起作用,甚至可以看到pageviewJRoute调用组件Ola的结果。

除非我完全误解了Joomla(我已经使用了四年了五年了),则没有实施"子视图"概念。试图使用这个想法是什么让您陷入困境。

我惊讶的是,使用视觉调试器的想法是如此不受欢迎。为自己提供诸如Netbeans(也有其他),设置本地网络和数据库服务器,然后观看"代码运行"。非常(嗯,相对非常非常),您将开始了解结构如何悬挂在一起。

您可以将代码放在您的视图中,以拾取已设置的额外参数并相应地显示或隐藏东西,但是没有"子视图"。

相关内容

  • 没有找到相关文章

最新更新