2013-03-25 10 views
10

Moja strona internetowa jest podzielona na osobne moduły. Każdy moduł ma swoje specyficzne pliki css lub js w plikach js w postaci /protected/modules/my_module/assets/css lub js. Menedżer zasobów Yiis tworzy folder, gdy po raz pierwszy korzystam ze strony korzystającej z moich zasobów. Niestety, jeśli zmienię coś w moich plikach - Yii nie przeładuje mojego pliku css lub js. Muszę ręcznie usunąć folder /projects/assets. To naprawdę denerwujące, gdy rozwijasz aplikację.Czy istnieje sposób zmuszenia Yii do przeładowania zasobów modułu na każde żądanie?

Czy istnieje sposób zmuszenia Yii do przeładowania aktywów na każde żądanie?

Odpowiedz

20

W components/Controller.php dodać następujące (lub dostosować istniejący beforeAction):

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

co to robi to, że przed rozpoczęciem prac działania, aplikacja będzie sprawdzić, czy jesteś w trybie debugowania, a jeśli Dlatego ustawi menedżer zasobów, aby wymusić skopiowanie wszystkich zasobów przy każdym ładowaniu strony.

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

nie testowałem, ale na podstawie dokumentacji wierzę powinno działać dobrze.

Uwaga: Umieszczenie tego kodu w numerze beforeAction jest tylko przykładem miejsca, w którym można go umieścić. Po prostu musisz ustawić właściwość forceCopy na wartość true przed wywołaniami do publish(), a umieszczenie jej w beforeAction powinno umożliwić osiągnięcie tego celu.

+2

Podpowiedź: 'defined (YII_DEBUG)' nie jest konieczne - będzie ona zawsze być określone jako albo '' true' lub FALSE. –

3

Alternatuwnym rozwiązaniem jest publikują swoje aktywa moduł tak:

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

Czwarty parametr wymusza kopię swoich aktywów, nawet jeśli gdzie już opublikowany. Aby uzyskać szczegółowe informacje, zapoznaj się z instrukcją na stronie publish().

2

Ponowne publikowanie zasobów na każde żądanie może pochłonąć wiele zasobów i nie ma znaczenia dla rozwoju.

  • Dla rozwoju, jest dużo łatwiej korzystać z linkAssets cechę CClientScript. Zasoby są publikowane jako katalogi dowiązań symbolicznych, a nigdy nie muszą być odnawiane. Zobacz: http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail

  • Na postoju/produkcji, należy dokonać rozliczeń aktywa/folderu część swojej rutynowej aktualizacji/skryptu.

Powróć do jednego z innych rozwiązań, jeśli z jakiegoś powodu nie możesz używać dowiązań symbolicznych na maszynie programistycznej (mało prawdopodobne).

+0

Bardzo interesujące rozwiązanie. Zajmę się tym, ale wydaje się bardzo obiecujące i rzeczywiście szybsze niż publikowanie zasobów każdego żądania. – Joe

9

Jeśli używasz Yii2, istnieje znacznie prostsze rozwiązanie dzięki konfiguracji.

Dodaj poniższe linie do swoich 'config/web.php':

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

Zmusza to AssetManager skopiować wszystkie foldery na każdym biegu.

+3

.. lub możesz po prostu dodać ''forceCopy' => YII_DEBUG,' w sekcji ** assetManager ** w ** komponentach ** – verybadbug

0

W Yii 1 w config mamy:

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

] 
Powiązane problemy