我正在编写自定义组件。我有观点employees
。在此视图下,我有两种布局,default
和modal
。
我在主菜单的顶层有一个菜单项,Employees
指向我的员工视图:
index.php?option=com_mycomponent&view=employees
解析为domain.com/joomla/employees
并按预期显示默认视图。
现在,在我的组件中,我想链接到模态视图,我使用JRoute和这个url这样做:
index.php?option=com_mycomponent&view=employees&layout=modal
哪个解析为
domain.com/joomla/employees/modal
并产生此错误:
500 - 查看未找到[名称,类型,前缀]:modal,html, mycomponentView
如果我使用index.php?option=com_mycomponent&view=employees&layout=modal
访问index.php,则会显示我的模态视图。
我还发现访问domain.com/joomla/employees/employees/modal
会显示正确的布局。就好像joomla忘记了哪个视图与/joomla/employees
的菜单项相关联,而是查找视图“模态”,除非在网址中提供了额外的“员工”。
另外值得注意的是,domain.com/joomla/employee?layout=modal
也可以。
这是我对router.php的所作所为。这是使用j-cook.pro的组件生成器为我生成的文件。
<?php
defined('_JEXEC') or die;
function MycomponentBuildRoute(&$query){
$segments = array();
if(isset($query['view']))
{
$view = $query['view'];
$segments[] = $view;
unset( $query['view'] );
}
if(isset($query['layout']))
{
$segments[] = $query['layout'];
unset( $query['layout'] );
}
if(isset($query['id']))
{
if(in_array($view, array('edit','view','view','editfacility','view','edit','client','editclient','viewposition','editposition','edit','view','edit','view','view','edit','view','edit','view','edit','view','edit')))
{
$segments[] = (is_array($query['id'])?implode(',', $query['id']):$query['id']);
unset( $query['id'] );
}
};
return $segments;
}
function MycomponentParseRoute($segments)
{
$vars = array();
$vars['view'] = $segments[0];
$nextPos = 1;
if (isset($segments[$nextPos]))
{
$vars['layout'] = $segments[$nextPos];
$nextPos++;
}
if(in_array($vars['view'], array('edit','view','view','editfacility','view','edit','client','editclient','viewposition','editposition','edit','view','edit','view','view','edit','view','edit','view','edit','view','edit'))
&& isset($segments[$nextPos]))
{
$slug = $segments[$nextPos];
$id = explode( ':', $slug );
$vars['id'] = (int) $id[0];
$nextPos++;
}
return $vars;
}
答案 0 :(得分:1)
因此,如果不了解您希望解析网址的所有不同方式,很难为此提供确切的答案。但我会尝试暗示将解决目前的情况(不希望引入太多新问题!)
基本问题是BuildRoute
方没有获得视图值,因此它不包含在网址中。一方面它没有必要,因为它在菜单中。但是它使解析起来有点困难,因此如果你可以通过更改top函数来启动它,那么选择一个就是强制那样:
function MycomponentBuildRoute(&$query){
$segments = array();
if(isset($query['view']))
{
$view = $query['view'];
$segments[] = $view;
unset( $query['view'] );
}
else
{
$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
if ($view = $active->query['view']) {
$segments[] = $view;
}
}
...
通过这种方式,如果有一个菜单项,并且它有一个视图,我们将对其进行处理。这应该生成domain.com/joomla/employees/employees/modal
。
你也可以在解析方面做这个逻辑。这将取代上面的其他选项:
function MycomponentParseRoute($segments)
{
$vars = array();
$app = JFactory::getApplication();
$menu = $app->getMenu();
$active = $menu->getActive();
if ($active->query['view']) {
$vars['layout'] = $segments[0];
$nextPos = 1;
} else {
$vars['view'] = $segments[0];
$nextPos = 1;
if (isset($segments[$nextPos]))
{
$vars['layout'] = $segments[$nextPos];
$nextPos++;
}
}
... continue with final check for id
我可能会使用第二个选项,但两者都是一个选项。顺便说一下,如果你试图在没有设置布局的情况下使用id,你也可能会遇到问题。