[pdoTools] Версия 1.5.0-pl1 улучшена работа с ТВ

Очередное обновление библиотеки для быстрой работы с БД pdoTools.

Изменений всего 3, зато каких!

Поддержка значения по умолчанию в ТВ

Одно из основных нареканий при переезде на pdoResources — отсутствие «значения по умолчанию», заданного в настройках ТВ параметра.

Многие думают, что это значение пишется в БД, но нифига. Если ТВ параметр пуст — то записи в БД вообще нет, и mySql отдаёт NULL при запросе.

С версии 1.5.0-pl все сниппеты pdoTools (включая getTickets и msProducts) будут выводить «умолчательное» значение, указанное в ТВ.


Правильная сортировка ТВ

Второе нарекание — неверная сортировка по ТВ полям, когда в них хранятся числа.

Дело в том, что все ТВ поля в БД — это текст. Поэтому сортировка по умолчанию будет такой:
  • 1000
  • 150
  • 800
То есть, сравнивается первый символ, потом второй и так далее. Если же у вас там цена, или другие числа, то должно быть так:
  • 150
  • 800
  • 1000
В новой версии эта проблема решается просто: нужно указать ТВ параметру тип «число», тогда при сортировке по нему данные будут приведены к типу DECIMAL.
Заодно приведение типа будет и для ТВ «дата» — они отсортируются как DATETIME.

Увидеть сортировку можно в логе:

Напоминаю, что подключить и отсортировать по ТВ проще простого:
[[!pdoResources?
	&includeTVs=`price`
	&sortby=`price`
	&showLog=`1`
]]

Поддержка [[~id]] в быстром режиме

Это незначительное изменение, но вся равно приятное.
Если кто помнит, в pdoTools есть параметр fastMode, выключенный по умолчанию.

Если же его включить, то библиотека пытается сама обработать все плейсхолдеры, а те которые не сможет — вырезает.
В результате чанк из неё выходит полностью обработанный, и парсеру MODX с ним делать нечего. Отсюда мега-скорость.

Понятно дело, что всякие вызовы сниппетов и фильтров вырезаются, поэтому нужно привести чанк к такому виду, чтобы ничего не пропадало. Упростить его, максимально.

В общем, теперь в быстром режиме можно использовать плейсхолдеры [[~id]], должно пригодиться.

Таким образом, с версии 1.5.0 нормально обрабатываются следующие плейхолдеры:
  • [[+placeholder]] — обычный плейхолдер. Сначала подставляются значения из выбираемых данных, а потом из $modx->placeholders
  • [[%lexicon]] — записи из словарей системы. Чтобы нормально работало, их нужно предварительно загрузить через $modx->lexicon->load(), обычно компоненты делают это самостоятельно.
  • [[~id]] — генерация ссылки через modX::makeUrl()
Именно так, и никак иначе. Никаких ?param=`value` не поддерживается. Это же быстрый режим.

Например, TicketComments работает именно в таком режиме, поэтому комментарии у Tickets не тормозят даже на больших ветках.

Заключение

За эти изменения благодарим покупателей mSearch2, которые прикручивают его к Shopkeeper и задают вопросы про работу с ТВ =)

Заметка про обновление, в связи с этим, самого mSearch2 будет чуть позже.

Следующая заметка
[mSearch2] Версия 0.8.0-pl слайдер цен и другие
Предыдущая заметка
[Office] Версия 0.9.0-pl с поддержкой HybridAuth


