2013-03-25 1 views
10

मेरी वेबसाइट को अलग मॉड्यूल में बांटा गया है। प्रत्येक मॉड्यूल में /protected/modules/my_module/assets/css या js में जेएस फाइलों के लिए इसकी विशिष्ट सीएसएस या जेएस फ़ाइलें हैं। यीस एसेट्स मैनेजर फ़ोल्डर बनाता है जब मैं पहली बार उस पृष्ठ का उपयोग करता हूं जो मेरी संपत्ति का उपयोग करता है। दुर्भाग्यवश यदि मैं अपनी फ़ाइलों में sth बदलता हूं - Yii मेरी सीएसएस या जेएस फ़ाइल को पुनः लोड नहीं करता है। मुझे मैन्युअल रूप से /projects/assets फ़ोल्डर को हटाना होगा। जब आप ऐप विकसित कर रहे हों तो यह वास्तव में परेशान है।क्या प्रत्येक अनुरोध पर वाईआई को मॉड्यूल संपत्तियों को फिर से लोड करने का कोई तरीका है?

क्या वाईआई को प्रत्येक अनुरोध को फिर से लोड करने के लिए मजबूर करने का कोई तरीका है?

उत्तर

20

components/Controller.php में निम्नलिखित जोड़ें (या समायोजित एक मौजूदा beforeAction):

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

इस यह क्या करता है कि किसी भी कार्रवाई शुरू कर रहे हैं इससे पहले कि, आवेदन अगर आप डिबग मोड में हैं देखने के लिए जाँच करेंगे, और अगर इसलिए, परिसंपत्ति प्रबंधक को प्रत्येक पृष्ठ लोड पर सभी संपत्तियों को जबरन दोबारा शुरू करने के लिए सेट कर देगा।

देखें: http://www.yiiframework.com/doc/api/1.1/CAssetManager#forceCopy-detail

मैं इस परीक्षण नहीं किया है, लेकिन मेरा मानना ​​है कि प्रलेखन यह ठीक काम करना चाहिए पर आधारित है।

नोट: beforeAction के भीतर इस कोड की नियुक्ति सिर्फ यह कहां है कि इसे कहां रखा जाए। publish() पर किसी भी कॉल से पहले आपको forceCopy संपत्ति को सत्य पर सेट करने की आवश्यकता है, और इसे beforeAction में रखना उस लक्ष्य को पूरा करना चाहिए।

+2

सुझाव: 'परिभाषित (YII_DEBUG)' आवश्यक नहीं है - यह हमेशा या तो 'TRUE' या' FALSE' के रूप में परिभाषित किया जाएगा। –

3

एक वैकल्पिक समाधान इस तरह अपने मॉड्यूल एसेट प्रकाशित करने की है:

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

चौथे पैरामीटर अपनी संपत्ति की एक प्रति को लागू करता है, भले ही वे पहले से ही प्रकाशित कहाँ। विवरण के लिए publish() पर मैनुअल देखें।

2

प्रत्येक अनुरोध पर पुन: प्रकाशन संपत्ति संभावित रूप से बहुत सारे संसाधन लेती है और विकास के लिए अनैतिक है।

  • विकास के लिए, यह CClientScript की linkAssets सुविधा का उपयोग करने के लिए बहुत आसान है। संपत्ति प्रतीकात्मक लिंक निर्देशिका के रूप में प्रकाशित की जाती है, और को पुन: उत्पन्न नहीं किया जाना चाहिए। देखें: http://www.yiiframework.com/doc/api/1.1/CAssetManager#linkAssets-detail

  • मचान/उत्पादन के लिए, आप संपत्ति/फ़ोल्डर साफ़ करने से आपकी अद्यतन दिनचर्या/लिपि के हिस्सा बनाना चाहिए।

किसी अन्य कारण से केवल एक अन्य समाधान में वापस आना अगर किसी कारण से आप अपनी विकास मशीन (बहुत संभावना नहीं) पर प्रतीकात्मक लिंक का उपयोग नहीं कर सकते हैं।

+0

बहुत दिलचस्प समाधान। मैं इसे देख लूंगा लेकिन यह हर अनुरोध को प्रकाशित संपत्तियों की तुलना में बहुत ही आशाजनक और वास्तव में तेज़ लगता है। – Joe

9

यदि आप वाईआई 2 का उपयोग कर रहे हैं तो कॉन्फ़िगरेशन के माध्यम से एक बहुत ही सरल समाधान है।

अपने 'config/web.php' के लिए निम्न जोड़ें:

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

यह AssetManager बलों प्रत्येक रन पर सभी फ़ोल्डर कॉपी करने के लिए।

+3

.. या आप ** घटक ** ** ** YII_DEBUG, ** ** ** ** प्रबंधक ** ** ** घटक ** में जोड़ सकते हैं ** – verybadbug

0

config में Yii 1 में हमने:

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

] 
संबंधित मुद्दे

 संबंधित मुद्दे