2011-11-27 25 views
12

Có cách nào để vượt qua một biến với phương pháp Assetic trong các mẫuVượt qua một biến đến một URL tài sản Assetic trong Symfony2

{% stylesheets 
    '@SomeExampleBundle/Resources/views/ SOMEVAR /css/*' 
%} 
<link rel="stylesheet" href="{{ asset_url }}" /> 
{% endstylesheets %} 

Vì vậy, những gì tôi muốn làm là vượt qua SOMEVAR từ bộ điều khiển.

+0

Sử dụng PHP làm ngôn ngữ mẫu và chỉ cần viết mã đó. Nếu không thực hiện logic trong PHP và tiêm vào ngôn ngữ cành. – hakre

Trả lời

18

Hiện tại, tôi không nghĩ điều đó là có thể. Lý do đằng sau điều này là Assetic được chạy trả trước để đổ các nội dung, do đó, nó không chạy mẫu Twig để tính toán biến. Điều này có thể giống nhau nếu bạn làm điều đó trong một khuôn mẫu PHP.

Điều này có nghĩa là các biến thời gian chạy sẽ không được tính và mở rộng. Vì vậy, điều này làm cho nó không thể tạo ra các tài sản nếu một biến được sử dụng. Điều này có thể thay đổi trong tương lai, nhưng điều này sẽ phải trả chi phí sản xuất mỗi khi tài sản được yêu cầu bởi người dùng vì Assetic sẽ cần phải tạo nội dung.

Tôi biết có thể định nghĩa và tạo nội dung theo chương trình bằng cách sử dụng mã được tìm thấy trong Assetic trực tiếp (không phải bằng cách sử dụng AsseticBundle). Bạn sẽ cần thử nghiệm, đọc mã nguồn và thực hiện các thử nghiệm và các lỗi để giải quyết vấn đề này.

Có ít hoặc không có tài liệu nào trên Assetic vào lúc này. Liên kết duy nhất tôi có thể cung cấp là số README được tìm thấy trên trang github của Assetic here. Tôi hy vọng điều này sẽ sớm thay đổi.

Hy vọng điều này sẽ hữu ích.

+0

Một số điều này đang trở thành có thể. [Biến tài sản trong Assetic] (http://jmsyst.com/blog/asset-variables-in-assetic) cho thấy rằng trong v1.1 khả năng sử dụng các biến với một tập hợp các giá trị có thể đã biết sẽ là có thể. – roverwolf

-1

Có lẽ tôi không hiểu, nhưng ... bạn đang cố gắng làm điều này?

{% stylesheets 
    '@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*' 
%} 
<link rel="stylesheet" href="{{ asset_url }}" /> 
{% endstylesheets %} 

Bởi vì, theo như tôi biết, chuỗi được chuyển đến stylesheets là biểu thức Twig hợp lệ, do đó bạn được tự do sử dụng phép nội suy biến.

Dù sao, tôi không nghĩ thực tiễn tốt để có nội dung động. Bạn chính xác muốn đạt được điều gì? Có thể có giải pháp tốt hơn.

+1

không! đọc câu trả lời của Matt –

+0

Vâng, đã hơi muộn rồi nhưng ... cảm ơn vì đã ngẩng đầu! :) –

26

Có thể thông qua cách này:

<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/') }}" /> 
+0

Tuyệt vời, cảm ơn rất nhiều. –

+5

điều này không sử dụng 'assetic', nhưng hàm' asset' của symfony. bạn không thể sử dụng các bộ lọc với điều này – gondo

3

Để xây dựng một chút về Chopchop của câu trả lời:

Trước tiên, bạn cần phải bao gồm tất cả các file mà nhu cầu assetic để đổ, như nó cần phải biết những gì bạn cần phải bán phá giá. Những gì bạn có thể thực hiện theo cách có điều kiện là sự bao gồm của bản thân tài sản khi chạy.

Vì vậy, lần đầu tiên đưa vào phần assetic:

{% javascripts 
'@ExampleComBundle/Resources/public/js/module1.js' 
'@ExampleComBundle/Resources/public/js/module2.js' 
%} 
{% endjavascripts %} 

Bây giờ bạn có thể đặt trong điều kiện mà bạn muốn. Cả những kịch bản sẽ được đổ vào thời điểm triển khai nhưng bạn sẽ có thể lựa chọn trong thời gian chạy cái nào bao gồm:

<link rel="stylesheet" href="{{ asset('bundles/examplecombundle/js/module' ~ WHICH_MODULE_TO_INCLUDE ~ '.js) }}" /> 

Các ~ nhân vật chỉ là các nhà điều hành nối trong cành mẫu.

Hoạt động tất nhiên giống với CSS và JS.

1

Một thay thế, mà làm việc với dãy hạn chế về lựa chọn (giải pháp Piotr đã không làm việc cho tôi trong chế độ dev):

{% javascripts 
    '@AcmeDemoBundle/Resources/public/js/module_A.js' 
    output='js/module_A.js' 
%} 
    {% if myVar == "A" %} 
     <script src="{{ asset_url }}"></script> 
    {% endif %} 
{% endjavascripts %} 

{% javascripts 
    '@AcmeDemoBundle/Resources/public/js/submodule1_B.js' 
    '@AcmeDemoBundle/Resources/public/js/submodule2_B.js' 
    '@AcmeDemoBundle/Resources/public/js/submodule3_B.js' 
    output='js/module_B.js' 
%} 
    {% if myVar == "B" %} 
     <script src="{{ asset_url }}"></script> 
    {% endif %} 
{% endjavascripts %} 

... 

Bằng cách đó, mỗi module sẽ được đổ vào triển khai hoặc tự động xử lý bởi assetic VÀ bạn có thể chọn mô-đun sẽ được bao gồm, sử dụng myVar.

Lưu ý: Tôi đã sử dụng khối javascripts ở đây, nhưng nó sẽ hoạt động tương tự với bảng định kiểu.

Các vấn đề liên quan