Комментарии пользователя «kpoxas»

+1
Кстати по моему опыту такая конструкция не срабатывает потому, что если плейсхолдер непустой, то должен выводиться он сам, о есть он есть и в условии, и в выводе.
Вот попробуйте вставить

[+validationmessage:isnot=``:then=`
        bla bla bla
`+]

И должно работать
Вообще старайтесь использовать:
[+validationmessage:ifempty=`..........`+]

avatar

kpoxas

  • 26 августа 2010, 12:09
0
Баги phx, а вернее тамошней регулярки. У меня бывало, что в одном шаблоне 2 одинаковых конструкции рабботали по-разному :)
avatar

kpoxas

  • 26 августа 2010, 02:32
0
Для Evo лучший, что я видел FileDownload
avatar

kpoxas

  • 26 августа 2010, 02:30
0
Боже, мать моя женщина!
Есть же API и функции работы с БД
Хотя бы пользуйтесь $modx->makeUrl для формирования ЧПУ:

global $modx;
<a href="'.$modx->makeUrl($row[uparent]).'#'.$row[id].'" class="darkgrey xsmltxt">'.$row[content].'</a></div>';
avatar

kpoxas

  • 26 августа 2010, 02:24
+1
вместо:

preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
                        if ($matches[0]) {
                                $template = str_replace($matches[0], '', $template);
                                $this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
                        }
avatar

kpoxas

  • 20 августа 2010, 19:04
0
наверное, сниппет в сниппете был. Еще не нашел, как это побороть
avatar

kpoxas

  • 5 августа 2010, 20:23
0
Заменил

if ($this->snippetsParsed > $this->snippetsQuantity || ($this->snippetsQuantity==0) )


на

if (/*$this->snippetsParsed > $this->snippetsQuantity || */($this->snippetsQuantity==0) )


Вроде работает

А так делали?
avatar

kpoxas

  • 5 августа 2010, 17:01
0
Заменил

if ($this->snippetsParsed > $this->snippetsQuantity || ($this->snippetsQuantity==0) )

на

if (/*$this->snippetsParsed > $this->snippetsQuantity || */($this->snippetsQuantity==0) )

Вроде работает
avatar

kpoxas

  • 2 августа 2010, 01:03
0
Ищу решение, чтобы это все работало в случае, если какой-то сниппет содержит чанк, содержащий другой сниппет
avatar

kpoxas

  • 2 августа 2010, 00:40
0
Можно тоже написать патч, чтоб отслеживал условия, и не выполнял сниппеты в условиях
avatar

kpoxas

  • 30 июля 2010, 03:19
0
документ не кэшируется. Но дело не в этом. Он и не должен исполняться.
Дело в том что PhX выполняет сниппет в независимости от того, должен он выводиться или нет
avatar

kpoxas

  • 29 июля 2010, 14:57
0
есть еще одна существенная недоработка:
если я вызываю такую конструкцию:
[+phx:if=`[*id*]`:is=`81`:then=`
      [[Ditto? &parents=`15` &startID=`15`  &removeChunk=`Comments` &tpl=`ditto_portfolio` &paginate=`1` &extenders=`dateFilter,tagging` &paginateAlwaysShowLinks=`1` &dateSource=`pub_date` &tagData=`partnersTags` &tagDelimiter=`,`  &dateFormat=`%d.%m.%Y` &sortBy=`pub_date` &id=`portfolio2`]]
   `+]

Выполняется 17 запросов к БД не на странице 81!

А при такой:

[+phx:if=`[*id*]`:is=`81`:then=`
      [!Ditto? &parents=`15` &startID=`15`  &removeChunk=`Comments` &tpl=`ditto_portfolio` &paginate=`1` &extenders=`dateFilter,tagging` &paginateAlwaysShowLinks=`1` &dateSource=`pub_date` &tagData=`partnersTags` &tagDelimiter=`,`  &dateFormat=`%d.%m.%Y` &sortBy=`pub_date` &id=`portfolio2`!]
   `+]

всего 4!!!
Есть мнения, как это исправить?

avatar

kpoxas

  • 29 июля 2010, 13:12
0
Дело в том, что для своих Шаблонов Ditto инициализирует класс pHX отдельно. То есть pHx может парсерить странцу за несколько вызовов. Счетчик при этом сбрасывается.
У меня получалось всегда, что именно плагин запускал класс последним. Но это не догма. Конечно, это дело тестирования.

