Нужно, что бы в сниппете значение из 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
72
0

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

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 отказывается его воспринимать как число