2010-07-29 2 views
1

Я использую плагин Assets в своем приложении Catalyst, и мне бы хотелось, чтобы некоторые javascript и css-файлы включались в активы каждой страницы.

Моя первая мысль - вызов $ c-> assets-> include ('file.js') из MyApp/lib/MyApp.pm, где я устанавливаю и конфигурирую, но я не знаю, как получить фиксацию от $ c.

Моя следующая идея включает использование материала WRAPPER и размещение вызовов, таких как [% c.assets.include ('file.js')%] в шаблоне html по умолчанию, но вызовы выгружают информацию об объекте на страницу, поэтому вызовы должны быть убраны для подавления выхода.

Решения или новые идеи оценены. Заранее спасибо.

ответ

4

Во время установки приложения пока нет контекстного объекта, так как $ c представляет текущий запрос.

Если вы используете Chained, вы можете выполнить вызов в действии вашей корневой цепи. Если вы используете не связанные цепочки действия, такие как Local, Path и т. Д., Вы можете поместить действие start в свой корневой контроллер.

Самый правильный способ, на мой взгляд, - это, однако, расширить вид. Вот пример кода:

package MyApp::View::HTML; 
use Moose; 
use MooseX::Types::Moose qw(ArrayRef Str); 
use namespace::autoclean;  

extends 'Catalyst::View::TT'; 

has common_assets => (
    traits => [qw(Array)], 
    isa  => ArrayRef[Str], 
    handles => { 
     common_assets => 'elements', 
    }, 
); 

before process => sub { 
    my ($self, $ctx) = @_; 

    $ctx->assets->include($_) 
     for $self->common_assets; 
}; 

1; 

Затем вы можете настроить его с чем-то вроде этого:

<view HTML> 
    common_assets foo.css 
    common_assets bar.js 
</view> 
+0

Красивая. Благодарю. – Felix

+0

Я не думаю, что здесь 'MooseX :: Types :: Moose' необходим - помощники атрибутов native являются частью ядра Moose. – Ether

+0

@Ether: Вы правы, можно использовать строчную форму. Я просто использую везде типы MooseX. – phaylon

 Смежные вопросы

  • Нет связанных вопросов^_^