2017-03-01 4 views
0

나는이 문서 페이지의 지시 사항을 따르려고하지만 뭔가 빠진 것 같다 : https://docs.joomla.org/Supporting_SEF_URLs_in_your_component줌라 구성 요소 라우터

수정 될 필요가있는 URI는에게 : index.php를 com_component &보기 = 법문 & 페이지 = 사용자 정의 동의서

라우팅 기능이 단순해야하지만 페이지가 하위보기 대신 기본값으로 표시됩니다.

여기 내 현재 코드입니다 :

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를 제공합니다 : 리갈 계약/법률 페이지 = 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> 

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

답변

1

당신은 하나 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; 
} 

또한 기능 ComponentBuildRoute, ComponentParseRoute이 구성 요소의 이름 대신의 시작 부분에 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라는 간단한 구성 요소 테스트 줌라 3 사이트가 있습니다.

비 SEO 구성 요소 URL : router.php를 생성 한 후 http://j3.dev.lytrax.net/index.php/component/ola/?page=test_page&view=ola

SEO URL이 JRoute::_('index.php?option=com_ola&page=test_page&view=ola');에 의해 반환하고 위의 라우터 클래스를 사용 : http://j3.dev.lytrax.net/index.php/component/ola/ola/test_page

라우터 클래스는 router.php에 추가하기 전에 JRoute에 의해 생성 http://j3.dev.lytrax.net/index.php?option=com_ola&page=test_page&view=ola

URL 링크를 방문하면 모든 기능이 작동하는 것을 확인할 수 있으며 page, view 및도 볼 수 있습니다.호출 구성 요소의 결과 Ola.

+0

내 구성 요소의 이름이 "구성 요소"인 경우를 제외합니다. :) –

+0

@JamesShaver 물론. 방금 클래스/함수의 시작 부분에 올바른 이름이 있어야한다는 것을 명확히하기 위해이 글을 썼습니다. 업데이트 된 클래스를 사용해보고 원하는대로 작동하는지 확인하십시오. –

+0

이제 404 오류가 발생합니다. [name, type, prefix] : view, html, componentView를 찾을 수 없습니다. –

-1

(지금은 4 ~ 5 년 동안 함께 개발 했어요), 구현에는 "하위보기"개념이 없다. 아이디어를 사용하려고하면 내가 생각하는 문제에 빠지게됩니다.

나는 시각적 인 디버거를 사용하는 아이디어가 그렇게 인기가 없다는 사실에 놀랐다. Netbeans (다른 사용자도 있음)와 같은 것을 얻고, 로컬 웹 및 데이터베이스 서버를 설정하고 코드 실행을 지켜보십시오. 매우 (잘, 상대적으로) 빨리 구조가 어떻게 끊어 지는지 이해하기 시작할 것입니다.

뷰에 설정 한 추가 매개 변수를 선택하고 그에 따라 표시하거나 숨길 수있는 코드를 넣을 수 있지만 "하위보기"는 없습니다.

+0

실제로 필자는 NetBeans와 PHPStorm 및 Visual Studio Code를 사용합니다. 이 경우 서브 뷰는 JRequest :: getVar ('page')에 스위치가있는 일반 뷰일뿐입니다. 거기에서 다른 파일을로드하는 것은 단순히 $ this-> loadTemplate ('legal')으로 찾는 것입니다. –

+0

com_content 또는 com_newsfeeds를 살펴보십시오. 둘 다 똑같은 개념을 가지고 있습니다. –

관련 문제