Кстати про ваше решение: я его туда вроде инсталлировал :) И оно есть в прикрепленном файле.
А на форум разработчикам pHx по-моему бесполезно писать. Может, конечно, я не туда пишу http://modxcms.com/forums/index.php/topic,50281.msg301735.html#msg301735?
avatar

kpoxas

  • 29 июля 2010, 11:50
+1
Еще одна правка. Так как зачастую плейсхолдеры не содержат сниппетов внутри, то

if ($this->snippetsParsed >= $this->snippetsQuantity)
                {
                        preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
                        if ($matches[0]) {
                                $template = str_replace($matches[0], '', $template);
                                $this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
                        }
                }

надо заменить на такое, условие:

if ($this->snippetsParsed > $this->snippetsQuantity || ($this->snippetsQuantity==0) )
		{
			
			preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?|)(\1|\))\]~s', $template, $matches);				
			if ($matches[0]) {
				$template = str_replace($matches[0], '', $template);
				$this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
			}
		}

Работает вместе с плэйсхолдерами Jot (делал 3 вызова с разными tagid) и Ajaxsearch на одной странице — проверено!!!
avatar

kpoxas

  • 27 июля 2010, 01:51
0
сейчас просто не до конца решил этот вопрос. Просто, когда этот парсер вызывается несколькими сниппетами (AjaxSearch, Jot ...), некоторые плейсхолдеры неправильно обрабатываются и выводится "`+]" в некоторых местах. Никто дальше не копался?
avatar

kpoxas

  • 26 июля 2010, 16:11
+2
Решил проблему таким образом:
Открываем phx.parser.class.inc.php
После
var $placeholders = array();

добавляем две переменные:

var $snippetsQuantity=0; 
var $snippetsParsed=0; 

Они будут отображать количество сниппетов на странице и кол-во обработанных сниппетов соответственно.
Затем после строчки
$template = $modx->documentOutput;

вставляем код подсчета всех сниппетов:


preg_match_all('~\[(\[|\!)(.*?)(\]|\!)\]~s', $template, $matches);		
$this->snippetsQuantity=count($matches[0]);

Следовательно меняем код:
preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
			if ($matches[0]) {
				$template = str_replace($matches[0], '', $template);
				$this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
			}

на
if ($this->snippetsParsed >= $this->snippetsQuantity)
		{
			preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
			if ($matches[0]) {
				$template = str_replace($matches[0], '', $template);
				$this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
			}
		}


То есть мы не будем вырезать неизвестные плейсхолдеры пока не выполнятся все сниппеты.
Ну и, наконец, будем считать выполнение сниппетов.
После строк

$replace = $modx->evalSnippets("[[".$snippet."]]");
$this->LogSnippet($replace);
					
// Replace values
$var_search[] = $matches[0][$i];
$var_replace[] = $replace;	

вставляем:
$this->snippetsParsed++;


Вуаля — теперь работает вызов [!Jot!] на кэшируемой странице!
И мы экономим огромное количество ресурсов!
avatar

kpoxas

  • 25 июля 2010, 19:14
+1
Исследование проблемы показало, что pHx при первых парсингах ничего не делает с плэйсхолдерами, что установлены сниппетами, так как сниппеты выполняются тем же парсерингом. Следоваетльно сниппет выполняется на первых прогонах, а функция, о которой я писал выше, убивает незамененные плэйсхолдеры — де факто те плэйсхолдеры что и созданы сниппетом.
Если, например, сделать счетчик парсерингов, и поставить условие на выполнение
preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
        if ($matches[0]) {
                        print_r ($matches[0]);
                        $template = str_replace($matches[0], '', $template);
                        $this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
                }

скажем, когда значение достигнет 5-9, то на кэшируемой и некэшируемой странице плэйсхолдеры будут вставляться нормально.
Это касается и пагинации Ditto (плэйсхолдеров со страницами).
Для решения проблемы нужно как-то заставить pHx сначало выполнить все сниппеты, а потом плэйсхолдеры.
avatar

kpoxas

  • 25 июля 2010, 17:42
+1
Проблема в классе pHx:
в строчках:

preg_match_all('~\[(\+|\*|\()([^:\+\[\]]+)([^\[\]]*?)(\1|\))\]~s', $template, $matches);
    	if ($matches[0]) {
			print_r ($matches[0]);
			$template = str_replace($matches[0], '', $template);
			$this->Log("Cleaning unsolved tags: \n" . implode("\n",$matches[2]) );
		}
Он вырезвет вообще плэйсхолдеры jot.
Кто-то знает, как починить?
avatar

kpoxas

  • 25 июля 2010, 02:54