2013-03-25 17 views
10

Il mio sito Web è diviso in moduli separati. Ogni modulo ha i propri file css o js specifici in /protected/modules/my_module/assets/css o js per i file js. Il gestore risorse Yiis crea una cartella quando utilizzo la pagina per la prima volta che utilizza le mie risorse. Sfortunatamente se cambio sth nei miei file - Yii non ricarica il mio file css o js. Devo cancellare manualmente la cartella /projects/assets. È davvero fastidioso quando stai sviluppando l'app.Esiste un modo per forzare Yii a ricaricare le risorse del modulo su ogni richiesta?

C'è un modo per forzare Yii a ricaricare le risorse ogni richiesta?

risposta

20

Nel components/Controller.php aggiungere la seguente (o regolare una beforeAction esistente):

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

Quello che fa è che prima di qualunque azione che vengono avviate, l'applicazione controllerà per vedere se si è in modalità di debug, e se quindi, imposterà il gestore patrimoniale a ricopiare forzatamente tutte le risorse su ogni caricamento di pagina.

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

non ho ancora testato questo, ma sulla base della documentazione credo che dovrebbe funzionare bene.

Nota: il posizionamento di questo codice all'interno di beforeAction è solo un esempio di dove inserirlo. È sufficiente impostare la proprietà forceCopy su true prima di qualsiasi chiamata a publish() e posizionarla in beforeAction per raggiungere tale obiettivo.

+2

Suggerimento: L'definito (YII_DEBUG) '' non è neccessary - sarà sempre definita come 'true' o' false'. –

3

Una alternativa soluzione è quella di pubblicare i vostri beni modulo come questo:

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

Il quarto parametro impone una copia dei vostri beni, anche se dove già pubblicati. Vedere il manuale su publish() per i dettagli.

2

La ri-pubblicazione di risorse su ogni richiesta richiede potenzialmente molte risorse ed è irrilevante per lo sviluppo.

  • Per lo sviluppo, è molto più semplice per utilizzare la funzione di linkAssets CClientScript. Le risorse sono pubblicate come directory di collegamenti simbolici e non devono mai essere rigenerate. Vedere: http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail

  • per la stadiazione/produzione, è necessario effettuare la compensazione delle attività/cartella parte della vostra routine di aggiornamento/script.

che ricadere in una delle altre soluzioni, se per qualche motivo non è possibile utilizzare i collegamenti simbolici sul computer di sviluppo (non molto probabile).

+0

Soluzione molto interessante. Lo esaminerò ma sembra molto promettente e anzi più veloce di pubblicare le risorse ogni richiesta. – Joe

9

Se si utilizza Yii2, c'è una soluzione molto più semplice attraverso la configurazione.

Aggiungere il seguente alla 'config/web.php':

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

Questo costringe il AssetManager per copiare tutte le cartelle in ogni esecuzione.

+3

.. oppure puoi semplicemente aggiungere ''forceCopy' => YII_DEBUG,' alla sezione ** assetManager ** in ** componenti ** – verybadbug

0

In YII 1 in config abbiamo:

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

] 
Problemi correlati