Комментарии ()

  1. Andrey Grachov 12 сентября 2013, 11:58 # 0
    Зачем же вы так плохо поступаете с дробными числами, они тоже хотят правильно сортироваться :)
    1. Василий Наумкин 12 сентября 2013, 12:10 # 0
      Ты не увидел в заметке слова DECIMAL?
      1. Andrey Grachov 12 сентября 2013, 12:26 # 0
        Ух, как дерзко :) Пример
        1. Василий Наумкин 12 сентября 2013, 12:28 # 0
          Ты не умничай, ты покажи как надо.
          1. Andrey Grachov 12 сентября 2013, 12:39 # 0
            В идеале приводить к DECIMAL(15, <точность из настроек TV-параметра>) и вынести это значение как отдельное поле выборки и сортировать по нему:
            SELECT ..., CAST(`value` AS DECIMAL(15, 2)) AS `sort_field` ... ORDER BY `sort_field`
            1. Василий Наумкин 12 сентября 2013, 12:41 # 0
              Почему 15, а не, например, 10?
              1. Andrey Grachov 12 сентября 2013, 12:48 # 0
                Это было в качестве примера, однозначно ее определить нельзя, все зависит от хранимых значений. Главное чтобы эта цифра была больше величины дробной части и меньше 66.
                1. Руслан Кундиус 14 октября 2013, 17:09 # 0
                  при 10 наблюдаются глюки с восьмизначными цифрами
                  1. Andrey Grachov 15 октября 2013, 11:36 # 0
                    Это не я ставил в коде DECIMAL(10, 3), что означает работу максимум с 7ми значными числами :)
                    1. Руслан Кундиус 15 октября 2013, 11:41 # 0
                      не туда ответил, пост попутал)
          2. Василий Наумкин 12 сентября 2013, 12:44 # 0
            Выходит, что в getResources ошибка.

            Прикольно, а я и не проверял.
            1. Andrey Grachov 12 сентября 2013, 12:49 # 0
              Для меня это не новость :)
              1. Василий Наумкин 12 сентября 2013, 12:51 # 0
                Это новость для меня!
                Я же его функционал повторяю, чтобы пользователям было проще переходить, а тут такое.

                Спасибо, что объяснил, хоть и не сразу. Сейчас будет обновление. Обновил, версия 1.5.0-pl2.
      2. Kirill A. Rusanov 12 сентября 2013, 17:31 # 0
        Обновился, заметил ошибку, если имя ТВ дано в стиле «имяНекойПеременной» и этот ТВ используется в условии WHERE.
        Сниппет джоинит таблицы с ТВ, приводя имена в нижний регистр, а в WHERE дает case sensitive.
        За pdoTools — спасибо.
        1. Василий Наумкин 12 сентября 2013, 18:02 # 0
          Это вроде никак не влияет на работу?

          Или есть проблемы?
          1. Kirill A. Rusanov 13 сентября 2013, 11:12 # 0
            ругается на unknown column in where clause
            1. Василий Наумкин 13 сентября 2013, 12:04 # 0
              Тогда удали и заново поставь из репо — я это починил, но версию не менял.
          2. Василий Наумкин 12 сентября 2013, 18:28 # 0
            Поправил и это.

            Пакет в репозитории обновил, без смены версии.
          3. Виталий Батушев 13 сентября 2013, 15:50 # 0
            Вась, обнаружилась в последней версии неприятная проблема.
            У меня TV, по которому на странице делается выборка, называет productMark. И смотри, что выдает лог (я обрезал несущественные портянки):
            0.0012808: Included list of tvs: priceProducts, sDiscount, sDiscountDate, productMark, summdiscount, maximum, year2, year3, startDiscountDate, diapazon, goodtype, goodfilter
            ...
            0.0011151: leftJoined modTemplateVarResource as TVproductmark
            ...
            0.0012541: Added where condition: published=1, deleted=0, template=7, `TVproductMark`.`value`=PAV-08-0
            
            Как видишь, в одном месте псевдоним TVproductmark, а в другом TVproductMark. Естественно, что выборка не срабатывает, потому что лефтджойн сделан для первого, а валью указано для второго.
            Я, конечно, изменил 323 строку в pdofetch.class.php до $name = $tv['name'];. Пока по крайней мере, поди ж, ты в нижний регистр имя не просто так переводил.
            1. Василий Наумкин 13 сентября 2013, 16:24 # 0
              Удали последнюю версию полностью и заново поставь из репозитория — должно помочь.

              Обсуждали вот тут, чуть выше.
            2. Володя 13 сентября 2013, 16:26 # 0
              Василий привет. У меня тоже косяк!
              Хотел на 2.2.9 обновиться и вот такое получил
              [2013-09-13 16:21:25] (ERROR @ /index.php) Could not load class: msResourceFile from mysql.msresourcefile.
              [2013-09-13 16:21:25] (ERROR @ /index.php) [pdoTools] Error 42S22: Unknown column '120x90.url' in 'field list'
              обратно все откатил на сервере.
              повторил на твоем тестовом, то же самое…
              если интересно то
              Логин	s3738
              Пароль	R0RM4nyvSavC
              Это ошибка при выборе pdoResources галереи ms2Gallery
              1. Василий Наумкин 13 сентября 2013, 16:38 # 0
                Да, есть косяк.

                В логах пишет, что приджоинил, а в запросе — нет. Буду разбираться завтра.
                1. Василий Наумкин 14 сентября 2013, 10:10 # 0
                  Косяк не мой

                  Автор ms2Gallery отключил постоянную загрузку класса msResourceFile в память, поэтому запрос формируется неверно.

                  Сейчас допишу в pdoTools возможность загрузки модели дополнений, на такой случай. Скоро будет апдейт.
                Добавление новых комментариев отключено.