Нужно, что бы в сниппете значение из tv было числом

Здравствуйте!
Мне нужно добавлять пунктам меню css-класс разным страницам. Условий много, поэтому я решил сделать для этого свой сниппет «dismenu», что бы там в php все это дело просчитывать. Создал tv (числовое поле) `day-num` для страниц и пытаюсь получить значение в сниппете для переменной $daynum:
[[pdoMenu? &parents=`219`
                    &level=`1`
                    &includeTVs=`day-num`
                    &rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]`
                    ]]
Проблема в том, что в сниппете переменная $daynum выводится как текст (т.е. я не могу ее ни сравнить с другим числом, ни сделать арифметические действия). Все мои попытки преобразовать ее в число в сниппете с помощью функций php тоже не дают результата (превращается тупо в 0).
Подскажите, что я делаю не так?
Игорь
07 ноября 2018, 20:39
modx.pro
1 574
0

Комментарии: 63

Jury
07 ноября 2018, 22:42
0
А атрибут ссылки не подойдет?
[[*link-attributes]]
    Игорь
    07 ноября 2018, 22:55
    0
    извините, не понимаю
      Jury
      07 ноября 2018, 22:59
      0
      Если открыть любой ресурс то там есть поле Атрибуты ссылки, туда можно ставить класс — будет уникальный класс меню.
        Игорь
        07 ноября 2018, 23:10
        0
        нет, не подойдет… мне нужно добавлять css-класс сравнивая дни недели (как минимум), т.е. если сегодня среда — то у этого пункта меню один класс, а если четверг — то другой :)
          Jury
          07 ноября 2018, 23:36
          0
          Ясно, но как то сниппет +тв для этого больно круто)
          вот на js набросал
          jsfiddle.net/jury1/a4mL290e/1/
            Игорь
            07 ноября 2018, 23:56
            0
            да нет же, опять… мне нужно, что если сегодня среда — то дням с понедельника до среды добавить класс «Неактивные» (что бы не открывались), а если Пятница — то уже открывались (типа это уже для следующей недели)… и это еще далеко не все условия — поэтому и хочу через php прописать… «затык» на ровном месте (с тонкостями MODX пока не очень знаком — но он мне нравится реально)..:(
              Баха Волков
              08 ноября 2018, 09:14
              0
              Так а MODX причём, если сниппет это чистый php просто с подключенным MODX API и который принимает значения из вызова (если говорить общими словами), скорее у вас php сломался и нужно отнести его в ремонт
                Игорь
                08 ноября 2018, 09:41
                0
                я не знаю… могу только предположить, что переменная попадает в сниппет в виде $daynum=`5` (повторюсь, это только предположение — если я напишу «echo $daynum;», то отображается обычная 5, но если «echo intval($daynum);» — то 0). Т.е. может быть это модоксовские кавычки `` все портят?
                  Баха Волков
                  08 ноября 2018, 10:25
                  0
                  Проблема скорее всего в echo, потому, что он пытается преобразовать переменную в строку, предполагаю, что проблема в этом.

                  Попробуйте так:

                  echo (int)$daynum;

                  Или используйте var_dump
                    Игорь
                    08 ноября 2018, 10:39
                    0
                    пробовал и
                    echo (int)$daynum;
                    все равно 0
                    var_dump($daynum);
                    возвращает
                    string(12) " 5"="
    Игорь
    08 ноября 2018, 17:50
    0
    так никто и не поможет? :(
      Иван
      08 ноября 2018, 19:08
      0
      Вы бы код своего дисменю выложили бы что ли. Глядишь, кто-то и зацепит глазом.
        Игорь
        08 ноября 2018, 19:16
        0
        так в этом dismenu пока и нет ничего толком — я просто увидел что переменная не хочет сравниваться… ну вот:
        <?php
        $today = date("w"); //echo $today;
        $day = $daynum; //echo $day;
        //echo intval($day);
        //echo (int)$daynum;
        if ($today > $day)
        return " menu_disabled";
          Иван
          08 ноября 2018, 19:54
          0
          просто увидел что переменная не хочет сравниваться
          Вы проверяли на выходе её значение, её тип, и, что получаемое значение не содержит ничего лишнего?
            Игорь
            08 ноября 2018, 20:05
            0
            что именно Вы имеете в виду?
            echo $day;
            отображает 5
            echo intval($day);
            отображает 0
            var_dump($daynum);
            отображает string(12) " 5"="
            как еще что проверить я не знаю… (
              Иван
              08 ноября 2018, 20:37
              0
              А просто число в day-num подставляли? Работает?
                Игорь
                08 ноября 2018, 20:46
                0
                day-num — это у меня Дополнительное поле (tv), тип ввода: число — кроме числа от 0 до 6 туда ничего и не вставится больше.
                Как Вы предлагаете проверить?
                  Иван
                  08 ноября 2018, 20:58
                  0
                  Прямо число вставить, а не TV. Это имеет смысл для проверки, что обработка TV тут не причём. Ещё можно в плейсхолдер результат записать, вывести его, всунув плейсхолдер где-нибудь на странице (я так поймал на днях, что значения в ТВ едут сплошняком — добавил разделителем запятую и все заработало, как часики). Кстати, лучше сниппет некешированным вызывать, хотя бы на время отладки — иначе бывают свои приколы).
                    Игорь
                    08 ноября 2018, 21:06
                    0
                    а, понял… если вставляю
                    &rowClass=`[[dismenu? &daynum=`5`]]`
                    то все нормально получается… значит причина в самом tv… но что теперь делать?
                      Иван
                      08 ноября 2018, 21:23
                      0
                      Я же написал — получить значение тэвэхи.
                      Ещё можно в плейсхолдер результат записать, вывести его, всунув плейсхолдер где-нибудь на странице
                        Игорь
                        08 ноября 2018, 21:36
                        0
                        вот сейчас опять не понял, что нужно делать, извините…
                        мы с вами выяснили, что значение из TV приходят в «неправильном» формате.
                        Подскажите дальнейший алгоритм действий
                        Иван
                        08 ноября 2018, 21:54
                        0
                        Нужно как есть вывести значение, которое попадает сюда: &daynum=`this_value` — Вам нужно увидеть точную запись, которая туда приезжает. Может, она у Вас там какая-то такая: `«value»`.
                        Игорь
                        08 ноября 2018, 22:09
                        0
                        блин, что-то я уже совсем плохо соображаю… что мне нужно вставить в код шаблона страницы, что бы увидеть то, о чем Вы говорите?
                        Игорь
                        08 ноября 2018, 22:27
                        0
                        вот я вставляю в шаблон [[*day-num]]
                        и он фаирбаге вижу " 5 " (т.е. какие-то лишние пробелы) — Вы об этом говорили?
                        Игорь
                        08 ноября 2018, 22:31
                        0
                        хотя нет, это не те пробелы… в общем просто «5» он мне показывает…
                        Иван
                        08 ноября 2018, 22:40
                        0
                        А должно быть просто 5. Ни пробелов, ни кавычек, итд итд. Просто 5.
                        Игорь
                        08 ноября 2018, 22:49
                        0
                        да нет — там просто 5 отображается… «5» — это в просмоторщике элементов в браузере, там все в кавычках… )
                        Игорь
                        08 ноября 2018, 22:50
                        0
                        … в общем, третий день пошел, как я не могу с этим разобраться… (((
                        Иван
                        08 ноября 2018, 22:56
                        0
                        Ну, ок)
                        Вот Вы и на финишной прямой. Вы знаете теперь, что отдаёте тэвэхе число 5, а получаете строку 5. Значит, проблема на стадии замены тэвэхи на её значение. Проверьте параметры ввода и вывода тэвэхи. Если там нет проблем (типа параметр вывода — строка, например), попробуйте установить ввод — текст, вывод — по умолчанию.
                        Игорь
                        08 ноября 2018, 23:04
                        0
                        но только все это я уже пробовал (еще вчера) :(… где-то на форуме видел, упоминание про то что в сниппет tv отдает строку, но там тоже никакого решения не приводилось
                        forums.modx.com/thread/62570/tv-1
                      Иван
                      08 ноября 2018, 21:31
                      0
                      Кстати, есть некий параметр processTVs — он подготоваливает тэвэхи согласно настройкам системы. Ни разу сам не применял, не доводилось, но, может он решит проблему, т.к
                      Список ТВ-параметров, которые нужно обработать и вывести согласно их настроек в менеджере системы
                      .
      Баха Волков
      09 ноября 2018, 01:35
      0
      О Боже, эта Санта-Барбара не закончилась? Я же написал, проблема ваша в echo

      1. Создаю TV и называю его number (Вообще не важно в данном случае тип ввода), присваиваю к шаблону, у ресурса указываю значение: 6
      2. Создаю сниппет и называю его test

      Содержимое сниппета:

      <?php
      var_dump((int)$daynum);

      Вывожу на странице:

      [[test?
       &daynum=`[[*number]]`
      ]]
      
      [[*number]]

      и получаю (барабанная дробь):

      int(6) 6
        Иван
        09 ноября 2018, 08:45
        0
        modx.pro/help/16810#comment-103581 — «а был ли эчо»?)
          Игорь
          09 ноября 2018, 09:50
          0
          когда я делаю, как вы написали — у меня и через
          echo (int)$daynum;
          получается
          int(6) 6

          А не работает именно когда я через PdoMenu пытаюсь tv получать для других страниц:
          [[pdoMenu? `
                              &includeTVs=day-num`
                              &rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]`
                              ]]
            Баха Волков
            09 ноября 2018, 10:49
            0
            Приехали, значит многосерийная история… Покажите всё что вы делаете, прям всё и посмотрим
              Игорь
              09 ноября 2018, 11:02
              0
              Хорошо. :)
              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]]`]]`
                                  ]]
              Все.
                Иван
                09 ноября 2018, 12:20
                0
                Попробуйте [[+tv.day-num]].
                  Игорь
                  09 ноября 2018, 12:31
                  0
                  &daynum=`[[+tv.day-num]]` — не передает значение в сниппет вообще (
                    Иван
                    09 ноября 2018, 13:28
                    0
                    А $tmp = $modx->resource->getTVValue('tv_name'); print_r($tmp);, что говорит?
                      Игорь
                      09 ноября 2018, 13:44
                      0
                      а что он может сказать?
                      "$tmp = $modx->resource->getTVValue('day-num'); print_r($tmp);" говорит номер дня недели страницы, на которой мы находимся… А нужно «пробежаться» по всем страницам из pdo меню (
                        Иван
                        09 ноября 2018, 14:09
                        0
                        А циклы на что?
                          Иван
                          09 ноября 2018, 14:11
                          0
                          if ($today > $tmp) заработало или нет?
                    Баха Волков
                    09 ноября 2018, 14:16
                    0
                    У меня истерика сейчас начнётся, какие циклы? Зачем кавычки внутри кавычек? Почему динамичные данные скармливаются сниппету, который запускается один раз? Почему echo а не return?
                      Иван
                      09 ноября 2018, 14:28
                      0
                      Да где ты это эчо тут узрел-то?!))) Точнее, я вижу где, но исходно было:
                      <?php
                      $today = date(«w»);
                      $day = $daynum;
                      if ($today > $day)
                      return " menu_disabled";
                        Баха Волков
                        09 ноября 2018, 14:34
                        0
                        Я твои циклы «узрел», ты еще посоветуй Node.js и Jquery вперемешку использовать
                          Игорь
                          09 ноября 2018, 14:40
                          0
                          в общем я понял, кажется… как в PdoMenu значение tv передать нормально в переменную никто не знает… нужно попробовать передавать в сниппет id страницы и там уже в сниппете с помощью getObject и getTVValue вытаскивать значение tv. так?
                            Иван
                            09 ноября 2018, 14:41
                            0
                            Я и не имел ввиду цикл для текущего варианта реализации…
                Баха Волков
                09 ноября 2018, 14:45
                +1

                Показываю


                1. Создаем 7 ресурсов, Понедельник — Воскресенье, у них родитель «Дни недели (2)»



                2. У них у всех есть TV number (по барабану какой, у меня например тип текст), присваиваем каждому от 1 до 7 соответственно

                3. Создаем сниппет dismenu с таким содержанием:

                  <?php
                  $today = date("w");
                  if($today > (int) $input)
                  return 'menu_disabled';

                4. На странице выводим так:

                  {'!pdoMenu' | snippet : [
                  'parents' => 2,
                  'includeTVs' => 'number',
                  'tvPrefix' => '',
                  'tpl' => 'item'
                  ]}

                5. Чанк: item

                  <li class="{$number | dismenu}">
                      <a href="{$link}">{$menutitle} ({$number})</a>
                  </li>

                6. И получаем (Барабанная дробь бл… дь):

                  <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>
                  Иван
                  09 ноября 2018, 15:18
                  0
                  Я твои циклы «узрел», ты еще посоветуй Node.js и Jquery вперемешку использовать
                  … изрёк Баха и предложил реализацию в которой зафигачил цикл)))))))
                    Баха Волков
                    09 ноября 2018, 17:42
                    0
                    Изрёк Иванушка и наверное предложит вариант лучше чем мой?
                    Игорь
                    09 ноября 2018, 17:00
                    0
                    так это Вы уже fenom используете? я в нем пока ваще не понимаю.
                    вставил ваш код
                    {'!pdoMenu' | snippet : [
                    'parents' => 2,
                    'includeTVs' => 'number',
                    'tvPrefix' => '',
                    'tpl' => 'item'
                    ]}
                    заменил на свои значения — белый экран
                      Иван
                      09 ноября 2018, 17:09
                      0
                      Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректно. И лично мне интересно было разобраться в проблеме текущей реализации.
                      В общем, тут Вам в мануалы — копайте в сторону {ignore}{/ignore} и пробелов (по ходу курения манов поймёте, о чём речь). + логи MODX по мере внесения правок смотрите, они вполне говорящие в данном случае.
                        Баха Волков
                        09 ноября 2018, 17:24
                        0
                        Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректно
                        Ну так корректно или всё же некорректно?)

                        Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректно
                        И причём вообще fenom если он тут никакую погоду не делает. Ну напишите всё на стандартном синтаксисе.

                        Я про феню промолчал, ибо, строго относительно постановки задачи применять его не совсем некорректно
                        Промолчал, но не промолчал — охерительная логика

                        А $tmp = $modx->resource->getTVValue('tv_name'); print_r($tmp);, что говорит?
                        Ну не запросы же делать в базу вместо самого pdoTools, когда это как собаке пятая нога
                          Иван
                          09 ноября 2018, 20:00
                          0
                          А всё корректно, что не некорректно).
                          Я же прямо написал:
                          И лично мне интересно было разобраться в проблеме текущей реализации.
                          — слово «проблема» видать, надеюсь?) Вот тут вот у тебя со зрением всё отлично было, а в этот раз удила закусил что-то)

                          Изрёк Иванушка и наверное предложит вариант лучше чем мой?
                          Ещё раз повторю:
                          И лично мне интересно было разобраться в проблеме текущей реализации
                          Я нигде слова не сказал, что твои решения хоть малость плохие итп — не по делу нападаешь — охолони!)
                            Иван
                            09 ноября 2018, 21:52
                            0
                            Ну не запросы же делать в базу вместо самого pdoTools, когда это как собаке пятая нога
                            Вообще-то, это было для проверки предложено.
                            А $tmp = $modx->resource->getTVValue('tv_name'); print_r($tmp);, что говорит?
                            — ключевое, «что говорит».

                            Короче, не суть. Лучше поделись, разобрался ты в самой проблеме или нет в рамках предложенного в топике вызова сниппа?
                              Баха Волков
                              10 ноября 2018, 12:26
                              0
                              Вообще-то, это было для проверки предложено.
                              О Боже, проверки? Проверки чего? Придёт значение или нет? А выше уже не было известно?

                              Короче, не суть. Лучше поделись, разобрался ты в самой проблеме или нет в рамках предложенного в топике вызова сниппа?
                              Короче, лучше делюсь, разобрался я в самой проблеме в рамках предложенного в топике вызова сниппета:

                              Проблема заключается в том, что проблемы вовсе и нет! Опа, уже 500 раз говорю. Санта-Барбара бл…

                              Если бы знаний было чуть больше, то можно было бы увидеть, что вызов либо неправильный, либо контекст неизвестен, я уже выше говорил:

                              [[pdoMenu?
                                 &parents=`219`
                                 &level=`1`
                                 &includeTVs=`day-num`
                                 &rowClass=`[[dismenu? &daynum=`[[+day-num]]`]]`     // Вот этого вот что такое?
                              ]]

                              1. pdoMenu в каком-то цикле запущен?
                              2. Откуда берется данный плейсхолдер [[+day-num]]

                              Нужно, что бы в сниппете значение из tv было числом
                              Вот сам вопрос и вот ответ: «Нужно? Можно! Ведь существуют тысячи компонентов с десятками тысяч сниппетов, и у них как-то получается получить то, что нужно. Еще не смешно? pdoMenu который вызывается в примере (барабанная дробь) получает в качестве параметра limit число и у него как ни странно всё получается»
                                Игорь
                                10 ноября 2018, 12:31
                                0
                                да блин, парни, что мне написать-то, что бы число в сниппет попадало?!
                                  Иван
                                  10 ноября 2018, 17:26
                                  0
                                  Забудь про циклы, задача и правда простая) Задача:
                                  Не используя 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";

                                  Мы верим в Баху!)
                            Баха Волков
                            09 ноября 2018, 17:28
                            0
                            Вызов:

                            [[!pdoMenu?
                            &parents=`2`
                            &includeTVs=`number`
                            &tvPrefix=``
                            &tpl=`item`
                            ]]

                            Чанк:

                            <li class="[[+number:dismenu]]">
                                <a href="[[+link]]">[[+menutitle]] ([[+number]])</a>
                            </li>
                              Игорь
                              10 ноября 2018, 11:33
                              0
                              а чем конкретно эта конструкция отличается от моей? и почему Вы решили что она будет работать? )
                                Баха Волков
                                10 ноября 2018, 12:28
                                0
                                а чем конкретно эта конструкция отличается от моей?
                                Эмм…

                                и почему Вы решили что она будет работать? )
                                Эмм… может потому что вот
                                  Игорь
                                  10 ноября 2018, 13:51
                                  0
                                  потому что что? через fenom у вас наверное работает (у меня не получилось, но я через fenom и не хочу). Я, наверное, смогу эту задачу решить и просто прописав в самом Pdomenu кучу условий в &rowClass=`[[...]]` (уже сейчас представляю, как это будет страшно выглядеть)…
                                  Но ведь тут уже вопрос принципа — почему значение tv, переданное из pdo мы не можем привести к обычному числу? (все разработчики MODX могут, а мы ет).
                                  Кстати с id ресурса такая же фигня — он передается, но в сниппете php отказывается его воспринимать как число
                          Антон
                          26 ноября 2018, 15:33
                          0
                          Добрый день.
                          Столкнулся с такой же проблемой. Если кратко, то решение: обращением к сниппету через чанк.

                          Если чуть более подробно, то суть проблемы в том, что в сниппет попадает не значение переменной 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 по имени переменной из сниппета узнать ее значение. На мой взгляд это не лучшее решение.
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                            63