[pdoTools] Версия 2.2 c модификаторами Fenom

Представляю вам новую версию pdoTools 2.2.0-pl, в которой вы можете задавать свои модификаторы для использования в Fenom.

Для этого придумана системная настройка pdotools_fenom_modifiers, в которой вы можете указать нужные сниппеты через запятую.

То, что указано в этой настройке, будет доступно глобально, для всех вызовов pdoTools. Также у вас есть возможность указать конкретные модификаторы для определённого вызова сниппета:
[[!pdoResources?
    &parents=`0`
    &fenomModifiers=`dateAgo`
    &tpl=`@INLINE <p>{$id} - {$pagetitle} {$createdon | dateago}</p>`
]]
Как можно заметить, модификаторы указываются через |.

Вы также можете указывать свои параметры для модификаторов:
[[!pdoResources?
    &parents=`0`
    &tpl=`@INLINE <p>{$id} - {$pagetitle} {$createdon | date_format:"%Y-%m-%d %H:%M:%S"}</p>`
]]
В данном примере используется встроенный в Fenom модификатор date_format. Вы можете использовать и другие.

Все указанные сниппеты должны соответствовать требованиям фильтров MODX.

Второе изменение, это возможность указать порядок присоединения таблиц через &joinSequence. По умолчанию это
&joinSequence=`innerJoin,leftJoin,rightJoin`
но теперь вы можете указать и свой порядок.

Выражаю большое спасибо гражданину Alexey Ch за эти изменения. Новая версия pdoTools уже в репозитории, можно обновляться.
Василий Наумкин
27 декабря 2015, 13:39
modx.pro
6
6 508
+14

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

