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

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

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

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

      Но когда этого нет, то «Понимаю, что можно сделать через pdoResources,» — это шикарный вариант.
    Это сообщение было удалено
      Сергей
      19 ноября 2019, 14:13
      0
      В этой строке пишет, что синтаксическая ошибка:
      return docs[0]->get('createdon');
      Мой вывод:
      [[!LatestNewsDate:strtotime:date=`%d.%m.%Y`? &getted_id=`3`]]
      (Не уверен в правильности)

      Результата нет.
        Это сообщение было удалено
          Сергей
          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 оптимальнее, чем описанный выше. Только в селект нужно указать одно поле, чтобы не гнать по сетке весь набор ненужных данных. А уж если хочется свой отдельный микросниппет, то используйте вариант отсюда.
                Это сообщение было удалено
                  Сергей Шлоков
                  19 ноября 2019, 19:49
                  0
                  то получается она и таже каша, а не самый худший вариант…
                  Выглядит одинаково только для тех, кто не знает матчасть. В данном случае нет знаний ни в xPDO, ни в SQL.
                  pdoResources будет работать как getCollection только в режиме проверки прав. Изначально он работает в облегченном режиме с массивом данных.
                  В твоём варианте все ресурсы указанного родителя (все!!!) с сервера полетят на клиента, а getCollection для каждой записи будет поднимать объект со всеми проверками. И всё это для того, чтобы получить одно поле одной записи. Т.е. хуже придумать нельзя.

                  Я выше давал ссылку как сделать это самым простым и быстрым способом.
                    Это сообщение было удалено
                      Это сообщение было удалено
                        Сергей Шлоков
                        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
                          Контент-менеджер сохранил недописанную или заранее заготовленную статью. Что увидит пользователь на странице?

                          Смешно. Сам же выше на Владимира ругаешься, а сам бездумно его код скопипастил.
          Это сообщение было удалено
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            28