2013-03-25 42 views
10

Trang web của tôi được chia thành các mô-đun riêng biệt. Mỗi mô-đun có tệp css hoặc js cụ thể của riêng mình trong /protected/modules/my_module/assets/css hoặc js đối với tệp js. Quản lý tài sản Yiis tạo thư mục khi tôi sử dụng trang đầu tiên sử dụng nội dung của tôi. Thật không may nếu tôi thay đổi sth trong các tệp của tôi - Yii không tải lại tệp css hoặc js của tôi. Tôi phải xóa thư mục /projects/assets theo cách thủ công. Nó thực sự gây phiền nhiễu khi bạn đang phát triển ứng dụng.Có cách nào để buộc Yii tải lại nội dung mô-đun trên mọi yêu cầu không?

Có cách nào để buộc Yii tải lại nội dung theo yêu cầu không?

Trả lời

20

Trong components/Controller.php thêm như sau (hoặc điều chỉnh một hiện beforeAction):

protected function beforeAction($action){ 
    if(defined('YII_DEBUG') && YII_DEBUG){ 
     Yii::app()->assetManager->forceCopy = true; 
    } 
    return parent::beforeAction($action); 
} 

Điều này không nó rằng trước khi bất kỳ hành động được bắt đầu, ứng dụng sẽ kiểm tra để xem nếu bạn đang ở trong chế độ gỡ lỗi, và nếu do đó, sẽ thiết lập trình quản lý nội dung để buộc sao chép tất cả nội dung trên mỗi lần tải trang.

Xem: http://www.yiiframework.com/doc/api/1.1/CAssetManager#forceCopy-detail

tôi đã không kiểm tra này, nhưng căn cứ vào tài liệu tôi tin rằng nó sẽ làm việc tốt.

Lưu ý: Vị trí của mã này trong phạm vi beforeAction chỉ là một ví dụ về vị trí đặt mã. Bạn chỉ cần đặt thuộc tính forceCopy thành true trước khi có bất kỳ cuộc gọi nào đến publish() và đặt số này vào beforeAction sẽ hoàn thành mục tiêu đó.

+2

Gợi ý: Lệnh 'định nghĩa (YII_DEBUG)' là không cần thiết - nó sẽ luôn luôn được xác định là một trong hai 'true' hay' false'. –

3

Một cách khác giải pháp là phải công bố tài sản module của bạn như thế này:

Yii::app()->assetManager->publish($path, false, -1, YII_DEBUG); 

Tham số thứ tư thi hành một bản sao của tài sản của bạn, ngay cả khi họ nơi đã được công bố. Xem hướng dẫn sử dụng trên publish() để biết chi tiết.

2

Tái xuất bản nội dung trên mọi yêu cầu có khả năng mất nhiều tài nguyên và không đơn giản để phát triển.

  • Đối với phát triển, nó dễ dàng hơn để sử dụng tính năng linkAssets của CClientScript. Các tài sản được xuất bản dưới dạng các thư mục liên kết tượng trưng và không bao giờ phải được tạo lại. Xem: http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail

  • Để dàn dựng/sản xuất, bạn nên xóa nội dung/thư mục một phần của tập lệnh/tập lệnh cập nhật.

Chỉ quay trở lại một trong các giải pháp khác nếu vì lý do nào đó bạn không thể sử dụng liên kết tượng trưng trên máy phát triển của mình (không phải là rất có thể).

+0

Giải pháp rất thú vị. Tôi sẽ xem xét nó nhưng nó có vẻ rất hứa hẹn và thực sự nhanh hơn xuất bản tài sản mọi yêu cầu. – Joe

9

Nếu bạn đang sử dụng Yii2, có một giải pháp đơn giản hơn nhiều thông qua cấu hình.

Thêm dòng sau vào 'config/web.php' của bạn:

if (YII_ENV_DEV) { 
    // configuration adjustments for 'dev' environment 
    // ... 
    $config['components']['assetManager']['forceCopy'] = true; 
} 

này buộc AssetManager để sao chép tất cả các thư mục trên mỗi lần chạy.

+3

.. hoặc bạn chỉ cần thêm phần 'forceCopy' => YII_DEBUG, 'at ** assetManager ** vào ** thành phần ** – verybadbug

0

Trong Yii 1 trong cấu hình chúng ta có:

'components'=> [ 
... 
'assetManager' => array(
      'forceCopy' => YII_DEBUG, 
... 
) 
... 

]