В первый раз сталкиваюсь с подобной проблемой. Работаю на MODX, в сниппете параметром возвращается строка, на экран вывести ее можно, но операцию сравнения провести нельзя, потому strlen() строки всегда возвращает значение 14. Какой бы ни была строка, хоть пустой хоть длинной, ее размер всегда показывается 14. Тоже самое показывает var_dump. Необходимо провести сравнение строки с пустой строкой, но это не получается. Empty() тоже показывает, что строка не пустая. Вопрос: как привести эту странную строку к нормальному виду, а точнее взять ее реальный размер? Может кто сталкивался.
Мультибайтовый вариант показывает тоже самое 14. Как проверить на спецсимволы, не думаю, что они тут есть. Var_dump показывает: string(14) "" Решил извратится так: $str = print_r($str, true); - типа вернуть печатное значение, не помогло, возвращает тоже самое =)
Это какая-то хитрость или особенность работы с MODX, а точнее с его шаблонизатором, параметр указывается прямо в шаблоне, где он в свою очередь берется из значение placeholder-а... короче, зашел в дремучий лес. Засунул свою строку (типа пустую) в JSON: json_encode(array('zzz'=>$str)) Смотрю var_dump: string(24) "{"zzz":""}" - все равно не хочет показывать правильно. mb_strlen тоже показывает 24, хотя по факту 12 Или вот другая строка из того же параметра: string(24) "{"zzz":"Магазин Ника раз два три"}" - а должно быть 36 =) Думал, может это такая неоднозначная работа с указателями, где потерялись байты указывающие на реальный размер строки. Теперь думаю, что это косяк PHP. Добавлено спустя 6 минут 18 секунд: Кусок шаблона: Код (Text): <title>[[!getTitle? &title=`[[+sitetitle]]`]]</title> Сниппет: Код (Text): <?php $t = $modx->getOption('title', $scriptProperties, ''); $sname = $modx->getOption('site_name'); $ptitle = $modx->resource->get('pagetitle'); return empty($t) ? $ptitle.' - '.$sname : $t; Замысел простой, если в шаблоне &title не пустой, то выводим его, иначе выводим Имя сайта и Заголовок страницы
А что если попробовать получить доступ ко всем символам поотдельности? =) Мне просто интересно. И еще, что если попробовать вывести 24 и 25-й символы? Может там EOL спрятался? MODX не Evo я надеюсь? =)) Еще мысля у меня ---отпишите плз плейсхолдер- не 24-ли символа он? =)) Добавлено спустя 54 секунды: Короч в эво и рево парсеры работают по-разному, в рево работает рекурсивно. Так что скорее всего у вас эво =) Добавлено спустя 1 минуту 41 секунду: короч расписал ход мысли епт%)
Слава богу у меня MODX Revolution 2.2.6 =) Плейсхолдер устанавливается только на некоторых страницах, где нужен конкретный тайтл (в сеошных целях). Просто берется из базы Код (Text): $modx->setPlaceholder('sitetitle', $row['meta_title']); Сейчас попробую как-нибудь посимвольно разобрать строку...
Лол... результаты такие: Одну и ту же переменную строку сначала разобрал по символам: Код (Text): preg_match_all('/./iu', $t, $a); print_r($a[0]); Array ( [0] => [ [1] => [ [2] => + [3] => s [4] => i [5] => t [6] => e [7] => t [8] => i [9] => t [10] => l [11] => e [12] => ] [13] => ] ) А затем просто вывел: Код (Text): var_dump($t); string(14) "Магазин Ника раз два три" Подскажите, то сделать? Это не укладывается в мое мировоззрение. Как узнать реальный размер строки ("Магазин Ника раз два три")?
Магия MODx Тут точно нужна бутылка xD. Ща подумаем Добавлено спустя 52 секунды: Решение --передавать плейсхолдер в сниппет Добавлено спустя 17 секунд: По крайней мере стоит попробовать xD Добавлено спустя 12 минут 49 секунд: Я запутался окончательно. У меня небыло подобных проблем никогда =\. Добавлено спустя 4 минуты 1 секунду: хм, а если вынести [[+sitetitle]] в отдельный чанк?) А потом просто $t=$modx->getChunk('чанк_с_тем_самым_плейсхолдером'); По-сути там будет уже обработанный текст, а так как там просто плейсхолдер - то будет либо пусто, либо нет Добавлено спустя 10 секунд: Отсюда и прыгать Добавлено спустя 1 минуту 54 секунды: И кста плейсхолдер лучше прописывать в некешируемом варианте, может и в этом дело, хз
Вот я кстати пытался взять значение прямо из сниппета, типа: Код (Text): $value = $modx->getPlaceholder('MyPlaceholder'); Но всегда возвращается пустое значение. Видимо причина в порядке обработки шаблона, то есть этот код обрабатывается раньше, чем плейсхолдер ставится... что навело меня на мысль пересмотреть структуру.
В общем произвольные плейсхолдеры видимо обрабатываются в последнюю очередь, отсюда косяк. Может TV попробовать на крайняк? Добавлено спустя 1 минуту 45 секунд: Просто хз, я над модексом вообще извращался, и подобное делал, НО у меня не было подобных проблем. Версия MODx та-же. 2.2.6pl
$value = $modx->getPlaceholder('MyPlaceholder'); сам плейсхолдер вынести в чанк, и обработать парсером с помощью getChunk, на выходе получим не плейсхолдер, а его значение.
Сделал по схеме с чанком... тоже самое! Выдает значение: string(14) "" Я сдаюсь -_- Буду пересматривать реализацию
Код (PHP): <?php // file charset is windows-1251 $s = 'Магазин Ника раз два три'; echo mb_strlen($s)."\n"; // 24 mb_internal_encoding('utf-8'); echo mb_strlen($s)."\n"; // 9 и теперь вот так (найди три отличия) Код (PHP): <?php // file charset is UTF-8 $s = 'Магазин Ника раз два три'; echo mb_strlen($s)."\n"; // 44 mb_internal_encoding('utf-8'); echo mb_strlen($s)."\n"; // 24 правильный результат только в последней строке, т.к. - кодировка utf-8 - мы уведомили PHP, что кодировка utf-8 var_dump всегда говорит длину в байтах, а не в символах. ему плевать на кодировку. а как обстоят дела с твоим MODX: реально какая кодировка, если UTF-8, устанавливается ли где-нибудь internal encoding???
Сходил проветрился и догнал решение. Можно на странице (в ресурсе) поставить: Код (Text): $modx->resource->set('pagetitle', 'Мой заголовок для страницы'); А потом в сниппите на шаблоне вызвать: Код (Text): $ptitle = $modx->resource->get('pagetitle'); Если заголовок не устанавливается, то остается как был по-умолчанию заголовком ресурса. Профит! r3l0c, спасибо за советы и подсказки! =)
MODx он такой . В переменной находится не пропарсеный слейсхолдер, возвращаем его снппетом в шаблон, и парсер его уже там заменяет). Добавлено спустя 31 секунду: Просто произвольные слейсхолдеры модекс парсит в последнюю очередь