Forums / National / Russian / Тех. поддержка / интересно почему...

переменная убита

Mr.Emm
#1 2010-06-22 06:48
Пишу скрипт с использованием XTemplate, долго не раздумывая скопировал сласс из папки cotonti...
суть вопроса вот в чем, есть форма, отправляется она с помощью ajaxSubmit примерно так:
$('#addNew').live('submit', function() {
   $(this).ajaxSubmit({
			//target: '#testinfo',
  			//beforeSubmit: _validate,
                        url: "ajax.php?q=add&n=insert",
                        dataType: 'json',                        						            
  			success: function(answer) {
						            
                            if(array_key_exists('errors', answer)) { 
                               printError(answer.errors);
                                return;
                            }
                          alert(answer.mydata);                                              
                         }                         
		  });
	return false; 
  });
работает оно до тех пор пока в скрипте по урлу (ajax.php?q=add) не прописываю инициализацию класса XTemplate:
   $t = new XTemplate('page.tpl');
после этой строчки, переменная $n(n=insert) - перестает существовать(или хз), почему так случается объясните мне? :)

P.S. в запросе с простым $.ajax() все норм, отрабатывает и возвращается как положено.
P.P.S. много разных, спонтанных мыслей по этому поводу... злая штука дебаг! %)
Trustmaster
#2 2010-06-24 00:30
А q=add при этом нормально передаётся?
May the Source be with you!
Mr.Emm
#3 2011-01-30 06:52
А q=add при этом нормально передаётся?
Уже точно не припомню как там было, переменная $q была до вызова шаблонизатора..., но в итоге я переписал, переместил инициализацию шаблонизатора в условие, раньше оно было до условия switch($n),а почему убивало переменную я не стал выяснять ибо время), таким макаром убил двух зайцев, т.к. не всегда нужно было парсить шаблон.
Но это сейчас не столь важно, всплыл очередной подводный КАМЕНЬ, в проекте очень активно используется аякс, поэтому чобы локализировать яваскрипт и объявить необходимые системные переменные я сначала пропускаю его через шаблонизатор, и кэширую, вывод разбывается по частям в зависимости от запроса, сейчас три блока общим размером >4000 строк кода. Так вот, буквально вчера при очередной доработке всплыл баг при парсинге шаблона(яваскрипта):
Notice: Undefined index: LIST_SCRIPT in Z:\html\...\system\templates.php on line 201
Fatal error: Uncaught exception 'Exception' with message 'Block LIST_SCRIPT is not found in skins/mask/javascript.tpl' in Z:\html\...\system\templates.php:202
если я убираю часть добавленного кода(любой), тоесть уменьшаю размер блока, то все нормально парсит, а иначе матюгается(общий размер блока ~2500строк), что это может быть, ограничение шаблонизатора на размер блока или всеже баг??
Trustmaster
#4 2011-01-30 15:13
Странный шаблонизатор у вас. В официальном это строка 214, а не 202 и она закомментирована. И называется он xtemplate.php, а не templates.php.

Судя по всему, не создаётся блок LIST_SCRIPT. Скорее всего, это связано с одной из причин: а) нарушена структура блоков (что-то не закрыто), б) PCRE достигает предела размера стека из-за того, что входная строка слишком велика. Вариант б), судя по описанию, весьма вероятен. Шаманство с бубном (ulimit) в командной строке на сервере вряд ли подойдёт, так что лучше всего в таком случае разбить файл на несколько.
May the Source be with you!
Mr.Emm
#5 2011-01-30 20:51
Да, похоже это вариант Б, пробовал решить вопрос увеличением значения опций pcre.backtrack_limit и pcre.recursion_limit, но это почему-то не работает, как на php5.2.14 так и 5.3.3 ...странно=\
Уже расселил блоки по отдельным файлам, но очень не хочется разбивать этот наибольший скрипт на части ибо потом прибавиться гемора с поддержкой, и все из-за этого ипучего лимита... что еще можете посоветовать?

Насчет несоответствий в шаблонизаторе, ничего странного) у меня там просто более старая версия, от котонти0.6.2 вроде, не обновлял ибо не увидел ничего важного в обновлении, строку специально раскомментировал, я разработчик - мне это необходимо=)) а название файла оно осталось от предыдущего древнего самописного шаблонизатора я скопипастил код а название не удосужился поправить, но уже исправил)
Trustmaster
#6 2011-01-30 21:57
Опции pcre.backtrack_limit и pcre.recursion_limit тут вряд ли помогут. Скорее надо увеличивать ulimit для пользователя, под которым работает PHP. Об этом немного говорится здесь и здесь.

Более кардинальным решением будет переписать XTemplate без использования PCRE для парсинга блоков, а использовать вместо этого строковые функции str*. В принципе это вполне реально, просто тогда шаблонизатор будет чувствителен к лишним/недостающим пробелам.
May the Source be with you!