Но это не решает проблемы повторной загрузки скриптов. Кто то сталкивался с подобным, или кто знает решение?
P.S. я немного покопал класс CClientScript, и обнаружил что при $processOutput = true все скрипты в конечном итоге загружаются через CHtml::scriptFile(), без проверки на их наличие.
я это решил использованием nyroModal плагина (модальное окно делает) так вот этот вполне себе хороший плагин не загружает без специального указания внешние срипты
А в целом после отказался от генерации яваскрипта средствами CHtml
На странице есть виджет ActiveForm, captha + несколько своих скриптов, которые привязаны к определенным событиям.
Виджеты содержат скрипты и события, которые должны быть инициированы при загрузке страницы.
при обычном заходе на страницу, все работает, без каких бы то ни было проблем (в контроллере используется $this->render())
при ajax-запросе (в моем случае - это загрузка контента в модальное окно), скрипты грузятся повторно, в контроллере вызывается метод $this->renderPartial(<view>, <data>, false, true) для того чтобы подгрзузить не весь контент, а только нужный вьювер, 4-ый параметр в true, чтобы были загружены скрипты используемые в виджетах (более глобально, те, которые подключаются через registerScriptFile() )
Странно еще то, что при вызове $this->render() скрипты грузятся из директории, указанной в Yii::app()->getClientScript()->setCoreScriptUrl(’/js’),
а при $this->renderPartial() - по умолчанию из /assets/…
Пока я вижу 2 решения проблемы:
переписать системынй класс CClientScript
не использовать во вьюверах, которые должны подгружаться асинхронно, методы registerScriptFile() registerScript(). Вместо этого писать <script type="text/javascript">$(document).ready(function () { …. А чтобы иницировать события в виджетах, то надо также повторно прописывать еще и для них события.
Я прекрасно понимаю то о чем Вы написали и сталкнулся с этим достаточно давно.
Поэтому и сказал Вам что в качестве модального окна использу. nyromdal ( в гугле найдете )
так вот ниромодал игнорирует внешние скрипты. Когда Юии сгенерирует контент для аякс при включенно processOutput’е он вставит и зависимые от всех этих штучек - jquery.js и иже с ним …
Так вот Ниромодал если не указать никак доп. параметр в тэг script не будет загружать их и проблема решается.
Так что Вашу проблему я понимаю и рассказал как Вам ее без костылей
А кстати грузятся все скрипты у Вас потому как капча наверняка исп. механизы Yii для перегенерации не перегружая страницу. вот и нужен ей для этого jquery
Я понял о чем вы говорите, и плагин смотрел. Но он, решая одну проблему, приводит к другой. собственно то что было, только наоборот.
Получается, что для каждой такой "ссылки" необходимо указывать какие скрипты надо иницировать в окне. Шило на мыло одним словом. Более того, надо вручную генерировать код, который создают виджеты, чтобы он тоже запустился. Это совсем уже не то.
Для простоты понимания проблемы: есть страница с формой, валидируемая ajax-ом посредствам ActiveForms. + на страничке UI-datepicker + yii-captha. При загруке такой странички посредсвтам ajax, мы получаем описаные проблемы.
Пока что ни одно решение не является красивым и оптимальным.
[size="1"](прошу не говорить о том, что лучше использовать другие валидаторы, разговор не о том)[/size]
При открытии странички с данным вьювером) виджет подключает необходимые скрипты (в частности, jquery.yiiactiveform.js) и с помощью registerScriptFile() вставляет в конец страницы примерно такой код [size="1"](чтобы добавить атрибуты для подключаемого скрипта, мне необходимо править системные виджеты)[/size]
чтобы игнорировать загрузку библиотеки jquery. В лайауте размещать нельзя, т.к. при использовании renderPartial() будут взяты дефолтные настройки.
Папку для скриптов тоже изменил, т.к. был модифицирован скрипт ActiveForm - добавил возможность редиректа и выполнения своей функции после успешной валидации и сабмита формы. Если кому надо, могу выложить файл.
Будем ждать. К сожалению предложенный вами способ не всегда получится применить, тем не менее спасибо за советы
ух, ребята, оказывается не только у меня такие проблемы возникают )) я (дабы не клювать себе мозг и забыться на эту проблему) решил сделать так (привожу сам принцип - кусок выдран с рабочего проекта))
суть его - коллекционировать то, что уже есть на странице или то, что было динамически подгружено… вызывается init() на ready() документа, все остальное, как вы могли догадаться, дело техники (добавляем следующий кусочек на beforeAction в своем контроллере):
суть - коллекционирование js/css (+дальнейшее коллекционирование при появлении нового содержимого), которые уже есть на клиенте, в каждом ajax запросе - передача этой коллекции на сервер, где тот в beforeAction пробегаемся по коллекции scriptMap, которые берутся из запроса и говорит что "ИХ ВСТАВЛЯТЬ В КОНЕЧНЫЙ XHTML УЖЕ НЕ НУЖНО".
Кусок js - в любое место (лишь бы подключался после jQuery),
Подскажите, на данный момент имеется "правильное решение" обсуждаемой в данной теме проблемы?
Я пока решаю это костылем, прописывая в форме, подгружаемой в модальном диалоговом окне, к id - time(). Это позволяет submit-кнопку делать уникальной при каждой загрузке формы (без обновления страницы). Если этого не делать то при повторном открытии диалога submit-запрос отрабатывается столько раз, сколько открывалась форма.