Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Joomla组件路由器_Php_Joomla_Joomla3.0 - Fatal编程技术网

Php Joomla组件路由器

Php Joomla组件路由器,php,joomla,joomla3.0,Php,Joomla,Joomla3.0,我试图按照文档页面上的说明进行操作,但我似乎遗漏了一些东西: 需要更正的URI是:index.php?com_component&view=legal&page=customermasteragreement class ComponentRouter extends JComponentRouterBase { public function build(&$query) { $segments = array(); $view = null

我试图按照文档页面上的说明进行操作,但我似乎遗漏了一些东西:

需要更正的URI是:index.php?com_component&view=legal&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;
    }
}
看起来路由功能应该很简单,但是页面只是显示默认值,而不是子视图

以下是我当前的代码:

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,如:legal agreements/legal?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

如果有帮助,下面是我的模型和视图

models/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;
            }
        }
    }

}
views/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);
    }
}

除非我完全误解了Joomla(我已经用它开发了四到五年了),否则没有实现“子视图”概念。我认为,试图利用这个想法会让你陷入困境

使用可视化调试器的想法如此不受欢迎,我感到震惊。 让自己有点像Netbeans(还有其他的),设置一个本地web和数据库服务器,并观察代码的运行。非常(好的,相对非常)快,你就会开始理解结构是如何连接在一起的


您可以在视图中放置代码,以拾取已设置的额外参数,并相应地显示或隐藏内容,但没有“子视图”。

您有一个
视图
,但在捕获
视图
参数时,实际上未正确设置
页面
参数,但是你把
page
当作另一种观点的国王。请您尝试一下并检查它是否有效:

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

    return $vars;
}
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;
    }
}
此外,函数
ComponentBuildRoute
ComponentParseRoute
必须在开头有您的组件名称,而不是
Component

编辑

[componentname]BuildRoute
[componentname]ParseRoute
不推荐使用,您应该将扩展
jComponentRoute
的类粘贴到更新后的第二个示例中。在这里试试这个,看看是否有效:

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

    return $vars;
}
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

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

非SEO组件URL:

路由器类添加到
Router.php
之前,由
JRoute
生成的URL:

JRoute::(('index.php?option=com\u ola&page=test\u page&view=ola')返回的SEO URL
创建
router.php
并使用上面的router类后:


如果您访问这些链接,您将看到所有这些都在工作,甚至可以看到调用组件的
页面
视图
JRoute
结果
Ola

实际上我使用的是NetBeans,还有PHPStorm和Visual Studio代码。本例中的子视图只是普通视图,在JRequest::getVar('page')上有一个开关。从那里加载另一个文件只需将其作为$this->loadTemplate('legal')进行查找,请查看com_内容或com_新闻提要。它们都有相同的概念。除非我的组件的名称是“组件”。)@当然是杰米沙弗。我写这篇文章只是为了澄清正确的名称必须在类/函数的开头。请尝试我更新的类,看看它是否能正常工作。现在它出现了404错误:找不到视图[名称、类型、前缀]:视图、html、componentView。它对我有效。我创建了一个名为
Ola
的测试组件,并添加了一个简单的默认视图、一个页面参数和路径,与我在答案中的内容完全相同。你是否加入了
index.php
来测试SEO URL?我将接受你的回答,因为我的下一个问题似乎与路由器无关。谢谢