2017-09-07 2 views
0

실버 스트라이프에 액션 ID 만 표시하는 홀더/페이지를 만들려고합니다. 블로그 페이지처럼 ID가없는 경우 (mydomain.com/programs/) 프로그램과 함께 세부 정보 페이지를 원하는 ID (mydomain.com/programs/spinning-with-chris/)가있는 경우 모든 프로그램의 목록을 표시하십시오.silverstripe 액션없이 홀더/페이지를 만드는 방법

아무에게도 이것을 수행하는 방법에 대한 예가 있습니까? (more info)

private static $url_handlers = array(
    '$Action//$ID/$OtherID' => 'handleAction', 
); 

이 그 선택이 될 것입니다 후 경로 routetocontroller/action 후 아무것도된다는 것을 의미합니다 :

답변

1

당신이 컨트롤러에서 사용자 지정 URL 핸들러를 정의하지 않은 가정, 기본이입니다. 경로의 첫 번째 부분은, 당신 YAML 구성에 정의된다 예를 들면 : 따라서 컨트롤러가 인덱스 작업을 노출 할 필요가

Director: 
    rules: 
    routetocontroller: YourControllerName 

:

private static $allowed_actions = array('index'); 

public function index(SS_HTTPRequest $request) 
{ 
    // Handle an ID passed 
    if ($id = $this->urlParams['ID']) { 
     return $this->doSomethingWithYourId($id); 
    } 

    // Otherwise, show all of your data 
    return $this->renderWith(array('YourTemplateName', array(
     'YourDataList' => YourModel::get() 
    )); 
} 

을 그리고 당신은 루프 YourTemplateName.ss에 다음 표시 할 수 있습니다 :

<% loop $YourDataList %> 
    <li><a href="$Link">$Title</a></li> 
<% end_loop %> 

이들은 출발점 예일 뿐이므로 필요에 맞게 조정해야합니다.

+0

위의 코드는 프레임 워크가 아닌 페이지 내용 만 렌더링한다는 유일한 문제가 있습니다. ProgramSchedulePage_Controller는 Page_Controller를 확장하지만 페이지 템플릿을 가져 오지 않습니다. 아이디어를 얻는 방법이나 "ProgramSchedulePage"템플릿을 전체 페이지 템플릿으로 만들어야합니까? – Mi32dogs

+0

@ Mi32dogs 아마도 당신의 템플릿은'templates/ProgramSchedulePage.ss'입니다 - 이것은 페이지 템플릿을 완전히 덮어 씁니다. 'templates/Layout/ProgramSchedulePage.ss' 파일로 저장해야 콘텐트를 덮을 수 있습니다. –

+1

레이아웃 폴더에 있었지만 여전히 페이지 템플릿을 무시하고 있었고 모든 페이지 데이터 자체를 잃어 버렸습니다. 먼저 페이지 데이터를 가져 와서 작업을합니다. $ dObj = Page :: get() -> byID ('8'); 두 템플릿 모두를 렌더링하여 $ this-> customize ($ dObj) -> renderWith (array ('ProgramSchedulePage', 'page')); 그것은 최선의 해결책은 아니지만 효과적입니다. – Mi32dogs