2013-06-13 3 views
0

사용자 지정 구성 요소를 쓰고 있습니다. 보기가 employees입니다. 이보기에서 나는 두 개의 레이아웃, defaultmodal을 가지고 있습니다.SEF 및 URL 다시 쓰기를 사용할 때 오류 500 "보기를 찾을 수 없음"

index.php?option=com_mycomponent&view=employeesdomain.com/joomla/employees으로 확인하고 예상대로 기본보기를 디스플레이의 :

나는 내 직원의보기를 가리키는 메인 메뉴 Employees의 맨 위의 메뉴 항목이있다.


이제 내 구성 요소 내부에 나는 모달 뷰에 연결하려면, 나는 그렇게 JRoute이 URL을 사용하여 수행합니다

index.php?option=com_mycomponent&view=employees&layout=modal

domain.com/joomla/employees/modal

로 확인

그리고이 오류가 발생합니다.

500 - View not found [name, type, prefix]: modal, html, mycomponentView

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; 
} 
+1

라우터 복사본을 첨부하십시오.php를 구성 요소의 루트 디렉토리 ('/ components/com_mycomponent/router.php')에 추가하십시오. 이 파일은 SEF url의 구문 분석 및 빌드를 처리하며이 경우를 처리하도록 수정해야합니다! –

+0

안녕하세요! 고마워요! 나는 그 파일을 지금까지 보지 못했다. 질문을 편집하여 내용을 포함 시켰습니다. 다행히도 이것이 나를 알아낼 수있는 올바른 길로 인도 할 것이지만, 당신이 제공 할 수있는 더 많은 통찰력에 크게 감사 할 것입니다. 다시 한번 감사드립니다. –

답변

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를 사용하려고하면 문제가 발생할 가능성이 큽니다.

+0

그냥 따라 오는 사람을 위해 두 가지를 지적하고 싶었습니다. '$ app'를 사용하기 전에'$ app = JFactory :: getApplication();'이 필요하고 if 문은'if ($ active-> query [ 'view'])'이어야합니다! 이것은 잘 작동합니다. –

+0

버그가 더 이상 존재하지 않도록 업데이트했습니다. 어떤 옵션을 사용 했습니까? 나는 두 번째를 추측하고 있나? –

+0

예, 두 번째 옵션을 사용했습니다. –

관련 문제