stworzyłem widżet, który rejestruje swój własny skrypt jak poniżejZmuszanie Script kolejności od metody registerScript w Yii
class MyWidget extends CWidget {
public function run(){
Yii::app()->clientScript->registerScript(__CLASS__, <<<JAVASCRIPT
var a = "Hello World!";
JAVASCRIPT
, CClientScript::POS_END);
}
}
A w układzie wzywam widżet lubię tego
<?php $this->widget('MyWidget');?>
<?php echo $content;?>
ale w zobacz plik, potrzebuję zmiennej zadeklarowanej przez ten widget.
<?php
Yii::app()->clientScript->registerScript('script', <<<JAVASCRIPT
alert(a);
JAVASCRIPT
, CClientScript::POS_END);
?>
Należy zauważyć, że zarówno w sposób registerScript użyć POS_END jako położenie skryptu ponieważ zamierza umieścić wszystkie skryptów (w tym CoreScript przykład jQuery jQueryUI etc) po znaczniku <body>
.
Problem polega na tym, że renderowany skrypt wyświetli ten z pliku widoku, a następnie ten z widżetu.
alert(a);
var a = "Hello World!";
Jak widać powyższy kod nie zadziała, więc muszę umieścić drugi wiersz powyżej pierwszego wiersza.
Każdy pomysł, jak zmusić zamówienie? Nie mam problemu z rozszerzeniem CClientScript
(i tworzeniem nowej metody registerScript
), o ile wszystkie skrypty będą renderowane w pozycji końcowej i nie będę musiał pobierać tych wewnętrznych kodów JavaScript powyżej do nowego pakietu lub pliku.
Moją intencją jest świadczenie wszystkich skryptów na końcu. Chodzi o to, że skrypt w widgecie zależy od jQuery, a ja włożyłem wszystkie coreScripty na koniec, ustawiając pole 'coreScriptPosition' (http://www.yiiframework.com/doc/api/1.1/CClientScript#coreScriptPosition- szczegóły) jako POS_END. –
Cóż, masz zły pomysł, lub musisz podzielić deklarację var na HEAD, treść widżetów skryptu END, lub U musisz zmienić END na GOTOWE: Yii :: app() -> clientScript-> registerScript ('script' , <<< JAVASCRIPT alert (a); JAVASCRIPT , CClientScript :: POS_READY); – Sergey