2013-05-22 2 views
1

디자이너에게 꽤 유연한 Catalyst 앱을 만들려고합니다. 정적 콘텐츠가 포함 된 새 페이지를 추가해야하는 경우 Catalyst에 들어가서 해당 페이지 템플릿을 만들기 전에 해당 작업을 추가 할 필요가 없습니다. 나는 그것이 name.html이라는 템플릿을 추가하면 name 동작 없이도 Catalyst 앱이 http://www.domain.com/name.html을 표시 할 수 있습니다. 현재 I는 다음과 같습니다 루트 컨트롤러 서브 루틴이 있습니다촉매 템플릿 툴킷 템플릿을 찾을 수 없음 404

sub any_template :Regex('(.+)\.html$') { 
    my ($self, $c) = @_; 
    $c->stash(
     template => $c->action . '.html', 
    ); 
} 

을하고 '.html 중에서'로 끝나는 모든 요청은 그 이름으로 템플릿을 찾을 수 있도록이 그것을 있습니다. 그러나 존재하지 않는 템플릿에 대해 URL을 요청하면 Template Toolkit은 템플릿을 렌더링 할 수 없다는 오류를 발생시킵니다. 템플릿이 존재하지 않기 때문에 의미가 있습니다. 그러나 템플릿이없는 경우 내 404 찾을 수없는 페이지를 대신 표시 할 수 있습니다. 이것을 할 수 있습니까? 또는 누군가가 Catalyst 앱에 빈 작업을 추가하지 않고도 템플릿 페이지를 만들 수있는 더 나은 방법을 찾고 있습니까? 필자는 perl의 -e 파일 테스트를 사용하여 파일 시스템에 템플릿이 있는지 확인할 수 있지만 더 좋은 방법은 없을까요? 감사!

[% 
    debug("Applying HTML page layout wrappers to $template.name\n"); 
    content WRAPPER "$host/site/html" + "$host/site/layout"; 
-%] 

는 대부분 TTSite에 의해 생성 된 :

UPDATE는

이처럼 내 현재 래퍼 모습입니다. 어쨌든 RET에서 제안한 것과 비슷한 것을 할 수 있습니까?이 경우 실패 할 경우 try catch 블록을 사용하여 404 페이지를 사용할 수 있습니까?

[%- 
    TRY; 
     content WRAPPER "$host/site/html" + "$host/site/layout"; 
    CATCH file; 
     "File Error! $error.info"; 
    CATCH; 
     "Error: $error.info!"; 
    END; 
-%] 

그리고 그것이 페이지를 찾을 수없는 파일 오류가 있음을 말할 것이다 :

Couldn't render template test.html: file error - test.html: not found 

UPDATE는

나는이 내 래퍼 템플릿을 업데이트하려고했습니다

그러나 내 catch 블록 중 하나에 가지 않습니다. 내가 다른 곳에 넣어야 할까? 이것은 내가 찾고 있어요 정확히 무엇

Note that the DEFAULT option (disabled by default) allows you to specify a default 
file to be used any time a template file can't be found. This will prevent file 
exceptions from ever being raised when a non-existant file is requested (unless, 
of course, the DEFAULT file your specify doesn't exist). Errors encountered once 
the file has been found (i.e. read error, parse error) will be raised as file 
exceptions as per usual. 

하지만,이를 사용하는 방법에는 예는 없다 :

UPDATE

Template Toolkit 문서화는 말한다. 누구든지 DEFAULT 옵션을 사용하는 방법을 알고 있습니까?

답변

0

그래서 나는 내가 원하는 것을 할 수있는 해결책을 찾아 냈습니다. 대신 기본 RenderView를 사용하여, 나는 내 자신을 만들어 :

#old end action 
#sub end : ActionClass('RenderView') {} 

sub end : Private { 
    my ($self, $c) = @_; 

    return if $c->res->body ne ''; 

    my $output; 
    eval { $output = $c->view($c->stash->{current_view})->render($c,$c->stash->{template})}; 

    unless([email protected]) { 
     $c->res->body($output); 
    } 
    else { 
     $c->res->status(404); 
     $c->stash->{template} = 'errors/404.html'; 
     $c->forward($c->view('NO_HTML')); 
    } 
} 

그것은 아마도 조금 해키이지만, 내가 원하는 것을 나를 때마다 페이지 (404)의 응답과 함께 404 페이지를 표시 할 수 있습니다 찾을 수 없기 때문에 내가 만든 모든 템플릿에 대해 작업을 정의 할 필요가없는 유연성을 유지할 수 있습니다.

1

정적 컨텐츠 용으로 Catalyst를 사용하지 않아도됩니다. 일반적으로 이미지, CSS, Javascript와 같은 정적 컨텐츠는 웹 서버 (nginx 또는 APache)에서 직접 제공됩니다. HTML 정적 파일에서도 동일한 작업을 수행 할 수 있습니다.

정적 및 동적 콘텐츠를 혼합하려면 Catalyst :: Plugin :: Static :: Simple을 1$c->serve_static_file($file_path) 기능을보십시오.

+0

그러나 변경해야 할 콘텐츠는 페이지 중간에있는 템플릿 시스템을 사용하면 얻을 수있는 이점이 없습니다. 내 디자이너가 어디서나 동일한 머리글, 꼬리말 등을 반복하지 않아도되기를 바랍니다. 그래서 '정적 인'컨텐츠이지만, 실제로 Template Toolkit과 같은 템플릿 시스템의 이점을 원합니다. – srchulo

1

저는 그가 옳았 기 때문에 줄리안의 대답을 너무 많이 외쳤습니다. 이것은 정적 리소스를 다루는 가장 좋은 방법입니다. HTML이라면 정적 영역에 넣고 웹 서버에 필요한 별칭 또는 위치 레코드를 설정하십시오.

그러나 디자이너가 WRAPPER 안에 넣거나 동적 처리가 필요한 템플릿을 제작하는 경우 해당 방법으로 몇 가지 한계를 빠르게 맞 춥니 다.

직접 같은 템플릿, 당신은 같은 것을 할 수있는 오히려 프로세스를보다 :

=== Root.pm ===를

sub any_template { 
    ... 
    $c->stash(template => 'static.tt'); 
} 

=== static.tt = == 파일 --발견되지 정상적으로 처리되도록

[%- WRAPPER foo.tt -%] 
[%- SET tmpl = c.action; 
    TRY; 
     # use either PROCESS if a template, or INCLUDE if it's HTML 
     PROCESS tmpl _ ".tt"; 
     # INCLUDE tmpl _ ".html"; # or this 
    CATCH; 
     PROCESS "404.tt"; 
    END -%] 
[%- END -%] 

. 404.tt 템플릿을 사용하면 래퍼의 머리글/바닥 글 등이 계속 표시됩니다.

+0

어쨌든 동일한 머리글과 바닥 글없이'404.tt'를 표시 할 수 있습니까? – srchulo

+0

위의 게시물을 업데이트하여 현재 래퍼 코드를 표시했습니다. 오류가있는 경우 404.tt를 처리하기 위해 여기서 수행 한 것과 유사한 작업을 수행 할 수있는 방법이 있습니까? – srchulo

+0

'content'가 먼저 생성 된 후 래퍼가 생성되기 때문에이 논리를 래퍼에 넣을 수 없습니다. 따라서 실패한 템플릿 렌더링이 이미 발생했습니다. 404에서 머리말/꼬리말을 변경하는 것에 대한 질문에 대답 할 때, 래퍼에서 테스트 할 404.tt 변수를 설정하십시오. 또는'CATCH' 블록 안에 다른 'WRAPPER'를 넣으십시오. – RET