Вывод даты создания последнего дочернего документа

Привет всем!
Надо вывести типа «Последняя новость от 00.00.0000»
Понимаю, что можно сделать через pdoResources, но существует ли более изящный или проще способ?
Сергей
19 ноября 2019, 11:24
modx.pro
159
0

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

Евгений Webinmd
19 ноября 2019, 11:25
0
ну ок, напишите свой сниппет, в котором будет вызов 1 ресурса с сортировкой по дате или по ID
    Сергей
    19 ноября 2019, 12:40
    0
    К сожалению, не силен в написании сниппетов :)
      Александр Мельник
      19 ноября 2019, 13:52
      0
      Необычно)
      Как правило, желание делать что-то изящно, возникает тогда, когда в руках много известных технологий и знаний, когда видишь различные пути решения одной и той же задачи.

      Но когда этого нет, то «Понимаю, что можно сделать через pdoResources,» — это шикарный вариант.
    Vladimir
    19 ноября 2019, 13:33
    +1
    Попробуй немного извращения…
    $getted_id = (int)$modx->getOption('getted_id', $scriptProperties, false);
    if(!$docs = $modx->getCollection('modResource', array(
        'parent' => $getted_id,
        'sortby' => 'createdon',
        'sortdir' => 'ASC'
    ))){return;}
    
    return docs[0]->get('createdon');
    Это код СНИПЕТА, вызывай его на странице так:
    [[!LatestNewsDate:strtotime:date=`%d.%m.%Y`? &getted_id=[[*id]]]]
    LatestNewsDate => это имя снипета
    Если не работает пиши (getted_id это айди где лежат твои ресурсы от которых нужна последняя дата)
      Сергей
      19 ноября 2019, 14:13
      0
      В этой строке пишет, что синтаксическая ошибка:
      return docs[0]->get('createdon');
      Мой вывод:
      [[!LatestNewsDate:strtotime:date=`%d.%m.%Y`? &getted_id=`3`]]
      (Не уверен в правильности)

      Результата нет.
        Vladimir
        19 ноября 2019, 14:54
        +1
        Замени весь снипет на это
        <?php
        $getted_id = (int)$modx->getOption('getted_id', $scriptProperties, false);
        
        $criteria = $modx->newQuery('modResource');
        $criteria->sortby('createdon', 'DESC');
        $criteria->where(array('parent' => $getted_id));
        
        $docs = $modx->getCollection('modResource', $criteria);
        
        return array_values($docs)[0]->get('createdon');
        Все будет работать! сам проверил
          Сергей
          19 ноября 2019, 15:04
          0
          Все работает! Спасибо! Доброго здоровья :)
            Сергей Шлоков
            19 ноября 2019, 17:07
            0
            Наихудший вариант из всех возможных.

            Сергей, если установлен pdoTools, то используйте pdoResources с limit=1.
              Сергей
              19 ноября 2019, 17:11
              0
              Считаете, что лучше воспользоваться pdoResources, чем небольшим сниппетом?
                Сергей Шлоков
                19 ноября 2019, 17:47
                +1
                pdoResources оптимальнее, чем описанный выше. Только в селект нужно указать одно поле, чтобы не гнать по сетке весь набор ненужных данных. А уж если хочется свой отдельный микросниппет, то используйте вариант отсюда.
                Vladimir
                19 ноября 2019, 18:45
                0
                ну дак пдо разве не сделает тоже самое? веть все равно необходимо отсортировать по дате, поучается что он пройдет по всем, конечно скорей всего можно добавить чтобы он брал только один пункт, ну а лимит в итоге после сортировки развен ен возьмет первый из списка просто? конечно может он там получит айди и возьмет его, то получается она и таже каша, а не самый худший вариант…
                  Сергей Шлоков
                  19 ноября 2019, 19:49
                  0
                  то получается она и таже каша, а не самый худший вариант…
                  Выглядит одинаково только для тех, кто не знает матчасть. В данном случае нет знаний ни в xPDO, ни в SQL.
                  pdoResources будет работать как getCollection только в режиме проверки прав. Изначально он работает в облегченном режиме с массивом данных.
                  В твоём варианте все ресурсы указанного родителя (все!!!) с сервера полетят на клиента, а getCollection для каждой записи будет поднимать объект со всеми проверками. И всё это для того, чтобы получить одно поле одной записи. Т.е. хуже придумать нельзя.

                  Я выше давал ссылку как сделать это самым простым и быстрым способом.
                    Vladimir
                    19 ноября 2019, 20:34
                    0
                    матан и sql отсутствует! тут проблемма в том что он берет ресурсы ото всех а не с конкретного родителя где есть чайлды, я понять не могу, веть он все равно получить данные и будет их сортировать, просто в другом он будет получать ресурсы из отдельного обекта в котором есть дочерние ресурсы, как это сделать с getcollection хз, веть
                    $docs = $modx->getCollection('modResource', array(
                        'parent' => $getted_id));
                    будет тоже самое что и выше параметрам where или он получит как-то это подругому, окей допустим я получил это таким образом, как там на лету это сортировать а не после того как получил все ресурсы? я просто дурак и не догоняю
                      Vladimir
                      19 ноября 2019, 20:37
                      0
                      и разве как парень ниже кинул код не будет тоже самое? он получит все ресурсы затем отсортируем в том методе getobject он просто получит только первый сразу а не как я полностью коллекцию а затем только первый объект.
                        Сергей Шлоков
                        19 ноября 2019, 21:26
                        0
                        Первый комментарий я вообще не понял. А по второму — учи матчасть и почитай, что значит клиент-серверная архитектура.

                        я просто дурак и не догоняю
                        Мы все с этого начинали. Главное — желание это исправить.
                          Александр
                          19 ноября 2019, 22:13
                          0
                          Мда… понимания что происходит 0.
                          И getCollection и getObject по $criteria готовят запрос в mysql. Для такого критерия он будет примерно таким для getCollection и $getted_id=2:
                          select * from modx_site_content where parent = 2 sort by createdon DESC
                          А getObject просто добавит limit=1
                          select * from modx_site_content where parent = 2 sort by createdon DESC limit=1
                          веть он все равно получить данные и будет их сортировать
                          Данные обрабатывает сортирует mysql сервер. Он это делает эффективнее, чем мы можем сделать в php. И в getObject они точно не сортируются.
                          Так вот, отличие getCollection и getObject ДЛЯ ДАННОГО ПРИМЕРА то, что getCollection заберет все записи с базы и займет кучу памяти, а getObject только одну и памяти понадобиться гораздо меньше.
                          И getCollection и getObject кроме запроса в mySQL делают, что-то еще, например проверяют есть ли доступ у юзера к объекту, но что конкректно я не разбирался и разбираться, в общем-то, не собираюсь :-). Только если что-то не так пойдет смотрю код функций. Важно только то, что getCollection и getObject выгружают данные с базы в виде xpdo объекта. Делать mySQL запросы напрямую не слишком удобно. Но если скрипт тупит или по памяти вылетает, то использую вместо getCollection getIterator или $modx->query($sql).
                          матан и sql отсутствует!
                          sql вам знать надо! учите.
                            Сергей Шлоков
                            20 ноября 2019, 07:49
                            0
                            А можешь показать место в коде, где
                            А getObject просто добавит limit=1
                            Уверен, долго будешь искать ))
                              Александр
                              20 ноября 2019, 10:10
                              0
                              Мда… сюрприз однако.
                              <?php
                              if($res=$modx->getObject("modResource",array("parent"=>1))){
                                  echo $res->pagetitle;
                              }
                              лог запросов mysql
                              SELECT… FROM `modx_site_content` AS `modResource` WHERE `modResource`.`parent` = 1
                              То есть, getObject получает все, а потом грузит первую запись :-(.
                              @Сергей Шлоков А зачем так сделано?? Память же все отстальное занимает.
                              И как теперь жить-то :-(. И limit через $query = $modx->newQuery долго добавлять.
                              Сергей Шлоков
                              20 ноября 2019, 10:26
                              0
                              Учим PDO и в частности отличие метода fetch от метода fetchAll. Так что живем радостно ))
                              Александр
                              20 ноября 2019, 14:15
                              0
                              И нафига мне эти методы?
                              Мне getObject нужен. Чтоб проверки доступа, все обработанные поля были. И чтоб не писать простыню кода каждый раз когда какое-то значение из базы нужно.
                              $pdo->getArray limit добавляет, но писать ['pagetitle'] раздражает. ->pagetitle короче. И создавать $pdo каждый раз надо.
                              Ваш modHelpers object limit ставит. И код писать короче. Но ради 1 функции грузить кучу кода явно не стоит. Загрузки 516. Не слишком популярная библиотека. Код написанный другим человеком и так бывает сложно разобрать и, чтоб добавить еще не популярный синтаксис должна быть веская причина. Ну и с первого раза библиотека просто не понравилась.

                              Так почему в getObject limit=1 не добавили? Кто-нибудь знает?
                              вот добавить $criteria->limit(1) после этой строки github.com/modxcms/revolution/blob/932472d65793a305bd8c971f21032f24068258ad/core/xpdo/om/xpdoobject.class.php#L423
                              и этой github.com/modxcms/revolution/blob/932472d65793a305bd8c971f21032f24068258ad/core/model/modx/modaccessibleobject.class.php#L96
                Александр
                19 ноября 2019, 19:45
                0
                Чтот я не понял зачем получать коллекцию если нужен то 1 объект???
                Можно же просто так
                <?php
                $getted_id = (int)$modx->getOption('getted_id', $scriptProperties, false);
                
                $criteria = $modx->newQuery('modResource');
                $criteria->sortby('createdon', 'DESC');
                $criteria->where(array('parent' => $getted_id));
                
                if($doc = $modx->getObject('modResource', $criteria))
                    return $doc->get('createdon');
                return;
                Все равно и getCollection и getObject просто готовят запрос mysql Ну грубо говоря :-(
                  Сергей Шлоков
                  19 ноября 2019, 19:51
                  0
                  А вот нет пока ни одной записи. Fatal Error!
                    Александр
                    19 ноября 2019, 19:53
                    0
                    Поправил уже :-)
                      Сергей Шлоков
                      19 ноября 2019, 21:28
                      0
                      Уверен, что больше ничего не упустил?

                      П.С. Я не про то, что для получения одного поля нужно запрашивать объект целиком.
                        Александр
                        19 ноября 2019, 22:17
                        0
                        Ну, кроме запроса объекта целиком, больше ничего не вижу. А что такого есть-то?
                          Сергей Шлоков
                          20 ноября 2019, 07:48
                          0
                          Контент-менеджер сохранил недописанную или заранее заготовленную статью. Что увидит пользователь на странице?

                          Смешно. Сам же выше на Владимира ругаешься, а сам бездумно его код скопипастил.
                            Александр
                            20 ноября 2019, 14:19
                            0
                            Ну добавить published = 1 в запрос.
            Vladimir
            19 ноября 2019, 13:51
            0
            DESC не ASC
              Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
              28