Нужно, что бы в сниппете значение из tv было числом
Здравствуйте!
Мне нужно добавлять пунктам меню css-класс разным страницам. Условий много, поэтому я решил сделать для этого свой сниппет «dismenu», что бы там в php все это дело просчитывать. Создал tv (числовое поле) `day-num` для страниц и пытаюсь получить значение в сниппете для переменной $daynum:
Подскажите, что я делаю не так?
Мне нужно добавлять пунктам меню css-класс разным страницам. Условий много, поэтому я решил сделать для этого свой сниппет «dismenu», что бы там в php все это дело просчитывать. Создал tv (числовое поле) `day-num` для страниц и пытаюсь получить значение в сниппете для переменной $daynum:
[[pdoMenu? &parents=`219`
&level=`1`
&includeTVs=`day-num`
&rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]`
]]
Проблема в том, что в сниппете переменная $daynum выводится как текст (т.е. я не могу ее ни сравнить с другим числом, ни сделать арифметические действия). Все мои попытки преобразовать ее в число в сниппете с помощью функций php тоже не дают результата (превращается тупо в 0).Подскажите, что я делаю не так?
Комментарии: 63
А атрибут ссылки не подойдет?
[[*link-attributes]]
извините, не понимаю
Если открыть любой ресурс то там есть поле Атрибуты ссылки, туда можно ставить класс — будет уникальный класс меню.
нет, не подойдет… мне нужно добавлять css-класс сравнивая дни недели (как минимум), т.е. если сегодня среда — то у этого пункта меню один класс, а если четверг — то другой :)
Ясно, но как то сниппет +тв для этого больно круто)
вот на js набросал
jsfiddle.net/jury1/a4mL290e/1/
вот на js набросал
jsfiddle.net/jury1/a4mL290e/1/
да нет же, опять… мне нужно, что если сегодня среда — то дням с понедельника до среды добавить класс «Неактивные» (что бы не открывались), а если Пятница — то уже открывались (типа это уже для следующей недели)… и это еще далеко не все условия — поэтому и хочу через php прописать… «затык» на ровном месте (с тонкостями MODX пока не очень знаком — но он мне нравится реально)..:(
Так а MODX причём, если сниппет это чистый php просто с подключенным MODX API и который принимает значения из вызова (если говорить общими словами), скорее у вас php сломался и нужно отнести его в ремонт
я не знаю… могу только предположить, что переменная попадает в сниппет в виде $daynum=`5` (повторюсь, это только предположение — если я напишу «echo $daynum;», то отображается обычная 5, но если «echo intval($daynum);» — то 0). Т.е. может быть это модоксовские кавычки `` все портят?
Проблема скорее всего в echo, потому, что он пытается преобразовать переменную в строку, предполагаю, что проблема в этом.
Попробуйте так:
Или используйте var_dump
Попробуйте так:
echo (int)$daynum;
Или используйте var_dump
пробовал и
string(12) " 5"="
echo (int)$daynum;
все равно 0var_dump($daynum);
возвращает string(12) " 5"="
так никто и не поможет? :(
Вы бы код своего дисменю выложили бы что ли. Глядишь, кто-то и зацепит глазом.
так в этом dismenu пока и нет ничего толком — я просто увидел что переменная не хочет сравниваться… ну вот:
<?php
$today = date("w"); //echo $today;
$day = $daynum; //echo $day;
//echo intval($day);
//echo (int)$daynum;
if ($today > $day)
return " menu_disabled";
просто увидел что переменная не хочет сравниватьсяВы проверяли на выходе её значение, её тип, и, что получаемое значение не содержит ничего лишнего?
что именно Вы имеете в виду?
как еще что проверить я не знаю… (
echo $day;
отображает 5echo intval($day);
отображает 0var_dump($daynum);
отображает string(12) " 5"="как еще что проверить я не знаю… (
А просто число в day-num подставляли? Работает?
day-num — это у меня Дополнительное поле (tv), тип ввода: число — кроме числа от 0 до 6 туда ничего и не вставится больше.
Как Вы предлагаете проверить?
Как Вы предлагаете проверить?
Прямо число вставить, а не TV. Это имеет смысл для проверки, что обработка TV тут не причём. Ещё можно в плейсхолдер результат записать, вывести его, всунув плейсхолдер где-нибудь на странице (я так поймал на днях, что значения в ТВ едут сплошняком — добавил разделителем запятую и все заработало, как часики). Кстати, лучше сниппет некешированным вызывать, хотя бы на время отладки — иначе бывают свои приколы).
а, понял… если вставляю
&rowClass=`[[dismenu? &daynum=`5`]]`
то все нормально получается… значит причина в самом tv… но что теперь делать?
Я же написал — получить значение тэвэхи.
Ещё можно в плейсхолдер результат записать, вывести его, всунув плейсхолдер где-нибудь на странице
вот сейчас опять не понял, что нужно делать, извините…
мы с вами выяснили, что значение из TV приходят в «неправильном» формате.
Подскажите дальнейший алгоритм действий
мы с вами выяснили, что значение из TV приходят в «неправильном» формате.
Подскажите дальнейший алгоритм действий
Нужно как есть вывести значение, которое попадает сюда: &daynum=`this_value` — Вам нужно увидеть точную запись, которая туда приезжает. Может, она у Вас там какая-то такая: `«value»`.
блин, что-то я уже совсем плохо соображаю… что мне нужно вставить в код шаблона страницы, что бы увидеть то, о чем Вы говорите?
вот я вставляю в шаблон [[*day-num]]
и он фаирбаге вижу " 5 " (т.е. какие-то лишние пробелы) — Вы об этом говорили?
и он фаирбаге вижу " 5 " (т.е. какие-то лишние пробелы) — Вы об этом говорили?
хотя нет, это не те пробелы… в общем просто «5» он мне показывает…
А должно быть просто 5. Ни пробелов, ни кавычек, итд итд. Просто 5.
да нет — там просто 5 отображается… «5» — это в просмоторщике элементов в браузере, там все в кавычках… )
… в общем, третий день пошел, как я не могу с этим разобраться… (((
Ну, ок)
Вот Вы и на финишной прямой. Вы знаете теперь, что отдаёте тэвэхе число 5, а получаете строку 5. Значит, проблема на стадии замены тэвэхи на её значение. Проверьте параметры ввода и вывода тэвэхи. Если там нет проблем (типа параметр вывода — строка, например), попробуйте установить ввод — текст, вывод — по умолчанию.
Вот Вы и на финишной прямой. Вы знаете теперь, что отдаёте тэвэхе число 5, а получаете строку 5. Значит, проблема на стадии замены тэвэхи на её значение. Проверьте параметры ввода и вывода тэвэхи. Если там нет проблем (типа параметр вывода — строка, например), попробуйте установить ввод — текст, вывод — по умолчанию.
но только все это я уже пробовал (еще вчера) :(… где-то на форуме видел, упоминание про то что в сниппет tv отдает строку, но там тоже никакого решения не приводилось
forums.modx.com/thread/62570/tv-1
forums.modx.com/thread/62570/tv-1
Кстати, есть некий параметр processTVs — он подготоваливает тэвэхи согласно настройкам системы. Ни разу сам не применял, не доводилось, но, может он решит проблему, т.к
Список ТВ-параметров, которые нужно обработать и вывести согласно их настроек в менеджере системы.
О Боже, эта Санта-Барбара не закончилась? Я же написал, проблема ваша в echo
Содержимое сниппета:
Вывожу на странице:
и получаю (барабанная дробь):
- Создаю TV и называю его number (Вообще не важно в данном случае тип ввода), присваиваю к шаблону, у ресурса указываю значение: 6
- Создаю сниппет и называю его test
Содержимое сниппета:
<?php
var_dump((int)$daynum);
Вывожу на странице:
[[test?
&daynum=`[[*number]]`
]]
[[*number]]
и получаю (барабанная дробь):
int(6) 6
modx.pro/help/16810#comment-103581 — «а был ли эчо»?)
когда я делаю, как вы написали — у меня и через
А не работает именно когда я через PdoMenu пытаюсь tv получать для других страниц:
echo (int)$daynum;
получается int(6) 6
…А не работает именно когда я через PdoMenu пытаюсь tv получать для других страниц:
[[pdoMenu? `
&includeTVs=day-num`
&rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]`
]]
Приехали, значит многосерийная история… Покажите всё что вы делаете, прям всё и посмотрим
Хорошо. :)
1. Создал tv (числовое поле) `day-num` для страниц (страницы — это у меня дни недели) и заполнил их значениями от 0 до 6
2. Создал сниппет dismenu:
1. Создал tv (числовое поле) `day-num` для страниц (страницы — это у меня дни недели) и заполнил их значениями от 0 до 6
2. Создал сниппет dismenu:
<?php
$today = date("w");
$day = $daynum;
if ($today > $day)
echo "menu_disabled";
3. Вывожу меню с днями недели на странице:[[pdoMenu? `
&includeTVs=day-num`
&rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]`
]]
Все.
Попробуйте [[+tv.day-num]].
&daynum=`[[+tv.day-num]]` — не передает значение в сниппет вообще (
А $tmp = $modx->resource->getTVValue('tv_name'); print_r($tmp);, что говорит?
а что он может сказать?
"$tmp = $modx->resource->getTVValue('day-num'); print_r($tmp);" говорит номер дня недели страницы, на которой мы находимся… А нужно «пробежаться» по всем страницам из pdo меню (
"$tmp = $modx->resource->getTVValue('day-num'); print_r($tmp);" говорит номер дня недели страницы, на которой мы находимся… А нужно «пробежаться» по всем страницам из pdo меню (
А циклы на что?
if ($today > $tmp) заработало или нет?
У меня истерика сейчас начнётся, какие циклы? Зачем кавычки внутри кавычек? Почему динамичные данные скармливаются сниппету, который запускается один раз? Почему echo а не return?
Да где ты это эчо тут узрел-то?!))) Точнее, я вижу где, но исходно было:
<?php
$today = date(«w»);
$day = $daynum;
if ($today > $day)
return " menu_disabled";
Я твои циклы «узрел», ты еще посоветуй Node.js и Jquery вперемешку использовать
в общем я понял, кажется… как в PdoMenu значение tv передать нормально в переменную никто не знает… нужно попробовать передавать в сниппет id страницы и там уже в сниппете с помощью getObject и getTVValue вытаскивать значение tv. так?
Я и не имел ввиду цикл для текущего варианта реализации…
Показываю
- Создаем 7 ресурсов, Понедельник — Воскресенье, у них родитель «Дни недели (2)»
- У них у всех есть TV number (по барабану какой, у меня например тип текст), присваиваем каждому от 1 до 7 соответственно
- Создаем сниппет dismenu с таким содержанием:
<?php $today = date("w"); if($today > (int) $input) return 'menu_disabled';
- На странице выводим так:
{'!pdoMenu' | snippet : [ 'parents' => 2, 'includeTVs' => 'number', 'tvPrefix' => '', 'tpl' => 'item' ]}
- Чанк: item
<li class="{$number | dismenu}"> <a href="{$link}">{$menutitle} ({$number})</a> </li>
- И получаем (Барабанная дробь бл… дь):
<ul class=""> <li class="menu_disabled"> <a href="index.php?id=3">Понедельник (1)</a> </li> <li class="menu_disabled"> <a href="index.php?id=4">Вторник (2)</a> </li> <li class="menu_disabled"> <a href="index.php?id=5">Среда (3)</a> </li> <li class="menu_disabled"> <a href="index.php?id=6">Четверг (4)</a> </li> <li class=""> <a href="index.php?id=7">Пятница (5)</a> </li> <li class=""> <a href="index.php?id=8">Суббота (6)</a> </li> <li class=""> <a href="index.php?id=9">Воскресенье (7)</a> </li> </ul>
- pdoMenu в каком-то цикле запущен?
- Откуда берется данный плейсхолдер [[+day-num]]
Я твои циклы «узрел», ты еще посоветуй Node.js и Jquery вперемешку использовать… изрёк Баха и предложил реализацию в которой зафигачил цикл)))))))
Изрёк Иванушка и наверное предложит вариант лучше чем мой?
так это Вы уже fenom используете? я в нем пока ваще не понимаю.
вставил ваш код
вставил ваш код
{'!pdoMenu' | snippet : [
'parents' => 2,
'includeTVs' => 'number',
'tvPrefix' => '',
'tpl' => 'item'
]}
заменил на свои значения — белый экран
Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректно. И лично мне интересно было разобраться в проблеме текущей реализации.
В общем, тут Вам в мануалы — копайте в сторону {ignore}{/ignore} и пробелов (по ходу курения манов поймёте, о чём речь). + логи MODX по мере внесения правок смотрите, они вполне говорящие в данном случае.
В общем, тут Вам в мануалы — копайте в сторону {ignore}{/ignore} и пробелов (по ходу курения манов поймёте, о чём речь). + логи MODX по мере внесения правок смотрите, они вполне говорящие в данном случае.
Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректноНу так корректно или всё же некорректно?)
Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректноИ причём вообще fenom если он тут никакую погоду не делает. Ну напишите всё на стандартном синтаксисе.
Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректноПромолчал, но не промолчал — охерительная логика
А $tmp = $modx->resource->getTVValue('tv_name'); print_r($tmp);, что говорит?Ну не запросы же делать в базу вместо самого pdoTools, когда это как собаке пятая нога
А всё корректно, что не некорректно).
Я же прямо написал:
Я же прямо написал:
И лично мне интересно было разобраться в проблеме текущей реализации.— слово «проблема» видать, надеюсь?) Вот тут вот у тебя со зрением всё отлично было, а в этот раз удила закусил что-то)
Изрёк Иванушка и наверное предложит вариант лучше чем мой?Ещё раз повторю:
И лично мне интересно было разобраться в проблеме текущей реализацииЯ нигде слова не сказал, что твои решения хоть малость плохие итп — не по делу нападаешь — охолони!)
Ну не запросы же делать в базу вместо самого pdoTools, когда это как собаке пятая ногаВообще-то, это было для проверки предложено.
А $tmp = $modx->resource->getTVValue('tv_name'); print_r($tmp);, что говорит?— ключевое, «что говорит».
Короче, не суть. Лучше поделись, разобрался ты в самой проблеме или нет в рамках предложенного в топике вызова сниппа?
Вообще-то, это было для проверки предложено.О Боже, проверки? Проверки чего? Придёт значение или нет? А выше уже не было известно?
Короче, не суть. Лучше поделись, разобрался ты в самой проблеме или нет в рамках предложенного в топике вызова сниппа?Короче, лучше делюсь, разобрался я в самой проблеме в рамках предложенного в топике вызова сниппета:
Проблема заключается в том, что проблемы вовсе и нет! Опа, уже 500 раз говорю. Санта-Барбара бл…
Если бы знаний было чуть больше, то можно было бы увидеть, что вызов либо неправильный, либо контекст неизвестен, я уже выше говорил:
[[pdoMenu?
&parents=`219`
&level=`1`
&includeTVs=`day-num`
&rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]` // Вот этого вот что такое?
]]
Нужно, что бы в сниппете значение из tv было числомВот сам вопрос и вот ответ: «Нужно? Можно! Ведь существуют тысячи компонентов с десятками тысяч сниппетов, и у них как-то получается получить то, что нужно. Еще не смешно? pdoMenu который вызывается в примере (барабанная дробь) получает в качестве параметра limit число и у него как ни странно всё получается»
да блин, парни, что мне написать-то, что бы число в сниппет попадало?!
Забудь про циклы, задача и правда простая) Задача:
Не используя fenom и tpl вызвать в параметре &rowClass сниппета pdoMenu свой сниппет, который вернёт значение «this text», if (x > n); где x — текущий день недели, а n — числовое значение tv, указываемое на странице вручную (и описать причины текущей проблемы):
Код вызова:
Мы верим в Баху!)
Не используя fenom и tpl вызвать в параметре &rowClass сниппета pdoMenu свой сниппет, который вернёт значение «this text», if (x > n); где x — текущий день недели, а n — числовое значение tv, указываемое на странице вручную (и описать причины текущей проблемы):
Код вызова:
[[pdoMenu? &parents=`219`
&level=`1`
&includeTVs=`day-num`
&rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]`
]]
Код сниппета:<?php
$today = date(«w»);
$day = $daynum;
if ($today > $day)
return " menu_disabled";
Мы верим в Баху!)
Вызов:
Чанк:
[[!pdoMenu?
&parents=`2`
&includeTVs=`number`
&tvPrefix=``
&tpl=`item`
]]
Чанк:
<li class="[[+number:dismenu]]">
<a href="[[+link]]">[[+menutitle]] ([[+number]])</a>
</li>
а чем конкретно эта конструкция отличается от моей? и почему Вы решили что она будет работать? )
а чем конкретно эта конструкция отличается от моей?Эмм…
и почему Вы решили что она будет работать? )Эмм… может потому что вот
потому что что? через fenom у вас наверное работает (у меня не получилось, но я через fenom и не хочу). Я, наверное, смогу эту задачу решить и просто прописав в самом Pdomenu кучу условий в &rowClass=`[[...]]` (уже сейчас представляю, как это будет страшно выглядеть)…
Но ведь тут уже вопрос принципа — почему значение tv, переданное из pdo мы не можем привести к обычному числу? (все разработчики MODX могут, а мы ет).
Кстати с id ресурса такая же фигня — он передается, но в сниппете php отказывается его воспринимать как число
Но ведь тут уже вопрос принципа — почему значение tv, переданное из pdo мы не можем привести к обычному числу? (все разработчики MODX могут, а мы ет).
Кстати с id ресурса такая же фигня — он передается, но в сниппете php отказывается его воспринимать как число
Добрый день.
Столкнулся с такой же проблемой. Если кратко, то решение: обращением к сниппету через чанк.
Если чуть более подробно, то суть проблемы в том, что в сниппет попадает не значение переменной day-num, а строка с названием переменной.
В этом можно убедиться, если в сниппете написать:
Если же создать чанк (например daynum_class) и обратиться из него к снипету dismenu. Тело чанга:
В приведенный выше примерах с TV я так понял пытаются через API по имени переменной из сниппета узнать ее значение. На мой взгляд это не лучшее решение.
Столкнулся с такой же проблемой. Если кратко, то решение: обращением к сниппету через чанк.
Если чуть более подробно, то суть проблемы в том, что в сниппет попадает не значение переменной day-num, а строка с названием переменной.
В этом можно убедиться, если в сниппете написать:
echo $day-num; exit;
Тогда мы реально видим, что пришло. В вашем случае окажется что $day-num = [[+$day-num]], и естественно, что никакие математические операции с ней не возможны. Получается сначала срабатывает сниппет, а потом pdo заменяет переменные [[+…]] на их значения.Если же создать чанк (например daynum_class) и обратиться из него к снипету dismenu. Тело чанга:
[[dismenu? &daynum=`[[+day-num]]`]]
А из pdoMenu обратиться к чангу:[[pdoMenu? &parents=`219`
&level=`1`
&includeTVs=`day-num`
&rowClass `daynum_class`
]]
То это будет работать. Есть еще вариант обратиться через файл:&rowClass `@FILE resources/mychank.tpl`
Но этот вариант не проверял.В приведенный выше примерах с TV я так понял пытаются через API по имени переменной из сниппета узнать ее значение. На мой взгляд это не лучшее решение.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.