tabbed UI

Доброго всем времени суток. Я работаю над интерфейсом с динамическими табами и ajax: по аяксовому запросу открываются новые табы, возможность закрывать, скрывать ненужные и прочее. Суть проблемы с которой я столкнулся: допустим в табу загружается форма в которой есть ckeditor, при открытии второй табы с такой же формой в ней не отображается ck, но добавляется ещё один в первую форму - как можно избежать этого? Предполагал решить это так - в аяксовом запросе передавать некую уникальную переменную, допустим количество открытых вкладок с такими же формами как запрашиваемая и добавлять эту переменную к имени полей загружаемой формы, чтобы имена полей в одинаковых формах не пересекались - насколько такое решение “криворуко” и возможно ли решить это другим способом? Ещё одна как мне кажется проблема - после закрытия табы в памяти остаются весь js который был загружен вместе с контентом табы, таким образом после открытия допустим 20 табов с ckeditor’ом в памяти висит столько же скриптов - возможно ли выгружать скрипты после закрытия табы? В jquery по этой теме есть event unload, но встретил только его использование на закрытие окна браузера. Буду рад любой помощи.

Проблему с множественной загрузкой и хранением в памяти скриптов сдвинул с места. На примере ckeditor’а:




public $firstTimeLoaded = true;



добавил в класс виджета ck новую переменную - при загрузке первый раз true, при последующих загрузках: false, далее:




if($this->firstTimeLoaded) {

    Yii::app()->clientScript->registerScript("id","var CKEDITOR_BASEPATH='{$this->assetsPath}/'",CClientScript::POS_BEGIN);

    Yii::app()->clientScript->registerScriptFile($this->assetsPath.'/ckeditor.js');

}



если загружен первый раз - отдаем скрипты, если не первый - не отдаем. Таким образом получилось, что при загрузке самой первой формы с ck загружаются все его скрипты, при загрузке последующих - рендерится только форма и скрипт с реплейсом настроек, ещё и во времени экономия получилась. Таким же образом думаю можно поступать со многими скриптами, хотя возможно есть решение лучше, но я его не знаю.

Другая проблема: uncaught exception: [CKEDITOR.editor] The instance "Category_catDescription" already exists. - собственно то же про что я уже писал - при загрузке формы с полями имеющими те же имена, что загруженная ранее форма - кто-нибудь поделитесь решением.

Вот, кстати, используя мой метод подключения ck и renderPartial(…, …, false, true) таки удалось решить проблему:

uncaught exception: [CKEDITOR.editor] The instance "Category_catDescription" already exists.

Уж не знаю какое этому логическое объяснение, но как вариант, каждый Ajax-запрос затирает старый CKEDITOR. Да, накладно, но наверное это можно обойти, если после загрузки ckeditor.js сделать копию CKEDITOR и перед каждым Ajax-запросом подсовывать ее вместо CKEDITOR.

Попробовал предложенный вами метод: при его использовании лучше всего будет, как мне показалось, удалить registerScriptFile метод из контроллера виджета, чтобы ck не загружался каждый раз заново, а про то что с uncaught exception таким методом справиться - у меня не срабатывает, потому что на одной странице у меня аяксом может быть загружено несколько одинаковых форм, в каждой из которых есть ck и в таком случае я вижу решение этой проблемы в объявление уникальных имен полей и id для каждой формы, то есть:




<textarea id="Post_content" name="Post[content]" cols="50" rows="6" style="visibility: hidden; display: none;"/>



в одной форме на странице, и допустим:




<textarea id="Post_content1" name="Post[content][1]" cols="50" rows="6" style="visibility: hidden; display: none;"/>



и так для каждой новой загруженной формы, но как это сделать лучше - я не знаю, один из вариантов - передача доп. GET переменной при отправке аяксового запроса на загрузку формы, которая каждый раз будет добавляться к имени и id полей формы. А может быть я вообще не в том вижу корень проблемы.

Помогите пожалуйста решить: в лэйауте страницы зарегистрирован jquery.js, при загрузке с помощью ajax новой вкладки с ajaxSubmitButton джквери загружается ещё раз - как избежать повторной загрузки библиотеки?

я точно не знаю, но у меня в приложении логика такая.

jquery в layout не подключается. Подключаются только css файлы. А подключение js функционала происходит в файлах фреймворка в widgets. Ну например в widget CTreeView.php подключение такое (в init()):




$cs->registerScript('Yii.CTreeView#'.$id,"jQuery(\"#{$id}\").treeview($options);");



В общем, я думаю, что в layout не нужно скрипты подключать.

Очень просто, подключать не в лаяуте.

Проблема в том что при аякс запросах и получении данных через renderPartial - лаяут участия не принимает.