2010-01-06 4 views
2
사용자의 관계 중 하나 인

RDBO가있는 템플릿 툴킷에서 목록 컨텍스트를 강제로 적용하려면 어떻게해야합니까?

[% Namespace.get_unique_uid_tt(data.users) %] 

및 "데이터"는 RDB 개체는, 상기 템플릿 호출이 단순히

sub get_unique_uid_tt { 
    my ($classname, $o) = @_; 

    my %h; 

    foreach my $item (@{$o}) { 
    unless (exists $h{ $item->id }) { 
     $h{ $item->id } = 1; 
    } 
    } 

    return keys %h; 
} 

:

은 내가 TT의 사소한 고유의 ID를하지 플러그인이있다. 필자는 ".users"가 관계에 하나 이상의 요소가 있는지 여부에 상관없이 Perl에서 직접 목록을 반환한다는 것을 확인했습니다.

그러나 TT는 단일 요소 목록에 대한 요소를 반환하고 여러 요소에 대한 목록을 올바르게 반환하는 것으로 보입니다.

나는이 고개를 당신이 ".list"로리스트 문맥을 강제 할 수 있음을 발견

[% Namespace.get_unique_uid_tt(data.users.list) %] 

데이터로, 단일 요소의 목록에 대한 의도 한대로이 작동하지 않습니다 :: 덤퍼 계시 :

를 대신
 $VAR1 = [ 
    bless({ 
      '__xrdbopriv_in_db' => 1, 
      'id' => '1', 
      'db' => ... snip ... 
    }, 'DataClass') 
]; 

단일 요소 목록에서도 개체 목록을 얻으려면 TT에 다른 간단한 방법이 있습니까? (한 가지 방법은 함수를 다시 작성하는 것이지만 바람직하지 않은 방법은

답변

6

는 TT 메일 링리스트에 발견 :

http://lists.template-toolkit.org/pipermail/templates/2009-December/011061.html

는 TT의 ".list"처럼 보인다 문제 변환 개체가 RDBO뿐만 아니라 일반적으로 목록에.

제안은 vmethod 할 수 있습니다 :

$Template::Stash::LIST_OPS->{ as_list } = sub { 
    return ref($_[0]) eq 'ARRAY' ? shift : [shift]; 
}; 

내 컨텍스트 객체에 이것을 추가 (같은 생각을) :

$context->define_vmethod(
    'list', 
    'as_list', 
    sub { 
     return ref($_[0]) eq 'ARRAY' ? shift : [shift]; 
    }, 
); 
3

그것은 아니에요 후 당신,하지만 당신은 변경할 수 꽤 무엇을 목록과 단일 항목을 모두 처리하는 TT 플러그인?

sub get_unique_uid_tt { 
    my ($classname, $o) = @_; 

    my %h; 

    if (ref $o eq 'ARRAY') { 
    foreach my $item (@{$o}) { 
     unless (exists $h{ $item->id }) { 
     $h{ $item->id } = 1; 
     } 
    } 
    } 
    else { 
     return ($o->id); 
    } 

    return keys %h; 
} 
관련 문제