Василий Столейков
27 декабря 2015, 17:26
+4
Спасибо за модификаторы! Теперь можно будет облегчить себе жизнь не вызывая их через вызов сниппета!
    Алексей
    27 декабря 2015, 20:03
    0
    &joinSequence=`innerJojn,leftJojn,rightJoin`
    джуджин)))
    Большое спасибо! еще было бы классно добавлять тэги, но это немного позже.
    Andrey Grachov
    27 декабря 2015, 20:25
    0
    joinSequence
    Было бы неплохо добавить туда же tvsJoin или всегда включать их первыми, потому что сейчас, если в одном из видов join-а (или только в left join до этого обновления) понадобится значение TV, join для этого TV-параметра придется дублировать самостоятельно, то есть писать
    &leftJoin=`[{"class": "modTemplateVarResource", "alias": "CountryTv", "on": "modResource.id = CountryTv.contentid AND CountryTv.tmplvarid = 15"}, {"class": "modResource", "alias": "CountryResource", "on": "CountryResource.id = CountryTv.value"}]`
    вместо
    &leftJoin=`[{"class": "modResource", "alias": "CountryResource", "on": "CountryResource.id = TVcountry.value"}]`
      Павел Гвоздь
      28 декабря 2015, 06:23
      +1
      Превосходно, Василий! Будет ли возможность указывать наборы параметров для модификатора, если он сниппет?
        Василий Наумкин
        28 декабря 2015, 08:05
        +1
        Нет, у модификаторов, вроде, не указывают наборы параметров.

        Если это нужно, их всегда можно вызвать через runSnippet и так уже указать.
          ck
          ck
          26 апреля 2016, 22:39
          2
          0
          Подскажите, как указать значение параметра dateFormat=`d F Y` у dateAgo вот при таком использовании в шаблоне:
          {$_modx->runSnippet('pdoResources',[
          	'tpl' => '@INLINE <div><a href="{$uri}">{$pagetitle}</a></div>
          	 <span>{$publishedon | dateago}
          	',
          ])}
        ck
        ck
        28 декабря 2015, 12:17
        -1
        Василий, подскажи, как использовать параметры Fenom и модификаторы на странице, к которой они непосредственно относятся?
        В чанке [[+pagetitle]] заменяется на {$pagetitle}, [[+createdon:dateago]] на {$createdon | dateago}.
        А как заменить [[*pagetitle]]?
            ck
            ck
            28 декабря 2015, 12:24
            0
            Да, на хабре прочёл ту же информацию. Попробовал.
            Вот так работает {$_modx->resource.pagetitle}, а вот так уже выдаёт ошибку {$_modx->resource.createdon | dateago}. Что не правильно делаю?
              Василий Наумкин
              28 декабря 2015, 12:28
              +3
              Что не правильно делаю?
              Не читаешь статью, к которой оставляешь комментарии.

              Там ведь сказано, что есть системная настройка pdotools_fenom_modifiers, в которой нужно указать все сниппеты-модификаторы, которые должны быть доступны глобально.
          Георгий Пушкин
          29 декабря 2015, 18:05
          0
          Спасибо за joinSequence Василий!
          Пользуясь случаем, хотел бы спросить тебя, насколько трудоёмко внести новый параметр в pdoPage,
          такой как реверс пагинации? Описан здесь
          И исходя из такой проблемы, которая описана здесь?
          Заранее спасибо за ответ.
            Василий Наумкин
            29 декабря 2015, 18:12
            0
            Учитывая, что я вообще не могу понять о чём речь, а ты не можешь показать работающую реализацию этой гениальной идеи — очень трудоёмко.
              Георгий Пушкин
              29 декабря 2015, 18:26
              0
              Понимаю тебя. Постараюсь объяснить может тебя тоже заинтересует.
              Речь о том, чтобы расклад страниц был по возможности статичен, т.е. 1-ая сформированная страница, так и оставалась под номером 1, а каждая последующая (по мере роста контента выдачи) имела номер (и соответственно адрес), приращеённый на единицу. Таким образом обычно у нас пагинация выглядит 1 2 3 4 5, а предполагается 5 4 3 2 1. По логике 5-ая страница появилась самой последней, но она впереди, так как это самый свежий контент на данный момент.
              Вот попытался. Что скажешь?
                Василий Наумкин
                29 декабря 2015, 18:30
                0
                Скажу, чтобы ты показал работающий пример на каком-нибудь популярном сайте.

                Сейчас читаю комментарии на vc.ru и там нет «вау, как круто, давайте так делать везде». Скорее даже наоборот.
                  Георгий Пушкин
                  29 декабря 2015, 18:40
                  0
                  Согласен с тобой, специфичное желание. Такого тоже не видел, но у себя ленту организовал бы таким вот образом. Я думаю проверить в боевых условиях. Пользователь скажет своё слово.
                  Во всяком случае для себя, как пользователю всевозможных лент (новостей, статей), хотелось бы знать, где остановился в прошлый раз, чтобы не искать по дате. Запомнил номер страницы и всё, она не изменилась, конечно если не поменяли количество вывода на странице.
                  А какие там аргументы против?
                  И сколько стоит такая реализация? Может после Нового года решусь?
                    Василий Наумкин
                    29 декабря 2015, 18:46
                    +1
                    Нисколько не стоит, потому что заказы я не беру, и еще долго брать не буду.

                    Если этот способ навигации наберёт популярность, то рано или поздно добавлю сам, бесплатно.
                      Георгий Пушкин
                      29 декабря 2015, 18:51
                      0
                      Спасибо за беседу, Василий!
                      Ну, что же может сами начнём менять вкусы, а? Станем новаторами :)
                      С наступающим, Новым годом тебя!
                        Василий Наумкин
                        29 декабря 2015, 18:53
                        0
                        Я бы с удовольствием, но сначала нужно выполнить все взятые на себя обязательства.

                        По моим прикидкам, это где-то середина 2016.
                          Воеводский Михаил
                          29 декабря 2015, 20:33
                          0
                          Что мешает выставить обратный порядок сортировки для сниппета, оберткой которого является pdoPage?
                            Василий Наумкин
                            29 декабря 2015, 20:50
                            0
                            Ничего, тут речь именно про циферки.

                            Идею я, вроде бы, понял. Но не уверен, что она приживётся и будет понятна людям. А времени делать «чтобы было» сейчас нет.

                            Поэтому, отложим пока эту мысль в сторонку и понаблюдаем за спросом.
                              Воеводский Михаил
                              29 декабря 2015, 20:54
                              0
                              Я идею тоже понял. Но, покуда, задача последнюю страницу сделать первой, то меняется только порядок сортировки. А в таком варианте это задача уже не совсем к pdoPage.

                              Если, например, выставить сортировку от самых старых к самым новым, старые всегда будут на первой странице. Разве нет?
                                Василий Наумкин
                                29 декабря 2015, 21:01
                                0
                                Еще раз, речь про циферки. Не 1,2,3,4,5, а 5,4,3,2,1.

                                Типа зашел сегодня и увидел страницу 5, зашел завтра — уже 6. И с неё стартуешь, отматывая к 1. Если остановился на 3, то там и продолжишь потом читать, ничего не изменится, просто добавятся страницы 7 и 8 через пару дней.

                                В теории, вроде бы, всё хорошо. Однако неясно, почему так никто не делает.
                                Павел Гвоздь
                                29 декабря 2015, 21:18
                                0
                                По идее для ПС должно быть лучше… точнее даже для пользователей… постоянно один контент на страницах, а то до сих пор в выдаче бывает такое, что система ссылается на страницу сайта, а тот пост с искомой информацией уже на следующей странице.
                                Павел Гвоздь
                                29 декабря 2015, 21:20
                                +2
                                отложим пока эту мысль в сторонку и понаблюдаем за спросом.
                                Я и Георгий (высказавший просьбу) = двое уже. Кто ещё?)
                                Борис И
                                29 декабря 2015, 22:10
                                +2
                                Поддерживаю, задумка интересна и на мой взгляд, удобна для поиска информации и пользователем, и поисковиком.
                                Я сейчас закрываю для индексации страницы с 2...n, контент на них все время меняется, пользователь приходит из поиска, а информации уже нет, она на другой странице, получите-распишитесь отказ. Много отказов, значит пользователи не нашли нужной информации у вас и в следующий раз поисковик не покажет ваш сайт.
                                Не часто, но бывает, сам попадаю в туже ситуацию, что либо ищешь попадаешь из поисковика на страницу где ответа уже нет.
            Владимир
            27 января 2016, 13:16
            0
            Василий, подскажи, пожалуйста
            добавил в вызове модификатор rezimgcrop, указал ему соответствующие параметры:
            [[pdoResources? 
            	&includeTVs=`video_image,video_videoId,video`
                    &limit=`0`
                    &fenomModifiers=`rezimgcrop`
                    &tpl=`@INLINE <div class="item"><img src="{$_modx->resource.video_image | rezimgcrop:"r-640x360"}"/></div>`
            		&parents=`123` 
            		]]
            но не обрезает картинку (т.е. вообще не выводит с модификатором), ошибка: (ERROR @ /home/s1161/www/core/cache/includes/elements/modsnippet/34.include.cache.php: 29) PHP warning: copy(): The first argument to copy() function cannot be a directory
            modsnippet/34 — снипет rezimgcrop
            Неправильно указываю параметры?
              Василий Наумкин
              27 января 2016, 13:19
              0
              The first argument to copy() function cannot be a directory
              Яндекс говорит
              Первый аргумент скопировать() функция не может быть каталогом
              Может, в $_modx->resource.video_image что-то не то?
                Владимир
                27 января 2016, 13:21
                0
                $_modx->resource.video_image — без модификатора все ок, картинку из тивишки выводит
                Я думал, rezimgcrop же создает папку, куда кидает обрезанные картинки, может не может создать?
            Aliaksandr Katlou
            16 февраля 2016, 00:01
            0
            Коллеги, нужна помощь. Не хотят нормально работать встроенные модификаторы Fenom. Работают только для строк. Вот так
            {var $p = 'low'} {$p | upper }
            работает, а любые вариации на тему
            {var $p = $_modx->resource.pagetitle} {$p | upper}
            нет. Что я делаю не так? Если я правильно понимаю, то встроенные модификаторы в настройку прописывать не нужно (если прописать все равно не работает).
              Василий Наумкин
              16 февраля 2016, 07:46
              0
              strtoupper() и strtolower() не понимают кирилицу.

              Нужно написать свои модификаторы с mb_strtoupper() и mb_strtolower(), указать их в pdotools_fenom_modifiers и использовать в чанках — всё будет ок.
            Сергей Шлоков
            01 июля 2016, 18:12
            0
            Почему-то не хочет работать такая конструкция
            [[!pdoResources?
                &parents=`0`
                &tpl=`@INLINE <p>{$id} - {$pagetitle} {$createdon}</p>`
            ]]
            Все переменные выводятся пустые. Версия pdoTools последняя. Все разрешения включены. Проблема только с INLINE чанком. Если указать обычный чанк с таким же содержимым, то всё работает.
              but1head
              01 июля 2016, 19:04
              0
              там вроде {{id}} или {{$id}}
                Владимир
                01 июля 2016, 19:10
                0
                кстати, а ведь недавно точно работало, а сейчас только так
                {$_modx->runSnippet('!pdoResources', [
                    'parents' => 0,
                    'tpl' => '@INLINE <p> {$id} - {$pagetitle} {$createdon}</p>',
                    
                ])}
                  Василий Наумкин
                  01 июля 2016, 22:34
                  0
                  Все разрешения включены.
                  Ну так и теги Fenom, наверное, парсятся перед вызовом сниппета на странице, как думаешь?
                  Константин Ильин
                  17 октября 2016, 11:51
                  0
                  Подскажите пожалуйста
                  есть модель
                  <?xml version="1.0" encoding="UTF-8"?>
                  <model package="translator" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" phpdoc-package="translator" version="1.1">
                  
                      <object class="trItem" extends="modResource">
                          <field key="translations" dbtype="text" phptype="text" null="true" default=""/>
                      </object>
                  
                  </model>
                  Как сделать так чтобы в чанках допустим pdoResource или pdoMenu, поле translations выводилось как плейсхолдер?
                  пробовал
                  [[!pdoMenu?
                     &parents=`0`
                     &select=`{"modResource":"*"}`
                     &tpl=`tpl.trans.item`
                  ]]
                  Работает, но при этом подключается content, хотелось бы узнать решение чтобы к выборке добавлялось только поле translations

                  Так делать как бы не очень выход, потому что мало ли в чанке используются другие поля, я то понимаю, что если надо в select дописать, а вот другой может не понять.
                  &select=`{"modResource":"id,pagetitle,translations "}`
                  есть ли какое либо изящное решение?
                    Константин Ильин
                    17 октября 2016, 12:38
                    0
                    блин, сразу забыл написать
                    Почему при использование prepareSnippet в pdoMenu, не обрабатывает первую запись??
                    joxi.ru/Vm65XJLTxOw59r

                    [[!pdoMenu?
                       &parents=`0`
                       &prepareSnippet=`trRes`
                    ]]
                    Пробовал такое в pdoResources, там все ок
                    joxi.ru/Dr8WkgZIkxQ3vA

                    код сниппета
                    $row['menutitle'] = 'newTitle / '.$id;
                    //$row['pagetitle'] = 'newTitle / '.$id;
                    return serialize($row);
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    39