【问题标题】:Error 500 "View Not Found" when using SEF and URL Rewriting使用 SEF 和 URL 重写时出现错误 500“未找到视图”
【发布时间】:2013-06-10 01:11:48
【问题描述】:

我正在编写一个自定义组件。我有观点employees。在这个视图下,我有两个布局,defaultmodal

我在主菜单的顶层有一个菜单项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 - 未找到视图 [名称、类型、前缀]:模态、html、 我的组件视图

如果我使用index.php?option=com_mycomponent&view=employees&layout=modal 访问 index.php,我的模态视图就会显示出来。

我还发现访问domain.com/joomla/employees/employees/modal 会显示正确的布局。就好像 joomla 忘记了与 /joomla/employees 的菜单项相关联的视图,而是寻找“模态”视图,除非在 url 中提供了额外的“员工”。

另外值得注意的是,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;
}

【问题讨论】:

  • 请在组件的根目录中包含您的 router.php 副本 (/components/com_mycomponent/router.php)。该文件处理 SEF url 的解析和构建,需要修复以处理这种情况!
  • 嘿!非常感谢!直到现在我什至没有看过那个文件。我编辑了问题以包含内容。希望这将使我走上正确的道路来弄清楚它,但我将非常感谢您提供的任何更多见解。再次感谢。

标签: joomla joomla2.5 custom-component


【解决方案1】:

因此,如果不知道您希望解析 url 的所有不同方式,很难为此提供确切的答案。但我会尝试给出解决当前情况的提示(希望不会引入太多新问题!)

基本问题是BuildRoute 端没有获得视图值,因此它不包含在 url 中。一方面没有必要,因为它在菜单中。但这使得解析变得有点困难,所以选项一是如果可以的话,通过改变顶部函数来强制有一个视图:

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 而不设置布局,也可能会遇到问题。

【讨论】:

  • 只是想指出两件事,以供后面的任何人参考。在使用$app 之前,您需要$app = JFactory::getApplication();,并且if 语句应该是if ( $active-&gt;query['view'] )(失去!否定)。这很好用。
  • 我已对其进行了更新,因此错误应该不再存在。您使用了哪个选项?我猜是第二个?
  • 是的,我选择了第二个选项。
猜你喜欢
  • 2022-09-23
  • 1970-01-01
  • 2014-06-02
  • 2011-12-28
  • 2019-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多